From cbf601581d67c1b7685105d3cf481ec16fafe7b5 Mon Sep 17 00:00:00 2001 From: Vben Date: Tue, 27 Aug 2024 23:22:34 +0800 Subject: [PATCH] feat(@vben/docs): preview components are supported within documents (#4250) --- docs/.vitepress/components/demo-preview.vue | 43 ++++++ docs/.vitepress/components/index.ts | 1 + docs/.vitepress/components/preview-group.vue | 108 ++++++++++++++ docs/.vitepress/config/en.mts | 2 +- docs/.vitepress/config/index.mts | 4 +- .../.vitepress/config/plugins/demo-preview.ts | 135 ++++++++++++++++++ .../config/{shard.mts => shared.mts} | 36 ++++- docs/.vitepress/config/zh.mts | 60 ++++---- docs/.vitepress/theme/index.ts | 8 +- docs/.vitepress/theme/styles/index.ts | 1 + docs/package.json | 10 +- docs/src/components/common-ui/vben-modal.md | 45 ++++++ docs/src/components/introduction.md | 11 ++ docs/src/demos/vben-modal/basic/index.vue | 11 ++ docs/src/demos/vben-modal/extra/index.vue | 22 +++ docs/src/demos/vben-modal/extra/modal.vue | 8 ++ docs/src/guide/in-depth/loading.md | 2 + docs/tailwind.config.mjs | 11 ++ docs/tsconfig.json | 9 +- package.json | 2 +- .../src/components/tooltip/tooltip.vue | 4 +- .../effects/common-ui/src/components/index.ts | 2 + pnpm-lock.yaml | 61 +++++++- 23 files changed, 558 insertions(+), 38 deletions(-) create mode 100644 docs/.vitepress/components/demo-preview.vue create mode 100644 docs/.vitepress/components/index.ts create mode 100644 docs/.vitepress/components/preview-group.vue create mode 100644 docs/.vitepress/config/plugins/demo-preview.ts rename docs/.vitepress/config/{shard.mts => shared.mts} (76%) create mode 100644 docs/src/components/common-ui/vben-modal.md create mode 100644 docs/src/components/introduction.md create mode 100644 docs/src/demos/vben-modal/basic/index.vue create mode 100644 docs/src/demos/vben-modal/extra/index.vue create mode 100644 docs/src/demos/vben-modal/extra/modal.vue create mode 100644 docs/tailwind.config.mjs diff --git a/docs/.vitepress/components/demo-preview.vue b/docs/.vitepress/components/demo-preview.vue new file mode 100644 index 00000000..2aba9832 --- /dev/null +++ b/docs/.vitepress/components/demo-preview.vue @@ -0,0 +1,43 @@ + + + diff --git a/docs/.vitepress/components/index.ts b/docs/.vitepress/components/index.ts new file mode 100644 index 00000000..9430871e --- /dev/null +++ b/docs/.vitepress/components/index.ts @@ -0,0 +1 @@ +export { default as DemoPreview } from './demo-preview.vue'; diff --git a/docs/.vitepress/components/preview-group.vue b/docs/.vitepress/components/preview-group.vue new file mode 100644 index 00000000..aad02b85 --- /dev/null +++ b/docs/.vitepress/components/preview-group.vue @@ -0,0 +1,108 @@ + + + diff --git a/docs/.vitepress/config/en.mts b/docs/.vitepress/config/en.mts index 72f40958..6902ee16 100644 --- a/docs/.vitepress/config/en.mts +++ b/docs/.vitepress/config/en.mts @@ -203,7 +203,7 @@ function nav(): DefaultTheme.NavItem[] { }, { link: '/commercial/technical-support', - text: '🦄 Technical Support', + text: '🦄 Tech Support', }, { link: '/sponsor/personal', diff --git a/docs/.vitepress/config/index.mts b/docs/.vitepress/config/index.mts index 8365bc31..6b8cb81d 100644 --- a/docs/.vitepress/config/index.mts +++ b/docs/.vitepress/config/index.mts @@ -2,12 +2,12 @@ import { withPwa } from '@vite-pwa/vitepress'; import { defineConfigWithTheme } from 'vitepress'; import { en } from './en.mts'; -import { shard } from './shard.mts'; +import { shared } from './shared.mts'; import { zh } from './zh.mts'; export default withPwa( defineConfigWithTheme({ - ...shard, + ...shared, locales: { en: { label: 'English', diff --git a/docs/.vitepress/config/plugins/demo-preview.ts b/docs/.vitepress/config/plugins/demo-preview.ts new file mode 100644 index 00000000..46c35a96 --- /dev/null +++ b/docs/.vitepress/config/plugins/demo-preview.ts @@ -0,0 +1,135 @@ +import type { MarkdownEnv, MarkdownRenderer } from 'vitepress'; + +import crypto from 'node:crypto'; +import { readdirSync } from 'node:fs'; +import { join } from 'node:path'; + +export const rawPathRegexp = + // eslint-disable-next-line regexp/no-super-linear-backtracking, regexp/strict + /^(.+?(?:\.([\da-z]+))?)(#[\w-]+)?(?: ?{(\d+(?:[,-]\d+)*)? ?(\S+)?})? ?(?:\[(.+)])?$/; + +function rawPathToToken(rawPath: string) { + const [ + filepath = '', + extension = '', + region = '', + lines = '', + lang = '', + rawTitle = '', + ] = (rawPathRegexp.exec(rawPath) || []).slice(1); + + const title = rawTitle || filepath.split('/').pop() || ''; + + return { extension, filepath, lang, lines, region, title }; +} + +export const demoPreviewPlugin = (md: MarkdownRenderer) => { + md.core.ruler.after('inline', 'demo-preview', (state) => { + const insertComponentImport = (importString: string) => { + const index = state.tokens.findIndex( + (i) => i.type === 'html_block' && i.content.match(/\n`; + state.tokens.splice(0, 0, importComponent); + } else { + if (state.tokens[index]) { + const content = state.tokens[index].content; + state.tokens[index].content = content.replace( + '', + `${importString}\n`, + ); + } + } + }; + // Define the regular expression to match the desired pattern + const regex = /]*\sdir="([^"]*)"/g; + // Iterate through the Markdown content and replace the pattern + state.src = state.src.replaceAll(regex, (_match, dir) => { + const componentDir = join(process.cwd(), 'src', dir); + + let childFiles: string[] = []; + let dirExists = true; + + try { + childFiles = + readdirSync(componentDir, { + encoding: 'utf8', + recursive: false, + withFileTypes: false, + }) || []; + } catch { + dirExists = false; + } + + if (!dirExists) { + return ''; + } + + const uniqueWord = generateContentHash(componentDir); + + const ComponentName = `DemoComponent_${uniqueWord}`; + insertComponentImport( + `import ${ComponentName} from '${componentDir}/index.vue'`, + ); + const { path: _path } = state.env as MarkdownEnv; + + const index = state.tokens.findIndex((i) => i.content.match(regex)); + + if (!state.tokens[index]) { + return ''; + } + + state.tokens[index].content = + `<${ComponentName}/> + `; + + const _dummyToken = new state.Token('', '', 0); + const tokenArray: Array = []; + childFiles.forEach((filename) => { + // const slotName = filename.replace(extname(filename), ''); + + const templateStart = new state.Token('html_inline', '', 0); + templateStart.content = `'; + tokenArray.push(templateEnd); + }); + const endTag = new state.Token('html_inline', '', 0); + endTag.content = ''; + tokenArray.push(endTag); + + state.tokens.splice(index + 1, 0, ...tokenArray); + + // console.log( + // state.md.renderer.render(state.tokens, state?.options ?? [], state.env), + // ); + return ''; + }); + }); +}; + +function generateContentHash(input: string, length: number = 10): string { + // 使用 SHA-256 生成哈希值 + const hash = crypto.createHash('sha256').update(input).digest('hex'); + + // 将哈希值转换为 Base36 编码,并取指定长度的字符作为结果 + return Number.parseInt(hash, 16).toString(36).slice(0, length); +} diff --git a/docs/.vitepress/config/shard.mts b/docs/.vitepress/config/shared.mts similarity index 76% rename from docs/.vitepress/config/shard.mts rename to docs/.vitepress/config/shared.mts index 1d9748ee..b7059f32 100644 --- a/docs/.vitepress/config/shard.mts +++ b/docs/.vitepress/config/shared.mts @@ -1,4 +1,5 @@ import type { PwaOptions } from '@vite-pwa/vitepress'; +import type { HeadConfig } from 'vitepress'; import { resolve } from 'node:path'; @@ -6,12 +7,20 @@ import { GitChangelog, GitChangelogMarkdownSection, } from '@nolebase/vitepress-plugin-git-changelog/vite'; -import { defineConfig, type HeadConfig } from 'vitepress'; +import tailwind from 'tailwindcss'; +import { defineConfig, postcssIsolateStyles } from 'vitepress'; +import { demoPreviewPlugin } from './plugins/demo-preview'; import { search as zhSearch } from './zh.mts'; -export const shard = defineConfig({ +export const shared = defineConfig({ + appearance: 'dark', head: head(), + markdown: { + preConfig(md) { + md.use(demoPreviewPlugin); + }, + }, pwa: pwa(), srcDir: 'src', themeConfig: { @@ -36,11 +45,34 @@ export const shard = defineConfig({ chunkSizeWarningLimit: Infinity, minify: 'terser', }, + css: { + postcss: { + plugins: [ + tailwind(), + postcssIsolateStyles({ includeFiles: [/vp-doc\.css/] }), + ], + }, + }, json: { stringify: true, }, plugins: [ GitChangelog({ + mapAuthors: [ + { + mapByNameAliases: ['Vben'], + name: 'vben', + username: 'anncwb', + }, + { + name: 'vince', + username: 'vince292007', + }, + { + name: 'Li Kui', + username: 'likui628', + }, + ], repoURL: () => 'https://github.com/vbenjs/vue-vben-admin', }), GitChangelogMarkdownSection(), diff --git a/docs/.vitepress/config/zh.mts b/docs/.vitepress/config/zh.mts index babbd70d..fcc23bda 100644 --- a/docs/.vitepress/config/zh.mts +++ b/docs/.vitepress/config/zh.mts @@ -38,6 +38,7 @@ export const zh = defineConfig({ sidebar: { '/commercial/': { base: '/commercial/', items: sidebarCommercial() }, + '/components/': { base: '/components/', items: sidebarComponents() }, '/guide/': { base: '/guide/', items: sidebarGuide() }, }, sidebarMenuLabel: '菜单', @@ -60,6 +61,11 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] { }, { link: 'introduction/quick-start', text: '快速开始' }, { link: 'introduction/thin', text: '精简版本' }, + { + base: '/', + link: 'components/introduction', + text: '组件文档', + }, ], }, { @@ -117,7 +123,7 @@ function sidebarCommercial(): DefaultTheme.SidebarItem[] { return [ { link: 'community', - text: '社区交流', + text: '社区', }, { link: 'technical-support', @@ -130,6 +136,30 @@ function sidebarCommercial(): DefaultTheme.SidebarItem[] { ]; } +function sidebarComponents(): DefaultTheme.SidebarItem[] { + return [ + { + text: '组件', + items: [ + { + link: 'introduction', + text: '介绍', + }, + ], + }, + { + collapsed: false, + text: '通用组件', + items: [ + { + link: 'common-ui/vben-modal', + text: 'Modal 弹窗', + }, + ], + }, + ]; +} + function nav(): DefaultTheme.NavItem[] { return [ { @@ -138,28 +168,10 @@ function nav(): DefaultTheme.NavItem[] { { link: '/guide/introduction/vben', text: '指南', - // items: [ - // { - // link: '/guide/introduction/vben', - // text: '简介', - // }, - // { - // link: '/guide/essentials/concept', - // text: '基础', - // }, - // { - // link: '/guide/in-depth/layout', - // text: '深入', - // }, - // { - // link: '/guide/project/standard', - // text: '工程', - // }, - // { - // link: '/guide/other/project-update', - // text: '其他', - // }, - // ], + }, + { + link: '/components/introduction', + text: '组件', }, { text: '历史版本', @@ -234,7 +246,7 @@ function nav(): DefaultTheme.NavItem[] { }, { link: '/commercial/community', - text: '👨‍👦‍👦 社区交流', + text: '👨‍👦‍👦 社区', // items: [ // { // link: 'https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=22ySzj7pKiw&businessType=9&from=246610&biz=ka&mainSourceId=share&subSourceId=others&jumpsource=shorturl#/pc', diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 862f06e9..e1888aa9 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,9 +1,10 @@ // https://vitepress.dev/guide/custom-theme -import type { Theme } from 'vitepress'; +import type { EnhanceAppContext, Theme } from 'vitepress'; import { NolebaseGitChangelogPlugin } from '@nolebase/vitepress-plugin-git-changelog/client'; import DefaultTheme from 'vitepress/theme'; +import { DemoPreview } from '../components'; import SiteLayout from './components/site-layout.vue'; import VbenContributors from './components/vben-contributors.vue'; import { initHmPlugin } from './plugins/hm'; @@ -13,9 +14,10 @@ import './styles'; import '@nolebase/vitepress-plugin-git-changelog/client/style.css'; export default { - enhanceApp({ app }) { - // ... + enhanceApp(ctx: EnhanceAppContext) { + const { app } = ctx; app.component('VbenContributors', VbenContributors); + app.component('DemoPreview', DemoPreview); app.use(NolebaseGitChangelogPlugin); // 百度统计 initHmPlugin(); diff --git a/docs/.vitepress/theme/styles/index.ts b/docs/.vitepress/theme/styles/index.ts index 3cc1668c..1ee8ccc4 100644 --- a/docs/.vitepress/theme/styles/index.ts +++ b/docs/.vitepress/theme/styles/index.ts @@ -1,2 +1,3 @@ import './variables.css'; import './base.css'; +import '@vben/styles'; diff --git a/docs/package.json b/docs/package.json index b61a19c3..3050e2b9 100644 --- a/docs/package.json +++ b/docs/package.json @@ -8,10 +8,18 @@ "docs:preview": "vitepress preview" }, "dependencies": { - "medium-zoom": "^1.1.0" + "@vben-core/shadcn-ui": "workspace:*", + "@vben/common-ui": "workspace:*", + "@vben/styles": "workspace:*", + "@vueuse/core": "^11.0.3", + "lucide-vue-next": "^0.436.0", + "markdown-it": "^14.1.0", + "medium-zoom": "^1.1.0", + "radix-vue": "^1.9.4" }, "devDependencies": { "@nolebase/vitepress-plugin-git-changelog": "^2.4.0", + "@types/markdown-it": "^14.1.2", "@vite-pwa/vitepress": "^0.5.0", "vitepress": "^1.3.4", "vue": "^3.4.38" diff --git a/docs/src/components/common-ui/vben-modal.md b/docs/src/components/common-ui/vben-modal.md new file mode 100644 index 00000000..f1d6c157 --- /dev/null +++ b/docs/src/components/common-ui/vben-modal.md @@ -0,0 +1,45 @@ +--- +outline: deep +--- + +# vben-modal + +::: tip + +文档还在完善中,敬请期待。 + +::: + +框架提供的模态框组件,支持`拖拽`、`全屏`、`自定义`等功能。 + +## 基础用法 + +使用 `useVbenModal` 创建最基于的模态框。 + + + +## 组件抽离 + +modal 内的内容一般业务中,会比较复杂,所以我们可以将 modal 内的内容抽离出来。 + + + +## API + +### 属性 + +| 属性名 | 描述 | 类型 | 默认值 | +| ------ | ----- | -------- | ------ | +| title | 标题. | `string` | — | + +### 事件 + +| 事件名 | 描述 | 类型 | +| ------ | ---- | ---- | +| TODO | TODO | TODO | + +### 插槽 + +| 插槽名 | 描述 | +| ------- | ---- | +| default | xx. | diff --git a/docs/src/components/introduction.md b/docs/src/components/introduction.md new file mode 100644 index 00000000..8fc96205 --- /dev/null +++ b/docs/src/components/introduction.md @@ -0,0 +1,11 @@ +# 介绍 + +::: tip README + +该文档介绍的是框架组件的使用方法、属性、事件等。如果你觉得组件封装的不好,或者不符合你的需求,你可以直接使用原生的组件,或者自己封装一个组件,不需要拘泥于框架提供的组件。我们只是提供了一些常用的组件,方便你快速开发。是否使用,取决于你的需求。 + +::: + +## 通用组件 + +通用组件是一些常用的组件,比如弹窗、抽屉、表单等。大部分基于 `Tailwind CSS` 实现,可适用于不同 UI 组件库的应用。 diff --git a/docs/src/demos/vben-modal/basic/index.vue b/docs/src/demos/vben-modal/basic/index.vue new file mode 100644 index 00000000..038d6268 --- /dev/null +++ b/docs/src/demos/vben-modal/basic/index.vue @@ -0,0 +1,11 @@ + + diff --git a/docs/src/demos/vben-modal/extra/index.vue b/docs/src/demos/vben-modal/extra/index.vue new file mode 100644 index 00000000..1fa74cd6 --- /dev/null +++ b/docs/src/demos/vben-modal/extra/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/docs/src/demos/vben-modal/extra/modal.vue b/docs/src/demos/vben-modal/extra/modal.vue new file mode 100644 index 00000000..68ceb5ee --- /dev/null +++ b/docs/src/demos/vben-modal/extra/modal.vue @@ -0,0 +1,8 @@ + + diff --git a/docs/src/guide/in-depth/loading.md b/docs/src/guide/in-depth/loading.md index adc5fd99..ff89dcb8 100644 --- a/docs/src/guide/in-depth/loading.md +++ b/docs/src/guide/in-depth/loading.md @@ -42,3 +42,5 @@ VITE_INJECT_APP_LOADING=false
<%= VITE_APP_TITLE %>
``` + +::: diff --git a/docs/tailwind.config.mjs b/docs/tailwind.config.mjs new file mode 100644 index 00000000..9dbc8c32 --- /dev/null +++ b/docs/tailwind.config.mjs @@ -0,0 +1,11 @@ +import tailwindcssConfig from '@vben/tailwind-config'; + +export default { + ...tailwindcssConfig, + content: [ + ...tailwindcssConfig.content, + '.vitepress/**/*.{js,mts,ts,vue}', + 'src/demos/**/*.{js,mts,ts,vue}', + 'src/**/*.md', + ], +}; diff --git a/docs/tsconfig.json b/docs/tsconfig.json index b4aff40b..9b738dbb 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,6 +1,13 @@ { "$schema": "https://json.schemastore.org/tsconfig", "extends": "@vben/tsconfig/web.json", - "include": [".vitepress/*.mts", ".vitepress/**/*.ts", ".vitepress/**/*.vue"], + "include": [ + ".vitepress/*.mts", + ".vitepress/**/*.ts", + ".vitepress/**/*.vue", + "src/*.mts", + "src/**/*.ts", + "src/**/*.vue" + ], "exclude": ["node_modules"] } diff --git a/package.json b/package.json index 5ca5d6b7..7a320d8a 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "node": ">=20", "pnpm": ">=9" }, - "packageManager": "pnpm@9.7.1", + "packageManager": "pnpm@9.9.0", "pnpm": { "peerDependencyRules": { "allowedVersions": { diff --git a/packages/@core/ui-kit/shadcn-ui/src/components/tooltip/tooltip.vue b/packages/@core/ui-kit/shadcn-ui/src/components/tooltip/tooltip.vue index 740ef4b3..2cd11c88 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/components/tooltip/tooltip.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/components/tooltip/tooltip.vue @@ -14,7 +14,7 @@ interface Props { contentClass?: any; contentStyle?: StyleValue; delayDuration?: number; - side: TooltipContentProps['side']; + side?: TooltipContentProps['side']; } withDefaults(defineProps(), { @@ -33,7 +33,7 @@ withDefaults(defineProps(), { :class="contentClass" :side="side" :style="contentStyle" - class="side-content text-popover-foreground bg-popover" + class="side-content text-popover-foreground bg-accent rounded-md" > diff --git a/packages/effects/common-ui/src/components/index.ts b/packages/effects/common-ui/src/components/index.ts index b4e7f482..8e62c781 100644 --- a/packages/effects/common-ui/src/components/index.ts +++ b/packages/effects/common-ui/src/components/index.ts @@ -1,3 +1,5 @@ export * from './ellipsis-text'; export * from './page'; export * from '@vben-core/popup-ui'; + +export { VbenButton } from '@vben-core/shadcn-ui'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81c6c765..eae78873 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -322,13 +322,37 @@ importers: docs: dependencies: + '@vben-core/shadcn-ui': + specifier: workspace:* + version: link:../packages/@core/ui-kit/shadcn-ui + '@vben/common-ui': + specifier: workspace:* + version: link:../packages/effects/common-ui + '@vben/styles': + specifier: workspace:* + version: link:../packages/styles + '@vueuse/core': + specifier: ^11.0.3 + version: 11.0.3(vue@3.4.38(typescript@5.5.4)) + lucide-vue-next: + specifier: ^0.436.0 + version: 0.436.0(vue@3.4.38(typescript@5.5.4)) + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 medium-zoom: specifier: ^1.1.0 version: 1.1.0 + radix-vue: + specifier: ^1.9.4 + version: 1.9.4(vue@3.4.38(typescript@5.5.4)) devDependencies: '@nolebase/vitepress-plugin-git-changelog': specifier: ^2.4.0 version: 2.4.0(@algolia/client-search@4.24.0)(@types/node@22.5.0)(async-validator@4.2.5)(axios@1.7.5)(nprogress@0.2.0)(postcss@8.4.41)(qrcode@1.5.4)(sass@1.77.8)(search-insights@2.16.3)(sortablejs@1.15.2)(terser@5.31.6)(typescript@5.5.4) + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 '@vite-pwa/vitepress': specifier: ^0.5.0 version: 0.5.0(vite-plugin-pwa@0.20.1(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)(terser@5.31.6))(workbox-build@7.1.1)(workbox-window@7.1.0)) @@ -3438,7 +3462,6 @@ packages: '@ls-lint/ls-lint@2.2.3': resolution: {integrity: sha512-ekM12jNm/7O2I/hsRv9HvYkRdfrHpiV1epVuI2NP+eTIcEgdIdKkKCs9KgQydu/8R5YXTov9aHdOgplmCHLupw==} - cpu: [x64, arm64, s390x] os: [darwin, linux, win32] hasBin: true @@ -6958,6 +6981,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + lint-staged@15.2.9: resolution: {integrity: sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==} engines: {node: '>=18.12.0'} @@ -7137,6 +7163,10 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} @@ -7146,6 +7176,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + medium-zoom@1.1.0: resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} @@ -8304,6 +8337,10 @@ packages: engines: {node: '>=16'} hasBin: true + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -9310,6 +9347,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -16391,6 +16431,10 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + lint-staged@15.2.9: dependencies: chalk: 5.3.0 @@ -16607,12 +16651,23 @@ snapshots: mark.js@8.11.1: {} + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + mathml-tag-names@2.1.3: {} mdn-data@2.0.28: {} mdn-data@2.0.30: {} + mdurl@2.0.0: {} + medium-zoom@1.1.0: {} memoize-one@6.0.0: {} @@ -17781,6 +17836,8 @@ snapshots: picocolors: 1.0.1 sade: 1.8.1 + punycode.js@2.3.1: {} + punycode@2.3.1: {} pupa@3.1.0: @@ -18908,6 +18965,8 @@ snapshots: typescript@5.5.4: {} + uc.micro@2.1.0: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: