diff --git a/.gitignore b/.gitignore index 69f424e..8c220c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,14 @@ /.eslintrc-auto-import.json /components.d.ts -/examples/auto-imports.d.ts +/auto-imports.d.ts /AGENTS.md /.npmrc +# 文档站 +/docs/.vitepress/cache +/docs/.vitepress/dist +/docs/.npmrc + # Logs logs *.log diff --git a/README.md b/README.md index 3596188..2898741 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,30 @@ Vue 3 移动端通用组件库,依赖 `timi-web` 提供基础组件和编辑 通知组件使用同样的 `uploadImage`、`uploadVideo` 和 `resolveAttachmentUrl` 回调。没有附件上传需求时,可以不传上传回调。 +## 文档与演示 + +组件演示与 API 文档由 VitePress 驱动,源码位于 `docs/`。它作为独立子包维护,依赖版本与根项目隔离(根项目用 Vite 7,文档站需要 VitePress 自带的 Vite 5)。 + +首次使用先安装文档站依赖: + +```bash +pnpm -C docs install +``` + +启动演示站(默认 http://localhost:3004): + +```bash +pnpm run dev +``` + +构建静态站点: + +```bash +pnpm run build:doc +``` + +演示直接引用 `src` 源码,改动组件即可热更新;API 表格由 `vue-docgen-api` 在构建期解析组件源码生成,无需手写。演示统一渲染在手机宽度的视口里——这是移动端组件库,按桌面宽度铺开会失去真实形态。新增组件的完整步骤见文档站的「演示与文档约定」页面。 + ## 开发 ```bash diff --git a/docs/.vitepress/api-types.ts b/docs/.vitepress/api-types.ts new file mode 100644 index 0000000..d7cff6d --- /dev/null +++ b/docs/.vitepress/api-types.ts @@ -0,0 +1,83 @@ +/** + * API 文档数据类型。 + * + * 这些结构由 Node 侧的 `plugins/docgen.ts` 产出,通过虚拟模块交给浏览器渲染, + * 因此刻意保持为不含第三方类型的纯数据,避免 `vue-docgen-api` 被打进客户端产物。 + */ + +/** 单个 prop 的表格行数据。 */ +export interface ApiPropRow { + /** prop 名称。 */ + name: string; + /** 类型签名,如 `string`、`Article`。 */ + type: string; + /** 默认值,未声明时为空字符串。 */ + defaultValue: string; + /** 是否必填。 */ + required: boolean; + /** 注释说明,取自源码 JSDoc。 */ + description: string; +} + +/** 单个事件的表格行数据。 */ +export interface ApiEventRow { + /** 事件名,如 `update:modelValue`。 */ + name: string; + /** 回调参数签名。 */ + type: string; + /** 注释说明。 */ + description: string; +} + +/** 单个插槽的表格行数据。 */ +export interface ApiSlotRow { + /** 插槽名。 */ + name: string; + /** 注释说明或作用域参数。 */ + description: string; +} + +/** 单个暴露方法或属性的表格行数据。 */ +export interface ApiExposeRow { + /** 暴露的名称。 */ + name: string; + /** 类型签名。 */ + type: string; + /** 注释说明。 */ + description: string; +} + +/** 一个组件解析完成后的完整 API 数据。 */ +export interface ComponentApi { + /** 组件名。 */ + name: string; + /** 组件自身的注释说明。 */ + description: string; + /** + * 源码是否解析成功。 + * + * 用来区分「解析失败」与「组件本身就没有 props/events/slots/expose」, + * 两者都会得到空数组,但提示语完全不同。 + */ + parsed: boolean; + props: ApiPropRow[]; + events: ApiEventRow[]; + slots: ApiSlotRow[]; + exposes: ApiExposeRow[]; +} + +/** 全部组件的 API 数据,键为组件名。 */ +export type ComponentApiMap = Record; + +/** 生成一个空的 API 数据,用于解析失败时兜底,保证文档站不因单个组件而白屏。 */ +export function createEmptyApi(name: string): ComponentApi { + return { + name, + description: "", + parsed: false, + props: [], + events: [], + slots: [], + exposes: [] + }; +} diff --git a/docs/.vitepress/components.ts b/docs/.vitepress/components.ts new file mode 100644 index 0000000..b8944bd --- /dev/null +++ b/docs/.vitepress/components.ts @@ -0,0 +1,180 @@ +/** + * 组件元数据清单。 + * + * 这是文档站的唯一数据源,三处消费它: + * - `config.ts` 生成侧边栏导航 + * - `plugins/docgen.ts` 按 `entry` 定位源码并交给 vue-docgen-api 解析 + * - 页面内的 `` 按 `name` 查询解析结果 + * + * 新增组件时只需在此追加一项,导航、API 表、文档路由会同步生效。 + */ + +/** 分类展示顺序即数组顺序。 */ +export const CATEGORY_LIST = [ + "布局组件", + "编辑器组件", + "交互组件", + "AI 对话组件" +] as const; + +export type ComponentCategory = (typeof CATEGORY_LIST)[number]; + +export interface ComponentMeta { + /** 组件名,与组件内 `defineOptions` 的 name 一致,同时是 api-table 的查询键。 */ + name: string; + /** 文档与侧边栏展示的中文标题。 */ + title: string; + /** 一句话功能描述。 */ + description: string; + /** 所属分类。 */ + category: ComponentCategory; + /** 组件入口源码,相对仓库根目录。 */ + entry: string; + /** 文档路径覆盖,默认由文件名或目录名推导。 */ + slug?: string; +} + +export const COMPONENT_LIST: ComponentMeta[] = [ + // ---------- 布局组件 ---------- + { + name: "RootLayout", + title: "RootLayout 根布局", + description: "移动端页面骨架,主体内容之外自动渲染版权与备案信息。", + category: "布局组件", + entry: "src/components/root-layout/index.vue" + }, + { + name: "Space", + title: "Space 间距", + description: "控制子元素之间的间距与排列方向,支持分隔符。", + category: "布局组件", + entry: "src/components/space/index.vue" + }, + + // ---------- 编辑器组件 ---------- + { + name: "CodeEditor", + title: "CodeEditor 代码编辑器", + description: "带行号、语法高亮与查找替换的代码输入框。", + category: "编辑器组件", + entry: "src/components/code-editor/index.vue" + }, + { + name: "TiptapEditor", + title: "TiptapEditor 富文本编辑器", + description: "基于 Tiptap 的富文本编辑器,工具栏覆盖媒体、表格、链接与代码块。", + category: "编辑器组件", + entry: "src/components/tiptap-editor/index.vue" + }, + { + name: "TiptapView", + title: "TiptapView 富文本视图", + description: "Tiptap 内容的只读渲染视图,与编辑器共用同一套样式。", + category: "编辑器组件", + entry: "src/components/tiptap-view/index.vue" + }, + { + name: "ArticleEditor", + title: "ArticleEditor 文章编辑器", + description: "以 Article 为数据模型,按正文类型切换纯文本、Markdown 与富文本编辑。", + category: "编辑器组件", + entry: "src/components/article-editor/index.vue" + }, + { + name: "ArticleView", + title: "ArticleView 文章视图", + description: "按 Article 的正文类型渲染正文与附件列表。", + category: "编辑器组件", + entry: "src/components/article-view/index.vue" + }, + { + name: "NotifyEditor", + title: "NotifyEditor 通知编辑器", + description: "以 NotifyDetail 为数据模型的通知编辑表单,复用文章编辑器能力。", + category: "编辑器组件", + entry: "src/components/notify-editor/index.vue" + }, + { + name: "NotifyView", + title: "NotifyView 通知视图", + description: "渲染通知的正文内容。", + category: "编辑器组件", + entry: "src/components/notify-view/index.vue" + }, + + // ---------- 交互组件 ---------- + { + name: "BottomPopup", + title: "BottomPopup 底部弹层", + description: "从底部升起的操作面板,可带标题与左右按钮。", + category: "交互组件", + entry: "src/components/bottom-popup/index.vue" + }, + { + name: "DurationPicker", + title: "DurationPicker 时长选择", + description: "按时长值选择并回填,单位与候选项由外部决定。", + category: "交互组件", + entry: "src/components/duration-picker/index.vue" + }, + + // ---------- AI 对话组件 ---------- + { + name: "AiChatPanel", + title: "AiChatPanel 对话面板", + description: "把消息列表与输入框组装成完整对话界面,由业务侧驱动数据。", + category: "AI 对话组件", + entry: "src/components/ai/AiChatPanel.vue" + }, + { + name: "AiChatMessageList", + title: "AiChatMessageList 消息列表", + description: "渲染对话消息,含思考过程、引用与流式光标。", + category: "AI 对话组件", + entry: "src/components/ai/AiChatMessageList.vue" + }, + { + name: "AiChatComposer", + title: "AiChatComposer 输入框", + description: "对话输入框,按状态在发送、停止与重试之间切换。", + category: "AI 对话组件", + entry: "src/components/ai/AiChatComposer.vue" + }, + { + name: "AiChatThinking", + title: "AiChatThinking 思考过程", + description: "折叠展示模型的思考分段,生成中自动展开。", + category: "AI 对话组件", + entry: "src/components/ai/AiChatThinking.vue" + } +]; + +/** + * 文档路径与路由片段。 + * + * `index.vue` 取所在目录名,具名文件取文件名——`ai` 目录下有多个组件, + * 只靠目录名会全部撞成 `ai`。两种写法都会再转成短横线形式。 + */ +export function toSlug(meta: ComponentMeta): string { + if (meta.slug) { + return meta.slug; + } + const segments = meta.entry.split("/"); + const fileName = segments[segments.length - 1]; + const baseName = fileName.replace(/\.\w+$/, ""); + const raw = baseName === "index" ? segments[segments.length - 2] : baseName; + return raw.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(); +} + +/** 组件文档页的站内绝对路径。 */ +export function toDocLink(meta: ComponentMeta): string { + return `/components/${toSlug(meta)}`; +} + +/** 按分类分组,保持 CATEGORY_LIST 的声明顺序。 */ +export function groupByCategory(): Array<{ category: ComponentCategory; items: ComponentMeta[] }> { + return CATEGORY_LIST.map(category => ({ + category, + items: COMPONENT_LIST.filter(item => item.category === category) + })).filter(group => group.items.length > 0); +} diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..ca2b2f6 --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,130 @@ +import { resolve } from "node:path"; +import { defineConfig } from "vitepress"; +import { + componentPreview, + containerPreview +} from "@vitepress-demo-preview/plugin"; +import AutoImport from "unplugin-auto-import/vite"; +import { groupByCategory, toDocLink } from "./components"; +import { docgenPlugin } from "./plugins/docgen"; +import { timiWebSsrStub } from "./plugins/ssr-stub"; + +/** `__dirname` 由 VitePress 打包配置时注入,指向 `docs/.vitepress`。 */ +const docsDir = resolve(__dirname, ".."); +/** 仓库根目录,组件源码位于它的 `src` 下。 */ +const repoRoot = resolve(docsDir, ".."); +/** timi-web 仓库目录,docs 通过 link 依赖它。 */ +const timiWebRoot = resolve(repoRoot, "../timi-web"); + +/** + * 源码引用别名。 + * + * demo 直接引用 `src` 源码而非构建产物,改组件即可热更新文档。 + * 组件源码自身的传递依赖(tiptap、prismjs 等)由 timi-web 的 node_modules 解析, + * docs 无需重复声明。 + */ +const alias = { + "timi-tdesign-mobile": resolve(repoRoot, "src/index.ts"), + "timi-web/editor": resolve(timiWebRoot, "src/editor/index.ts") +}; + +/** 组件文档侧边栏,按 components.ts 的分类与顺序生成。 */ +const componentSidebar = groupByCategory().map(group => ({ + text: group.category, + collapsed: false, + items: group.items.map(item => ({ + text: item.title, + link: toDocLink(item) + })) +})); + +export default defineConfig({ + title: "timi-tdesign-mobile", + description: "移动端 TDesign 组件库的演示与 API 文档", + lang: "zh-CN", + cleanUrls: true, + + themeConfig: { + nav: [ + { text: "指南", link: "/guide/" }, + { text: "场景", link: "/scenarios/editor" }, + { text: "组件", link: "/components/" } + ], + sidebar: [ + { + text: "指南", + items: [ + { text: "快速开始", link: "/guide/" }, + { text: "演示与文档约定", link: "/guide/demo" } + ] + }, + { + text: "场景示例", + collapsed: false, + items: [ + { text: "编辑器能力总览", link: "/scenarios/editor" }, + { text: "文章编辑与预览", link: "/scenarios/article" }, + { text: "通知编辑与预览", link: "/scenarios/notify" }, + { text: "移动端组件", link: "/scenarios/mobile" }, + { text: "AI 对话", link: "/scenarios/ai" } + ] + }, + ...componentSidebar + ], + outline: { + level: [2, 3], + label: "本页目录" + }, + search: { + provider: "local" + }, + docFooter: { + prev: "上一篇", + next: "下一篇" + }, + darkModeSwitchLabel: "主题", + sidebarMenuLabel: "目录", + returnToTopLabel: "回到顶部" + }, + + markdown: { + theme: { + light: "vitesse-light", + dark: "vitesse-dark" + }, + lineNumbers: true, + config(md) { + // 组件依赖浏览器 API(Tiptap、Prism、ResizeObserver、SSE 等), + // 统一开启 clientOnly 交给浏览器渲染,避免 SSR 阶段报错。 + md.use(componentPreview, { clientOnly: true, alias }); + md.use(containerPreview, { clientOnly: true, alias }); + } + }, + + vite: { + resolve: { + alias + }, + + plugins: [ + // 必须最先执行:SSR 阶段拦截 timi-web,否则整个构建无法通过。 + timiWebSsrStub(docsDir), + docgenPlugin(repoRoot), + // src 源码依赖自动导入(内部没有显式 import vue 的文件不在少数), + // 这里仅为其提供支持;docs 自身的代码一律显式导入。 + AutoImport({ + imports: ["vue"], + dts: false + }) + ], + + server: { + port: 3004, + host: true, + fs: { + // demo 需要读取 docs 之外的 src 与 timi-web 源码。 + allow: [repoRoot, timiWebRoot] + } + } + } +}); diff --git a/docs/.vitepress/plugins/docgen.ts b/docs/.vitepress/plugins/docgen.ts new file mode 100644 index 0000000..ff26f0d --- /dev/null +++ b/docs/.vitepress/plugins/docgen.ts @@ -0,0 +1,160 @@ +import { existsSync } from "node:fs"; +import { resolve } from "node:path"; +import { parse } from "vue-docgen-api"; +import type { Plugin } from "vite"; +import { COMPONENT_LIST } from "../components"; +import { + createEmptyApi, + type ApiEventRow, + type ApiExposeRow, + type ApiPropRow, + type ApiSlotRow, + type ComponentApi, + type ComponentApiMap +} from "../api-types"; + +/** 虚拟模块的引用标识,业务代码与类型声明共用。 */ +export const API_MODULE_ID = "virtual:timi-api"; + +/** Vite 内部使用的解析后标识,前置 `\0` 避免被其他插件处理。 */ +const RESOLVED_ID = `\0${API_MODULE_ID}`; + +/** + * 把 vue-docgen-api 的联合类型描述压平成可读文本。 + * 不同版本对 `defineEmits` 的产出结构不一致,这里统一兜底。 + */ +function normalizeType(type: unknown): string { + if (!type || typeof type !== "object") { + return "-"; + } + const candidate = type as { name?: unknown; names?: unknown }; + if (Array.isArray(candidate.names)) { + return candidate.names.length > 0 ? candidate.names.join(" | ") : "-"; + } + if (typeof candidate.name === "string" && candidate.name.length > 0) { + return candidate.name; + } + return "-"; +} + +/** 转换 prop 描述符。 */ +function toPropRow(descriptor: any): ApiPropRow { + return { + name: String(descriptor.name ?? ""), + type: normalizeType(descriptor.type), + defaultValue: descriptor.defaultValue?.value === undefined ? "-" : String(descriptor.defaultValue.value), + required: descriptor.required === true, + description: String(descriptor.description ?? "") + }; +} + +/** 转换事件描述符。 */ +function toEventRow(descriptor: any): ApiEventRow { + return { + name: String(descriptor.name ?? ""), + type: normalizeType(descriptor.type), + description: String(descriptor.description ?? "") + }; +} + +/** 转换插槽描述符,把作用域参数并入说明列。 */ +function toSlotRow(descriptor: any): ApiSlotRow { + const bindings = Array.isArray(descriptor.bindings) + ? descriptor.bindings.map((item: any) => String(item.name ?? "")).filter(Boolean) + : []; + const description = String(descriptor.description ?? ""); + const scope = bindings.length > 0 ? `作用域参数:${bindings.join("、")}` : ""; + return { + name: String(descriptor.name ?? ""), + description: [description, scope].filter(Boolean).join(";") + }; +} + +/** 转换暴露描述符。 */ +function toExposeRow(descriptor: any): ApiExposeRow { + return { + name: String(descriptor.name ?? ""), + type: normalizeType(descriptor.type), + description: String(descriptor.description ?? "") + }; +} + +/** 把单个组件文档规范化为纯数据。 */ +function toComponentApi(name: string, doc: any): ComponentApi { + return { + name, + description: String(doc?.description ?? ""), + parsed: true, + props: Array.isArray(doc?.props) ? doc.props.map(toPropRow) : [], + events: Array.isArray(doc?.events) ? doc.events.map(toEventRow) : [], + slots: Array.isArray(doc?.slots) ? doc.slots.map(toSlotRow) : [], + exposes: Array.isArray(doc?.expose) ? doc.expose.map(toExposeRow) : [] + }; +} + +/** + * 逐个解析组件源码。 + * 单个组件解析失败只降级为空 API,不让整个文档站因一处语法而无法构建。 + */ +async function parseAll(repoRoot: string): Promise { + const result: ComponentApiMap = {}; + + for (const meta of COMPONENT_LIST) { + const filePath = resolve(repoRoot, meta.entry); + if (!existsSync(filePath)) { + console.warn(`[timi-docgen] 未找到组件入口,已跳过:${meta.entry}`); + result[meta.name] = createEmptyApi(meta.name); + continue; + } + try { + const doc = await parse(filePath); + result[meta.name] = toComponentApi(meta.name, doc); + } catch (error) { + console.warn(`[timi-docgen] 解析 ${meta.name} 失败,已降级为空 API:`, error); + result[meta.name] = createEmptyApi(meta.name); + } + } + + return result; +} + +/** + * 提供 `virtual:timi-api` 虚拟模块,内容为全部组件的 API 数据。 + * + * 解析结果按需缓存,仅在组件源码变更时失效,避免每次页面请求都重复解析。 + * @param repoRoot 仓库根目录的绝对路径 + */ +export function docgenPlugin(repoRoot: string): Plugin { + const entryPathSet = new Set(COMPONENT_LIST.map(meta => resolve(repoRoot, meta.entry))); + let cache: ComponentApiMap | null = null; + + return { + name: "timi-docgen", + + resolveId(id: string) { + return id === API_MODULE_ID ? RESOLVED_ID : null; + }, + + async load(id: string) { + if (id !== RESOLVED_ID) { + return null; + } + if (cache === null) { + cache = await parseAll(repoRoot); + } + return `export default ${JSON.stringify(cache)};`; + }, + + handleHotUpdate({ file, server }) { + if (!entryPathSet.has(file)) { + return; + } + cache = null; + const invalidated = server.moduleGraph.getModuleById(RESOLVED_ID); + if (invalidated) { + server.moduleGraph.invalidateModule(invalidated); + server.ws.send({ type: "full-reload" }); + } + } + }; +} diff --git a/docs/.vitepress/plugins/ssr-stub.ts b/docs/.vitepress/plugins/ssr-stub.ts new file mode 100644 index 0000000..fe9c477 --- /dev/null +++ b/docs/.vitepress/plugins/ssr-stub.ts @@ -0,0 +1,133 @@ +import { existsSync, readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import type { Plugin } from "vite"; + +/** 虚拟 stub 模块标识。 */ +const STUB_ID = "\0timi-web-ssr-stub"; + +/** 被 stub 的模块说明符。 */ +const STUBBED_MODULES = new Set(["timi-web", "timi-web/editor"]); + +/** + * SSR 阶段必须存在的具名导出。 + * + * 取自 `src` 与 `docs` 中所有 `timi-web` / `timi-web/editor` 值导入的并集, + * 是 stub 的保底名单;若构建产物可读,`collectExportNames` 会在此基础上补全全部导出。 + */ +const REQUIRED_EXPORTS = [ + // ---------- timi-web ---------- + "VPopup", + "Popup", + "PopupType", + "Copyright", + "MarkdownView", + "MarkdownEditor", + "Toolkit", + "WebToolkit", + + // ---------- timi-web/editor ---------- + "findTextMatches", + "replaceAllText", + "replaceMatchText", + "buildSearchRegex", + "highlightCode", + "resolveCodeEditorKeydown", + "resolvePrismLanguage", + "useTiptapEditor", + "useTiptapView", + "headingMeta", + "ATTACHMENT_ID_ATTR", + "TEMP_FILE_ID_ATTR", + "LOCAL_MEDIA_ID_PREFIX", + "isLocalMediaId", + "normalizeContent", + "supportedCodeLanguages", + "TABLE_PICKER_SIZE" +]; + +/** 从构建产物中提取具名导出,让 stub 自动跟上上游变化。 */ +function collectExportNames(distFile: string): Set { + const names = new Set(REQUIRED_EXPORTS); + if (!existsSync(distFile)) { + return names; + } + try { + const source = readFileSync(distFile, "utf-8"); + for (const match of source.matchAll(/export\s*\{([^}]*)\}/g)) { + for (const part of match[1].split(",")) { + const bits = part.trim().split(/\s+as\s+/); + const name = (bits[1] ?? bits[0]).trim(); + if (/^[A-Za-z_$][\w$]*$/.test(name)) { + names.add(name); + } + } + } + } catch { + // 读取失败时退回保底名单,不影响构建。 + } + return names; +} + +/** 生成 stub 模块源码:每个导出都是可调用、可解构、可当插件安装的空实现。 */ +function buildStubSource(names: Set): string { + const named = [...names] + .filter(name => name !== "default") + .map(name => `export const ${name} = stub;`) + .join("\n"); + return `const stub = new Proxy(function () {}, { + get(target, key) { + if (key === Symbol.toPrimitive || key === "valueOf" || key === "toString") { + return () => ""; + } + return stub; + }, + apply() { + return stub; + }, + construct() { + return {}; + } +}); +export default stub; +${named} +`; +} + +/** + * 在 SSR 阶段把 timi-web 替换为空实现。 + * + * timi-web 的构建产物在模块顶层就访问 `window` 并启动 Prism 自动高亮定时器, + * 在 Node 中 import 会直接抛错,导致 VitePress 的 SSR 构建必然失败。 + * + * 文档站里真正需要 timi-web 的只有演示组件,它们全部通过 `clientOnly` 延迟到浏览器渲染, + * SSR 阶段只需要「能 import 且不报错」,因此这里返回一个 Proxy 空实现。 + * 客户端构建不受影响,`options.ssr` 为 false 时照常解析到真实模块。 + * @param docsDir docs 目录绝对路径,用于定位 timi-web 构建产物 + */ +export function timiWebSsrStub(docsDir: string): Plugin { + const distFile = resolve(docsDir, "node_modules/timi-web/dist/timi-web.mjs"); + let stubSource: string | null = null; + + return { + name: "timi-web-ssr-stub", + enforce: "pre", + + resolveId(source, importer, options) { + // 只拦截精确的包名,`timi-web/style.css` 等子路径照常交给 Vite 处理。 + if (options?.ssr && STUBBED_MODULES.has(source)) { + return STUB_ID; + } + return null; + }, + + load(id) { + if (id !== STUB_ID) { + return null; + } + if (stubSource === null) { + stubSource = buildStubSource(collectExportNames(distFile)); + } + return stubSource; + } + }; +} diff --git a/docs/.vitepress/theme/components/ApiTable.vue b/docs/.vitepress/theme/components/ApiTable.vue new file mode 100644 index 0000000..1d558cc --- /dev/null +++ b/docs/.vitepress/theme/components/ApiTable.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/docs/.vitepress/theme/containers/DemoPreview.vue b/docs/.vitepress/theme/containers/DemoPreview.vue new file mode 100644 index 0000000..d3ab46e --- /dev/null +++ b/docs/.vitepress/theme/containers/DemoPreview.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/docs/.vitepress/theme/env.d.ts b/docs/.vitepress/theme/env.d.ts new file mode 100644 index 0000000..8323275 --- /dev/null +++ b/docs/.vitepress/theme/env.d.ts @@ -0,0 +1,16 @@ +/// + +/** 构建期由 vue-docgen-api 解析生成的组件 API 数据。 */ +declare module "virtual:timi-api" { + import type { ComponentApiMap } from "../api-types"; + + const apiMap: ComponentApiMap; + export default apiMap; +} + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, unknown>; + export default component; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..a1fa84e --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,48 @@ +import DefaultTheme from "vitepress/theme"; +import { watch } from "vue"; +import { useData } from "vitepress"; +import type { App } from "vue"; +import TDesignMobile from "tdesign-mobile-vue"; +import TimiWebUI, { VPopup } from "timi-web"; + +// 必须引完整样式:`tdesign-mobile-vue/es/style/index.css` 只含全局 token, +// 不含任何组件类,全量注册时会导致所有组件无样式渲染。 +import "tdesign-mobile-vue/dist/tdesign.css"; +import "./styles/index.less"; + +import DemoPreview from "./containers/DemoPreview.vue"; +import ApiTable from "./components/ApiTable.vue"; + +/** + * 同步深色模式。 + * + * VitePress 通过 `html.dark` 切换深色,而 TDesign 依赖 `html[theme-mode="dark"]`, + * 两者不是同一套机制,不同步会导致深色模式下 TDesign 组件仍是亮色。 + */ +function syncThemeMode(dark: boolean) { + if (typeof document === "undefined") { + return; + } + document.documentElement.setAttribute("theme-mode", dark ? "dark" : "light"); +} + +export default { + extends: DefaultTheme, + + enhanceApp({ app }: { app: App }) { + // 全量注册 TDesign Mobile,演示区内所有 t-* 组件直接可用。 + app.use(TDesignMobile); + // 组件内部大量使用 timi-web 的 v-popup 指令,且用在组件模板里, + // 无法由演示局部注入,只能在主题里全局注册。 + app.use(TimiWebUI); + app.directive("popup", VPopup); + + app.component("demo-preview", DemoPreview); + app.component("api-table", ApiTable); + }, + + setup() { + const { isDark } = useData(); + watch(isDark, syncThemeMode, { immediate: true }); + } +}; diff --git a/docs/.vitepress/theme/styles/index.less b/docs/.vitepress/theme/styles/index.less new file mode 100644 index 0000000..7efd824 --- /dev/null +++ b/docs/.vitepress/theme/styles/index.less @@ -0,0 +1,18 @@ +/** + * 文档站全局样式。 + * + * 只处理 VitePress 正文与演示容器、API 表格的交界处; + * 组件自身的样式一律各自 scoped,避免相互污染。 + */ + +.vp-doc { + // 演示容器与正文的呼吸感 + .tui-demo { + margin: 1rem 0; + } + + // API 表格里的类型与默认值不换行,避免长签名把列挤变形 + table code { + white-space: nowrap; + } +} diff --git a/docs/components/ai-chat-composer.md b/docs/components/ai-chat-composer.md new file mode 100644 index 0000000..642f955 --- /dev/null +++ b/docs/components/ai-chat-composer.md @@ -0,0 +1,41 @@ +# AiChatComposer 输入框 + +对话输入框,按状态在发送、停止与重试之间切换。 + +## 基础用法 + +:::preview 基础用法 || 发送后进入生成态,2 秒后自动恢复,可观察按钮的三种形态 + +demo-preview=../demos/ai-chat-composer/basic.vue + +::: + +## 何时使用 + +需要单独摆放输入框时使用。多数情况下直接用 [AiChatPanel](/components/ai-chat-panel) 更省事。 + +## 三种按钮形态 + +| 状态 | 按钮 | +| --- | --- | +| 默认 | 发送(`sendText`) | +| `isGenerating` 为真 | 停止(`stopText`,危险色) | +| 有 `lastError` 且 `canRetry` | 错误条 + 重试(`retryText`) | + +生成中或 `disabled` 为真时输入框不可编辑,`send` 事件也不会抛出。 + +## 事件 + +- `send`:抛出**去除首尾空白后**的内容,抛完自动清空输入框;空内容不抛 +- `stop`:点停止按钮 +- `retry`:点错误条上的重试 + +输入框内容用 `v-model` 绑定,`maxLength` 默认 2000。 + +## 自定义插槽 + +`send`、`stop`、`error` 三个插槽可以替换对应区域的渲染,都带作用域参数(`disabled`、`onSend`、`onStop`、`error`、`canRetry`)。 + +## API + + diff --git a/docs/components/ai-chat-message-list.md b/docs/components/ai-chat-message-list.md new file mode 100644 index 0000000..359d9c3 --- /dev/null +++ b/docs/components/ai-chat-message-list.md @@ -0,0 +1,42 @@ +# AiChatMessageList 消息列表 + +渲染对话消息,含思考过程、引用与流式光标。 + +## 基础用法 + +:::preview 基础用法 || 消息里的 thinkingList 与 citationList 会渲染为思考过程与引用 + +demo-preview=../demos/ai-chat-message-list/basic.vue + +::: + +## 何时使用 + +需要单独控制消息区域的布局时使用。多数情况下直接用 [AiChatPanel](/components/ai-chat-panel) 更省事。 + +## 消息结构 + +每条消息是 `AiChatMessage`: + +| 字段 | 说明 | +| --- | --- | +| `id` | 唯一标识。 | +| `role` | `"user"` 或 `"assistant"`。 | +| `content` | 正文,按 Markdown 渲染。 | +| `thinkingList` | 思考分段,传给 `AiChatThinking` 展示。 | +| `citationList` | 引用信息。 | +| `createdAt` | 生成时间戳。 | +| `statusText` | 状态文案,如工具调用的当前步骤。 | +| `duration` | 本次生成耗时(毫秒)。 | + +## 角色文案 + +`roleNames` 覆盖默认的「助手 / 我」,需要更复杂的逻辑时用 `roleNameFormatter`。 + +## 插槽 + +`welcome`、`message`、`role-name`、`thinking`、`citation`、`message-status`、`assistant-icon`、`user-icon` 可以替换对应区域,都带作用域参数。 + +## API + + diff --git a/docs/components/ai-chat-panel.md b/docs/components/ai-chat-panel.md new file mode 100644 index 0000000..9928b13 --- /dev/null +++ b/docs/components/ai-chat-panel.md @@ -0,0 +1,70 @@ +# AiChatPanel 对话面板 + +把消息列表与输入框组装成完整对话界面,由业务侧驱动数据。 + +## 基础用法 + +:::preview 基础用法 || 回答由本地假流逐块吐出,可随时点「停止」 + +demo-preview=../demos/ai-chat-panel/basic.vue + +::: + +## 何时使用 + +需要一个开箱即用的对话界面时使用。面板本身是**纯展示组件**——它不发起请求、不维护会话,全部状态由外部传入。 + +## 与 useAiChat 接线 + +库提供了 `useAiChat` 组合式函数管理会话与流式消息,把它的返回值直接摊给面板即可: + +```vue + + + +``` + +`request` 需要返回一个 SSE 流式的 `Response`,其余能力(历史会话、错误文案、上下文切换)都通过 `useAiChat` 的可选配置注入,组件侧不用改。 + +## SSE 事件协议 + +`useAiChat` 内置了一套事件协议,`event:` 后跟事件名、`data:` 后跟 JSON 或纯文本: + +| 事件名(含别名) | 作用 | 载荷取值字段 | +| --- | --- | --- | +| `thinking` / `think` / `agent_thought` | 思考过程分段 | `thought`、`thinking`、`reasoning`、`observation`、`text`、`content` | +| `answer` / `message` / `text` | 回答正文增量 | `answer`、`text`、`content` | +| `tool-status` / `tool_status` | 工具调用状态 | `text`、`message`、`statusText`、`status` | +| `citation` / `source` | 引用信息 | `source`、`dataDomain`、`timeRange`、`caliber`、`generatedAt` | +| `done` / `finish` / `completed` | 生成结束 | `conversationId`、`duration` | +| `error` | 流内错误 | `message`、`code` | + +载荷是纯文本时会直接当作内容使用。协议不匹配时可以用 `parseEvent` 自行转换。 + +## 自定义 + +`welcome`、`composer`、`tool-status`、`message` 等插槽可以替换对应区域。`composer` 插槽会拿到 `draft`、`on-send`、`on-stop`、`on-retry` 等,便于接入自定义输入框。 + +## API + + diff --git a/docs/components/ai-chat-thinking.md b/docs/components/ai-chat-thinking.md new file mode 100644 index 0000000..3d79e07 --- /dev/null +++ b/docs/components/ai-chat-thinking.md @@ -0,0 +1,29 @@ +# AiChatThinking 思考过程 + +折叠展示模型的思考分段,生成中自动展开。 + +## 基础用法 + +:::preview 基础用法 || 逐段追加内容,生成中会自动滚到底部 + +demo-preview=../demos/ai-chat-thinking/basic.vue + +::: + +## 何时使用 + +需要把模型的推理过程单独呈现时使用,通常由 [AiChatMessageList](/components/ai-chat-message-list) 内部调用,也可以单独摆放。 + +## 行为 + +- `isGenerating` 为真时展开并跟随滚动到底部,结束后收起 +- 内容受 `max-height` 限制,超出时内部滚动 +- 容器带 `role="log"` 与 `aria-live="polite"`,屏幕阅读器会播报增量 + +## 与消息的关系 + +消息的 `thinkingList` 是一组分段(`{ id, content }`),[AiChatMessageList](/components/ai-chat-message-list) 会把它们拼成完整文本后传进来。 + +## API + + diff --git a/docs/components/article-editor.md b/docs/components/article-editor.md new file mode 100644 index 0000000..4a0ab30 --- /dev/null +++ b/docs/components/article-editor.md @@ -0,0 +1,41 @@ +# ArticleEditor 文章编辑器 + +以 `Article` 为数据模型,按正文类型切换纯文本、Markdown 与富文本三种编辑形态。 + +## 基础用法 + +:::preview 基础用法 || 切换正文类型会同时替换内容,提交时读取完整文章 + +demo-preview=../demos/article-editor/basic.vue + +::: + +## 何时使用 + +需要在一套表单里同时支持多种正文格式时使用。切换只改 `contentType`,上层不需要关心具体编辑器。 + +## 数据模型 + +组件只约束三个字段,其他字段会原样保留: + +| 字段 | 说明 | +| --- | --- | +| `contentType` | 正文类型,支持 `TEXT`、`MARKDOWN`、`TIP_TAP`(`TIPTAP` 为兼容写法)。 | +| `content` | 正文内容,随类型分别是纯文本、Markdown 源码或 HTML。 | +| `attachmentList` | 附件列表,元素至少包含 `id`、`name`、`url`。 | + +## 附件与媒体 + +`uploadImage`、`uploadVideo` 负责上传,`resolveAttachmentUrl`、`resolveTempUrl` 负责把附件标识换成可访问地址。四个回调都可选,不传时对应能力自动降级。 + +## 提交内容 + +编辑过程中抛出的是实时值,提交时建议调用 `submit()`,它会等待富文本里未完成的上传再返回最终数据: + +```ts +const article = await editorRef.value?.submit(); +``` + +## API + + diff --git a/docs/components/article-view.md b/docs/components/article-view.md new file mode 100644 index 0000000..a615677 --- /dev/null +++ b/docs/components/article-view.md @@ -0,0 +1,29 @@ +# ArticleView 文章视图 + +按 `Article` 的正文类型渲染正文内容。 + +## 基础用法 + +:::preview 基础用法 || 把 contentType 换成 TEXT 或 MARKDOWN 会切换渲染分支 + +demo-preview=../demos/article-view/basic.vue + +::: + +## 何时使用 + +需要在详情页只读展示文章正文时使用,与 `ArticleEditor` 共用同一套数据类型。 + +## 渲染分支 + +| contentType | 渲染方式 | +| --- | --- | +| `TEXT` | 只读文本域。 | +| `MARKDOWN` | 由 timi-web 的 MarkdownView 渲染。 | +| `TIP_TAP` | 由 [TiptapView](/components/tiptap-view) 渲染。 | + +内容为空时统一显示 `emptyText`。 + +## API + + diff --git a/docs/components/bottom-popup.md b/docs/components/bottom-popup.md new file mode 100644 index 0000000..53b46df --- /dev/null +++ b/docs/components/bottom-popup.md @@ -0,0 +1,37 @@ +# BottomPopup 底部弹层 + +从底部升起的操作面板,可带标题与左右按钮。 + +## 基础用法 + +:::preview 基础用法 || 弹层从视口底部升起,标题栏在内容滚动时吸顶 + +demo-preview=../demos/bottom-popup/basic.vue + +::: + +## 何时使用 + +需要在移动端承载一组操作或一段表单时使用。它基于 TDesign Mobile 的 `Popup`,因此遮罩、层级与动画都沿用框架行为。 + +## 按钮只抛事件 + +左右按钮**不会自动关闭弹层**,只抛出 `leftButtonClick` / `rightButtonClick`,关闭与否由业务决定: + +```vue + +``` + +按钮文案传空字符串即可隐藏对应按钮;也可以分别用 `leftButton` / `rightButton` 插槽完全接管,插槽会收到 `onClick`。 + +## 高度 + +`height` 默认 `"auto"`,按内容撑开;传具体值(如 `"60vh"`)时内容区滚动、标题栏吸顶。 + +## API + + diff --git a/docs/components/code-editor.md b/docs/components/code-editor.md new file mode 100644 index 0000000..52524fd --- /dev/null +++ b/docs/components/code-editor.md @@ -0,0 +1,36 @@ +# CodeEditor 代码编辑器 + +带行号、语法高亮与查找替换的代码输入框。 + +## 基础用法 + +:::preview 基础用法 || 通过 v-model 绑定内容,实例暴露 openSearch 等方法 + +demo-preview=../demos/code-editor/basic.vue + +::: + +## 何时使用 + +需要让用户输入或查看结构化代码时使用。它不做代码校验,只负责输入、高亮与检索。 + +## 内容绑定 + +`modelValue` 与 `value` 都可作为输入源,`value` 优先级更高。输入时同步抛出 `update:modelValue` 与 `change`。 + +## 实例方法 + +通过模板引用调用暴露的方法,例如打开查找栏: + +```ts +import type { CodeEditorExpose } from "timi-tdesign-mobile"; + +const editorRef = ref(); +editorRef.value?.openSearch(true); +``` + +移动端受限于宽度,代码行会横向滚动而不是折行。 + +## API + + diff --git a/docs/components/duration-picker.md b/docs/components/duration-picker.md new file mode 100644 index 0000000..4e85648 --- /dev/null +++ b/docs/components/duration-picker.md @@ -0,0 +1,42 @@ +# DurationPicker 时长选择 + +按时长值选择并回填,单位与候选项由组件内部推导。 + +## 基础用法 + +:::preview 基础用法 || 选择后回填的是毫秒数 + +demo-preview=../demos/duration-picker/basic.vue + +::: + +## 何时使用 + +需要让用户选择一个时间跨度(缓存有效期、超时时长等)时使用。对外只暴露毫秒值,单位换算是内部细节。 + +## 取值与单位 + +`modelValue` 是**毫秒数**。组件内置了年 / 天 / 小时 / 分钟 / 秒 / 毫秒六个单位,各自带有取值范围与步长: + +| 单位 | 范围 | 步长 | +| --- | --- | --- | +| 年 | 1 - 100 | 1 | +| 天 | 1 - 364 | 1 | +| 小时 | 1 - 23 | 1 | +| 分钟 | 1 - 59 | 1 | +| 秒 | 1 - 59 | 1 | +| 毫秒 | 50 - 950 | 50 | + +默认值为 1000 毫秒(1 秒)。 + +## 两个事件 + +`update:modelValue` 在滚动选择时触发,`change` 在确认选择时触发: + +```vue + +``` + +## API + + diff --git a/docs/components/index.md b/docs/components/index.md new file mode 100644 index 0000000..527e76c --- /dev/null +++ b/docs/components/index.md @@ -0,0 +1,38 @@ +# 组件总览 + +共 15 个组件,分为布局、编辑器、交互与 AI 对话四类。 + +## 布局组件 + +| 组件 | 说明 | +| --- | --- | +| [RootLayout](/components/root-layout) | 移动端页面骨架,主体内容之外自动渲染版权与备案信息。 | +| [Space](/components/space) | 控制子元素之间的间距与排列方向,支持分隔符。 | + +## 编辑器组件 + +| 组件 | 说明 | +| --- | --- | +| [CodeEditor](/components/code-editor) | 带行号、语法高亮与查找替换的代码输入框。 | +| [TiptapEditor](/components/tiptap-editor) | 基于 Tiptap 的富文本编辑器,工具栏覆盖媒体、表格、链接与代码块。 | +| [TiptapView](/components/tiptap-view) | Tiptap 内容的只读渲染视图,与编辑器共用同一套样式。 | +| [ArticleEditor](/components/article-editor) | 以 Article 为数据模型,按正文类型切换纯文本、Markdown 与富文本编辑。 | +| [ArticleView](/components/article-view) | 按 Article 的正文类型渲染正文与附件列表。 | +| [NotifyEditor](/components/notify-editor) | 以 NotifyDetail 为数据模型的通知编辑表单,复用文章编辑器能力。 | +| [NotifyView](/components/notify-view) | 渲染通知的正文内容。 | + +## 交互组件 + +| 组件 | 说明 | +| --- | --- | +| [BottomPopup](/components/bottom-popup) | 从底部升起的操作面板,可带标题与左右按钮。 | +| [DurationPicker](/components/duration-picker) | 按时长值选择并回填,单位与候选项由组件内部推导。 | + +## AI 对话组件 + +| 组件 | 说明 | +| --- | --- | +| [AiChatPanel](/components/ai-chat-panel) | 把消息列表与输入框组装成完整对话界面,由业务侧驱动数据。 | +| [AiChatMessageList](/components/ai-chat-message-list) | 渲染对话消息,含思考过程、引用与流式光标。 | +| [AiChatComposer](/components/ai-chat-composer) | 对话输入框,按状态在发送、停止与重试之间切换。 | +| [AiChatThinking](/components/ai-chat-thinking) | 折叠展示模型的思考分段,生成中自动展开。 | diff --git a/docs/components/notify-editor.md b/docs/components/notify-editor.md new file mode 100644 index 0000000..906590f --- /dev/null +++ b/docs/components/notify-editor.md @@ -0,0 +1,37 @@ +# NotifyEditor 通知编辑器 + +以 `NotifyDetail` 为数据模型的通知编辑表单,正文部分复用文章编辑器。 + +## 基础用法 + +:::preview 基础用法 || 通知复用文章编辑器,同时保留主题等自有字段 + +demo-preview=../demos/notify-editor/basic.vue + +::: + +## 何时使用 + +需要编辑系统通知、站内信等内容时使用。通知与文章的差别只在元数据,正文能力完全一致。 + +## 数据模型 + +`NotifyDetail` 只约束正文相关字段,主题、状态等业务字段由外层维护并原样保留: + +| 字段 | 说明 | +| --- | --- | +| `content` | 正文内容。 | +| `contentType` | 正文类型,支持 `TEXT`、`TIP_TAP`。 | +| `attachmentList` | 附件列表。 | + +## 提交内容 + +```ts +const detail = await editorRef.value?.submit(); +``` + +与文章编辑器一致,`submit()` 会等待未完成的媒体上传。 + +## API + + diff --git a/docs/components/notify-view.md b/docs/components/notify-view.md new file mode 100644 index 0000000..18845dd --- /dev/null +++ b/docs/components/notify-view.md @@ -0,0 +1,19 @@ +# NotifyView 通知视图 + +渲染通知的正文内容,是 `ArticleView` 在通知场景下的薄封装。 + +## 基础用法 + +:::preview 基础用法 || 传入 NotifyDetail 即可渲染正文 + +demo-preview=../demos/notify-view/basic.vue + +::: + +## 何时使用 + +需要在通知详情页只读展示正文时使用。主题、状态等元数据由业务页面自行呈现,组件只负责正文。 + +## API + + diff --git a/docs/components/root-layout.md b/docs/components/root-layout.md new file mode 100644 index 0000000..642a0f4 --- /dev/null +++ b/docs/components/root-layout.md @@ -0,0 +1,23 @@ +# RootLayout 根布局 + +移动端页面骨架,主体内容之外自动渲染版权与备案信息。 + +## 基础用法 + +:::preview 基础用法 || 插槽填充主体内容,底部版权区在窄屏下自适应 + +demo-preview=../demos/root-layout/basic.vue + +::: + +## 何时使用 + +需要一套带页脚版权信息的整页容器时使用。它只负责骨架与页脚,不含导航栏,业务可以自行组合。 + +## 版权区 + +底部由 timi-web 的 `Copyright` 组件渲染,`icp` 会链接到工信部网站,`domain` 与 `author` 同时传入时才渲染版权行。 + +## API + + diff --git a/docs/components/space.md b/docs/components/space.md new file mode 100644 index 0000000..54b6d0f --- /dev/null +++ b/docs/components/space.md @@ -0,0 +1,33 @@ +# Space 间距 + +控制子元素之间的间距与排列方向,支持分隔符。 + +## 基础用法 + +:::preview 基础用法 || 尺寸可用预设名或具体数值,数组形式分别指定横向与纵向 + +demo-preview=../demos/space/basic.vue + +::: + +## 何时使用 + +需要给一组元素之间加统一间距时使用。相比手写 `margin`,它把间距收敛到一个属性上,调整时不必逐个改样式。 + +## 尺寸 + +`size` 接受三种写法: + +| 写法 | 说明 | +| --- | --- | +| `"small"` / `"medium"` / `"large"` | 预设值,分别为 8 / 16 / 24 像素 | +| 数字或带单位的字符串 | 自定义间距,如 `12`、`"1.5rem"` | +| 数组 | 依次表示横向与纵向间距 | + +## 分隔符 + +`separator` 或 `separator` 插槽会在相邻元素之间插入内容,注意**末尾元素之后不会插入**。 + +## API + + diff --git a/docs/components/tiptap-editor.md b/docs/components/tiptap-editor.md new file mode 100644 index 0000000..54385fc --- /dev/null +++ b/docs/components/tiptap-editor.md @@ -0,0 +1,37 @@ +# TiptapEditor 富文本编辑器 + +基于 Tiptap 的富文本编辑器,工具栏覆盖媒体、表格、链接与代码块。 + +## 基础用法 + +:::preview 基础用法 || 工具栏按移动端宽度自动换行排列 + +demo-preview=../demos/tiptap-editor/basic.vue + +::: + +## 何时使用 + +需要所见即所得的正文编辑时使用。内容以 HTML 字符串双向绑定,可直接入库。 + +## 媒体上传 + +图片与视频通过 `uploadImage`、`uploadVideo` 回调上传,组件不绑定具体接口。拖拽或粘贴文件时会先插入占位内容,上传成功后替换为真实地址。 + +未完成的媒体会在提交时统一处理,`getPendingMediaCount()` 可查询待处理数量。 + +## 提交内容 + +编辑过程中的 `v-model` 是实时值,提交时建议调用 `submit()` 以等待未完成的上传并归一化内容: + +```ts +const html = await editorRef.value?.submit(); +``` + +## 移动端差异 + +工具栏按钮在窄屏下换行排列而不是收进折叠菜单,`v-popup` 提示在触屏下不可用,按钮已带文字或图标语义。 + +## API + + diff --git a/docs/components/tiptap-view.md b/docs/components/tiptap-view.md new file mode 100644 index 0000000..7e2315f --- /dev/null +++ b/docs/components/tiptap-view.md @@ -0,0 +1,23 @@ +# TiptapView 富文本视图 + +Tiptap 内容的只读渲染视图,与编辑器共用同一套样式与扩展。 + +## 基础用法 + +:::preview 基础用法 || 超出 maxHeight 时可滚动查看 + +demo-preview=../demos/tiptap-view/basic.vue + +::: + +## 何时使用 + +需要在详情页、审批流等只读场景渲染富文本时使用。相比直接 `v-html`,它复用了编辑器的扩展与样式,展示与编辑效果一致。 + +## 空内容 + +内容为空或规范化后为空字符串时,渲染 `emptyText` 占位文案而不是空白区域。 + +## API + + diff --git a/docs/demos/ai-chat-composer/basic.vue b/docs/demos/ai-chat-composer/basic.vue new file mode 100644 index 0000000..8ec6c0a --- /dev/null +++ b/docs/demos/ai-chat-composer/basic.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/docs/demos/ai-chat-message-list/basic.vue b/docs/demos/ai-chat-message-list/basic.vue new file mode 100644 index 0000000..1c5cd41 --- /dev/null +++ b/docs/demos/ai-chat-message-list/basic.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/docs/demos/ai-chat-panel/basic.vue b/docs/demos/ai-chat-panel/basic.vue new file mode 100644 index 0000000..8a00999 --- /dev/null +++ b/docs/demos/ai-chat-panel/basic.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/docs/demos/ai-chat-thinking/basic.vue b/docs/demos/ai-chat-thinking/basic.vue new file mode 100644 index 0000000..5c29f9a --- /dev/null +++ b/docs/demos/ai-chat-thinking/basic.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/docs/demos/ai/mock-sse.ts b/docs/demos/ai/mock-sse.ts new file mode 100644 index 0000000..b020b82 --- /dev/null +++ b/docs/demos/ai/mock-sse.ts @@ -0,0 +1,93 @@ +/** + * 演示专用的假 SSE 流。 + * + * `useAiChat` 要求 `request` 返回一个 `Response`,真实的实现由后端提供。 + * 这里用 ReadableStream 按内置协议逐条吐出事件,让文档站无需后端也能跑通 + * 流式对话的完整链路。 + * + * 内置协议的事件名与载荷字段(见 `parseDefaultEvent` / `extractText` 等): + * - `thinking` 载荷取 `thought` / `thinking` / `reasoning` + * - `answer` 载荷取 `answer` / `text` / `content` + * - `tool-status` 载荷取 `text` / `message` / `status` + * - `citation` 载荷为引用对象 + * - `done` 载荷可带 `conversationId` 与 `duration` + */ + +/** 单条 SSE 事件。 */ +interface MockEvent { + event: string; + data: Record; +} + +/** 每个事件之间的间隔,模拟真实的流式节奏。 */ +const STEP_DELAY = 420; + +function buildEvents(question: string): MockEvent[] { + return [ + { event: "thinking", data: { thought: `先理解问题:「${question}」` } }, + { event: "thinking", data: { thought: "然后确认需要的数据口径与时间范围。" } }, + { event: "tool-status", data: { text: "正在查询数据" } }, + { event: "answer", data: { text: "根据当前口径," } }, + { event: "answer", data: { text: `关于「${question}」的结论如下:` } }, + { event: "answer", data: { text: "\n\n- 近 30 天整体**环比上升 12%**" } }, + { event: "answer", data: { text: "\n- 其中移动端贡献了主要增量" } }, + { event: "citation", data: { source: "分析中心", dataDomain: "订单域", timeRange: "近 30 天" } }, + { event: "done", data: { conversationId: "demo-conversation", duration: STEP_DELAY * 9 } } + ]; +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +/** + * 生成一段假的流式回复。 + * + * @param question 用户提问,会回显在回答里 + * @param signal 取消信号,用户点「停止」时中断 + */ +export function createMockReply(question: string, signal?: AbortSignal): Response { + const encoder = new TextEncoder(); + const events = buildEvents(question); + let index = 0; + + const stream = new ReadableStream({ + async pull(controller) { + if (signal?.aborted) { + controller.error(new DOMException("已停止生成", "AbortError")); + return; + } + if (index >= events.length) { + controller.close(); + return; + } + const item = events[index]; + index += 1; + controller.enqueue(encoder.encode(`event: ${item.event}\ndata: ${JSON.stringify(item.data)}\n\n`)); + await sleep(STEP_DELAY); + } + }); + + return new Response(stream, { + headers: { "Content-Type": "text/event-stream" } + }); +} + +/** 构造一条用于静态展示的消息。 */ +export function createMessage( + id: number, + role: "user" | "assistant", + content: string, + extra: Partial<{ thinkingList: Array<{ id: number; content: string }>; citationList: unknown[] }> = {} +) { + return { + id, + role, + content, + thinkingList: extra.thinkingList ?? [], + citationList: extra.citationList ?? [], + createdAt: Date.now() - (10 - id) * 60_000, + statusText: "", + duration: role === "assistant" ? 2400 : undefined + }; +} diff --git a/docs/demos/article-editor/basic.vue b/docs/demos/article-editor/basic.vue new file mode 100644 index 0000000..b635861 --- /dev/null +++ b/docs/demos/article-editor/basic.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/docs/demos/article-view/basic.vue b/docs/demos/article-view/basic.vue new file mode 100644 index 0000000..be374f3 --- /dev/null +++ b/docs/demos/article-view/basic.vue @@ -0,0 +1,20 @@ + + + diff --git a/docs/demos/bottom-popup/basic.vue b/docs/demos/bottom-popup/basic.vue new file mode 100644 index 0000000..757433e --- /dev/null +++ b/docs/demos/bottom-popup/basic.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/docs/demos/code-editor/basic.vue b/docs/demos/code-editor/basic.vue new file mode 100644 index 0000000..5e6904d --- /dev/null +++ b/docs/demos/code-editor/basic.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/docs/demos/duration-picker/basic.vue b/docs/demos/duration-picker/basic.vue new file mode 100644 index 0000000..4a22056 --- /dev/null +++ b/docs/demos/duration-picker/basic.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/docs/demos/notify-editor/basic.vue b/docs/demos/notify-editor/basic.vue new file mode 100644 index 0000000..b8ee7e1 --- /dev/null +++ b/docs/demos/notify-editor/basic.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/docs/demos/notify-view/basic.vue b/docs/demos/notify-view/basic.vue new file mode 100644 index 0000000..3f0bb00 --- /dev/null +++ b/docs/demos/notify-view/basic.vue @@ -0,0 +1,19 @@ + + + diff --git a/docs/demos/root-layout/basic.vue b/docs/demos/root-layout/basic.vue new file mode 100644 index 0000000..32f3eb6 --- /dev/null +++ b/docs/demos/root-layout/basic.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/docs/demos/scenarios/ai.vue b/docs/demos/scenarios/ai.vue new file mode 100644 index 0000000..fc22ea7 --- /dev/null +++ b/docs/demos/scenarios/ai.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/docs/demos/scenarios/article.vue b/docs/demos/scenarios/article.vue new file mode 100644 index 0000000..f898e2b --- /dev/null +++ b/docs/demos/scenarios/article.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/docs/demos/scenarios/editor.vue b/docs/demos/scenarios/editor.vue new file mode 100644 index 0000000..e6053a2 --- /dev/null +++ b/docs/demos/scenarios/editor.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/docs/demos/scenarios/mobile.vue b/docs/demos/scenarios/mobile.vue new file mode 100644 index 0000000..a6a0c0a --- /dev/null +++ b/docs/demos/scenarios/mobile.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/docs/demos/scenarios/notify.vue b/docs/demos/scenarios/notify.vue new file mode 100644 index 0000000..d99d8cd --- /dev/null +++ b/docs/demos/scenarios/notify.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/docs/demos/space/basic.vue b/docs/demos/space/basic.vue new file mode 100644 index 0000000..acdf5e3 --- /dev/null +++ b/docs/demos/space/basic.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/docs/demos/tiptap-editor/basic.vue b/docs/demos/tiptap-editor/basic.vue new file mode 100644 index 0000000..d56ca7a --- /dev/null +++ b/docs/demos/tiptap-editor/basic.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/docs/demos/tiptap-view/basic.vue b/docs/demos/tiptap-view/basic.vue new file mode 100644 index 0000000..20b4e29 --- /dev/null +++ b/docs/demos/tiptap-view/basic.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/docs/guide/demo.md b/docs/guide/demo.md new file mode 100644 index 0000000..f8bf3b6 --- /dev/null +++ b/docs/guide/demo.md @@ -0,0 +1,122 @@ +# 演示与文档约定 + +本站的演示与 API 文档都由源码驱动,新增组件时只需按下面的顺序补齐三处内容。 + +## 目录结构 + +```text +docs/ +├── .vitepress/ +│ ├── components.ts # 组件元数据清单(唯一数据源) +│ ├── config.ts # 站点配置、侧边栏、markdown 插件 +│ ├── plugins/ +│ │ ├── docgen.ts # vue-docgen-api 解析,产出虚拟模块 +│ │ └── ssr-stub.ts # SSR 阶段替换 timi-web +│ └── theme/ +│ ├── index.ts # 主题入口,注册 TDesign Mobile 与自定义组件 +│ ├── containers/ # :::preview 的预览容器 +│ └── components/ # api-table 等文档组件 +├── demos/ # 演示组件,按组件名分目录 +│ ├── ai/ # AI 演示共用的假流 +│ └── scenarios/ # 跨组件的组合场景演示 +├── components/ # 组件文档页 +└── scenarios/ # 组合场景文档页 +``` + +单组件文档只回答「这个组件怎么用」,跨组件的协作方式放在 `scenarios/` 下。 + +## 新增一个组件 + +### 1. 登记元数据 + +在 `docs/.vitepress/components.ts` 的 `COMPONENT_LIST` 中追加一项。侧边栏导航、API 数据解析都从这里读取: + +```ts +{ + name: "CodeEditor", // 必须与组件 defineOptions 的 name 一致 + title: "CodeEditor 代码编辑器", + description: "带行号、语法高亮与查找替换的代码输入框。", + category: "编辑器组件", + entry: "src/components/code-editor/index.vue" +} +``` + +### 2. 编写演示 + +演示组件放在 `docs/demos/<文档路径>/` 下。演示直接引用 `src` 源码,改组件会即时热更新: + +```vue + + + +``` + +### 3. 编写文档页 + +在 `docs/components/` 下建立同名 markdown,用 `:::preview` 容器引用演示: + +````md +# CodeEditor 代码编辑器 + +带行号、语法高亮与查找替换的代码输入框。 + +## 基础用法 + +:::preview 基础用法 || 通过 v-model 双向绑定内容 + +demo-preview=../demos/code-editor/basic.vue + +::: + +## API + + +```` + +路径以 markdown 文件所在位置为基准,因此 `docs/components/` 下的页面统一使用 `../demos/`。 + +## 文档路径的来历 + +`index.vue` 取所在**目录名**,具名文件取**文件名**——`ai` 目录下有多个组件,只靠目录名会全部撞成 `ai`。两者都会再转成短横线形式,`AiChatComposer` 得到 `ai-chat-composer`。需要特殊路径时用元数据里的 `slug` 覆盖。 + +## API 表从哪来 + +`` 的数据由 `vue-docgen-api` 在构建期解析组件源码得到,通过虚拟模块 `virtual:timi-api` 交给页面渲染。因此不需要手写 props / events / slots 表格,改源码后文档自动更新。 + +想让说明出现在表里,就在 props 类型上写 JSDoc 注释: + +```ts +const props = withDefaults(defineProps<{ + /** 距离底部小于等于该值时触发 */ + distance?: number; +}>(), { + distance: 120 +}); +``` + +某个组件解析失败时只会让该组件的 API 区降级为空,不会影响整站构建;构建日志里会打出对应的组件名。 + +## 演示统一放在手机视口里 + +这是移动端组件库,按桌面宽度铺开会失去真实形态。容器把演示收在 `26rem` 宽的视口内,宽度可以通过 CSS 变量调整: + +```less +.tui-demo { + --tui-demo-viewport: 30rem; +} +``` + +需要全宽的演示(如整页骨架)可以在自己的样式里覆盖这个变量。 + +## 关于 SSR + +`timi-web` 的构建产物在模块顶层访问 `window`,无法在 Node 中加载,而主题必须静态引入它来注册 `v-popup` 指令。因此 SSR 阶段由 `ssr-stub.ts` 提供空实现。 + +演示组件本身以 `clientOnly` 延迟渲染,不需要额外处理 SSR,但也别把它当作服务端渲染能力的验证。 diff --git a/docs/guide/index.md b/docs/guide/index.md new file mode 100644 index 0000000..b372573 --- /dev/null +++ b/docs/guide/index.md @@ -0,0 +1,102 @@ +# 快速开始 + +`timi-tdesign-mobile` 是面向移动端的 Vue 3 业务组件库,底层复用 `timi-web` 的编辑器与内容渲染能力,UI 基于 TDesign Mobile。 + +## 安装 + +```sh +pnpm add timi-tdesign-mobile tdesign-mobile-vue +``` + +## 按需引入 + +组件在 ` + + +``` + +## 全局注册 + +每个组件都带有 `install` 方法,可以单独注册为全局组件: + +```ts +import { createApp } from "vue"; +import { CodeEditor, TiptapEditor } from "timi-tdesign-mobile"; + +const app = createApp(App); +app.use(CodeEditor); +app.use(TiptapEditor); +``` + +## 必须注册 v-popup 指令 + +富文本工具栏等组件内部使用了 `timi-web` 的 `v-popup` 指令,且用在组件模板里,宿主的应用入口需要注册一次: + +```ts +import TimiWebUI, { VPopup } from "timi-web"; + +app.use(TimiWebUI); +app.directive("popup", VPopup); +``` + +漏掉这一步不会报错,但工具栏的悬停提示会静默失效。 + +## 引入样式 + +```ts +import "timi-tdesign-mobile/style.css"; +``` + +该样式入口已包含 TDesign 定制与编辑器正文样式,`timi-web` 的样式也会一并带入。 + +**另外还需要引入 TDesign Mobile 自己的样式**,注意要引完整包而不是 `es/style/index.css`——后者只含全局 token,不含任何组件类: + +```ts +import "tdesign-mobile-vue/dist/tdesign.css"; +``` + +## 数据与回调 + +文章、通知类组件只约束对象的最小字段,业务对象上的其他字段会原样保留。上传与附件地址通过回调注入,库本身不绑定任何接口实现: + +```vue + +``` + +没有附件上传需求时,可以不传上传回调。 + +## AI 对话 + +对话能力由 `useAiChat` 组合式函数提供,组件只负责渲染: + +```ts +import { useAiChat } from "timi-tdesign-mobile"; + +const { messages, isGenerating, sendMessage } = useAiChat({ + request: ({ message, signal }) => fetchSseReply(message, signal) +}); +``` + +详见 [AiChatPanel](/components/ai-chat-panel) 与 [AI 对话场景](/scenarios/ai)。 + +## 下一步 + +- 在[组件总览](/components/)中浏览全部组件 +- 看[编辑器能力总览](/scenarios/editor)等场景,了解多个组件如何协作 +- 了解本站的[演示与文档约定](/guide/demo),向文档站补充新组件 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c4eb9aa --- /dev/null +++ b/docs/index.md @@ -0,0 +1,23 @@ +--- +layout: home + +hero: + name: timi-tdesign-mobile + text: 移动端 TDesign 组件库 + tagline: 15 个业务组件,配套可交互演示与由源码自动生成的 API 文档 + actions: + - theme: brand + text: 快速开始 + link: /guide/ + - theme: alt + text: 浏览组件 + link: /components/ + +features: + - title: 真实可交互 + details: 演示直接运行 src 源码而非静态截图,改动组件源码后文档即时热更新。 + - title: 手机视口呈现 + details: 演示统一放在移动端宽度的视口里,避免移动组件被桌面宽度拉伸失真。 + - title: API 自动生成 + details: 由 vue-docgen-api 在构建期解析组件源码提取 props、events、slots 与 expose,文档与代码不会脱节。 +--- diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..004653d --- /dev/null +++ b/docs/package.json @@ -0,0 +1,27 @@ +{ + "name": "timi-tdesign-mobile-docs", + "private": true, + "version": "0.0.1", + "type": "module", + "description": "timi-tdesign-mobile 组件演示与 API 文档站", + "scripts": { + "dev": "vitepress dev .", + "build": "vitepress build .", + "preview": "vitepress preview ." + }, + "dependencies": { + "tdesign-mobile-vue": "^1.13.2", + "timi-web": "link:E:/WebProject/timi-web", + "vue": "^3.5.26" + }, + "devDependencies": { + "@types/node": "^25.0.8", + "@vitepress-demo-preview/plugin": "^1.4.1", + "less": "^4.5.1", + "markdown-it-container": "^3.0.0", + "typescript": "^5.9.3", + "unplugin-auto-import": "^21.0.0", + "vitepress": "^1.6.4", + "vue-docgen-api": "^4.79.2" + } +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 0000000..72a6f6e --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,2845 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + tdesign-mobile-vue: + specifier: ^1.13.2 + version: 1.16.2(vue@3.5.43(typescript@5.9.3)) + timi-web: + specifier: link:E:/WebProject/timi-web + version: link:../../timi-web + vue: + specifier: ^3.5.26 + version: 3.5.43(typescript@5.9.3) + devDependencies: + '@types/node': + specifier: ^25.0.8 + version: 25.9.8 + '@vitepress-demo-preview/plugin': + specifier: ^1.4.1 + version: 1.4.1(markdown-it-container@3.0.0)(vitepress@1.6.4(@algolia/client-search@5.59.0)(@types/node@25.9.8)(less@4.9.1)(postcss@8.5.28)(search-insights@2.17.3)(typescript@5.9.3))(vue@3.5.43(typescript@5.9.3)) + less: + specifier: ^4.5.1 + version: 4.9.1 + markdown-it-container: + specifier: ^3.0.0 + version: 3.0.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unplugin-auto-import: + specifier: ^21.0.0 + version: 21.1.0(@vueuse/core@12.8.2(typescript@5.9.3))(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)) + vitepress: + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.59.0)(@types/node@25.9.8)(less@4.9.1)(postcss@8.5.28)(search-insights@2.17.3)(typescript@5.9.3) + vue-docgen-api: + specifier: ^4.79.2 + version: 4.79.2(vue@3.5.43(typescript@5.9.3)) + +packages: + + '@algolia/abtesting@1.25.0': + resolution: {integrity: sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.59.0': + resolution: {integrity: sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.59.0': + resolution: {integrity: sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.59.0': + resolution: {integrity: sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.59.0': + resolution: {integrity: sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.59.0': + resolution: {integrity: sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.59.0': + resolution: {integrity: sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.59.0': + resolution: {integrity: sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.59.0': + resolution: {integrity: sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.59.0': + resolution: {integrity: sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.59.0': + resolution: {integrity: sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.59.0': + resolution: {integrity: sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.59.0': + resolution: {integrity: sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.59.0': + resolution: {integrity: sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA==} + engines: {node: '>= 14.0.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@flypeng/tool@5.7.5': + resolution: {integrity: sha512-3/TMouPSQiKcvV4sL/Jog20codkmEObYr0Pn4xJl6J+XEyb1rN/HqaQve2Kv5GhsbBC4s7YSlGcmOCC9CgH9aA==} + + '@iconify-json/simple-icons@1.2.97': + resolution: {integrity: sha512-Z6PmM6jvWVU7rmLzqbxCLJA7SeqCnK6lMHXtjyzHPLZebwuoojBEcHHycppahDzEeN9xujRkrV5J8QpOhMyNrg==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-android-arm-eabi@4.63.4': + resolution: {integrity: sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.63.4': + resolution: {integrity: sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.63.4': + resolution: {integrity: sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.63.4': + resolution: {integrity: sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.63.4': + resolution: {integrity: sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.63.4': + resolution: {integrity: sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': + resolution: {integrity: sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.63.4': + resolution: {integrity: sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.63.4': + resolution: {integrity: sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.63.4': + resolution: {integrity: sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.63.4': + resolution: {integrity: sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.63.4': + resolution: {integrity: sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.63.4': + resolution: {integrity: sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.63.4': + resolution: {integrity: sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.63.4': + resolution: {integrity: sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.63.4': + resolution: {integrity: sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.63.4': + resolution: {integrity: sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.63.4': + resolution: {integrity: sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.63.4': + resolution: {integrity: sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.63.4': + resolution: {integrity: sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.63.4': + resolution: {integrity: sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.63.4': + resolution: {integrity: sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.63.4': + resolution: {integrity: sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.63.4': + resolution: {integrity: sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.63.4': + resolution: {integrity: sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==} + cpu: [x64] + os: [win32] + + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.2.0': + resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@25.9.8': + resolution: {integrity: sha512-VfMrScDmMhUJQmd5hArdQnFvK0OIeD36uN2Va1FcpYaLB/BgkgM8Ulc50XtYISPMz7APJ30+N0T5EM0jlcdfRw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + + '@use-gesture/core@10.3.1': + resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + + '@use-gesture/vanilla@10.3.1': + resolution: {integrity: sha512-lT4scGLu59ovA3zmtUonukAGcA0AdOOh+iwNDS05Bsu7Lq9aZToDHhI6D8Q2qvsVraovtsLLYwPrWdG/noMAKw==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vitepress-demo-preview/plugin@1.4.1': + resolution: {integrity: sha512-RYmEieW2URgxw276ztlQfvGeyXjErx0ZyebNUQAFPINXFKdn58b228QqpvwGnsiy0WMxOTUgdH9KUHdX5cfA9w==} + peerDependencies: + markdown-it-container: ^3.0.0 + vitepress: '*' + vue: ^3.2.0 + + '@vue/compiler-core@3.5.43': + resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} + + '@vue/compiler-dom@3.5.43': + resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} + + '@vue/compiler-sfc@3.5.43': + resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} + + '@vue/compiler-ssr@3.5.43': + resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} + + '@vue/devtools-api@7.7.10': + resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} + + '@vue/devtools-kit@7.7.10': + resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} + + '@vue/devtools-shared@7.7.10': + resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} + + '@vue/reactivity@3.5.43': + resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} + + '@vue/runtime-core@3.5.43': + resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} + + '@vue/runtime-dom@3.5.43': + resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} + + '@vue/server-renderer@3.5.43': + resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} + + '@vue/shared@3.5.43': + resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} + + '@vueuse/core@10.7.0': + resolution: {integrity: sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.7.0': + resolution: {integrity: sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==} + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@10.7.0': + resolution: {integrity: sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + algoliasearch@5.59.0: + resolution: {integrity: sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw==} + engines: {node: '>= 14.0.0'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + + ast-types@0.16.3: + resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} + engines: {node: '>=4'} + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + copy-anything@4.1.1: + resolution: {integrity: sha512-AoT6Imdr98feSpFfmFwTFN73ccdr7uFPf27cBCgYvyyRyn1BzLRxMvrHNmwXO5LJMddRy4Rdhw2b1h7vSMKsEw==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-resolve@1.0.11: + resolution: {integrity: sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-to-image@1.11.13: + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} + engines: {node: '>= 0.4'} + + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + + less@4.9.1: + resolution: {integrity: sha512-orp15PfJvvNDIqJdVWzMI9Sjpjp3VTiw3sfvbB+67LlISTEn8uVT2EdYSuyl02BLvaftv6sdk9Umnxmm5rckmg==} + engines: {node: '>=18'} + hasBin: true + + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.4.1: + resolution: {integrity: sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==} + + make-dir@5.1.0: + resolution: {integrity: sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==} + engines: {node: '>=18'} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-it-container@3.0.0: + resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} + + markdown-it@14.3.2: + resolution: {integrity: sha512-sHHjZ5fJKlgrG4qns2YwVcdNep35h5fERrfkD2YNsb9UFk0UIHarbiTaHKVMlPuWAoiilyK8Fv/jAm11slsY7Q==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdurl@2.1.0: + resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} + engines: {node: '>= 4.4.x'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.3: + resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + + probe-image-size@7.4.0: + resolution: {integrity: sha512-cdEprVtZxV+awMde9X+4jILBFYh4CARxVrQaMl4wY4YcPWbul9jntXrIW95NInBDyJwcVUP3U0T6yukN8rMBaQ==} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.4: + resolution: {integrity: sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.4: + resolution: {integrity: sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + recast@0.23.21: + resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} + engines: {node: '>= 4'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.63.4: + resolution: {integrity: sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-literal@4.0.0: + resolution: {integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + + tdesign-icons-vue-next@0.4.11: + resolution: {integrity: sha512-lBkRUy8bdb6lQLFOOkSb1LPdl4CmZRewrc8SOUlmWkDD/DG3BTsSd/ZQ4Z767pPSlypyvxwSwcJgRv6+zjubAQ==} + peerDependencies: + vue: ^3.0.0 + + tdesign-mobile-vue@1.16.2: + resolution: {integrity: sha512-05lOApsyGeIFzlOuJvvm+P0o3h7FeHM9HsPcslRFPwOQXIZW1AvJhnvP7aon3mdFtUEFdeja6yq7uJB8Os4haQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + vue: ^3.2.6 + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-map@1.0.3: + resolution: {integrity: sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + unimport@6.5.0: + resolution: {integrity: sha512-t0KLJLRbebz3f7NrQe+vy2ObeugVeM1XqI2oeYnauddmHSglYj3U6bxOJ65IbXmOFkcAGFJK2OyGH7aqHPM6Ug==} + engines: {node: '>=18.12.0'} + peerDependencies: + oxc-parser: '*' + rolldown: ^1.0.0 + peerDependenciesMeta: + oxc-parser: + optional: true + rolldown: + optional: true + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unplugin-auto-import@21.1.0: + resolution: {integrity: sha512-EzrSqWIBulEqCuP7idADXH+tVKYrbwKlR5+r/lOWik0o+Ksny1kitmtryHGNSv7puzzORlcIwT/x2JStiszlHA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@nuxt/kit': ^4.0.0 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rsbuild/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rsbuild/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + + validator@13.15.35: + resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} + engines: {node: '>= 0.10'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-docgen-api@4.79.2: + resolution: {integrity: sha512-n9ENAcs+40awPZMsas7STqjkZiVlIjxIKgiJr5rSohDP0/JCrD9VtlzNojafsA1MChm/hz2h3PDtUedx3lbgfA==} + peerDependencies: + vue: '>=2' + + vue-inbrowser-compiler-independent-utils@4.71.1: + resolution: {integrity: sha512-K3wt3iVmNGaFEOUR4JIThQRWfqokxLfnPslD41FDZB2ajXp789+wCqJyGYlIFsvEQ2P61PInw6/ph5iiqg51gg==} + peerDependencies: + vue: '>=2' + + vue@3.5.43: + resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/abtesting@1.25.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + '@algolia/client-search': 5.59.0 + algoliasearch: 5.59.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)': + dependencies: + '@algolia/client-search': 5.59.0 + algoliasearch: 5.59.0 + + '@algolia/client-abtesting@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-analytics@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-common@5.59.0': {} + + '@algolia/client-insights@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-personalization@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-query-suggestions@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/client-search@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/ingestion@1.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/monitoring@1.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/recommend@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + '@algolia/requester-browser-xhr@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + + '@algolia/requester-fetch@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + + '@algolia/requester-node-http@5.59.0': + dependencies: + '@algolia/client-common': 5.59.0 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/runtime@7.29.7': {} + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3) + preact: 10.29.8 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - preact-render-to-string + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.59.0)(algoliasearch@5.59.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.59.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@flypeng/tool@5.7.5': + dependencies: + dayjs: 1.11.23 + html-to-image: 1.11.13 + lodash: 4.18.1 + + '@iconify-json/simple-icons@1.2.97': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@rollup/rollup-android-arm-eabi@4.63.4': + optional: true + + '@rollup/rollup-android-arm64@4.63.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.63.4': + optional: true + + '@rollup/rollup-darwin-x64@4.63.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.63.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.63.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.63.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.63.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.63.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.63.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.63.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.63.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.63.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.63.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.63.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.63.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.63.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.63.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.63.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.63.4': + optional: true + + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.2.0': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/node@25.9.8': + dependencies: + undici-types: 7.24.6 + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.4.0': {} + + '@use-gesture/core@10.3.1': {} + + '@use-gesture/vanilla@10.3.1': + dependencies: + '@use-gesture/core': 10.3.1 + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@25.9.8)(less@4.9.1))(vue@3.5.43(typescript@5.9.3))': + dependencies: + vite: 5.4.21(@types/node@25.9.8)(less@4.9.1) + vue: 3.5.43(typescript@5.9.3) + + '@vitepress-demo-preview/plugin@1.4.1(markdown-it-container@3.0.0)(vitepress@1.6.4(@algolia/client-search@5.59.0)(@types/node@25.9.8)(less@4.9.1)(postcss@8.5.28)(search-insights@2.17.3)(typescript@5.9.3))(vue@3.5.43(typescript@5.9.3))': + dependencies: + '@flypeng/tool': 5.7.5 + markdown-it: 14.3.2 + markdown-it-container: 3.0.0 + vitepress: 1.6.4(@algolia/client-search@5.59.0)(@types/node@25.9.8)(less@4.9.1)(postcss@8.5.28)(search-insights@2.17.3)(typescript@5.9.3) + vue: 3.5.43(typescript@5.9.3) + + '@vue/compiler-core@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/shared': 3.5.43 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.43': + dependencies: + '@vue/compiler-core': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/compiler-sfc@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/compiler-core': 3.5.43 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-ssr': 3.5.43 + '@vue/shared': 3.5.43 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.28 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.43': + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/devtools-api@7.7.10': + dependencies: + '@vue/devtools-kit': 7.7.10 + + '@vue/devtools-kit@7.7.10': + dependencies: + '@vue/devtools-shared': 7.7.10 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.10': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.43': + dependencies: + '@vue/shared': 3.5.43 + + '@vue/runtime-core@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/runtime-dom@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/runtime-core': 3.5.43 + '@vue/shared': 3.5.43 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.43': + dependencies: + '@vue/compiler-ssr': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/shared@3.5.43': {} + + '@vueuse/core@10.7.0(vue@3.5.43(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.7.0 + '@vueuse/shared': 10.7.0(vue@3.5.43(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.43(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@12.8.2(typescript@5.9.3)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.43(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(focus-trap@7.8.0)(typescript@5.9.3)': + dependencies: + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.43(typescript@5.9.3) + optionalDependencies: + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@10.7.0': {} + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@10.7.0(vue@3.5.43(typescript@5.9.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.43(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@12.8.2(typescript@5.9.3)': + dependencies: + vue: 3.5.43(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + acorn@7.4.1: {} + + acorn@8.18.0: {} + + algoliasearch@5.59.0: + dependencies: + '@algolia/abtesting': 1.25.0 + '@algolia/client-abtesting': 5.59.0 + '@algolia/client-analytics': 5.59.0 + '@algolia/client-common': 5.59.0 + '@algolia/client-insights': 5.59.0 + '@algolia/client-personalization': 5.59.0 + '@algolia/client-query-suggestions': 5.59.0 + '@algolia/client-search': 5.59.0 + '@algolia/ingestion': 1.59.0 + '@algolia/monitoring': 1.59.0 + '@algolia/recommend': 5.59.0 + '@algolia/requester-browser-xhr': 5.59.0 + '@algolia/requester-fetch': 5.59.0 + '@algolia/requester-node-http': 5.59.0 + + argparse@2.0.1: {} + + asap@2.0.6: {} + + assert-never@1.4.0: {} + + ast-types@0.16.3: + dependencies: + tslib: 2.8.1 + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.29.8 + + birpc@2.9.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + + comma-separated-tokens@2.0.3: {} + + confbox@0.1.8: {} + + confbox@0.3.1: {} + + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + copy-anything@4.1.1: {} + + csstype@3.2.3: {} + + dayjs@1.11.23: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + optional: true + + debug@3.2.7: + dependencies: + ms: 2.1.3 + optional: true + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + doctypes@1.1.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + emoji-regex-xs@1.0.0: {} + + entities@4.5.0: {} + + entities@7.0.1: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escape-string-regexp@5.0.0: {} + + esm-resolve@1.0.11: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + exsolve@1.1.1: {} + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + focus-trap@7.8.0: + dependencies: + tabbable: 6.5.0 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-sum@2.0.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hookable@5.5.3: {} + + html-to-image@1.11.13: {} + + html-void-elements@3.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + is-core-module@2.17.0: + dependencies: + hasown: 2.0.4 + + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + + is-promise@2.2.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-what@4.1.16: {} + + js-stringify@1.0.2: {} + + js-tokens@10.0.0: {} + + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + + less@4.9.1: + dependencies: + copy-anything: 3.0.5 + parse-node-version: 1.0.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + make-dir: 5.1.0 + mime: 1.6.0 + needle: 3.5.0 + probe-image-size: 7.4.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + linkify-it@5.0.2: + dependencies: + uc.micro: 2.1.0 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.3 + quansync: 0.2.11 + + lodash-es@4.18.1: {} + + lodash.merge@4.6.2: + optional: true + + lodash@4.18.1: {} + + lru-cache@8.0.5: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.4.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + make-dir@5.1.0: + optional: true + + mark.js@8.11.1: {} + + markdown-it-container@3.0.0: {} + + markdown-it@14.3.2: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.2 + mdurl: 2.1.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdurl@2.1.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + mime@1.6.0: + optional: true + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + ms@2.0.0: + optional: true + + ms@2.1.3: + optional: true + + nanoid@3.3.19: {} + + needle@2.9.1: + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + optional: true + + needle@3.5.0: + dependencies: + iconv-lite: 0.6.3 + sax: 1.6.1 + optional: true + + object-assign@4.1.1: {} + + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + + parse-node-version@1.0.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.3: + dependencies: + confbox: 0.3.1 + exsolve: 1.1.1 + pathe: 2.0.3 + + postcss@8.5.28: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.29.8: {} + + probe-image-size@7.4.0: + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + optional: true + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + property-information@7.2.0: {} + + prr@1.0.1: + optional: true + + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.4: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.12 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.4: + dependencies: + pug-code-gen: 3.0.4 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + punycode.js@2.3.1: {} + + quansync@0.2.11: {} + + recast@0.23.21: + dependencies: + ast-types: 0.16.3 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.17.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rfdc@1.4.1: {} + + rollup@4.63.4: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.4 + '@rollup/rollup-android-arm64': 4.63.4 + '@rollup/rollup-darwin-arm64': 4.63.4 + '@rollup/rollup-darwin-x64': 4.63.4 + '@rollup/rollup-freebsd-arm64': 4.63.4 + '@rollup/rollup-freebsd-x64': 4.63.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.4 + '@rollup/rollup-linux-arm-musleabihf': 4.63.4 + '@rollup/rollup-linux-arm64-gnu': 4.63.4 + '@rollup/rollup-linux-arm64-musl': 4.63.4 + '@rollup/rollup-linux-loong64-gnu': 4.63.4 + '@rollup/rollup-linux-loong64-musl': 4.63.4 + '@rollup/rollup-linux-ppc64-gnu': 4.63.4 + '@rollup/rollup-linux-ppc64-musl': 4.63.4 + '@rollup/rollup-linux-riscv64-gnu': 4.63.4 + '@rollup/rollup-linux-riscv64-musl': 4.63.4 + '@rollup/rollup-linux-s390x-gnu': 4.63.4 + '@rollup/rollup-linux-x64-gnu': 4.63.4 + '@rollup/rollup-linux-x64-musl': 4.63.4 + '@rollup/rollup-openbsd-x64': 4.63.4 + '@rollup/rollup-openharmony-arm64': 4.63.4 + '@rollup/rollup-win32-arm64-msvc': 4.63.4 + '@rollup/rollup-win32-ia32-msvc': 4.63.4 + '@rollup/rollup-win32-x64-gnu': 4.63.4 + '@rollup/rollup-win32-x64-msvc': 4.63.4 + fsevents: 2.3.3 + + safer-buffer@2.1.2: + optional: true + + sax@1.6.1: + optional: true + + scule@1.3.0: {} + + search-insights@2.17.3: {} + + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + stream-parser@0.3.1: + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + optional: true + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-literal@4.0.0: + dependencies: + js-tokens: 10.0.0 + + superjson@2.2.6: + dependencies: + copy-anything: 4.1.1 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.5.0: {} + + tdesign-icons-vue-next@0.4.11(vue@3.5.43(typescript@5.9.3)): + dependencies: + '@babel/runtime': 7.29.7 + vue: 3.5.43(typescript@5.9.3) + + tdesign-mobile-vue@1.16.2(vue@3.5.43(typescript@5.9.3)): + dependencies: + '@babel/runtime': 7.29.7 + '@use-gesture/vanilla': 10.3.1 + '@vueuse/core': 10.7.0(vue@3.5.43(typescript@5.9.3)) + dayjs: 1.11.23 + lodash-es: 4.18.1 + tdesign-icons-vue-next: 0.4.11(vue@3.5.43(typescript@5.9.3)) + tinycolor2: 1.6.0 + validator: 13.15.35 + vue: 3.5.43(typescript@5.9.3) + transitivePeerDependencies: + - '@vue/composition-api' + + tiny-invariant@1.3.3: {} + + tinycolor2@1.6.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + token-stream@1.0.0: {} + + trim-lines@3.0.1: {} + + ts-map@1.0.3: {} + + tslib@2.8.1: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.4: {} + + undici-types@7.24.6: {} + + unimport@6.5.0(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)): + dependencies: + acorn: 8.18.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.2.1 + magic-string: 1.4.1 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.7 + pkg-types: 2.3.3 + scule: 1.3.0 + strip-literal: 4.0.0 + tinyglobby: 0.2.17 + unplugin: 3.4.0(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)) + unplugin-utils: 0.3.2 + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rollup + - unloader + - vite + - webpack + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unplugin-auto-import@21.1.0(@vueuse/core@12.8.2(typescript@5.9.3))(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)): + dependencies: + local-pkg: 1.2.1 + magic-string: 1.4.1 + picomatch: 4.0.7 + unimport: 6.5.0(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)) + unplugin: 3.4.0(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)) + unplugin-utils: 0.3.2 + optionalDependencies: + '@vueuse/core': 12.8.2(typescript@5.9.3) + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - oxc-parser + - rolldown + - rollup + - unloader + - vite + - webpack + + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.7 + + unplugin@3.4.0(esbuild@0.21.5)(rollup@4.63.4)(vite@5.4.21(@types/node@25.9.8)(less@4.9.1)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.21.5 + rollup: 4.63.4 + vite: 5.4.21(@types/node@25.9.8)(less@4.9.1) + + validator@13.15.35: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@5.4.21(@types/node@25.9.8)(less@4.9.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.28 + rollup: 4.63.4 + optionalDependencies: + '@types/node': 25.9.8 + fsevents: 2.3.3 + less: 4.9.1 + + vitepress@1.6.4(@algolia/client-search@5.59.0)(@types/node@25.9.8)(less@4.9.1)(postcss@8.5.28)(search-insights@2.17.3)(typescript@5.9.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.59.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.97 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.2.0 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@25.9.8)(less@4.9.1))(vue@3.5.43(typescript@5.9.3)) + '@vue/devtools-api': 7.7.10 + '@vue/shared': 3.5.43 + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/integrations': 12.8.2(focus-trap@7.8.0)(typescript@5.9.3) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21(@types/node@25.9.8)(less@4.9.1) + vue: 3.5.43(typescript@5.9.3) + optionalDependencies: + postcss: 8.5.28 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - preact-render-to-string + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + void-elements@3.1.0: {} + + vue-demi@0.14.10(vue@3.5.43(typescript@5.9.3)): + dependencies: + vue: 3.5.43(typescript@5.9.3) + + vue-docgen-api@4.79.2(vue@3.5.43(typescript@5.9.3)): + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + ast-types: 0.16.3 + esm-resolve: 1.0.11 + hash-sum: 2.0.0 + lru-cache: 8.0.5 + pug: 3.0.4 + recast: 0.23.21 + ts-map: 1.0.3 + vue: 3.5.43(typescript@5.9.3) + vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.43(typescript@5.9.3)) + + vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.43(typescript@5.9.3)): + dependencies: + vue: 3.5.43(typescript@5.9.3) + + vue@3.5.43(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/server-renderer': 3.5.43 + '@vue/shared': 3.5.43 + optionalDependencies: + typescript: 5.9.3 + + webpack-virtual-modules@0.6.2: {} + + with@7.0.2: + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + + zwitch@2.0.4: {} diff --git a/docs/scenarios/ai.md b/docs/scenarios/ai.md new file mode 100644 index 0000000..e13ba44 --- /dev/null +++ b/docs/scenarios/ai.md @@ -0,0 +1,42 @@ +# AI 对话 + +把对话面板嵌进带标题栏的页面骨架,并自定义欢迎语与角色名。 + +## 组合演示 + +:::preview 完整对话 || 回答由本地假流逐块吐出,可随时点「停止」或用「清空」重开 + +demo-preview=../demos/scenarios/ai.vue + +::: + +## 这个场景覆盖了什么 + +- **会话接线**:`useAiChat` 提供 `messages` 与生成状态,面板只负责渲染 +- **页面骨架**:标题栏与面板组合成完整页面,`清空` 调用 `resetConversation` +- **自定义文案**:`roleNames` 把「助手」换成「分析助手」,`welcome` 插槽替换空态 +- **流式呈现**:思考过程、工具状态、回答与引用按事件依次出现 + +## 换成真实后端 + +示例里的 `request` 返回的是本地构造的假流。接真实接口时只要返回一个 SSE 流式的 `Response` 即可,其余不用改: + +```ts +const chat = useAiChat({ + request: ({ message, signal }) => fetch("/api/chat", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ message }), + signal + }) +}); +``` + +事件名与载荷字段见 [AiChatPanel](/components/ai-chat-panel) 的协议表;后端用的是另一套事件名时,用 `parseEvent` 转换。 + +## 相关组件 + +- [AiChatPanel](/components/ai-chat-panel) +- [AiChatMessageList](/components/ai-chat-message-list) +- [AiChatComposer](/components/ai-chat-composer) +- [AiChatThinking](/components/ai-chat-thinking) diff --git a/docs/scenarios/article.md b/docs/scenarios/article.md new file mode 100644 index 0000000..086f44b --- /dev/null +++ b/docs/scenarios/article.md @@ -0,0 +1,27 @@ +# 文章编辑与预览 + +编辑与预览共用同一个 `Article` 对象,用标签在两种视图之间切换。 + +## 组合演示 + +:::preview 编辑与预览联动 || 切换正文类型时两个标签页同时切换渲染分支 + +demo-preview=../demos/scenarios/article.vue + +::: + +## 这个场景覆盖了什么 + +- **正文类型切换**:纯文本、Markdown、富文本三种形态共用一份数据 +- **数据联动**:`ArticleEditor` 抛出的更新直接喂给 `ArticleView` +- **字段保留**:`title` 等业务字段由外层维护,编辑器不会丢字段 +- **提交语义**:`submit()` 等待未完成的媒体上传后再返回最终数据 + +## 为什么用标签而不是分栏 + +PC 端可以左右并排,移动端宽度不够。用标签切换既保证了对比的便利,又不牺牲编辑区的可用宽度。 + +## 相关组件 + +- [ArticleEditor](/components/article-editor) +- [ArticleView](/components/article-view) diff --git a/docs/scenarios/editor.md b/docs/scenarios/editor.md new file mode 100644 index 0000000..6f09425 --- /dev/null +++ b/docs/scenarios/editor.md @@ -0,0 +1,24 @@ +# 编辑器能力总览 + +把富文本编辑器、只读视图与代码编辑器放在一个页面里,验证它们共用同一套内容模型与检索能力。 + +## 组合演示 + +:::preview 组合用法 || 标签切换而不是左右分栏——移动端宽度放不下分栏 + +demo-preview=../demos/scenarios/editor.vue + +::: + +## 这个场景覆盖了什么 + +- **富文本编辑**:工具栏、媒体上传、提交前的占位内容处理 +- **只读渲染**:同一份 HTML 交给 `TiptapView`,展示效果与编辑态一致 +- **代码编辑**:行号、语法高亮与查找替换 +- **统一检索**:`openSearch()` 在两类编辑器上语义一致,便于封装统一的快捷键 + +## 相关组件 + +- [TiptapEditor](/components/tiptap-editor) +- [TiptapView](/components/tiptap-view) +- [CodeEditor](/components/code-editor) diff --git a/docs/scenarios/mobile.md b/docs/scenarios/mobile.md new file mode 100644 index 0000000..e730dc3 --- /dev/null +++ b/docs/scenarios/mobile.md @@ -0,0 +1,27 @@ +# 移动端组件 + +移动端最典型的两种浮现方式:整块选择面板与操作确认,都从底部升起。 + +## 组合演示 + +:::preview 组合用法 || 点击「缓存有效期」行打开 Picker,点按钮打开底部弹层 + +demo-preview=../demos/scenarios/mobile.vue + +::: + +## 这个场景覆盖了什么 + +- **列表触发的选择面板**:`t-cell` 当前值 + 箭头,点击后用 `t-popup` 从底部升起 `DurationPicker` +- **操作确认**:`BottomPopup` 承载标题与左右按钮,按钮只抛事件、关闭由业务决定 +- **间距**:`Space` 统一控制一组元素之间的间距 + +## 关于 destroy-on-close + +示例里的 Picker 弹层加了 `destroy-on-close`,每次打开都重建,避免上次的选择残留。选择面板这类有内部滚动状态的组件建议都带上。 + +## 相关组件 + +- [DurationPicker](/components/duration-picker) +- [BottomPopup](/components/bottom-popup) +- [Space](/components/space) diff --git a/docs/scenarios/notify.md b/docs/scenarios/notify.md new file mode 100644 index 0000000..ed0dfc4 --- /dev/null +++ b/docs/scenarios/notify.md @@ -0,0 +1,22 @@ +# 通知编辑与预览 + +通知复用文章编辑器的正文能力,同时保留主题、状态等自有字段。 + +## 组合演示 + +:::preview 编辑与预览联动 || 状态字段由外层维护,切状态不影响正文 + +demo-preview=../demos/scenarios/notify.vue + +::: + +## 这个场景覆盖了什么 + +- **能力复用**:`NotifyEditor` 内部就是 `ArticleEditor`,正文体验一致 +- **元数据独立**:`subject`、`status` 等字段与正文互不干扰 +- **字段透传**:业务字段在编辑过程中原样保留 + +## 相关组件 + +- [NotifyEditor](/components/notify-editor) +- [NotifyView](/components/notify-view) diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..ff00123 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": [ + "ESNext", + "DOM", + "DOM.Iterable" + ], + "jsx": "preserve", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "types": [ + "node" + ], + "baseUrl": ".", + "paths": { + "timi-tdesign-mobile": [ + "../src/index.ts" + ], + "timi-web/editor": [ + "../../timi-web/src/editor/index.ts" + ] + } + }, + "include": [ + "./**/*.ts", + "./**/*.d.ts", + "./**/*.vue" + ], + "exclude": [ + "node_modules", + ".vitepress/cache", + ".vitepress/dist" + ] +} diff --git a/examples/Root.vue b/examples/Root.vue deleted file mode 100644 index 82e35c0..0000000 --- a/examples/Root.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/examples/components/ArticleShowcase.vue b/examples/components/ArticleShowcase.vue deleted file mode 100644 index 2414f71..0000000 --- a/examples/components/ArticleShowcase.vue +++ /dev/null @@ -1,177 +0,0 @@ - - - - - diff --git a/examples/components/DurationShowcase.vue b/examples/components/DurationShowcase.vue deleted file mode 100644 index c065dcd..0000000 --- a/examples/components/DurationShowcase.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/examples/components/EditorShowcase.vue b/examples/components/EditorShowcase.vue deleted file mode 100644 index 4720216..0000000 --- a/examples/components/EditorShowcase.vue +++ /dev/null @@ -1,186 +0,0 @@ - - - - - diff --git a/examples/components/NotifyShowcase.vue b/examples/components/NotifyShowcase.vue deleted file mode 100644 index 77a9438..0000000 --- a/examples/components/NotifyShowcase.vue +++ /dev/null @@ -1,137 +0,0 @@ - - - - - diff --git a/examples/demo-data.ts b/examples/demo-data.ts deleted file mode 100644 index 78cb290..0000000 --- a/examples/demo-data.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { Article, NotifyDetail, UploadResult } from "timi-tdesign-mobile"; - -/** 编辑器演示使用的固定内容,避免每个页面各自维护一份 HTML。 */ -export const DEMO_ARTICLE_CONTENT = `

跨平台编辑器

-

这段内容同时验证标题、段落、链接、表格和代码块的渲染。

-

移动端和 PC 端只替换交互层,共享文档模型。

-
const message: string = "timi editor";
`; - -export const DEMO_CODE = `type DemoUser = { -\tid: string; -\tname: string; -}; - -const user: DemoUser = { -\tid: "demo-001", -\tname: "Timi" -}; - -console.log(user.name);`; - -export const DEMO_ARTICLE: Article = { - title: "编辑器组件演示文章", - description: "用于验证文章编辑、预览和附件处理。", - contentType: "TIP_TAP", - content: DEMO_ARTICLE_CONTENT, - attachmentList: [] -}; - -export const DEMO_NOTIFY: NotifyDetail = { - subject: "编辑器通知演示", - msgType: "INTERNAL", - contentType: "TIP_TAP", - content: DEMO_ARTICLE_CONTENT, - status: "WAITING", - attachmentList: [] -}; - -export function cloneArticle(): Article { - return { - ...DEMO_ARTICLE, - attachmentList: [...(DEMO_ARTICLE.attachmentList || [])] - }; -} - -export function cloneNotify(): NotifyDetail { - return { - ...DEMO_NOTIFY, - attachmentList: [...(DEMO_NOTIFY.attachmentList || [])] - }; -} - -/** 返回本地预览地址,让示例无需依赖后端上传接口。 */ -export async function uploadDemoMedia(file: File): Promise { - return { - id: `demo-${Date.now()}-${file.name}`, - name: file.name, - url: URL.createObjectURL(file) - }; -} diff --git a/examples/main.ts b/examples/main.ts deleted file mode 100644 index 8533c3b..0000000 --- a/examples/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { createApp } from "vue"; -import Root from "./Root.vue"; - -import TimiWebUI from "timi-web"; - -import "timi-web/style.css"; -import "tdesign-mobile-vue/es/style/index.css"; -import "../src/assets/style/tdesign-custom.less"; - -const app = createApp(Root); -app.use(TimiWebUI); -app.mount("#root"); diff --git a/examples/vite-env.d.ts b/examples/vite-env.d.ts deleted file mode 100644 index 140e810..0000000 --- a/examples/vite-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "*.vue" { - import type { DefineComponent } from "vue"; - const component: DefineComponent<{}, {}, any>; - export default component; -} diff --git a/index.html b/index.html deleted file mode 100644 index a6af72d..0000000 --- a/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - Timi TDesign Mobile - - -
- - - diff --git a/package.json b/package.json index 1568477..4f73ed8 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "version": "0.0.10", "license": "MIT", "scripts": { - "dev": "vite", - "dev:doc": "pnpm run -C docs dev", + "dev": "pnpm run -C docs dev", "build": "vue-tsc --noEmit && vite build", "build:doc": "pnpm run -C docs build", + "preview:doc": "pnpm run -C docs preview", "pub": "pnpm run build && npm publish --registry=https://nexus.imyeyu.com/repository/npm-timi/" }, "publishConfig": { @@ -20,7 +20,6 @@ "files": [ "dist/**", "src/**", - "examples/**", "README.md", "package.json" ], diff --git a/src/components/tiptap-editor/TiptapCodeBlockButton.vue b/src/components/tiptap-editor/TiptapCodeBlockButton.vue index d86a2ce..71dd689 100644 --- a/src/components/tiptap-editor/TiptapCodeBlockButton.vue +++ b/src/components/tiptap-editor/TiptapCodeBlockButton.vue @@ -23,7 +23,6 @@ import type { PickerValue } from "tdesign-mobile-vue"; import { supportedCodeLanguages } from "timi-web/editor"; import type { TiptapEditorInstance } from "timi-web/editor"; -import BottomPopup from "../bottom-popup/index.vue"; defineOptions({ name: "TiptapCodeBlockButton" diff --git a/tsconfig.json b/tsconfig.json index 8354f2d..c1a2381 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,9 +17,6 @@ "DOM.Iterable" ], "paths": { - "@/*": [ - "./examples/*" - ], "timi-web/editor": [ "../timi-web/src/editor/index.ts" ], @@ -32,10 +29,7 @@ "src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue", - "examples/**/*.ts", - "examples/**/*.d.ts", - "examples/**/*.vue", - "node_modules/.pnpm/unplugin-auto-import@19.1.2/node_modules/unplugin-auto-import/auto-imports.d.ts" + "auto-imports.d.ts" ], "references": [ { diff --git a/vite.config.ts b/vite.config.ts index 1397371..24ec5ee 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,10 +8,6 @@ import { TDesignResolver } from "unplugin-vue-components/resolvers"; import dts from "vite-plugin-dts"; const alias: Alias[] = [ - { - find: "@", - replacement: resolve(__dirname, "./examples") - }, { find: /^timi-web\/editor$/, replacement: resolve(__dirname, "../timi-web/src/editor/index.ts") @@ -67,7 +63,7 @@ export default defineConfig({ "vue", "vue-router" ], - dts: "examples/auto-imports.d.ts", + dts: "auto-imports.d.ts", eslintrc: { enabled: true, globalsPropValue: true