Skip to content

Commit 85bb051

Browse files
committed
feat: update Vitepress configuration and theme imports for improved module support
1 parent 906da2b commit 85bb051

File tree

19 files changed

+248
-337
lines changed

19 files changed

+248
-337
lines changed

docs/.vitepress/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineNimiqVitepressConfig } from 'nimiq-vitepress-theme'
1+
import { defineNimiqVitepressConfig } from '../../packages/nimiq-vitepress-theme/src/'
22
import PreviewPlugin from './theme/plugins/component-preview'
33

44
// @unocss-include

docs/.vitepress/theme/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client'
22

3-
import { defineNimiqThemeConfig } from 'nimiq-vitepress-theme/client.js'
3+
import { defineNimiqThemeConfig } from 'nimiq-vitepress-theme/theme.js'
44

55
import ComponentPreview from './components/ComponentPreview.vue'
66

docs/.vitepress/theme/plugins/component-preview.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import type { PluginSimple } from 'markdown-it'
12
import type { MarkdownEnv, MarkdownRenderer } from 'vitepress'
23
import { dirname, resolve } from 'node:path'
34
import { renderMarkdownItTokens } from 'render-markdown-it-tokens'
45

5-
export default function (md: MarkdownRenderer) {
6+
// PluginSimple
7+
export default function (md: MarkdownRenderer): PluginSimple {
68
md.core.ruler.after('block', 'markdown-preview', (state) => {
79
// Find all html_block tokens containing ComponentPreview
810
for (let i = 0; i < state.tokens.length; i++) {

docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"name": "docs",
3+
"type": "module",
34
"version": "1.0.0",
45
"packageManager": "pnpm@10.5.1",
56
"description": "",
67
"author": "",
78
"license": "ISC",
89
"keywords": [],
9-
"type": "module",
1010
"main": "index.js",
1111
"scripts": {
1212
"test": "echo \"Error: no test specified\" && exit 1",

docs/vite.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import UnoCSS from 'unocss/vite'
88
import { defineConfig } from 'vite'
99
import Inspect from 'vite-plugin-inspect'
1010
import VueDevTools from 'vite-plugin-vue-devtools'
11-
import NimiqVitepressVite from '../packages/nimiq-vitepress-theme/src/vite'
11+
import { NimiqVitepressVitePlugin } from '../packages/nimiq-vitepress-theme/src/vite'
1212

1313
const __filename = fileURLToPath(import.meta.url)
1414
const __dirname = dirname(__filename)
@@ -30,6 +30,6 @@ export default defineConfig({
3030
GitChangelog({
3131
repoURL: 'https://github.com/onmax/nimiq-ui',
3232
}),
33-
NimiqVitepressVite(),
33+
NimiqVitepressVitePlugin(),
3434
],
3535
})

packages/nimiq-vitepress-theme/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"import": "./dist/*.mjs"
3838
}
3939
},
40+
"main": "./dist/index.mjs",
4041
"module": "./dist/index.mjs",
4142
"types": "./dist/index.d.ts",
4243
"typesVersions": {
@@ -72,14 +73,15 @@
7273
"nimiq-icons": "workspace:*",
7374
"p-map": "catalog:",
7475
"reka-ui": "catalog:",
75-
"vitepress-plugin-group-icons": "catalog:",
7676
"vue": "catalog:",
7777
"vue-router": "catalog:"
7878
},
7979
"devDependencies": {
80+
"@iconify-json/vscode-icons": "catalog:",
8081
"@iconify/utils": "catalog:",
8182
"@shikijs/vitepress-twoslash": "catalog:",
8283
"@types/cross-spawn": "catalog:",
84+
"@types/markdown-it": "catalog:",
8385
"@unocss/cli": "catalog:",
8486
"@unocss/reset": "catalog:",
8587
"bumpp": "catalog:",
@@ -91,7 +93,6 @@
9193
"unbuild": "catalog:",
9294
"unocss": "catalog:",
9395
"unocss-preset-animations": "catalog:",
94-
"unocss-preset-onmax": "catalog:",
95-
"unplugin-vue-components": "catalog:"
96+
"unocss-preset-onmax": "catalog:"
9697
}
9798
}

packages/nimiq-vitepress-theme/src/assets/code-blocks.css

Lines changed: 0 additions & 56 deletions
Large diffs are not rendered by default.
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
11
@import url('./layers.css');
22

33
@import url('./uno.css') layer nq-vp;
4-
@import url('./typography.css') layer nq-vp;
5-
@import url('./github-callouts.css') layer nq-vp;
6-
@import url('./code-blocks.css') layer nq-vp;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export const builtinIcons = {
2+
// package managers
3+
'pnpm': 'vscode-icons:file-type-light-pnpm',
4+
'npm': 'vscode-icons:file-type-npm',
5+
'yarn': 'vscode-icons:file-type-yarn',
6+
'bun': 'vscode-icons:file-type-bun',
7+
'deno': 'vscode-icons:file-type-deno',
8+
// frameworks
9+
'vue': 'vscode-icons:file-type-vue',
10+
'svelte': 'vscode-icons:file-type-svelte',
11+
'angular': 'vscode-icons:file-type-angular',
12+
'react': 'vscode-icons:file-type-reactjs',
13+
'next': 'vscode-icons:file-type-light-next',
14+
'nuxt': 'vscode-icons:file-type-nuxt',
15+
// 'solid': 'logos:solidjs-icon',
16+
'astro': 'vscode-icons:file-type-light-astro',
17+
// bundlers
18+
'rollup': 'vscode-icons:file-type-rollup',
19+
'webpack': 'vscode-icons:file-type-webpack',
20+
'vite': 'vscode-icons:file-type-vite',
21+
'esbuild': 'vscode-icons:file-type-esbuild',
22+
// configuration files
23+
'package.json': 'vscode-icons:file-type-node',
24+
'tsconfig.json': 'vscode-icons:file-type-tsconfig',
25+
'.npmrc': 'vscode-icons:file-type-npm',
26+
'.editorconfig': 'vscode-icons:file-type-editorconfig',
27+
'.eslintrc': 'vscode-icons:file-type-eslint',
28+
'.eslintignore': 'vscode-icons:file-type-eslint',
29+
'eslint.config': 'vscode-icons:file-type-eslint',
30+
'.gitignore': 'vscode-icons:file-type-git',
31+
'.gitattributes': 'vscode-icons:file-type-git',
32+
'.env': 'vscode-icons:file-type-dotenv',
33+
'.env.example': 'vscode-icons:file-type-dotenv',
34+
'.vscode': 'vscode-icons:file-type-vscode',
35+
'tailwind.config': 'vscode-icons:file-type-tailwind',
36+
'uno.config': 'vscode-icons:file-type-unocss',
37+
'unocss.config': 'vscode-icons:file-type-unocss',
38+
'.oxlintrc': 'vscode-icons:file-type-oxlint',
39+
// filename extensions
40+
'mts': 'vscode-icons:file-type-typescript',
41+
'cts': 'vscode-icons:file-type-typescript',
42+
'ts': 'vscode-icons:file-type-typescript',
43+
'tsx': 'vscode-icons:file-type-typescript',
44+
'mjs': 'vscode-icons:file-type-js',
45+
'cjs': 'vscode-icons:file-type-js',
46+
'json': 'vscode-icons:file-type-json',
47+
'js': 'vscode-icons:file-type-js',
48+
'jsx': 'vscode-icons:file-type-js',
49+
'md': 'vscode-icons:file-type-markdown',
50+
'py': 'vscode-icons:file-type-python',
51+
'ico': 'vscode-icons:file-type-favicon',
52+
'html': 'vscode-icons:file-type-html',
53+
'css': 'vscode-icons:file-type-css',
54+
'scss': 'vscode-icons:file-type-scss',
55+
'yml': 'vscode-icons:file-type-light-yaml',
56+
'yaml': 'vscode-icons:file-type-light-yaml',
57+
'php': 'vscode-icons:file-type-php',
58+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { icons } from '@iconify-json/vscode-icons'
2+
import { encodeSvgForCss, getIconData, iconToHTML, iconToSVG } from '@iconify/utils'
3+
import { builtinIcons } from './builtin-icons'
4+
5+
export async function generateCSS(labels: Set<string>) {
6+
const mergedIcons = { ...builtinIcons }
7+
console.log({labels})
8+
const matched = getMatchedLabels(labels, mergedIcons)
9+
const css = await generateIconCSS(matched)
10+
return { css }
11+
}
12+
13+
function getMatchedLabels(labels: Set<string>, icons: Record<string, string>) {
14+
const matched: Record<string, string[]> = {}
15+
const sortedKeys = Object.keys(icons).sort((a, b) => b.length - a.length)
16+
for (const label of labels) {
17+
const key = sortedKeys.find(k => label?.toLowerCase().includes(k))
18+
if (key) {
19+
matched[icons[key]] = (matched[icons[key]] || []).concat(label)
20+
}
21+
}
22+
return matched
23+
}
24+
25+
async function generateIconCSS(matched: Record<string, string[]>) {
26+
const iconCSS = await Promise.all(Object.entries(matched).map(async ([icon, labels]) => {
27+
const [, iconName] = icon.split(':')
28+
const iconData = getIconData(icons, iconName)
29+
if (!iconData)
30+
throw new Error(`Icon not found: ${iconName}`)
31+
const { attributes, body } = iconToSVG(iconData)
32+
const svg = encodeSvgForCss(iconToHTML(body, attributes))
33+
const selector = labels.map(l => l.replace('.','')).map(
34+
label => `:where([data-title$='${label}' i], [class$='language-${label}' i] .lang)::before`,
35+
).join(', ')
36+
return `${selector} {--logo: url("data:image/svg+xml,${svg}");}`
37+
}))
38+
console.log({iconCSS,matched})
39+
40+
return iconCSS.sort().join('')
41+
}

0 commit comments

Comments
 (0)