diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e7df96c..c1108833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## [2.0.0-alpha.16](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.15...v2.0.0-alpha.16) (2026-01-31) + +### Bug Fixes + +- always log error when failed to fetch page ([66cf64e](https://github.com/vuejs/vitepress/commit/66cf64e6d127dd8473e582d11e1133acda6c3bc8)) +- **theme:** add fallback for `heroImageSlotExists` ([#5076](https://github.com/vuejs/vitepress/issues/5076)) ([f119b18](https://github.com/vuejs/vitepress/commit/f119b18e39b545f39e29358913fe9ed1fd69bc55)) +- **theme:** align badges in h1 and h2 ([#5087](https://github.com/vuejs/vitepress/issues/5087)) (closes [#5063](https://github.com/vuejs/vitepress/issues/5063)) ([b200865](https://github.com/vuejs/vitepress/commit/b2008654ffaf0d8f8c425e88592e9ed2f8791506)) +- **theme:** highlight active link in mobile nav menu ([#5086](https://github.com/vuejs/vitepress/issues/5086)) (closes [#5068](https://github.com/vuejs/vitepress/issues/5068), closes [#5074](https://github.com/vuejs/vitepress/issues/5074)) ([923aa90](https://github.com/vuejs/vitepress/commit/923aa902523739bfb9d77aed376ebc73c32eeb33)) +- **theme:** overflow clip is buggy on safari ([8ed6ea0](https://github.com/vuejs/vitepress/commit/8ed6ea048cb49256e3302de2de0edfbe635afd32)), closes [#5050](https://github.com/vuejs/vitepress/issues/5050) [#5039](https://github.com/vuejs/vitepress/issues/5039) [#5027](https://github.com/vuejs/vitepress/issues/5027) +- **theme:** remove margin between code groups and blocks in markdown containers ([a28e171](https://github.com/vuejs/vitepress/commit/a28e171604605713a221d0eb2bbdce211930d94f)), closes [#5099](https://github.com/vuejs/vitepress/issues/5099) + +### Features + +- **theme:** upgrade DocSearch to 4.5 with sidepanel ([#5092](https://github.com/vuejs/vitepress/issues/5092)) ([0d646a6](https://github.com/vuejs/vitepress/commit/0d646a66cd44e97adef516a6a36e03365f179906)) +- **theme:** use `@layer __vitepress_base` to wrap the styles in base.css ([#4905](https://github.com/vuejs/vitepress/issues/4905)) ([f8d8c0d](https://github.com/vuejs/vitepress/commit/f8d8c0d712fba4728c750e1f44c5ba9596979ba1)) + ## [2.0.0-alpha.15](https://github.com/vuejs/vitepress/compare/v2.0.0-alpha.14...v2.0.0-alpha.15) (2025-11-22) ### Bug Fixes diff --git a/__tests__/e2e/local-search/local-search.test.ts b/__tests__/e2e/local-search/local-search.test.ts index 492136b6..9496dc6b 100644 --- a/__tests__/e2e/local-search/local-search.test.ts +++ b/__tests__/e2e/local-search/local-search.test.ts @@ -4,7 +4,7 @@ describe('local search', () => { }) test('exclude content from search results', async () => { - await page.locator('#local-search button').click() + await page.locator('.VPNavBarSearchButton').click() const input = await page.waitForSelector('input#localsearch-input') await input.type('local') diff --git a/__tests__/unit/client/theme-default/support/docsearch.test.ts b/__tests__/unit/client/theme-default/support/docsearch.test.ts new file mode 100644 index 00000000..4da8f113 --- /dev/null +++ b/__tests__/unit/client/theme-default/support/docsearch.test.ts @@ -0,0 +1,196 @@ +import { + buildAskAiConfig, + hasAskAi, + hasKeywordSearch, + mergeLangFacetFilters, + validateCredentials +} from 'client/theme-default/support/docsearch' + +describe('client/theme-default/support/docsearch', () => { + describe('mergeLangFacetFilters', () => { + test('adds a lang facet filter when none is provided', () => { + expect(mergeLangFacetFilters(undefined, 'en')).toEqual(['lang:en']) + }) + + test('replaces existing lang facet filters', () => { + expect(mergeLangFacetFilters('lang:fr', 'en')).toEqual(['lang:en']) + expect(mergeLangFacetFilters(['foo', 'lang:fr'], 'en')).toEqual([ + 'foo', + 'lang:en' + ]) + }) + + test('handles nested facet filters (OR conditions)', () => { + expect( + mergeLangFacetFilters([['tag:foo', 'tag:bar'], 'lang:fr'], 'en') + ).toEqual([['tag:foo', 'tag:bar'], 'lang:en']) + }) + + test('removes empty nested arrays', () => { + expect(mergeLangFacetFilters([['lang:fr'], 'other'], 'en')).toEqual([ + 'other', + 'lang:en' + ]) + }) + + test('handles multiple lang filters in nested arrays', () => { + expect( + mergeLangFacetFilters([['lang:fr', 'tag:foo'], 'bar'], 'en') + ).toEqual([['tag:foo'], 'bar', 'lang:en']) + }) + }) + + describe('hasKeywordSearch', () => { + test('returns true when all credentials are provided', () => { + expect( + hasKeywordSearch({ + appId: 'app', + apiKey: 'key', + indexName: 'index' + }) + ).toBe(true) + }) + + test('returns false when any credential is missing', () => { + expect( + hasKeywordSearch({ + appId: undefined, + apiKey: 'key', + indexName: 'index' + }) + ).toBe(false) + expect( + hasKeywordSearch({ + appId: 'app', + apiKey: undefined, + indexName: 'index' + }) + ).toBe(false) + expect( + hasKeywordSearch({ + appId: 'app', + apiKey: 'key', + indexName: undefined + }) + ).toBe(false) + }) + }) + + describe('hasAskAi', () => { + test('returns true for valid string assistantId', () => { + expect(hasAskAi('assistant123')).toBe(true) + }) + + test('returns false for empty string assistantId', () => { + expect(hasAskAi('')).toBe(false) + }) + + test('returns true for object with assistantId', () => { + expect(hasAskAi({ assistantId: 'assistant123' } as any)).toBe(true) + }) + + test('returns false for object without assistantId', () => { + expect(hasAskAi({ assistantId: null } as any)).toBe(false) + expect(hasAskAi({} as any)).toBe(false) + }) + + test('returns false for undefined', () => { + expect(hasAskAi(undefined)).toBe(false) + }) + }) + + describe('validateCredentials', () => { + test('validates complete credentials', () => { + const result = validateCredentials({ + appId: 'app', + apiKey: 'key', + indexName: 'index' + }) + expect(result.valid).toBe(true) + expect(result.appId).toBe('app') + expect(result.apiKey).toBe('key') + expect(result.indexName).toBe('index') + }) + + test('invalidates incomplete credentials', () => { + expect( + validateCredentials({ + appId: undefined, + apiKey: 'key', + indexName: 'index' + }).valid + ).toBe(false) + }) + }) + + describe('buildAskAiConfig', () => { + test('builds config from string assistantId', () => { + const result = buildAskAiConfig( + 'assistant123', + { + appId: 'app', + apiKey: 'key', + indexName: 'index' + } as any, + 'en' + ) + expect(result.assistantId).toBe('assistant123') + expect(result.appId).toBe('app') + expect(result.apiKey).toBe('key') + expect(result.indexName).toBe('index') + }) + + test('builds config from object with overrides', () => { + const result = buildAskAiConfig( + { + assistantId: 'assistant123', + appId: 'custom-app', + apiKey: 'custom-key', + indexName: 'custom-index' + } as any, + { + appId: 'default-app', + apiKey: 'default-key', + indexName: 'default-index' + } as any, + 'en' + ) + expect(result.assistantId).toBe('assistant123') + expect(result.appId).toBe('custom-app') + expect(result.apiKey).toBe('custom-key') + expect(result.indexName).toBe('custom-index') + }) + + test('merges facet filters with lang', () => { + const result = buildAskAiConfig( + { + assistantId: 'assistant123', + searchParameters: { + facetFilters: ['tag:docs'] + } + } as any, + { + appId: 'app', + apiKey: 'key', + indexName: 'index' + } as any, + 'en' + ) + expect(result.searchParameters?.facetFilters).toContain('tag:docs') + expect(result.searchParameters?.facetFilters).toContain('lang:en') + }) + + test('always adds lang facet filter to searchParameters', () => { + const result = buildAskAiConfig( + 'assistant123', + { + appId: 'app', + apiKey: 'key', + indexName: 'index' + } as any, + 'en' + ) + expect(result.searchParameters?.facetFilters).toEqual(['lang:en']) + }) + }) +}) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 7be361c8..4c65ec7e 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -26,10 +26,13 @@ export default defineConfig({ markdown: { math: true, codeTransformers: [ - // We use `[!!code` in demo to prevent transformation, here we revert it back. + // We use `[!!code` and `@@include` in demo to prevent transformation, + // here we revert it back. { postprocess(code) { - return code.replace(/\[\!\!code/g, '[!code') + return code + .replaceAll('[!!code', '[!code') + .replaceAll('@@include', '@include') } } ], @@ -118,7 +121,10 @@ export default defineConfig({ appId: '8J64VVRP8K', apiKey: '52f578a92b88ad6abde815aae2b0ad7c', indexName: 'vitepress', - askAi: 'YaVSonfX5bS8' + askAi: { + assistantId: 'YaVSonfX5bS8', + sidePanel: true + } } }, diff --git a/docs/en/guide/deploy.md b/docs/en/guide/deploy.md index 48e8c9ea..7433fbf5 100644 --- a/docs/en/guide/deploy.md +++ b/docs/en/guide/deploy.md @@ -105,7 +105,7 @@ Note: the `vercel.json` file should be placed at the root of your **repository** ## Platform Guides -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} Set up a new project and change these settings using your dashboard: @@ -221,7 +221,9 @@ Don't enable options like _Auto Minify_ for HTML code. It will remove comments f - main ``` -### Azure Static Web Apps + + +### Azure 1. Follow the [official documentation](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration). @@ -231,6 +233,10 @@ Don't enable options like _Auto Minify_ for HTML code. It will remove comments f - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` +### CloudRay + +You can deploy your VitePress project with [CloudRay](https://cloudray.io/) by following these [instructions](https://cloudray.io/articles/how-to-deploy-vitepress-site). + ### Firebase 1. Create `firebase.json` and `.firebaserc` at the root of your project: @@ -262,14 +268,6 @@ Don't enable options like _Auto Minify_ for HTML code. It will remove comments f firebase deploy ``` -### Surge - -1. After running `npm run docs:build`, run this command to deploy: - - ```sh - npx surge docs/.vitepress/dist - ``` - ### Heroku 1. Follow documentation and guide given in [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static). @@ -282,11 +280,11 @@ Don't enable options like _Auto Minify_ for HTML code. It will remove comments f } ``` -### Edgio +### Hostinger -Refer [Creating and Deploying a VitePress App To Edgio](https://docs.edg.io/guides/vitepress). +You can deploy your VitePress project with [Hostinger](https://www.hostinger.com/web-apps-hosting) by following these [instructions](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/). While configuring build settings, choose VitePress as the framework and adjust the root directory to `./docs`. -### Kinsta Static Site Hosting +### Kinsta You can deploy your VitePress website on [Kinsta](https://kinsta.com/static-site-hosting/) by following these [instructions](https://kinsta.com/docs/vitepress-static-site-example/). @@ -294,9 +292,13 @@ You can deploy your VitePress website on [Kinsta](https://kinsta.com/static-site You can deploy your VitePress project to [Stormkit](https://www.stormkit.io) by following these [instructions](https://stormkit.io/blog/how-to-deploy-vitepress). -### CloudRay +### Surge -You can deploy your VitePress project with [CloudRay](https://cloudray.io/) by following these [instructions](https://cloudray.io/articles/how-to-deploy-vitepress-site). +1. After running `npm run docs:build`, run this command to deploy: + + ```sh + npx surge docs/.vitepress/dist + ``` ### Nginx diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md index 7249fac2..a60f764e 100644 --- a/docs/en/guide/markdown.md +++ b/docs/en/guide/markdown.md @@ -793,7 +793,7 @@ For example, you can include a relative markdown file using this: ## Basics - + ``` **Part file** (`parts/basics.md`) @@ -829,7 +829,7 @@ It also supports selecting a line range: ## Basics - + ``` **Part file** (`parts/basics.md`) @@ -865,8 +865,8 @@ You can also use a [VS Code region](https://code.visualstudio.com/docs/editor/co ## Basics - - + + ``` **Part file** (`parts/basics.md`) @@ -917,7 +917,7 @@ You can include the `My Base Section` section like this: ```md ## My Extended Section - + ``` **Equivalent code** @@ -941,7 +941,7 @@ Here, `my-base-section` is the generated id of the heading element. In case it's and include it like this: ```md - + ``` ## Math Equations diff --git a/docs/en/index.md b/docs/en/index.md index 6c49a313..f05e9200 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -4,7 +4,7 @@ layout: home hero: name: VitePress text: Vite & Vue Powered Static Site Generator - tagline: Markdown to Beautiful Docs in Minutes + tagline: Markdown to beautiful docs in minutes actions: - theme: brand text: What is VitePress? @@ -21,7 +21,7 @@ hero: features: - icon: 📝 - title: Focus on Your Content + title: Focus on your content details: Effortlessly create beautiful documentation sites with just markdown. - icon: title: Enjoy the Vite DX @@ -30,6 +30,6 @@ features: title: Customize with Vue details: Use Vue syntax and components directly in markdown, or build custom themes with Vue. - icon: 🚀 - title: Ship Fast Sites + title: Ship fast sites details: Fast initial load with static HTML, fast post-load navigation with client-side routing. --- diff --git a/docs/en/reference/default-theme-search.md b/docs/en/reference/default-theme-search.md index 9501dce4..bdefdb02 100644 --- a/docs/en/reference/default-theme-search.md +++ b/docs/en/reference/default-theme-search.md @@ -179,7 +179,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -213,6 +213,19 @@ export default defineConfig({ You can use a configuration like this to enable multilingual search: +
+View full example + +<<< @/snippets/algolia-i18n.ts + +
+ +Refer [official Algolia docs](https://docsearch.algolia.com/docs/api#translations) to learn more about them. To quickly get started, you can also copy the translations used by this site from [our GitHub repo](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code). + +### Algolia Ask AI Support {#ask-ai} + +If you would like to include **Ask AI**, pass the `askAi` option (or any of the partial fields) inside `options`: + ```ts import { defineConfig } from 'vitepress' @@ -224,79 +237,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' - }, - modal: { - searchBox: { - clearButtonTitle: '清除查询条件', - clearButtonAriaLabel: '清除查询条件', - closeButtonText: '关闭', - closeButtonAriaLabel: '关闭', - placeholderText: '搜索文档', - placeholderTextAskAi: '向 AI 提问:', - placeholderTextAskAiStreaming: '回答中...', - searchInputLabel: '搜索', - backToKeywordSearchButtonText: '返回关键字搜索', - backToKeywordSearchButtonAriaLabel: '返回关键字搜索' - }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除', - recentConversationsTitle: '最近的对话', - removeRecentConversationButtonTitle: '从历史记录中删除对话' - }, - errorScreen: { - titleText: '无法获取结果', - helpText: '你可能需要检查你的网络连接' - }, - noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' - }, - resultsScreen: { - askAiPlaceholder: '向 AI 提问: ' - }, - askAiScreen: { - disclaimerText: '答案由 AI 生成,可能不准确,请自行验证。', - relatedSourcesText: '相关来源', - thinkingText: '思考中...', - copyButtonText: '复制', - copyButtonCopiedText: '已复制!', - copyButtonTitle: '复制', - likeButtonTitle: '赞', - dislikeButtonTitle: '踩', - thanksForFeedbackText: '感谢你的反馈!', - preToolCallText: '搜索中...', - duringToolCallText: '搜索 ', - afterToolCallText: '已搜索' - }, - footer: { - selectText: '选择', - submitQuestionText: '提交问题', - selectKeyAriaLabel: 'Enter 键', - navigateText: '切换', - navigateUpKeyAriaLabel: '向上箭头', - navigateDownKeyAriaLabel: '向下箭头', - closeText: '关闭', - backToSearchText: '返回搜索', - closeKeyAriaLabel: 'Esc 键', - poweredByText: '搜索提供者' - } - } - } - } + // askAi: "YOUR-ASSISTANT-ID" + // OR + askAi: { + // at minimum you must provide the assistantId you received from Algolia + assistantId: 'XXXYYY', + // optional overrides – if omitted, the top-level appId/apiKey/indexName values are reused + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -304,11 +253,13 @@ export default defineConfig({ }) ``` -[These options](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) can be overridden. Refer to the official Algolia docs to learn more about them. +::: warning Note +If you want to default to keyword search and do not want to use Ask AI, omit the `askAi` property. +::: -### Algolia Ask AI Support {#ask-ai} +### Ask AI Side Panel {#ask-ai-side-panel} -If you would like to include **Ask AI**, pass the `askAi` option (or any of the partial fields) inside `options`: +DocSearch v4.5+ supports an optional **Ask AI side panel**. When enabled, it can be opened with **Ctrl/Cmd+I** by default. The [Sidepanel API Reference](https://docsearch.algolia.com/docs/sidepanel/api-reference) contains the full list of options. ```ts import { defineConfig } from 'vitepress' @@ -321,15 +272,17 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - // askAi: "YOUR-ASSISTANT-ID" - // OR askAi: { - // at minimum you must provide the assistantId you received from Algolia assistantId: 'XXXYYY', - // optional overrides – if omitted, the top-level appId/apiKey/indexName values are reused - // apiKey: '...', - // appId: '...', - // indexName: '...' + sidePanel: { + panel: { + variant: 'floating', // or 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } } } } @@ -337,116 +290,70 @@ export default defineConfig({ }) ``` -::: warning Note -If you want to default to keyword search and not use Ask AI, just omit the `askAi` property -::: +If you need to disable the keyboard shortcut, use the `keyboardShortcuts` option at the sidepanel root level: -The translations for the Ask AI UI live under `options.translations.modal.askAiScreen` and `options.translations.resultsScreen` — see the [type definitions](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) for all keys. +```ts +import { defineConfig } from 'vitepress' -### Crawler Config +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } + } + } +}) +``` -Here is an example config based on what this site uses: +#### Mode (auto / sidePanel / hybrid / modal) {#ask-ai-mode} + +You can optionally control how VitePress integrates keyword search and Ask AI: + +- `mode: 'auto'` (default): infer `hybrid` when keyword search is configured, otherwise `sidePanel` when Ask AI side panel is configured. +- `mode: 'sidePanel'`: force side panel only (hides the keyword search button). +- `mode: 'hybrid'`: enable keyword search modal + Ask AI side panel (requires keyword search configuration). +- `mode: 'modal'`: keep Ask AI inside the DocSearch modal (even if you configured the side panel). + +#### Ask AI only (no keyword search) {#ask-ai-only} + +If you want to use **Ask AI side panel only**, you can omit top-level keyword search config and provide credentials under `askAi`: ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' - } } }) ``` + +### Crawler Config + +Here is an example config based on what this site uses: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/en/reference/runtime-api.md b/docs/en/reference/runtime-api.md index d5af1669..d92a92cc 100644 --- a/docs/en/reference/runtime-api.md +++ b/docs/en/reference/runtime-api.md @@ -49,7 +49,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/es/config.ts b/docs/es/config.ts index 934c1dcf..fee38361 100644 --- a/docs/es/config.ts +++ b/docs/es/config.ts @@ -181,7 +181,6 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: 'Buscar documentos', translations: { button: { buttonText: 'Buscar', @@ -189,46 +188,72 @@ function searchOptions(): Partial { }, modal: { searchBox: { - clearButtonTitle: 'Limpiar búsqueda', - clearButtonAriaLabel: 'Limpiar búsqueda', + clearButtonTitle: 'Limpiar', + clearButtonAriaLabel: 'Borrar la consulta', closeButtonText: 'Cerrar', closeButtonAriaLabel: 'Cerrar', - placeholderText: undefined, - placeholderTextAskAi: undefined, + placeholderText: 'Buscar en la documentación o preguntar a Ask AI', + placeholderTextAskAi: 'Haz otra pregunta...', placeholderTextAskAiStreaming: 'Respondiendo...', + searchInputLabel: 'Buscar', backToKeywordSearchButtonText: 'Volver a la búsqueda por palabras clave', backToKeywordSearchButtonAriaLabel: - 'Volver a la búsqueda por palabras clave' + 'Volver a la búsqueda por palabras clave', + newConversationPlaceholder: 'Haz una pregunta', + conversationHistoryTitle: 'Mi historial de conversaciones', + startNewConversationText: 'Iniciar una nueva conversación', + viewConversationHistoryText: 'Historial de conversaciones', + threadDepthErrorPlaceholder: 'Se alcanzó el límite de conversación' + }, + newConversation: { + newConversationTitle: '¿Cómo puedo ayudarte hoy?', + newConversationDescription: + 'Busco en tu documentación para ayudarte a encontrar guías de configuración, detalles de funciones y consejos de solución de problemas rápidamente.' + }, + footer: { + selectText: 'Seleccionar', + submitQuestionText: 'Enviar pregunta', + selectKeyAriaLabel: 'Tecla Enter', + navigateText: 'Navegar', + navigateUpKeyAriaLabel: 'Flecha arriba', + navigateDownKeyAriaLabel: 'Flecha abajo', + closeText: 'Cerrar', + backToSearchText: 'Volver a la búsqueda', + closeKeyAriaLabel: 'Tecla Escape', + poweredByText: 'Con la tecnología de' + }, + errorScreen: { + titleText: 'No se pueden obtener resultados', + helpText: 'Puede que quieras comprobar tu conexión de red.' }, startScreen: { - recentSearchesTitle: 'Historial de búsqueda', - noRecentSearchesText: 'Ninguna búsqueda reciente', - saveRecentSearchButtonTitle: 'Guardar en el historial de búsqueda', - removeRecentSearchButtonTitle: 'Borrar del historial de búsqueda', + recentSearchesTitle: 'Recientes', + noRecentSearchesText: 'No hay búsquedas recientes', + saveRecentSearchButtonTitle: 'Guardar esta búsqueda', + removeRecentSearchButtonTitle: 'Eliminar esta búsqueda del historial', favoriteSearchesTitle: 'Favoritos', - removeFavoriteSearchButtonTitle: 'Borrar de favoritos', + removeFavoriteSearchButtonTitle: + 'Eliminar esta búsqueda de favoritos', recentConversationsTitle: 'Conversaciones recientes', removeRecentConversationButtonTitle: 'Eliminar esta conversación del historial' }, - errorScreen: { - titleText: 'No fue posible obtener resultados', - helpText: 'Verifique su conexión de red' - }, noResultsScreen: { - noResultsText: 'No fue posible encontrar resultados', - suggestedQueryText: 'Puede intentar una nueva búsqueda', + noResultsText: 'No se encontraron resultados para', + suggestedQueryText: 'Intenta buscar', reportMissingResultsText: - '¿Deberían haber resultados para esta consulta?', - reportMissingResultsLinkText: 'Click para enviar feedback' + '¿Crees que esta consulta debería devolver resultados?', + reportMissingResultsLinkText: 'Avísanos.' }, resultsScreen: { - askAiPlaceholder: 'Preguntar a la IA: ' + askAiPlaceholder: 'Preguntar a la IA: ', + noResultsAskAiPlaceholder: + '¿No lo encontraste en la documentación? Pide ayuda a Ask AI: ' }, askAiScreen: { disclaimerText: - 'Las respuestas son generadas por IA y pueden contener errores. Verifica las respuestas.', + 'Las respuestas se generan con IA y pueden contener errores. Verifícalas.', relatedSourcesText: 'Fuentes relacionadas', thinkingText: 'Pensando...', copyButtonText: 'Copiar', @@ -236,23 +261,70 @@ function searchOptions(): Partial { copyButtonTitle: 'Copiar', likeButtonTitle: 'Me gusta', dislikeButtonTitle: 'No me gusta', - thanksForFeedbackText: '¡Gracias por tu opinión!', + thanksForFeedbackText: '¡Gracias por tu comentario!', preToolCallText: 'Buscando...', - duringToolCallText: 'Buscando ', - afterToolCallText: 'Búsqueda de', - aggregatedToolCallText: 'Búsqueda de' + duringToolCallText: 'Buscando...', + afterToolCallText: 'Buscado', + stoppedStreamingText: 'Has detenido esta respuesta', + errorTitleText: 'Error de chat', + threadDepthExceededMessage: + 'Esta conversación se ha cerrado para mantener respuestas precisas.', + startNewConversationButtonText: 'Iniciar una nueva conversación' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'Preguntar a la IA', + buttonAriaLabel: 'Preguntar a la IA' + } }, - footer: { - selectText: 'Seleccionar', - submitQuestionText: 'Enviar pregunta', - selectKeyAriaLabel: 'Tecla Enter', - navigateText: 'Navegar', - navigateUpKeyAriaLabel: 'Flecha arriba', - navigateDownKeyAriaLabel: 'Flecha abajo', - closeText: 'Cerrar', - backToSearchText: 'Volver a la búsqueda', - closeKeyAriaLabel: 'Tecla Escape', - poweredByText: 'Búsqueda por' + panel: { + translations: { + header: { + title: 'Preguntar a la IA', + conversationHistoryTitle: 'Mi historial de conversaciones', + newConversationText: 'Iniciar una nueva conversación', + viewConversationHistoryText: 'Historial de conversaciones' + }, + promptForm: { + promptPlaceholderText: 'Haz una pregunta', + promptAnsweringText: 'Respondiendo...', + promptAskAnotherQuestionText: 'Haz otra pregunta', + promptDisclaimerText: + 'Las respuestas se generan con IA y pueden contener errores.', + promptLabelText: + 'Pulsa Enter para enviar, o Shift+Enter para una nueva línea.', + promptAriaLabelText: 'Entrada de prompt' + }, + conversationScreen: { + preToolCallText: 'Buscando...', + searchingText: 'Buscando...', + toolCallResultText: 'Buscado', + conversationDisclaimer: + 'Las respuestas se generan con IA y pueden contener errores. Verifícalas.', + reasoningText: 'Razonando...', + thinkingText: 'Pensando...', + relatedSourcesText: 'Fuentes relacionadas', + stoppedStreamingText: 'Has detenido esta respuesta', + copyButtonText: 'Copiar', + copyButtonCopiedText: '¡Copiado!', + likeButtonTitle: 'Me gusta', + dislikeButtonTitle: 'No me gusta', + thanksForFeedbackText: '¡Gracias por tu comentario!', + errorTitleText: 'Error de chat' + }, + newConversationScreen: { + titleText: '¿Cómo puedo ayudarte hoy?', + introductionText: + 'Busco en tu documentación para ayudarte a encontrar guías de configuración, detalles de funciones y consejos de solución de problemas rápidamente.' + }, + logo: { + poweredByText: 'Con la tecnología de' + } + } } } } diff --git a/docs/es/guide/deploy.md b/docs/es/guide/deploy.md index 6cbb3df5..f2f71384 100644 --- a/docs/es/guide/deploy.md +++ b/docs/es/guide/deploy.md @@ -105,13 +105,13 @@ Nota: el archivo `vercel.json` debe ser colocado en la raiz de su **repositório ## Guias de Plataforma {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} Configure un nuevo proyecto y altere estas configuraciones usando su panel: - **Comando de Compilación:** `npm run docs:build` - **directorio de Salida:** `docs/.vitepress/dist` -- **Versión de Node:** `18` (o superior) +- **Versión de Node:** `20` (o superior) ::: warning No active opciones como _Auto Minify_ para código HTML. Eso removera comentarios de salida que tiene significado para Vue. Habrán errores de incompatibilidad de hidratación se fueran removidos. @@ -169,10 +169,8 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario uses: actions/configure-pages@v4 - name: Install dependencies run: npm ci # o pnpm install / yarn install / bun install - - name: Build with VitePress - run: | - npm run docs:build # o pnpm docs:build / yarn docs:build / bun run docs:build - touch docs/.vitepress/dist/.nojekyll + - name: Build with VitePress + run: npm run docs:build # o pnpm docs:build / yarn docs:build / bun run docs:build - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: @@ -192,6 +190,7 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario uses: actions/deploy-pages@v4 ``` + ::: warning Asegurese de que la opción `base` en su VitePress esté configurada correctamentse. Vea [Configuranco un Path base Público](#setting-a-public-base-path) para más detalles. ::: @@ -201,7 +200,7 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario ### GitLab Pages -1. Defina `outDir` en la configuración VitePress como `../public`. Configure la opción `base` para `'//'` se desea implantar en `https://.gitlab.io//`. +1. Defina `outDir` en la configuración VitePress como `../public`. Configure la opción `base` para `'//'` se desea implantar en `https://.gitlab.io//`. No necesita `base` si está implementando en un dominio personalizado, páginas de usuario o grupo, o si la configuración "Use unique domain" está habilitada en GitLab. 2. Cree un archivo llamado `.gitlab-ci.yml` en la raiz del proyecto con el contenido abajo. Esto construirá e implantará su sitio siempre que haga alteraciones en el contenido. @@ -222,7 +221,7 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario - main ``` -### Azure Static Web Apps {#azure-static-web-apps} +### Azure 1. Siga la [documentación oficial](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration). @@ -232,7 +231,11 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +Puedes desplegar tu proyecto VitePress con [CloudRay](https://cloudray.io/) siguiendo estas [instrucciones](https://cloudray.io/articles/how-to-deploy-vitepress-site). + +### Firebase 1. Cree `firebase.json` y `.firebaserc` en la raiz de su proyecto: @@ -263,14 +266,6 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario firebase deploy ``` -### Surge - -1. Después de ejecutar `npm run docs:build`, ejecute este comando para implantar: - - ```sh - npx surge docs/.vitepress/dist - ``` - ### Heroku 1. Siga la documentación y el guia proporcionados por [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static). @@ -283,10 +278,66 @@ No active opciones como _Auto Minify_ para código HTML. Eso removera comentario } ``` -### Edgio +### Hostinger -Consulte [Crear e Implantar una Aplicación VitePress en Edgio](https://docs.edg.io/guides/vitepress). +Puedes desplegar tu proyecto VitePress con [Hostinger](https://www.hostinger.com/web-apps-hosting) siguiendo estas [instrucciones](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/). Al configurar los ajustes de compilación, elige VitePress como framework y ajusta el directorio raíz a `./docs`. -### Kinsta Static Site Hosting {#kinsta-static-site-hosting} +### Kinsta Puede implantar su sitio VitePress em [Kinsta](https://kinsta.com/static-site-hosting/) siguiendo estas [instrucciones](https://kinsta.com/docs/vitepress-static-site-example/). + +### Stormkit + +Puedes desplegar tu proyecto VitePress en [Stormkit](https://www.stormkit.io) siguiendo estas [instrucciones](https://stormkit.io/blog/how-to-deploy-vitepress). + +### Surge + +1. Después de ejecutar `npm run docs:build`, ejecute este comando para implantar: + + ```sh + npx surge docs/.vitepress/dist + ``` + +### Nginx + +Aquí hay un ejemplo de configuración de bloque de servidor Nginx. Esta configuración incluye compresión gzip para recursos comunes basados en texto, reglas para servir los archivos estáticos de su sitio VitePress con encabezados de caché adecuados, así como el manejo de `cleanUrls: true`. + +```nginx +server { + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + listen 80; + server_name _; + index index.html; + + location / { + # content location + root /app; + + # exact matches -> reverse clean urls -> folders -> not found + try_files $uri $uri.html $uri/ =404; + + # non existent pages + error_page 404 /404.html; + + # a folder without index.html raises 403 in this setup + error_page 403 /404.html; + + # adjust caching headers + # files in the assets folder have hashes filenames + location ~* ^/assets/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + } +} +``` + +Esta configuración asume que su sitio VitePress compilado está ubicado en el directorio `/app` de su servidor. Ajuste la directiva `root` según corresponda si los archivos de su sitio se encuentran en otro lugar. + +::: warning No predeterminar index.html +La resolución de try_files no debe predeterminar index.html como en otras aplicaciones Vue. Esto resultará en un estado de página inválido. +::: + +Se puede encontrar más información en la [documentación oficial de nginx](https://nginx.org/en/docs/), en estos issues [#2837](https://github.com/vuejs/vitepress/discussions/2837), [#3235](https://github.com/vuejs/vitepress/issues/3235) así como en este [post del blog](https://blog.mehdi.cc/articles/vitepress-cleanurls-on-nginx-environment#readings) de Mehdi Merah. diff --git a/docs/es/guide/markdown.md b/docs/es/guide/markdown.md index 516f70f3..b76eb0ac 100644 --- a/docs/es/guide/markdown.md +++ b/docs/es/guide/markdown.md @@ -773,7 +773,7 @@ Por ejemplo, puede incluir un archivo markdown relativo usando esto: ## Conceptos Básicos - + ``` **Archivo de Parte** (`parts/basics.md`) @@ -809,7 +809,7 @@ También soporta la selección de un intervalo de lineas: ## Conceptos Básicos - + ``` **Archivo de Parte** (`parts/basics.md`) diff --git a/docs/es/reference/default-theme-search.md b/docs/es/reference/default-theme-search.md index 5391c3d7..e2034ba2 100644 --- a/docs/es/reference/default-theme-search.md +++ b/docs/es/reference/default-theme-search.md @@ -39,18 +39,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - zh: { + es: { // usa `root` si quieres traducir la configuración regional predeterminada translations: { button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' + buttonText: 'Buscar', + buttonAriaLabel: 'Buscar' }, modal: { - noResultsText: '无法找到相关结果', - resetButtonTitle: '清除查询条件', + displayDetails: 'Mostrar lista detallada', + resetButtonTitle: 'Restablecer búsqueda', + backButtonTitle: 'Cerrar búsqueda', + noResultsText: 'No hay resultados', footer: { - selectText: '选择', - navigateText: '切换' + selectText: 'Seleccionar', + selectKeyAriaLabel: 'Intro', + navigateText: 'Navegar', + navigateUpKeyAriaLabel: 'Flecha arriba', + navigateDownKeyAriaLabel: 'Flecha abajo', + closeText: 'Cerrar', + closeKeyAriaLabel: 'Esc' } } } @@ -62,7 +69,7 @@ export default defineConfig({ }) ``` -### Opciones MiniSearch {#mini-search-options} +### Opciones MiniSearch {#minisearch-options} Puedes configurar MiniSearch de esta manera: @@ -116,7 +123,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // retorne un string HTML + // devuelve una cadena HTML } } } @@ -141,7 +148,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' - if (env.relativePath.startsWith('algum/caminho')) return '' + if (env.relativePath.startsWith('some/path')) return '' return html } } @@ -167,7 +174,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -197,10 +204,23 @@ export default defineConfig({ }) ``` -### i18n {#algolia-search-i18n} {#algolia-search-i18n} +### i18n {#algolia-search-i18n} Puedes utilizar una configuración como esta para utilizar la búsqueda multilingüe: +
+Haz clic para expandir + +<<< @/snippets/algolia-i18n.ts + +
+ +Consulta la [documentación oficial de Algolia](https://docsearch.algolia.com/docs/api#translations) para conocer más detalles. Para empezar rápidamente, también puedes copiar las traducciones usadas por este sitio desde [nuestro repositorio de GitHub](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code). + +### Algolia Ask AI Support {#ask-ai} + +Si deseas incluir **Ask AI**, pasa la opción `askAi` (o alguno de sus campos parciales) dentro de `options`: + ```ts import { defineConfig } from 'vitepress' @@ -212,72 +232,51 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { buttonText: '搜索文档', buttonAriaLabel: '搜索文档' }, - modal: { - searchBox: { - clearButtonTitle: '清除查询条件', - clearButtonAriaLabel: '清除查询条件', - closeButtonText: '关闭', - closeButtonAriaLabel: '关闭', - placeholderText: '搜索文档', - placeholderTextAskAi: '向 AI 提问:', - placeholderTextAskAiStreaming: '回答中...', - searchInputLabel: '搜索', - backToKeywordSearchButtonText: '返回关键字搜索', - backToKeywordSearchButtonAriaLabel: '返回关键字搜索' - }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除', - recentConversationsTitle: '最近的对话', - removeRecentConversationButtonTitle: '从历史记录中删除对话' - }, - errorScreen: { - titleText: '无法获取结果', - helpText: '你可能需要检查你的网络连接' - }, - noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' - }, - resultsScreen: { askAiPlaceholder: '向 AI 提问: ' }, - askAiScreen: { - disclaimerText: '答案由 AI 生成,可能不准确,请自行验证。', - relatedSourcesText: '相关来源', - thinkingText: '思考中...', - copyButtonText: '复制', - copyButtonCopiedText: '已复制!', - copyButtonTitle: '复制', - likeButtonTitle: '赞', - dislikeButtonTitle: '踩', - thanksForFeedbackText: '感谢你的反馈!', - preToolCallText: '搜索中...', - duringToolCallText: '搜索 ', - afterToolCallText: '已搜索' - }, - footer: { - selectText: '选择', - submitQuestionText: '提交问题', - selectKeyAriaLabel: 'Enter 键', - navigateText: '切换', - navigateUpKeyAriaLabel: '向上箭头', - navigateDownKeyAriaLabel: '向下箭头', - closeText: '关闭', - backToSearchText: '返回搜索', - closeKeyAriaLabel: 'Esc 键', - poweredByText: '搜索提供者' - } - } + // askAi: "TU-ID-DE-ASISTENTE" + // O + askAi: { + // como mínimo debes proporcionar el assistantId que recibiste de Algolia + assistantId: 'XXXYYY', + // anulaciones opcionales — si se omiten, se reutilizan los valores appId/apiKey/indexName de nivel superior + // apiKey: '...', + // appId: '...', + // indexName: '...' + } + } + } + } +}) +``` + +::: warning Nota +Si prefieres solo la búsqueda por palabra clave y no la Ask AI, simplemente omite `askAi`. +::: + +### Panel lateral de Ask AI {#ask-ai-side-panel} + +DocSearch v4.5+ admite un **panel lateral de Ask AI** opcional. Cuando está habilitado, se puede abrir con **Ctrl/Cmd+I** por defecto. La [Referencia de API del Panel Lateral](https://docsearch.algolia.com/docs/sidepanel/api-reference) contiene la lista completa de opciones. + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + // Refleja la API de @docsearch/sidepanel-js SidepanelProps + panel: { + variant: 'floating', // o 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true } } } @@ -287,132 +286,70 @@ export default defineConfig({ }) ``` -### Algolia Ask AI Support {#ask-ai} - -Si deseas incluir **Ask AI**, pasa la opción `askAi` (o alguno de sus campos parciales) dentro de `options`: +Si necesitas deshabilitar el atajo de teclado, usa la opción `keyboardShortcuts` del panel lateral: ```ts -options: { - appId: '...', - apiKey: '...', - indexName: '...', - // askAi: 'TU-ASSISTANT-ID' - askAi: { - assistantId: 'XXXYYY' +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } + } } -} +}) ``` -::: warning Nota -Si prefieres solo la búsqueda por palabra clave y no la Ask AI, simplemente omite `askAi`. -::: +#### Modo (auto / sidePanel / hybrid / modal) {#ask-ai-mode} -[Estas opciones](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) se pueden superponer. Consulte la documentación oficial de Algolia para obtener más información sobre ellos. +Puedes controlar opcionalmente cómo VitePress integra la búsqueda por palabra clave y Ask AI: -### Configuración _Crawler_ {#crawler-config} +- `mode: 'auto'` (por defecto): infiere `hybrid` cuando la búsqueda por palabra clave está configurada, de lo contrario `sidePanel` cuando el panel lateral de Ask AI está configurado. +- `mode: 'sidePanel'`: fuerza solo el panel lateral (oculta el botón de búsqueda por palabra clave). +- `mode: 'hybrid'`: habilita el modal de búsqueda por palabra clave + panel lateral de Ask AI (requiere configuración de búsqueda por palabra clave). +- `mode: 'modal'`: mantiene Ask AI dentro del modal de DocSearch (incluso si configuraste el panel lateral). -A continuación se muestra un ejemplo de la configuración que utiliza este sitio: +#### Solo Ask AI (sin búsqueda por palabra clave) {#ask-ai-only} + +Si quieres usar **solo el panel lateral de Ask AI**, puedes omitir la configuración de búsqueda por palabra clave de nivel superior y proporcionar las credenciales bajo `askAi`: ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' - } } }) ``` + +### Configuración _Crawler_ {#crawler-config} + +A continuación se muestra un ejemplo de la configuración que utiliza este sitio: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/es/reference/runtime-api.md b/docs/es/reference/runtime-api.md index 1446df4c..012e8d7c 100644 --- a/docs/es/reference/runtime-api.md +++ b/docs/es/reference/runtime-api.md @@ -45,7 +45,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/fa/config.ts b/docs/fa/config.ts index 97a005f0..4cb8c245 100644 --- a/docs/fa/config.ts +++ b/docs/fa/config.ts @@ -182,7 +182,6 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: 'جستجوی مستندات', translations: { button: { buttonText: 'جستجو', @@ -190,67 +189,139 @@ function searchOptions(): Partial { }, modal: { searchBox: { - clearButtonTitle: 'پاک کردن جستجو', - clearButtonAriaLabel: 'پاک کردن جستجو', + clearButtonTitle: 'پاک کردن', + clearButtonAriaLabel: 'پاک کردن عبارت جستجو', closeButtonText: 'بستن', closeButtonAriaLabel: 'بستن', - placeholderText: 'جستجوی مستندات', - placeholderTextAskAi: 'از هوش مصنوعی بپرسید: ', - placeholderTextAskAiStreaming: 'در حال پاسخ...', + placeholderText: 'در مستندات جستجو کنید یا از Ask AI بپرسید', + placeholderTextAskAi: 'سؤال دیگری بپرسید...', + placeholderTextAskAiStreaming: 'در حال پاسخ گویی...', searchInputLabel: 'جستجو', backToKeywordSearchButtonText: 'بازگشت به جستجوی کلیدواژه', - backToKeywordSearchButtonAriaLabel: 'بازگشت به جستجوی کلیدواژه' + backToKeywordSearchButtonAriaLabel: 'بازگشت به جستجوی کلیدواژه', + newConversationPlaceholder: 'یک سؤال بپرسید', + conversationHistoryTitle: 'تاریخچه گفت وگوی من', + startNewConversationText: 'شروع گفت وگوی جدید', + viewConversationHistoryText: 'تاریخچه گفت وگو', + threadDepthErrorPlaceholder: 'محدودیت گفت وگو رسید' }, - startScreen: { - recentSearchesTitle: 'جستجوهای اخیر', - noRecentSearchesText: 'هیچ جستجوی اخیر', - saveRecentSearchButtonTitle: 'ذخیره در تاریخچه جستجو', - removeRecentSearchButtonTitle: 'حذف از تاریخچه جستجو', - favoriteSearchesTitle: 'علاقه‌مندی‌ها', - removeFavoriteSearchButtonTitle: 'حذف از علاقه‌مندی‌ها', - recentConversationsTitle: 'گفتگوهای اخیر', - removeRecentConversationButtonTitle: 'حذف این گفتگو از تاریخچه' + newConversation: { + newConversationTitle: 'امروز چگونه می توانم کمک کنم؟', + newConversationDescription: + 'در مستندات شما جستجو می کنم تا سریع راهنماهای راه اندازی، جزئیات ویژگی ها و نکات رفع اشکال را پیدا کنم.' + }, + footer: { + selectText: 'انتخاب', + submitQuestionText: 'ارسال سؤال', + selectKeyAriaLabel: 'کلید Enter', + navigateText: 'پیمایش', + navigateUpKeyAriaLabel: 'پیکان بالا', + navigateDownKeyAriaLabel: 'پیکان پایین', + closeText: 'بستن', + backToSearchText: 'بازگشت به جستجو', + closeKeyAriaLabel: 'کلید Escape', + poweredByText: 'قدرت گرفته از' }, errorScreen: { - titleText: 'عدم امکان دریافت نتایج', - helpText: 'اتصال شبکه خود را بررسی کنید' + titleText: 'امکان دریافت نتایج وجود ندارد', + helpText: 'ممکن است لازم باشد اتصال شبکه را بررسی کنید.' + }, + startScreen: { + recentSearchesTitle: 'اخیر', + noRecentSearchesText: 'جستجوی اخیر وجود ندارد', + saveRecentSearchButtonTitle: 'ذخیره این جستجو', + removeRecentSearchButtonTitle: 'حذف این جستجو از تاریخچه', + favoriteSearchesTitle: 'علاقه مندی ها', + removeFavoriteSearchButtonTitle: 'حذف این جستجو از علاقه مندی ها', + recentConversationsTitle: 'گفت وگوهای اخیر', + removeRecentConversationButtonTitle: 'حذف این گفت وگو از تاریخچه' }, noResultsScreen: { - noResultsText: 'هیچ نتیجه‌ای یافت نشد', - suggestedQueryText: 'می‌توانید جستجوی دیگری امتحان کنید', - reportMissingResultsText: 'فکر می‌کنید باید نتیجه‌ای نمایش داده شود؟', - reportMissingResultsLinkText: 'برای ارسال بازخورد کلیک کنید' + noResultsText: 'هیچ نتیجه ای برای', + suggestedQueryText: 'سعی کنید جستجو کنید', + reportMissingResultsText: + 'فکر می کنید این جستجو باید نتیجه داشته باشد؟', + reportMissingResultsLinkText: 'به ما اطلاع دهید.' }, resultsScreen: { - askAiPlaceholder: 'از هوش مصنوعی بپرسید: ' + askAiPlaceholder: 'از هوش مصنوعی بپرسید: ', + noResultsAskAiPlaceholder: + 'در مستندات پیدا نکردید؟ از Ask AI کمک بگیرید: ' }, askAiScreen: { disclaimerText: - 'پاسخ‌ها توسط هوش مصنوعی تولید می‌شوند و ممکن است خطا داشته باشند. لطفاً بررسی کنید.', + 'پاسخ ها توسط هوش مصنوعی تولید می شوند و ممکن است اشتباه باشند. بررسی کنید.', relatedSourcesText: 'منابع مرتبط', - thinkingText: 'در حال پردازش...', + thinkingText: 'در حال فکر کردن...', copyButtonText: 'کپی', copyButtonCopiedText: 'کپی شد!', copyButtonTitle: 'کپی', likeButtonTitle: 'پسندیدم', dislikeButtonTitle: 'نپسندیدم', - thanksForFeedbackText: 'از بازخورد شما سپاسگزاریم!', + thanksForFeedbackText: 'از بازخورد شما متشکریم!', preToolCallText: 'در حال جستجو...', - duringToolCallText: 'در حال جستجو برای ', - afterToolCallText: 'جستجو انجام شد', - aggregatedToolCallText: 'جستجو انجام شد' + duringToolCallText: 'در حال جستجو...', + afterToolCallText: 'جستجو برای', + stoppedStreamingText: 'شما این پاسخ را متوقف کردید', + errorTitleText: 'خطای گفتگو', + threadDepthExceededMessage: + 'برای حفظ دقت پاسخ ها، این گفت وگو بسته شد.', + startNewConversationButtonText: 'شروع گفت وگوی جدید' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'از هوش مصنوعی بپرسید', + buttonAriaLabel: 'از هوش مصنوعی بپرسید' + } }, - footer: { - selectText: 'انتخاب', - submitQuestionText: 'ارسال پرسش', - selectKeyAriaLabel: 'کلید Enter', - navigateText: 'حرکت', - navigateUpKeyAriaLabel: 'کلید جهت بالا', - navigateDownKeyAriaLabel: 'کلید جهت پایین', - closeText: 'بستن', - backToSearchText: 'بازگشت به جستجو', - closeKeyAriaLabel: 'کلید Escape', - poweredByText: 'جستجو توسط' + panel: { + translations: { + header: { + title: 'از هوش مصنوعی بپرسید', + conversationHistoryTitle: 'تاریخچه گفت وگوی من', + newConversationText: 'شروع گفت وگوی جدید', + viewConversationHistoryText: 'تاریخچه گفت وگو' + }, + promptForm: { + promptPlaceholderText: 'یک سؤال بپرسید', + promptAnsweringText: 'در حال پاسخ گویی...', + promptAskAnotherQuestionText: 'سؤال دیگری بپرسید', + promptDisclaimerText: + 'پاسخ ها توسط هوش مصنوعی تولید می شوند و ممکن است اشتباه باشند.', + promptLabelText: + 'برای ارسال Enter را بزنید، یا برای خط جدید Shift+Enter.', + promptAriaLabelText: 'ورودی پرسش' + }, + conversationScreen: { + preToolCallText: 'در حال جستجو...', + searchingText: 'در حال جستجو...', + toolCallResultText: 'جستجو برای', + conversationDisclaimer: + 'پاسخ ها توسط هوش مصنوعی تولید می شوند و ممکن است اشتباه باشند. بررسی کنید.', + reasoningText: 'در حال استدلال...', + thinkingText: 'در حال فکر کردن...', + relatedSourcesText: 'منابع مرتبط', + stoppedStreamingText: 'شما این پاسخ را متوقف کردید', + copyButtonText: 'کپی', + copyButtonCopiedText: 'کپی شد!', + likeButtonTitle: 'پسندیدم', + dislikeButtonTitle: 'نپسندیدم', + thanksForFeedbackText: 'از بازخورد شما متشکریم!', + errorTitleText: 'خطای گفتگو' + }, + newConversationScreen: { + titleText: 'امروز چگونه می توانم کمک کنم؟', + introductionText: + 'در مستندات شما جستجو می کنم تا سریع راهنماهای راه اندازی، جزئیات ویژگی ها و نکات رفع اشکال را پیدا کنم.' + }, + logo: { + poweredByText: 'قدرت گرفته از' + } + } } } } diff --git a/docs/fa/guide/deploy.md b/docs/fa/guide/deploy.md index a8c8ebc0..de3cf724 100644 --- a/docs/fa/guide/deploy.md +++ b/docs/fa/guide/deploy.md @@ -105,13 +105,13 @@ Cache-Control: max-age=31536000,immutable ## راهنمای‌های پلتفرم {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render} +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} یک پروژه جدید راه‌اندازی کرده و این تنظیمات را با استفاده از داشبورد خود تغییر دهید: - **دستور ساخت:** `npm run docs:build` - **دایرکتوری خروجی:** `docs/.vitepress/dist` -- **نسخه Node:** `18` (یا بالاتر) +- **نسخه Node:** `20` (یا بالاتر) ::: warning هشدار گزینه‌هایی مانند _Auto Minify_ را برای کد HTML فعال نکنید. این گزینه‌ها ممکن است توضیحاتی را که به Vue معنا دارد، از خروجی حذف کنند. ممکن است خطاهای ناسازگاری را در اجرا ببینید اگر حذف شوند. @@ -198,7 +198,7 @@ Cache-Control: max-age=31536000,immutable ### صفحات GitLab {#gitlab-pages} -1. `outDir` را در پیکربندی ویت‌پرس به `../public` تنظیم کنید. گزینه `base` را به `'//'` تنظیم کنید اگر می‌خواهید در `https://.gitlab.io//` انتشار دهید. +1. `outDir` را در پیکربندی ویت‌پرس به `../public` تنظیم کنید. گزینه `base` را به `'//'` تنظیم کنید اگر می‌خواهید در `https://.gitlab.io//` انتشار دهید. اگر روی دامنه سفارشی، صفحات کاربر یا گروه منتشر می‌کنید یا تنظیمات "Use unique domain" در GitLab فعال است، نیازی به `base` ندارید. 2. یک فایل به نام `.gitlab-ci.yml` در ریشه پروژه خود با محتوای زیر ایجاد کنید. این کار به ساخت و انتشار وب‌سایت شما هر زمانی که تغییری در محتوا ایجاد می‌کنید، می‌پردازد: @@ -219,7 +219,7 @@ Cache-Control: max-age=31536000,immutable - main ``` -### Azure Static Web Apps {#azure-static-web-apps} +### Azure 1. دستورالعمل [رسمی](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration) را دنبال کنید. @@ -229,7 +229,11 @@ Cache-Control: max-age=31536000,immutable - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +می‌توانید پروژه ویت‌پرس خود را با [CloudRay](https://cloudray.io/) با دنبال کردن این [دستورالعمل‌ها](https://cloudray.io/articles/how-to-deploy-vitepress-site) منتشر کنید. + +### Firebase 1. فایل‌های `firebase.json` و `.firebaserc` را در ریشه پروژه خود ایجاد کنید: @@ -260,15 +264,7 @@ Cache-Control: max-age=31536000,immutable firebase deploy ``` -### Surge {#surge} - -1. بعد از اجرای `npm run docs:build`، دستور زیر را برای انتشار اجرا کنید: - - ```sh - npx surge docs/.vitepress/dist - ``` - -### Heroku {#heroku} +### Heroku 1. دستورالعمل و راهنماها را در [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static) دنبال کنید. @@ -280,11 +276,11 @@ Cache-Control: max-age=31536000,immutable } ``` -### Edgio {#edgio} +### Hostinger -به [ایجاد و انتشار یک برنامه ویت‌پرس در Edgio](https://docs.edg.io/guides/vitepress) مراجعه کنید. +می‌توانید پروژه ویت‌پرس خود را با [Hostinger](https://www.hostinger.com/web-apps-hosting) با دنبال کردن این [دستورالعمل‌ها](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/) منتشر کنید. هنگام پیکربندی تنظیمات ساخت، VitePress را به عنوان فریم‌ورک انتخاب کنید و ریشه دایرکتوری را به `./docs` تنظیم کنید. -### Kinsta Static Site Hosting {#kinsta-static-site-hosting} +### Kinsta شما می‌توانید وب‌سایت ویت‌پرس خود را بر روی [Kinsta](https://kinsta.com/static-site-hosting/) با دنبال کردن این [دستورالعمل‌ها](https://kinsta.com/docs/vitepress-static-site-example/) انتشار دهید. @@ -292,6 +288,14 @@ Cache-Control: max-age=31536000,immutable شما می‌توانید پروژه ویت‌پرس خود را به [Stormkit](https://www.stormkit.io) با دنبال کردن این [دستورالعمل‌ها](https://stormkit.io/blog/how-to-deploy-vitepress) انتشار دهید. +### Surge + +1. بعد از اجرای `npm run docs:build`، دستور زیر را برای انتشار اجرا کنید: + + ```sh + npx surge docs/.vitepress/dist + ``` + ### Nginx اینجا یک مثال از پیکربندی بلوک سرور Nginx است. این تنظیم شامل فشرده‌سازی gzip برای فایل‌های متن معمولی، قوانین برای سرویس فایل‌های ایستا سایت ویت‌پرس شما با هدرهای مناسب برای حافظه‌نگهداری مناسب است و همچنین مدیریت `cleanUrls: true` می‌کند. diff --git a/docs/fa/guide/markdown.md b/docs/fa/guide/markdown.md index 077c7383..bac84ac9 100644 --- a/docs/fa/guide/markdown.md +++ b/docs/fa/guide/markdown.md @@ -724,7 +724,7 @@ export default config ## مبانی - + ``` **قسمت فایل** (`parts/basics.md`) @@ -760,7 +760,7 @@ export default config ## مبانی - + ``` **قسمت فایل** (`parts/basics.md`) @@ -796,8 +796,8 @@ export default config ## مبانی - - + + ``` **قسمت فایل** (`parts/basics.md`) diff --git a/docs/fa/reference/default-theme-search.md b/docs/fa/reference/default-theme-search.md index 033e145e..dad447fa 100644 --- a/docs/fa/reference/default-theme-search.md +++ b/docs/fa/reference/default-theme-search.md @@ -39,25 +39,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - zh: { // اگر می‌خواهید زبان پیش‌فرض را ترجمه کنید، این را به `root` تغییر دهید + fa: { // اگر می خواهید زبان پیش فرض را ترجمه کنید، این را `root` قرار دهید translations: { button: { buttonText: 'جستجو', buttonAriaLabel: 'جستجو' }, modal: { - displayDetails: 'نمایش جزئیات', + displayDetails: 'نمایش فهرست کامل', resetButtonTitle: 'بازنشانی جستجو', backButtonTitle: 'بستن جستجو', - noResultsText: 'نتیجه‌ای یافت نشد', + noResultsText: 'نتیجه ای یافت نشد', footer: { selectText: 'انتخاب', - selectKeyAriaLabel: 'ورود', + selectKeyAriaLabel: 'Enter', navigateText: 'پیمایش', - navigateUpKeyAriaLabel: 'کلید بالا', - navigateDownKeyAriaLabel: 'کلید پایین', + navigateUpKeyAriaLabel: 'فلش بالا', + navigateDownKeyAriaLabel: 'فلش پایین', closeText: 'بستن', - closeKeyAriaLabel: 'esc' + closeKeyAriaLabel: 'Esc' } } } @@ -123,7 +123,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // بازگشت رشته HTML + // رشته HTML را برمی گرداند } } } @@ -174,7 +174,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -208,6 +208,19 @@ export default defineConfig({ می‌توانید با استفاده از تنظیماتی مانند این برای جستجوی چندزبانه استفاده کنید: +
+برای باز کردن کلیک کنید + +<<< @/snippets/algolia-i18n.ts + +
+ +برای اطلاعات بیشتر به [مستندات رسمی Algolia](https://docsearch.algolia.com/docs/api#translations) مراجعه کنید. برای شروع سریع‌تر، می‌توانید ترجمه‌های استفاده‌شده در این سایت را از [مخزن GitHub ما](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code) کپی کنید. + +### پشتیبانی Algolia Ask AI {#ask-ai} + +برای فعال‌سازی **Ask AI** کافی است گزینه `askAi` را اضافه کنید: + ```ts import { defineConfig } from 'vitepress' @@ -219,46 +232,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' - }, - modal: { - searchBox: { - resetButtonTitle: '清除搜索条件', - resetButtonAriaLabel: '清除搜索条件', - cancelButtonText: '取消', - cancelButtonAriaLabel: '取消' - }, - startScreen: { - recentSearchesTitle: '最近搜索', - noRecentSearchesText: '没有最近搜索', - saveRecentSearchButtonTitle: '保存到最近搜索', - removeRecentSearchButtonTitle: '从最近搜索中删除' - }, - errorScreen: { - titleText: '无法显示结果', - helpText: '您可能需要检查您的互联网连接' - }, - footer: { - selectText: '选择', - navigateText: '导航', - closeText: '关闭', - searchByText: '搜索由' - }, - noResultsScreen: { - noResultsText: '没有找到结果', - suggestedQueryText: '您可以尝试', - reportMissingResultsText: '您认为应该有结果吗?', - reportMissingResultsLinkText: '点击这里报告' - } - } - } - } + // askAi: "شناسه-دستیار-شما" + // یا + askAi: { + // حداقل باید assistantId دریافت شده از Algolia را ارائه کنید + assistantId: 'XXXYYY', + // بازنویسی های اختیاری — اگر حذف شوند، مقادیر appId/apiKey/indexName سطح بالا دوباره استفاده می شوند + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -266,131 +248,108 @@ export default defineConfig({ }) ``` -این [گزینه‌ها](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) می‌توانند بازنویسی شوند. برای یادگیری بیشتر درباره آن‌ها به اسناد رسمی Algolia مراجعه کنید. +::: warning نکته +اگر فقط به جستجوی کلمات کلیدی نیاز دارید، `askAi` را اضافه نکنید. +::: -### پیکربندی Crawler {#crawler-config} +### پنل کناری Ask AI {#ask-ai-side-panel} -در اینجا یک پیکربندی نمونه بر اساس آنچه که این سایت استفاده می‌کند آمده است: +DocSearch v4.5+ از **پنل کناری Ask AI** اختیاری پشتیبانی می‌کند. وقتی فعال باشد، به طور پیش‌فرض می‌توان آن را با **Ctrl/Cmd+I** باز کرد. [مرجع API پنل کناری](https://docsearch.algolia.com/docs/sidepanel/api-reference) شامل لیست کامل گزینه‌ها است. ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: '', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + // آینه API @docsearch/sidepanel-js SidepanelProps + panel: { + variant: 'floating', // یا 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' + } +}) +``` + +اگر نیاز به غیرفعال کردن میانبر صفحه‌کلید دارید، از گزینه `keyboardShortcuts` پنل کناری استفاده کنید: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } } } }) ``` -### پشتیبانی Algolia Ask AI {#ask-ai} +#### حالت (auto / sidePanel / hybrid / modal) {#ask-ai-mode} -برای فعال‌سازی **Ask AI** کافی است گزینه `askAi` را اضافه کنید: +می‌توانید به صورت اختیاری نحوه ادغام جستجوی کلمات کلیدی و Ask AI در VitePress را کنترل کنید: + +- `mode: 'auto'` (پیش‌فرض): وقتی جستجوی کلمات کلیدی پیکربندی شده باشد `hybrid` را استنباط می‌کند، در غیر این صورت وقتی پنل کناری Ask AI پیکربندی شده باشد `sidePanel` را استنباط می‌کند. +- `mode: 'sidePanel'`: فقط پنل کناری را اعمال می‌کند (دکمه جستجوی کلمات کلیدی را پنهان می‌کند). +- `mode: 'hybrid'`: مودال جستجوی کلمات کلیدی + پنل کناری Ask AI را فعال می‌کند (نیاز به پیکربندی جستجوی کلمات کلیدی دارد). +- `mode: 'modal'`: Ask AI را درون مودال DocSearch نگه می‌دارد (حتی اگر پنل کناری را پیکربندی کرده باشید). + +#### فقط Ask AI (بدون جستجوی کلمات کلیدی) {#ask-ai-only} + +اگر می‌خواهید **فقط پنل کناری Ask AI** را استفاده کنید، می‌توانید پیکربندی جستجوی کلمات کلیدی سطح بالا را حذف کرده و اعتبارنامه‌ها را در `askAi` ارائه دهید: ```ts -options: { - appId: '...', - apiKey: '...', - indexName: '...', - askAi: { - assistantId: 'XXXYYY' +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } + } + } } -} +}) ``` -::: warning نکته -اگر فقط به جستجوی کلمات کلیدی نیاز دارید، `askAi` را اضافه نکنید. -::: +### پیکربندی Crawler {#crawler-config} + +در اینجا یک پیکربندی نمونه بر اساس آنچه که این سایت استفاده می‌کند آمده است: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/fa/reference/runtime-api.md b/docs/fa/reference/runtime-api.md index 67e076cd..ba74ff18 100644 --- a/docs/fa/reference/runtime-api.md +++ b/docs/fa/reference/runtime-api.md @@ -49,7 +49,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/ja/config.ts b/docs/ja/config.ts index 4f6ef26d..0631ca82 100644 --- a/docs/ja/config.ts +++ b/docs/ja/config.ts @@ -149,7 +149,6 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: 'ドキュメントを検索', translations: { button: { buttonText: '検索', @@ -157,67 +156,138 @@ function searchOptions(): Partial { }, modal: { searchBox: { - clearButtonTitle: '検索をクリア', - clearButtonAriaLabel: '検索をクリア', + clearButtonTitle: 'クリア', + clearButtonAriaLabel: 'クエリをクリア', closeButtonText: '閉じる', closeButtonAriaLabel: '閉じる', - placeholderText: 'ドキュメントを検索', - placeholderTextAskAi: 'AI に質問: ', - placeholderTextAskAiStreaming: '回答を作成中...', + placeholderText: 'ドキュメントを検索するか Ask AI に質問', + placeholderTextAskAi: '別の質問をする...', + placeholderTextAskAiStreaming: '回答中...', searchInputLabel: '検索', backToKeywordSearchButtonText: 'キーワード検索に戻る', - backToKeywordSearchButtonAriaLabel: 'キーワード検索に戻る' + backToKeywordSearchButtonAriaLabel: 'キーワード検索に戻る', + newConversationPlaceholder: '質問する', + conversationHistoryTitle: '自分の会話履歴', + startNewConversationText: '新しい会話を開始', + viewConversationHistoryText: '会話履歴', + threadDepthErrorPlaceholder: '会話上限に達しました' + }, + newConversation: { + newConversationTitle: '今日はどのようにお手伝いできますか?', + newConversationDescription: + 'ドキュメントを検索して、設定ガイド、機能の詳細、トラブルシューティングのヒントをすばやく見つけるお手伝いをします。' + }, + footer: { + selectText: '選択', + submitQuestionText: '質問を送信', + selectKeyAriaLabel: 'Enter キー', + navigateText: '移動', + navigateUpKeyAriaLabel: '上矢印', + navigateDownKeyAriaLabel: '下矢印', + closeText: '閉じる', + backToSearchText: '検索に戻る', + closeKeyAriaLabel: 'Escape キー', + poweredByText: '提供' + }, + errorScreen: { + titleText: '結果を取得できませんでした', + helpText: 'ネットワーク接続を確認してください。' }, startScreen: { - recentSearchesTitle: '検索履歴', + recentSearchesTitle: '最近', noRecentSearchesText: '最近の検索はありません', - saveRecentSearchButtonTitle: '検索履歴に保存', - removeRecentSearchButtonTitle: '検索履歴から削除', + saveRecentSearchButtonTitle: 'この検索を保存', + removeRecentSearchButtonTitle: '履歴からこの検索を削除', favoriteSearchesTitle: 'お気に入り', - removeFavoriteSearchButtonTitle: 'お気に入りから削除', + removeFavoriteSearchButtonTitle: 'お気に入りからこの検索を削除', recentConversationsTitle: '最近の会話', - removeRecentConversationButtonTitle: '会話履歴から削除' - }, - errorScreen: { - titleText: '結果を取得できません', - helpText: 'ネットワーク接続を確認してください' + removeRecentConversationButtonTitle: '履歴からこの会話を削除' }, noResultsScreen: { - noResultsText: '結果が見つかりません', - suggestedQueryText: '別の検索語を試してください', - reportMissingResultsText: '結果があるはずだと思いますか?', - reportMissingResultsLinkText: 'フィードバックを送る' + noResultsText: '次の検索結果はありません', + suggestedQueryText: '次を検索してみてください', + reportMissingResultsText: + 'この検索には結果があるべきだと思いますか?', + reportMissingResultsLinkText: 'お知らせください。' }, resultsScreen: { - askAiPlaceholder: 'AI に質問: ' + askAiPlaceholder: 'AI に質問:', + noResultsAskAiPlaceholder: + 'ドキュメントに見つかりませんでしたか? Ask AI に相談:' }, askAiScreen: { disclaimerText: - 'AI が生成した回答には誤りが含まれる可能性があります。必ずご確認ください。', + '回答は AI により生成され、誤りが含まれる場合があります。内容をご確認ください。', relatedSourcesText: '関連ソース', thinkingText: '考え中...', copyButtonText: 'コピー', copyButtonCopiedText: 'コピーしました!', copyButtonTitle: 'コピー', likeButtonTitle: 'いいね', - dislikeButtonTitle: 'よくない', + dislikeButtonTitle: 'よくないね', thanksForFeedbackText: 'フィードバックありがとうございます!', preToolCallText: '検索中...', - duringToolCallText: '検索中 ', - afterToolCallText: '検索完了', - aggregatedToolCallText: '検索完了' + duringToolCallText: '検索中...', + afterToolCallText: '検索しました', + stoppedStreamingText: 'この応答を停止しました', + errorTitleText: 'チャットエラー', + threadDepthExceededMessage: + '回答の正確性を保つため、この会話は終了しました。', + startNewConversationButtonText: '新しい会話を開始' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'AI に質問', + buttonAriaLabel: 'AI に質問' + } }, - footer: { - selectText: '選択', - submitQuestionText: '質問を送信', - selectKeyAriaLabel: 'Enter キー', - navigateText: '移動', - navigateUpKeyAriaLabel: '上矢印キー', - navigateDownKeyAriaLabel: '下矢印キー', - closeText: '閉じる', - backToSearchText: '検索に戻る', - closeKeyAriaLabel: 'Esc キー', - poweredByText: '提供: ' + panel: { + translations: { + header: { + title: 'AI に質問', + conversationHistoryTitle: '自分の会話履歴', + newConversationText: '新しい会話を開始', + viewConversationHistoryText: '会話履歴' + }, + promptForm: { + promptPlaceholderText: '質問する', + promptAnsweringText: '回答中...', + promptAskAnotherQuestionText: '別の質問をする', + promptDisclaimerText: + '回答は AI により生成され、誤りが含まれる場合があります。', + promptLabelText: 'Enterで送信、Shift+Enterで改行。', + promptAriaLabelText: 'プロンプト入力' + }, + conversationScreen: { + preToolCallText: '検索中...', + searchingText: '検索中...', + toolCallResultText: '検索しました', + conversationDisclaimer: + '回答は AI により生成され、誤りが含まれる場合があります。内容をご確認ください。', + reasoningText: '推論中...', + thinkingText: '考え中...', + relatedSourcesText: '関連ソース', + stoppedStreamingText: 'この応答を停止しました', + copyButtonText: 'コピー', + copyButtonCopiedText: 'コピーしました!', + likeButtonTitle: 'いいね', + dislikeButtonTitle: 'よくないね', + thanksForFeedbackText: 'フィードバックありがとうございます!', + errorTitleText: 'チャットエラー' + }, + newConversationScreen: { + titleText: '今日はどのようにお手伝いできますか?', + introductionText: + 'ドキュメントを検索して、設定ガイド、機能の詳細、トラブルシューティングのヒントをすばやく見つけるお手伝いをします。' + }, + logo: { + poweredByText: '提供' + } + } } } } diff --git a/docs/ja/guide/cms.md b/docs/ja/guide/cms.md index 191312df..9e3ceb06 100644 --- a/docs/ja/guide/cms.md +++ b/docs/ja/guide/cms.md @@ -12,44 +12,44 @@ CMS ごとに動作が異なるため、ここでは各自の環境に合わせ 1. CMS が認証を必要とする場合は、API トークンを格納するための `.env` を作成し、次のように読み込みます。 - ```js - // posts/[id].paths.js - import { loadEnv } from 'vitepress' + ```js + // posts/[id].paths.js + import { loadEnv } from 'vitepress' - const env = loadEnv('', process.cwd()) - ``` + const env = loadEnv('', process.cwd()) + ``` 2. CMS から必要なデータを取得し、適切なパスデータの形式に整形します。 - ```js - export default { - async paths() { - // 必要に応じて各 CMS のクライアントライブラリを使用 - const data = await (await fetch('https://my-cms-api', { - headers: { - // 必要ならトークン - } - })).json() - - return data.map(entry => { - return { - params: { id: entry.id, /* title, authors, date など */ }, - content: entry.content - } - }) - } - } - ``` + ```js + export default { + async paths() { + // 必要に応じて各 CMS のクライアントライブラリを使用 + const data = await (await fetch('https://my-cms-api', { + headers: { + // 必要ならトークン + } + })).json() + + return data.map((entry) => { + return { + params: { id: entry.id, /* title, authors, date など */ }, + content: entry.content + } + }) + } + } + ``` 3. ページ内でコンテンツをレンダリングします。 - ```md - # {{ $params.title }} + ```md + # {{ $params.title }} - - {{ $params.date }} に {{ $params.author }} が作成 + - {{ $params.date }} に {{ $params.author }} が作成 - - ``` + + ``` ## 連携ガイドの募集 {#integration-guides} diff --git a/docs/ja/guide/custom-theme.md b/docs/ja/guide/custom-theme.md index 0095ca8a..9f11bba0 100644 --- a/docs/ja/guide/custom-theme.md +++ b/docs/ja/guide/custom-theme.md @@ -23,43 +23,42 @@ VitePress のカスタムテーマは次のインターフェースを持つオ ```ts interface Theme { -/** - * すべてのページに適用されるルートレイアウトコンポーネント - * @required - */ -Layout: Component -/** - * Vue アプリインスタンスを拡張 - * @optional - */ -enhanceApp?: (ctx: EnhanceAppContext) => Awaitable -/** - * 別のテーマを拡張し、そのテーマの `enhanceApp` を先に実行 - * @optional - */ -extends?: Theme + /** + * すべてのページに適用されるルートレイアウトコンポーネント + * @required + */ + Layout: Component + /** + * Vue アプリインスタンスを拡張 + * @optional + */ + enhanceApp?: (ctx: EnhanceAppContext) => Awaitable + /** + * 別のテーマを拡張し、そのテーマの `enhanceApp` を先に実行 + * @optional + */ + extends?: Theme } interface EnhanceAppContext { -app: App // Vue アプリインスタンス -router: Router // VitePress のルーターインスタンス -siteData: Ref // サイト全体のメタデータ + app: App // Vue アプリインスタンス + router: Router // VitePress のルーターインスタンス + siteData: Ref // サイト全体のメタデータ } ``` テーマエントリファイルでは、このテーマをデフォルトエクスポートとして公開します。 ```js [.vitepress/theme/index.js] - // テーマエントリでは Vue ファイルを直接インポートできます // VitePress は @vitejs/plugin-vue をあらかじめ設定済みです import Layout from './Layout.vue' export default { -Layout, -enhanceApp({ app, router, siteData }) { - // ... -} + Layout, + enhanceApp({ app, router, siteData }) { + // ... + } } ``` @@ -73,10 +72,10 @@ enhanceApp({ app, router, siteData }) { ```vue [.vitepress/theme/Layout.vue] ``` @@ -100,11 +99,11 @@ const { page } = useData() [`useData()`](../reference/runtime-api#usedata) ヘルパーを使うと、条件によってレイアウトを切り替えるために必要なすべてのランタイムデータを取得できます。アクセスできるデータのひとつにフロントマターがあります。これを利用すると、ページごとにレイアウトを制御できます。例えば、ユーザーが特別なホームページレイアウトを使いたい場合は以下のように記述します。 - ```md +```md --- layout: home --- - ``` +``` テーマ側を次のように調整します。 @@ -164,7 +163,6 @@ npm パッケージとして配布する場合は、次の手順を踏みます ## カスタムテーマの利用 {#consuming-a-custom-theme} - 外部テーマを利用するには、カスタムテーマエントリからインポートして再エクスポートします。 ```js [.vitepress/theme/index.js] @@ -179,10 +177,10 @@ export default Theme import Theme from 'awesome-vitepress-theme' export default { -extends: Theme, -enhanceApp(ctx) { - // ... -} + extends: Theme, + enhanceApp(ctx) { + // ... + } } ``` @@ -192,8 +190,8 @@ enhanceApp(ctx) { import baseConfig from 'awesome-vitepress-theme/config' export default { -// 必要に応じてテーマの基本設定を拡張 -extends: baseConfig + // 必要に応じてテーマの基本設定を拡張 + extends: baseConfig } ``` @@ -205,9 +203,9 @@ import { defineConfigWithTheme } from 'vitepress' import type { ThemeConfig } from 'awesome-vitepress-theme' export default defineConfigWithTheme({ -extends: baseConfig, -themeConfig: { - // 型は `ThemeConfig` -} + extends: baseConfig, + themeConfig: { + // 型は `ThemeConfig` + } }) ``` diff --git a/docs/ja/guide/data-loading.md b/docs/ja/guide/data-loading.md index 469999d7..def21ad6 100644 --- a/docs/ja/guide/data-loading.md +++ b/docs/ja/guide/data-loading.md @@ -10,12 +10,12 @@ VitePress には **データローダー (data loaders)** という機能があ ```js [example.data.js] export default { -load() { - return { - hello: 'world' + load() { + return { + hello: 'world' + } } } -} ``` ローダーモジュールは Node.js 上でのみ評価されるため、Node API や npm 依存関係を自由に利用できます。 @@ -179,7 +179,6 @@ interface ContentOptions { ## 型付きデータローダー {#typed-data-loaders} - TypeScript を使用する場合は、ローダーと `data` エクスポートを型付けできます。 ```ts @@ -202,7 +201,6 @@ export default defineLoader({ ## 設定情報の取得 {#configuration} - ローダー内で設定情報を取得するには次のようにします。 ```ts diff --git a/docs/ja/guide/deploy.md b/docs/ja/guide/deploy.md index b709c4d6..5e6a6cdc 100644 --- a/docs/ja/guide/deploy.md +++ b/docs/ja/guide/deploy.md @@ -4,7 +4,6 @@ outline: deep # VitePress サイトをデプロイする {#deploy-your-vitepress-site} - 以下のガイドは、次の前提に基づいています。 - VitePress のサイトはプロジェクトの `docs` ディレクトリ内にある。 @@ -12,17 +11,16 @@ outline: deep - VitePress はプロジェクトのローカル依存としてインストールされており、`package.json` に次のスクリプトが設定されている。 ```json [package.json] - { - "scripts": { - "docs:build": "vitepress build docs", - "docs:preview": "vitepress preview docs" - } - } +{ + "scripts": { + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + } +} ``` ## ローカルでビルドしてテストする {#build-and-test-locally} - 1. 次のコマンドでドキュメントをビルドします。 ```sh @@ -35,30 +33,28 @@ outline: deep $ npm run docs:preview ``` - `preview` コマンドはローカルの静的 Web サーバーを起動し、出力ディレクトリ `.vitepress/dist` を `http://localhost:4173` で配信します。プロダクションへプッシュする前に見た目を確認できます。 + `preview` コマンドはローカルの静的 Web サーバーを起動し、出力ディレクトリ `.vitepress/dist` を `http://localhost:4173` で配信します。プロダクションへプッシュする前に見た目を確認できます。 3. `--port` 引数でサーバーのポートを設定できます。 ```json - { - "scripts": { - "docs:preview": "vitepress preview docs --port 8080" - } - } + { + "scripts": { + "docs:preview": "vitepress preview docs --port 8080" + } + } ``` - これで `docs:preview` は `http://localhost:8080` でサーバーを起動します。 + これで `docs:preview` は `http://localhost:8080` でサーバーを起動します。 ## 公開ベースパスの設定 {#setting-a-public-base-path} - デフォルトでは、サイトはドメインのルートパス(`/`)にデプロイされることを想定しています。サイトをサブパス、例:`https://mywebsite.com/blog/` で配信する場合は、VitePress の設定で [`base`](../reference/site-config#base) オプションを `'/blog/'` に設定してください。 **例:** GitHub(または GitLab)Pages に `user.github.io/repo/` としてデプロイするなら、`base` を `/repo/` に設定します。 ## HTTP キャッシュヘッダー {#http-cache-headers} - 本番サーバーの HTTP ヘッダーを制御できる場合は、`cache-control` ヘッダーを設定して、再訪時のパフォーマンスを向上させましょう。 本番ビルドでは静的アセット(JavaScript、CSS、`public` 以外のインポートアセット)にハッシュ付きファイル名が使用されます。ブラウザの開発者ツールのネットワークタブで本番プレビューを確認すると、`app.4f283b18.js` のようなファイルが見られます。 @@ -86,19 +82,19 @@ Cache-Control: max-age=31536000,immutable ::: details `vercel.json` による Vercel 設定例 ```json - { - "headers": [ - { - "source": "/assets/(.*)", - "headers": [ - { - "key": "Cache-Control", - "value": "max-age=31536000, immutable" - } - ] - } - ] - } +{ + "headers": [ + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "max-age=31536000, immutable" + } + ] + } + ] +} ``` 注:`vercel.json` は **リポジトリのルート** に配置してください。 @@ -109,8 +105,7 @@ Cache-Control: max-age=31536000,immutable ## プラットフォーム別ガイド {#platform-guides} - -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render} +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} 新しいプロジェクトを作成し、ダッシュボードで次の設定に変更します。 @@ -122,143 +117,146 @@ Cache-Control: max-age=31536000,immutable HTML の _Auto Minify_ のようなオプションを有効にしないでください。Vue にとって意味のあるコメントが出力から削除され、削除されるとハイドレーションの不整合エラーが発生する可能性があります。 ::: -### GitHub Pages {#github-pages} +### GitHub Pages 1. プロジェクトの `.github/workflows` ディレクトリに `deploy.yml` を作成し、以下の内容を記述します。 ```yaml [.github/workflows/deploy.yml] - # Sample workflow for building and deploying a VitePress site to GitHub Pages - # - name: Deploy VitePress site to Pages - - on: - # Runs on pushes targeting the `main` branch. Change this to `master` if you're - # using the `master` branch as the default branch. - push: - branches: [main] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - - # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages - permissions: - contents: read - pages: write - id-token: write - - # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. - # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. - concurrency: - group: pages - cancel-in-progress: false - - jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 # Not needed if lastUpdated is not enabled - # - uses: pnpm/action-setup@v4 # Uncomment this block if you're using pnpm - # with: - # version: 9 # Not needed if you've set "packageManager" in package.json - # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun - - name: Setup Node - uses: actions/setup-node@v6 - with: - node-version: 24 - cache: npm # or pnpm / yarn - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Install dependencies - run: npm ci # or pnpm install / yarn install / bun install - - name: Build with VitePress - run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: docs/.vitepress/dist - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - needs: build - runs-on: ubuntu-latest - name: Deploy - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + # Sample workflow for building and deploying a VitePress site to GitHub Pages + # + name: Deploy VitePress site to Pages + + on: + # Runs on pushes targeting the `main` branch. Change this to `master` if you're + # using the `master` branch as the default branch. + push: + branches: [main] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages + permissions: + contents: read + pages: write + id-token: write + + # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. + # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. + concurrency: + group: pages + cancel-in-progress: false + + jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Not needed if lastUpdated is not enabled + # - uses: pnpm/action-setup@v4 # Uncomment this block if you're using pnpm + # with: + # version: 9 # Not needed if you've set "packageManager" in package.json + # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm # or pnpm / yarn + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci # or pnpm install / yarn install / bun install + - name: Build with VitePress + run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 ``` - ::: warning - VitePress の `base` オプションが正しく設定されていることを確認してください。詳細は [公開ベースパスの設定](#公開ベースパスの設定) を参照してください。 - ::: + ::: warning + VitePress の `base` オプションが正しく設定されていることを確認してください。詳細は [公開ベースパスの設定](#公開ベースパスの設定) を参照してください。 + ::: 2. リポジトリ設定の「Pages」メニューで、「Build and deployment > Source」を「GitHub Actions」に設定します。 3. 変更を `main` ブランチにプッシュし、GitHub Actions の完了を待ちます。設定に応じて、サイトは `https://.github.io/[repository]/` または `https:///` にデプロイされます。以後、`main` へのプッシュごとに自動デプロイされます。 -### GitLab Pages {#gitlab-pages} +### GitLab Pages 1. VitePress の設定で `outDir` を `../public` に設定します。`https://.gitlab.io//` にデプロイする場合は `base` を `'//'` に設定します。カスタムドメイン、ユーザー/グループページ、または GitLab の「Use unique domain」を有効にしている場合は `base` は不要です。 2. プロジェクトのルートに `.gitlab-ci.yml` を作成して、以下を追加します。これにより、コンテンツを更新するたびにサイトがビルド・デプロイされます。 ```yaml [.gitlab-ci.yml] - image: node:18 - pages: - cache: - paths: - - node_modules/ - script: - # - apk add git # Uncomment this if you're using small docker images like alpine and have lastUpdated enabled - - npm install - - npm run docs:build - artifacts: - paths: - - public - only: - - main + image: node:18 + pages: + cache: + paths: + - node_modules/ + script: + # - apk add git # Uncomment this if you're using small docker images like alpine and have lastUpdated enabled + - npm install + - npm run docs:build + artifacts: + paths: + - public + only: + - main ``` -### Azure Static Web Apps {#azure-static-web-apps} +### Azure 1. [公式ドキュメント](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration) に従います。 2. 設定ファイルで次の値を指定します(`api_location` のように不要なものは削除)。 - - **`app_location`**: `/` - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +[CloudRay](https://cloudray.io/) でのデプロイ方法は [こちらの手順](https://cloudray.io/articles/how-to-deploy-vitepress-site) を参照してください。 + +### Firebase 1. プロジェクトのルートに `firebase.json` と `.firebaserc` を作成します。 `firebase.json`: ```json [firebase.json] - { - "hosting": { - "public": "docs/.vitepress/dist", - "ignore": [] - } - } + { + "hosting": { + "public": "docs/.vitepress/dist", + "ignore": [] + } + } ``` `.firebaserc`: ```json [.firebaserc] - { - "projects": { - "default": "" - } - } + { + "projects": { + "default": "" + } + } ``` 2. `npm run docs:build` の後、次のコマンドでデプロイします。 @@ -267,43 +265,39 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ firebase deploy ``` -### Surge {#surge} - -1. `npm run docs:build` の後、次のコマンドでデプロイします。 - - ```sh - npx surge docs/.vitepress/dist - ``` - -### Heroku {#heroku} +### Heroku 1. [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static) のドキュメントとガイドに従います。 2. プロジェクトのルートに `static.json` を作成し、以下を記述します。 ```json [static.json] - { - "root": "docs/.vitepress/dist" - } + { + "root": "docs/.vitepress/dist" + } ``` -### Edgio {#edgio} +### Hostinger -[Creating and Deploying a VitePress App To Edgio](https://docs.edg.io/guides/vitepress) を参照してください。 +[Hostinger](https://www.hostinger.com/web-apps-hosting) を使用して VitePress プロジェクトをデプロイするには、こちらの [手順](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/) に従ってください。ビルド設定の構成では、フレームワークに VitePress を選択し、ルートディレクトリを `./docs` に調整してください。 -### Kinsta Static Site Hosting {#kinsta-static-site-hosting} +### Kinsta [VitePress](https://kinsta.com/static-site-hosting/) を [こちらの手順](https://kinsta.com/docs/vitepress-static-site-example/) に従ってデプロイできます。 -### Stormkit {#stormkit} +### Stormkit [VitePress プロジェクトを Stormkit にデプロイ](https://stormkit.io/blog/how-to-deploy-vitepress) する手順を参照してください。 -### CloudRay {#cloudray} +### Surge -[CloudRay](https://cloudray.io/) でのデプロイ方法は [こちらの手順](https://cloudray.io/articles/how-to-deploy-vitepress-site) を参照してください。 +1. `npm run docs:build` の後、次のコマンドでデプロイします。 + + ```sh + npx surge docs/.vitepress/dist + ``` -### Nginx {#nginx} +### Nginx 以下は Nginx サーバーブロックの設定例です。一般的なテキスト系アセットの gzip 圧縮、VitePress サイトの静的ファイル配信における適切なキャッシュヘッダー、そして `cleanUrls: true` のハンドリングを含みます。 diff --git a/docs/ja/guide/extending-default-theme.md b/docs/ja/guide/extending-default-theme.md index 6047ac91..fc5ce184 100644 --- a/docs/ja/guide/extending-default-theme.md +++ b/docs/ja/guide/extending-default-theme.md @@ -70,7 +70,9 @@ export default DefaultTheme export default { transformHead({ assets }) { // 使うフォントに合わせて正規表現を調整 - const myFontFile = assets.find(file => /font-name\.[\w-]+\.woff2/.test(file)) + const myFontFile = assets.find((file) => + /font-name\.[\w-]+\.woff2/.test(file) + ) if (myFontFile) { return [ [ diff --git a/docs/ja/guide/frontmatter.md b/docs/ja/guide/frontmatter.md index 0c5ddcb5..46c52e85 100644 --- a/docs/ja/guide/frontmatter.md +++ b/docs/ja/guide/frontmatter.md @@ -5,10 +5,10 @@ VitePress はすべての Markdown ファイルで YAML フロントマターをサポートしており、[gray-matter](https://github.com/jonschlinkert/gray-matter) で解析します。フロントマターは Markdown ファイルの先頭(` - - # Hello - ``` +```md + + +# Hello +``` ` - ``` +console.log(params.value) + +``` ### 生コンテンツのレンダリング {#rendering-raw-content} @@ -363,23 +363,23 @@ VitePress は静的サイトジェネレーターなので、生成可能なペ 代わりに、各パスオブジェクトの `content` プロパティでコンテンツを渡せます: - ```js - export default { - async paths() { - const posts = await (await fetch('https://my-cms.com/blog-posts')).json() - - return posts.map((post) => { - return { - params: { id: post.id }, - content: post.content // 生の Markdown または HTML - } - }) - } - } - ``` +```js +export default { + async paths() { + const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + + return posts.map((post) => { + return { + params: { id: post.id }, + content: post.content // 生の Markdown または HTML + } + }) + } +} +``` そのうえで、Markdown ファイル内で次の特別な構文を使って、そのコンテンツを埋め込みます: - ```md - - ``` +```md + +``` diff --git a/docs/ja/guide/sitemap-generation.md b/docs/ja/guide/sitemap-generation.md index db44942c..0d2e4645 100644 --- a/docs/ja/guide/sitemap-generation.md +++ b/docs/ja/guide/sitemap-generation.md @@ -2,13 +2,13 @@ VitePress には、サイト用の `sitemap.xml` を生成する機能が標準で用意されています。有効化するには、`.vitepress/config.js` に次を追加します。 - ```ts - export default { - sitemap: { - hostname: 'https://example.com' - } - } - ``` +```ts +export default { + sitemap: { + hostname: 'https://example.com' + } +} +``` `siteamp.xml` に `` タグを含めるには、[`lastUpdated`](../reference/default-theme-last-updated) オプションを有効にします。 @@ -16,43 +16,43 @@ VitePress には、サイト用の `sitemap.xml` を生成する機能が標準 サイトマップ生成は [`sitemap`](https://www.npmjs.com/package/sitemap) モジュールで行われます。設定ファイルの `sitemap` に、このモジュールがサポートする任意のオプションを渡せます。指定した値はそのまま `SitemapStream` コンストラクタに渡されます。詳しくは [`sitemap` のドキュメント](https://www.npmjs.com/package/sitemap#options-you-can-pass) を参照してください。例: - ```ts - export default { - sitemap: { - hostname: 'https://example.com', - lastmodDateOnly: false - } - } - ``` +```ts +export default { + sitemap: { + hostname: 'https://example.com', + lastmodDateOnly: false + } +} +``` 設定で `base` を使っている場合は、`hostname` にもそれを付与してください: - ```ts - export default { - base: '/my-site/', - sitemap: { - hostname: 'https://example.com/my-site/' - } - } - ``` +```ts +export default { + base: '/my-site/', + sitemap: { + hostname: 'https://example.com/my-site/' + } +} +``` ## `transformItems` フック {#transformitems-hook} `siteamp.xml` に書き出す直前にサイトマップ項目を加工するには、`sitemap.transformItems` フックを使います。このフックはサイトマップ項目の配列を受け取り、配列を返す必要があります。例: - ```ts - export default { - sitemap: { - hostname: 'https://example.com', - transformItems: (items) => { - // 既存項目の追加・変更・フィルタリングが可能 - items.push({ - url: '/extra-page', - changefreq: 'monthly', - priority: 0.8 - }) - return items - } - } - } - ``` +```ts +export default { + sitemap: { + hostname: 'https://example.com', + transformItems: (items) => { + // 既存項目の追加・変更・フィルタリングが可能 + items.push({ + url: '/extra-page', + changefreq: 'monthly', + priority: 0.8 + }) + return items + } + } +} +``` diff --git a/docs/ja/guide/ssr-compat.md b/docs/ja/guide/ssr-compat.md index d756d6d1..f72a2aad 100644 --- a/docs/ja/guide/ssr-compat.md +++ b/docs/ja/guide/ssr-compat.md @@ -12,11 +12,11 @@ VitePress は本番ビルド時に、Node.js 上で Vue のサーバーサイド SSR に適さないコンポーネント(例:カスタムディレクティブを含むなど)を使用・デモする場合は、組み込みの `` コンポーネントでラップできます。 - ```md - - - - ``` +```md + + + +``` ## インポート時に Browser API にアクセスするライブラリ {#libraries-that-access-browser-api-on-import} @@ -24,112 +24,112 @@ SSR に適さないコンポーネント(例:カスタムディレクティ ### mounted フック内でのインポート {#importing-in-mounted-hook} - ```vue - - ``` +onMounted(() => { + import('./lib-that-access-window-on-import').then((module) => { + // ここでコードを利用 + }) +}) + +``` ### 条件付きインポート {#conditional-import} [`import.meta.env.SSR`](https://vitejs.dev/guide/env-and-mode.html#env-variables) フラグ(Vite の環境変数の一部)を使って、依存関係を条件付きでインポートすることもできます。 - ```js - if (!import.meta.env.SSR) { - import('./lib-that-access-window-on-import').then((module) => { - // ここでコードを利用 - }) - } - ``` +```js +if (!import.meta.env.SSR) { + import('./lib-that-access-window-on-import').then((module) => { + // ここでコードを利用 + }) +} +``` [`Theme.enhanceApp`](./custom-theme#theme-interface) は非同期にできるため、**インポート時に Browser API に触れる Vue プラグイン** を条件付きでインポート・登録できます。 - ```js [.vitepress/theme/index.js] - /** @type {import('vitepress').Theme} */ - export default { - // ... - async enhanceApp({ app }) { - if (!import.meta.env.SSR) { - const plugin = await import('plugin-that-access-window-on-import') - app.use(plugin.default) - } - } - } - ``` +```js [.vitepress/theme/index.js] +/** @type {import('vitepress').Theme} */ +export default { + // ... + async enhanceApp({ app }) { + if (!import.meta.env.SSR) { + const plugin = await import('plugin-that-access-window-on-import') + app.use(plugin.default) + } + } +} +``` TypeScript を使う場合: - ```ts [.vitepress/theme/index.ts] - import type { Theme } from 'vitepress' +```ts [.vitepress/theme/index.ts] +import type { Theme } from 'vitepress' - export default { - // ... - async enhanceApp({ app }) { - if (!import.meta.env.SSR) { - const plugin = await import('plugin-that-access-window-on-import') - app.use(plugin.default) - } - } - } satisfies Theme - ``` +export default { + // ... + async enhanceApp({ app }) { + if (!import.meta.env.SSR) { + const plugin = await import('plugin-that-access-window-on-import') + app.use(plugin.default) + } + } +} satisfies Theme +``` ### `defineClientComponent` VitePress は、**インポート時に Browser API にアクセスする Vue コンポーネント** を読み込むためのユーティリティを提供します。 - ```vue - +const ClientComp = defineClientComponent(() => { + return import('component-that-access-window-on-import') +}) + - - ``` + +``` ターゲットコンポーネントに props / children / slots を渡すこともできます。 - ```vue - - - - ``` +```vue + + + +``` ターゲットコンポーネントは、ラッパーコンポーネントの mounted フックで初めてインポートされます。 diff --git a/docs/ja/guide/using-vue.md b/docs/ja/guide/using-vue.md index 65f2383e..d71d245f 100644 --- a/docs/ja/guide/using-vue.md +++ b/docs/ja/guide/using-vue.md @@ -16,9 +16,9 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的 **入力** - ```md - {{ 1 + 1 }} - ``` +```md +{{ 1 + 1 }} +``` **出力** @@ -30,9 +30,9 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的 **入力** - ```html - {{ i }} - ``` +```html +{{ i }} +``` **出力** @@ -42,30 +42,30 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的 Markdown ファイルのルート直下に置く ` +const count = ref(0) + - ## Markdown コンテンツ +## Markdown コンテンツ - 現在の値: {{ count }} +現在の値: {{ count }} - + - - ``` + +``` ::: warning Markdown での ` - ``` +```vue + +``` ## Teleport の利用 {#using-teleports} @@ -231,15 +231,15 @@ VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl` <<< @/components/ModalDemo.vue ::: - ```md - - -
- // ... -
-
-
- ``` +```md + + +
+ // ... +
+
+
+``` +const { hasSidebar } = useLayout() + - - ``` + +``` diff --git a/docs/ja/reference/default-theme-edit-link.md b/docs/ja/reference/default-theme-edit-link.md index 03573944..a5b40dbd 100644 --- a/docs/ja/reference/default-theme-edit-link.md +++ b/docs/ja/reference/default-theme-edit-link.md @@ -4,57 +4,57 @@ 編集リンクは、GitHub や GitLab などの Git 管理サービスでそのページを編集できるリンクを表示します。有効化するには、設定に `themeConfig.editLink` オプションを追加します。 - ```js - export default { - themeConfig: { - editLink: { - pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path' - } - } - } - ``` +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path' + } + } +} +``` `pattern` オプションはリンクの URL 構造を定義します。`:path` はページパスに置き換えられます。 また、引数に [`PageData`](./runtime-api#usedata) を受け取り、URL 文字列を返す純粋関数を指定することもできます。 - ```js - export default { - themeConfig: { - editLink: { - pattern: ({ filePath }) => { - if (filePath.startsWith('packages/')) { - return `https://github.com/acme/monorepo/edit/main/${filePath}` - } else { - return `https://github.com/acme/monorepo/edit/main/docs/${filePath}` - } - } - } - } - } - ``` +```js +export default { + themeConfig: { + editLink: { + pattern: ({ filePath }) => { + if (filePath.startsWith('packages/')) { + return `https://github.com/acme/monorepo/edit/main/${filePath}` + } else { + return `https://github.com/acme/monorepo/edit/main/docs/${filePath}` + } + } + } + } +} +``` この関数はブラウザでシリアライズされ実行されるため、副作用を持たず、スコープ外のものへアクセスしないでください。 既定では、ドキュメント下部に「Edit this page」というリンクテキストが表示されます。`text` オプションでこの文言をカスタマイズできます。 - ```js - export default { - themeConfig: { - editLink: { - pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', - text: 'GitHub でこのページを編集' - } - } - } - ``` +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: 'GitHub でこのページを編集' + } + } +} +``` ## フロントマターでの設定 {#frontmatter-config} ページごとに無効化するには、フロントマターで `editLink` オプションを使用します。 - ```yaml - --- - editLink: false - --- - ``` +```yaml +--- +editLink: false +--- +``` diff --git a/docs/ja/reference/default-theme-home-page.md b/docs/ja/reference/default-theme-home-page.md index e472a478..011456f8 100644 --- a/docs/ja/reference/default-theme-home-page.md +++ b/docs/ja/reference/default-theme-home-page.md @@ -186,3 +186,4 @@ hero: npm init npx vitepress init ``` +```` diff --git a/docs/ja/reference/default-theme-search.md b/docs/ja/reference/default-theme-search.md index e15de4ef..f7760361 100644 --- a/docs/ja/reference/default-theme-search.md +++ b/docs/ja/reference/default-theme-search.md @@ -29,6 +29,7 @@ export default defineConfig({ - - - +- ### i18n {#local-search-i18n} @@ -43,25 +44,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - zh: { // 既定ロケールの文言も翻訳したい場合はこれを `root` に + ja: { // 既定ロケールを翻訳する場合は `root` にしてください translations: { button: { - buttonText: '搜索', - buttonAriaLabel: '搜索' + buttonText: '検索', + buttonAriaLabel: '検索' }, modal: { - displayDetails: '显示详细列表', - resetButtonTitle: '重置搜索', - backButtonTitle: '关闭搜索', - noResultsText: '没有结果', + displayDetails: '詳細一覧を表示', + resetButtonTitle: '検索をリセット', + backButtonTitle: '検索を閉じる', + noResultsText: '結果が見つかりません', footer: { - selectText: '选择', - selectKeyAriaLabel: '输入', - navigateText: '导航', - navigateUpKeyAriaLabel: '上箭头', - navigateDownKeyAriaLabel: '下箭头', - closeText: '关闭', - closeKeyAriaLabel: 'esc' + selectText: '選択', + selectKeyAriaLabel: 'Enter', + navigateText: '移動', + navigateUpKeyAriaLabel: '上矢印', + navigateDownKeyAriaLabel: '下矢印', + closeText: '閉じる', + closeKeyAriaLabel: 'Esc' } } } @@ -73,7 +74,7 @@ export default defineConfig({ }) ``` -### miniSearch のオプション {#mini-search-options} +### miniSearch のオプション {#minisearch-options} MiniSearch の設定例です。 @@ -178,7 +179,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -212,6 +213,19 @@ export default defineConfig({ 多言語検索の設定例です。 +
+クリックして展開 + +<<< @/snippets/algolia-i18n.ts + +
+ +詳しくは[公式 Algolia ドキュメント](https://docsearch.algolia.com/docs/api#translations)を参照してください。すぐに始めるには、このサイトで使っている翻訳を[GitHub リポジトリ](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code)からコピーすることもできます。 + +### Algolia Ask AI のサポート {#ask-ai} + +**Ask AI** を有効にするには、`options` 内に `askAi` オプション(またはその一部)を指定します。 + ```ts import { defineConfig } from 'vitepress' @@ -223,79 +237,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' - }, - modal: { - searchBox: { - clearButtonTitle: '清除查询条件', - clearButtonAriaLabel: '清除查询条件', - closeButtonText: '关闭', - closeButtonAriaLabel: '关闭', - placeholderText: '搜索文档', - placeholderTextAskAi: '向 AI 提问:', - placeholderTextAskAiStreaming: '回答中...', - searchInputLabel: '搜索', - backToKeywordSearchButtonText: '返回关键字搜索', - backToKeywordSearchButtonAriaLabel: '返回关键字搜索' - }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除', - recentConversationsTitle: '最近的对话', - removeRecentConversationButtonTitle: '从历史记录中删除对话' - }, - errorScreen: { - titleText: '无法获取结果', - helpText: '你可能需要检查你的网络连接' - }, - noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' - }, - resultsScreen: { - askAiPlaceholder: '向 AI 提问: ' - }, - askAiScreen: { - disclaimerText: '答案由 AI 生成,可能不准确,请自行验证。', - relatedSourcesText: '相关来源', - thinkingText: '思考中...', - copyButtonText: '复制', - copyButtonCopiedText: '已复制!', - copyButtonTitle: '复制', - likeButtonTitle: '赞', - dislikeButtonTitle: '踩', - thanksForFeedbackText: '感谢你的反馈!', - preToolCallText: '搜索中...', - duringToolCallText: '搜索 ', - afterToolCallText: '已搜索' - }, - footer: { - selectText: '选择', - submitQuestionText: '提交问题', - selectKeyAriaLabel: 'Enter 键', - navigateText: '切换', - navigateUpKeyAriaLabel: '向上箭头', - navigateDownKeyAriaLabel: '向下箭头', - closeText: '关闭', - backToSearchText: '返回搜索', - closeKeyAriaLabel: 'Esc 键', - poweredByText: '搜索提供者' - } - } - } - } + // askAi: "あなたのアシスタントID" + // または + askAi: { + // 最低限、Algolia から受け取った assistantId を指定する必要があります + assistantId: 'XXXYYY', + // 任意の上書き — 省略した場合は上位の appId/apiKey/indexName を再利用 + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -303,11 +253,13 @@ export default defineConfig({ }) ``` -[これらのオプション](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) は上書きできます。詳細は Algolia の公式ドキュメントを参照してください。 +::: warning 注意 +キーワード検索を既定にして Ask AI を使わない場合は、`askAi` を指定しないでください。 +::: -### Algolia Ask AI のサポート {#ask-ai} +### Ask AI サイドパネル {#ask-ai-side-panel} -**Ask AI** を有効にするには、`options` 内に `askAi` オプション(またはその一部)を指定します。 +DocSearch v4.5+ はオプションの **Ask AI サイドパネル**をサポートしています。有効にすると、デフォルトで **Ctrl/Cmd+I** で開くことができます。[サイドパネル API リファレンス](https://docsearch.algolia.com/docs/sidepanel/api-reference)にオプションの完全なリストがあります。 ```ts import { defineConfig } from 'vitepress' @@ -320,15 +272,18 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - // askAi: "YOUR-ASSISTANT-ID" - // または askAi: { - // 少なくとも Algolia から受け取った assistantId を指定 assistantId: 'XXXYYY', - // 任意の上書き — 省略時は上位の appId/apiKey/indexName を再利用 - // apiKey: '...', - // appId: '...', - // indexName: '...' + sidePanel: { + // @docsearch/sidepanel-js SidepanelProps API をミラー + panel: { + variant: 'floating', // または 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } } } } @@ -336,116 +291,70 @@ export default defineConfig({ }) ``` -::: warning 注意 -キーワード検索を既定にして Ask AI を使わない場合は、`askAi` を指定しないでください。 -::: +キーボードショートカットを無効にする必要がある場合は、サイドパネルの `keyboardShortcuts` オプションを使用してください: -Ask AI UI の翻訳は `options.translations.modal.askAiScreen` と `options.translations.resultsScreen` にあります。すべてのキーは[型定義](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts)を参照してください。 +```ts +import { defineConfig } from 'vitepress' -### クローラー設定 {#crawler-config} +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } + } + } +}) +``` -このサイトで使用している設定を元にした例です。 +#### モード (auto / sidePanel / hybrid / modal) {#ask-ai-mode} + +VitePress がキーワード検索と Ask AI を統合する方法をオプションで制御できます: + +- `mode: 'auto'`(デフォルト):キーワード検索が設定されている場合は `hybrid` を推論し、それ以外の場合は Ask AI サイドパネルが設定されている場合は `sidePanel` を推論します。 +- `mode: 'sidePanel'`:サイドパネルのみを強制(キーワード検索ボタンを非表示)。 +- `mode: 'hybrid'`:キーワード検索モーダル + Ask AI サイドパネルを有効化(キーワード検索設定が必要)。 +- `mode: 'modal'`:Ask AI を DocSearch モーダル内に保持(サイドパネルを設定した場合でも)。 + +#### Ask AI のみ(キーワード検索なし) {#ask-ai-only} + +**Ask AI サイドパネルのみ**を使用する場合は、トップレベルのキーワード検索設定を省略し、`askAi` の下に認証情報を提供できます: ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' - } } }) ``` + +### クローラー設定 {#crawler-config} + +このサイトで使用している設定を元にした例です。 + +<<< @/snippets/algolia-crawler.js diff --git a/docs/ja/reference/runtime-api.md b/docs/ja/reference/runtime-api.md index b73b8503..afcad68d 100644 --- a/docs/ja/reference/runtime-api.md +++ b/docs/ja/reference/runtime-api.md @@ -49,7 +49,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/ko/config.ts b/docs/ko/config.ts index b2fbecf3..4a076036 100644 --- a/docs/ko/config.ts +++ b/docs/ko/config.ts @@ -223,7 +223,6 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: '문서 검색', translations: { button: { buttonText: '검색', @@ -231,44 +230,67 @@ function searchOptions(): Partial { }, modal: { searchBox: { - clearButtonTitle: '검색 지우기', - clearButtonAriaLabel: '검색 지우기', + clearButtonTitle: '지우기', + clearButtonAriaLabel: '검색어 지우기', closeButtonText: '닫기', closeButtonAriaLabel: '닫기', - placeholderText: '문서 검색', - placeholderTextAskAi: 'AI에게 물어보기: ', - placeholderTextAskAiStreaming: '답변 작성 중...', + placeholderText: '문서를 검색하거나 Ask AI에 질문', + placeholderTextAskAi: '다른 질문하기...', + placeholderTextAskAiStreaming: '답변 중...', searchInputLabel: '검색', backToKeywordSearchButtonText: '키워드 검색으로 돌아가기', - backToKeywordSearchButtonAriaLabel: '키워드 검색으로 돌아가기' + backToKeywordSearchButtonAriaLabel: '키워드 검색으로 돌아가기', + newConversationPlaceholder: '질문하기', + conversationHistoryTitle: '내 대화 기록', + startNewConversationText: '새 대화 시작', + viewConversationHistoryText: '대화 기록', + threadDepthErrorPlaceholder: '대화 한도에 도달했습니다' + }, + newConversation: { + newConversationTitle: '오늘 무엇을 도와드릴까요?', + newConversationDescription: + '문서를 검색해 설정 가이드, 기능 설명, 문제 해결 팁을 빠르게 찾아드립니다.' + }, + footer: { + selectText: '선택', + submitQuestionText: '질문 제출', + selectKeyAriaLabel: 'Enter 키', + navigateText: '이동', + navigateUpKeyAriaLabel: '위 화살표', + navigateDownKeyAriaLabel: '아래 화살표', + closeText: '닫기', + backToSearchText: '검색으로 돌아가기', + closeKeyAriaLabel: 'Escape 키', + poweredByText: '제공' + }, + errorScreen: { + titleText: '결과를 불러올 수 없습니다', + helpText: '네트워크 연결을 확인해 주세요.' }, startScreen: { - recentSearchesTitle: '검색 기록', - noRecentSearchesText: '최근 검색 없음', - saveRecentSearchButtonTitle: '검색 기록에 저장', - removeRecentSearchButtonTitle: '검색 기록에서 삭제', + recentSearchesTitle: '최근', + noRecentSearchesText: '최근 검색이 없습니다', + saveRecentSearchButtonTitle: '이 검색 저장', + removeRecentSearchButtonTitle: '기록에서 이 검색 제거', favoriteSearchesTitle: '즐겨찾기', - removeFavoriteSearchButtonTitle: '즐겨찾기에서 삭제', + removeFavoriteSearchButtonTitle: '즐겨찾기에서 이 검색 제거', recentConversationsTitle: '최근 대화', - removeRecentConversationButtonTitle: '대화를 기록에서 삭제' - }, - errorScreen: { - titleText: '결과를 가져올 수 없습니다', - helpText: '네트워크 연결을 확인하세요' + removeRecentConversationButtonTitle: '기록에서 이 대화 제거' }, noResultsScreen: { - noResultsText: '결과를 찾을 수 없습니다', - suggestedQueryText: '다른 검색어를 시도해 보세요', - reportMissingResultsText: '결과가 있어야 한다고 생각하나요?', - reportMissingResultsLinkText: '피드백 보내기' + noResultsText: '다음에 대한 결과를 찾을 수 없습니다', + suggestedQueryText: '다음을 검색해 보세요', + reportMissingResultsText: '이 검색은 결과가 있어야 하나요?', + reportMissingResultsLinkText: '알려주세요.' }, resultsScreen: { - askAiPlaceholder: 'AI에게 물어보기: ' + askAiPlaceholder: 'AI에게 묻기: ', + noResultsAskAiPlaceholder: '문서에서 찾지 못했나요? Ask AI에 문의: ' }, askAiScreen: { disclaimerText: - 'AI가 생성한 답변으로 오류가 있을 수 있습니다. 반드시 확인하세요.', - relatedSourcesText: '관련 소스', + '답변은 AI가 생성하며 오류가 있을 수 있습니다. 확인해 주세요.', + relatedSourcesText: '관련 출처', thinkingText: '생각 중...', copyButtonText: '복사', copyButtonCopiedText: '복사됨!', @@ -277,21 +299,67 @@ function searchOptions(): Partial { dislikeButtonTitle: '싫어요', thanksForFeedbackText: '피드백 감사합니다!', preToolCallText: '검색 중...', - duringToolCallText: '검색 중 ', - afterToolCallText: '검색 완료', - aggregatedToolCallText: '검색 완료' + duringToolCallText: '검색 중...', + afterToolCallText: '검색함', + stoppedStreamingText: '이 응답을 중지했습니다', + errorTitleText: '채팅 오류', + threadDepthExceededMessage: + '정확성을 유지하기 위해 이 대화는 종료되었습니다.', + startNewConversationButtonText: '새 대화 시작' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'AI에게 묻기', + buttonAriaLabel: 'AI에게 묻기' + } }, - footer: { - selectText: '선택', - submitQuestionText: '질문 보내기', - selectKeyAriaLabel: 'Enter 키', - navigateText: '탐색', - navigateUpKeyAriaLabel: '위쪽 화살표', - navigateDownKeyAriaLabel: '아래쪽 화살표', - closeText: '닫기', - backToSearchText: '검색으로 돌아가기', - closeKeyAriaLabel: 'Esc 키', - poweredByText: '제공: ' + panel: { + translations: { + header: { + title: 'AI에게 묻기', + conversationHistoryTitle: '내 대화 기록', + newConversationText: '새 대화 시작', + viewConversationHistoryText: '대화 기록' + }, + promptForm: { + promptPlaceholderText: '질문하기', + promptAnsweringText: '답변 중...', + promptAskAnotherQuestionText: '다른 질문하기', + promptDisclaimerText: + '답변은 AI가 생성하며 오류가 있을 수 있습니다.', + promptLabelText: 'Enter로 전송, Shift+Enter로 줄바꿈.', + promptAriaLabelText: '프롬프트 입력' + }, + conversationScreen: { + preToolCallText: '검색 중...', + searchingText: '검색 중...', + toolCallResultText: '검색함', + conversationDisclaimer: + '답변은 AI가 생성하며 오류가 있을 수 있습니다. 확인해 주세요.', + reasoningText: '추론 중...', + thinkingText: '생각 중...', + relatedSourcesText: '관련 출처', + stoppedStreamingText: '이 응답을 중지했습니다', + copyButtonText: '복사', + copyButtonCopiedText: '복사됨!', + likeButtonTitle: '좋아요', + dislikeButtonTitle: '싫어요', + thanksForFeedbackText: '피드백 감사합니다!', + errorTitleText: '채팅 오류' + }, + newConversationScreen: { + titleText: '오늘 무엇을 도와드릴까요?', + introductionText: + '문서를 검색해 설정 가이드, 기능 설명, 문제 해결 팁을 빠르게 찾아드립니다.' + }, + logo: { + poweredByText: '제공' + } + } } } } diff --git a/docs/ko/guide/deploy.md b/docs/ko/guide/deploy.md index 6ac12244..d2e62228 100644 --- a/docs/ko/guide/deploy.md +++ b/docs/ko/guide/deploy.md @@ -105,13 +105,13 @@ Cache-Control: max-age=31536000,immutable ## 플랫폼 가이드 {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} 새 프로젝트를 설정하고 대시보드를 사용하여 다음 설정을 변경하세요: - **빌드 명령어:** `npm run docs:build` - **출력 디렉토리:** `docs/.vitepress/dist` -- **노드 버전:** `18` (또는 그 이상) +- **노드 버전:** `20` (또는 그 이상) ::: warning HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 Vue에 의미가 있는 주석을 출력에서 제거할 것입니다. 제거되면 하이드레이션 불일치 오류가 발생할 수 있습니다. @@ -220,7 +220,7 @@ HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 - main ``` -### Azure 정적 Web 앱 {#azure-static-web-apps} +### Azure 1. [공식 문서](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration)를 따르세요. @@ -230,7 +230,11 @@ HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +[CloudRay](https://cloudray.io/)로 VitePress 프로젝트를 배포하려면 이 [지침](https://cloudray.io/articles/how-to-deploy-vitepress-site)을 따르세요. + +### Firebase 1. 프로젝트 루트에 `firebase.json`과 `.firebaserc`를 생성하세요: @@ -261,14 +265,6 @@ HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 firebase deploy ``` -### Surge - -1. `npm run docs:build`를 실행한 후, 배포하기 위해 이 명령어를 실행하세요: - - ```sh - npx surge docs/.vitepress/dist - ``` - ### Heroku 1. [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static)에 제공된 문서와 가이드를 따르세요. @@ -281,11 +277,11 @@ HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 } ``` -### Edgio +### Hostinger -[Edgio에 VitePress 앱 생성 및 배포하기](https://docs.edg.io/guides/vitepress)를 참고하세요. +[Hostinger](https://www.hostinger.com/web-apps-hosting)로 VitePress 프로젝트를 배포하려면 이 [지침](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/)을 따르세요. 빌드 설정을 구성할 때 프레임워크로 VitePress를 선택하고 루트 디렉터리를 `./docs`로 조정하세요. -### Kinsta 정적 사이트 호스팅 {#kinsta-static-site-hosting} +### Kinsta [VitePress](https://kinsta.com/static-site-hosting/) 웹사이트를 [Kinsta](https://kinsta.com/static-site-hosting/)에 배포하려면 이 [지침](https://kinsta.com/docs/vitepress-static-site-example/)을 따르세요. @@ -293,6 +289,14 @@ HTML 코드에 대해 _Auto Minify_ 옵션을 활성화하지 마세요. 이는 [VitePress](https://stormkit.io) 프로젝트를 [Stormkit](https://www.stormkit.io)에 배포하려면 이 [지침](https://stormkit.io/blog/how-to-deploy-vitepress)을 따르세요. +### Surge + +1. `npm run docs:build`를 실행한 후, 배포하기 위해 이 명령어를 실행하세요: + + ```sh + npx surge docs/.vitepress/dist + ``` + ### Nginx 다음은 Nginx 서버 블록 구성의 예입니다. 이 설정은 일반적인 텍스트 기반 에셋에 대한 gzip 압축, VitePress 사이트의 정적 파일을 적절한 캐싱 헤더와 함께 제공하는 규칙 및 `cleanUrls: true`를 처리하는 규칙을 포함합니다. diff --git a/docs/ko/guide/markdown.md b/docs/ko/guide/markdown.md index 0ebf53a5..4584d1bd 100644 --- a/docs/ko/guide/markdown.md +++ b/docs/ko/guide/markdown.md @@ -771,7 +771,7 @@ export default config ## Basics - + ``` **해당 파일** (`parts/basics.md`) @@ -807,7 +807,7 @@ Can be created using `.foorc.json`. ## Basics - + ``` **해당 파일** (`parts/basics.md`) @@ -843,8 +843,8 @@ Can be created using `.foorc.json`. ## Basics - - + + ``` **해당 파일** (`parts/basics.md`) diff --git a/docs/ko/reference/default-theme-search.md b/docs/ko/reference/default-theme-search.md index 03eda030..0ee68e36 100644 --- a/docs/ko/reference/default-theme-search.md +++ b/docs/ko/reference/default-theme-search.md @@ -39,7 +39,7 @@ export default defineConfig({ provider: 'local', options: { locales: { - ko: { // 기본 로케일을 번역하려면 이것을 `root`로 만드십시오. + ko: { // 기본 로케일을 번역하려면 `root`로 설정하세요 translations: { button: { buttonText: '검색', @@ -47,17 +47,17 @@ export default defineConfig({ }, modal: { displayDetails: '상세 목록 표시', - resetButtonTitle: '검색 지우기', + resetButtonTitle: '검색 재설정', backButtonTitle: '검색 닫기', - noResultsText: '결과를 찾을 수 없습니다', + noResultsText: '결과가 없습니다', footer: { selectText: '선택', - selectKeyAriaLabel: '선택하기', - navigateText: '탐색', - navigateUpKeyAriaLabel: '위로', - navigateDownKeyAriaLabel: '아래로', + selectKeyAriaLabel: 'Enter', + navigateText: '이동', + navigateUpKeyAriaLabel: '위쪽 화살표', + navigateDownKeyAriaLabel: '아래쪽 화살표', closeText: '닫기', - closeKeyAriaLabel: 'esc' + closeKeyAriaLabel: 'Esc' } } } @@ -69,7 +69,7 @@ export default defineConfig({ }) ``` -### MiniSearch 옵션 {#mini-search-options} +### MiniSearch 옵션 {#minisearch-options} MiniSearch를 다음과 같이 구성할 수 있습니다: @@ -123,7 +123,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // return html string + // HTML 문자열을 반환 } } } @@ -174,7 +174,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -208,6 +208,19 @@ export default defineConfig({ 다국어 검색을 사용하려면 다음과 같이 구성해야 합니다: +
+클릭하여 펼치기 + +<<< @/snippets/algolia-i18n.ts + +
+ +자세한 내용은 [공식 Algolia 문서](https://docsearch.algolia.com/docs/api#translations)를 참고하세요. 빠르게 시작하려면 이 사이트에서 사용하는 번역을 [GitHub 저장소](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code)에서 복사할 수도 있습니다. + +### Algolia Ask AI 지원 {#ask-ai} + +**Ask AI** 기능을 사용하려면 `askAi` 옵션을 추가하세요: + ```ts import { defineConfig } from 'vitepress' @@ -219,48 +232,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - ko: { - placeholder: '문서 검색', - translations: { - button: { - buttonText: '검색', - buttonAriaLabel: '검색' - }, - modal: { - searchBox: { - resetButtonTitle: '검색 지우기', - resetButtonAriaLabel: '검색 지우기', - cancelButtonText: '취소', - cancelButtonAriaLabel: '취소' - }, - startScreen: { - recentSearchesTitle: '검색 기록', - noRecentSearchesText: '최근 검색 없음', - saveRecentSearchButtonTitle: '검색 기록에 저장', - removeRecentSearchButtonTitle: '검색 기록에서 삭제', - favoriteSearchesTitle: '즐겨찾기', - removeFavoriteSearchButtonTitle: '즐겨찾기에서 삭제' - }, - errorScreen: { - titleText: '결과를 가져올 수 없습니다', - helpText: '네트워크 연결을 확인하세요' - }, - footer: { - selectText: '선택', - navigateText: '탐색', - closeText: '닫기', - searchByText: '검색 기준' - }, - noResultsScreen: { - noResultsText: '결과를 찾을 수 없습니다', - suggestedQueryText: '새로운 검색을 시도할 수 있습니다', - reportMissingResultsText: '해당 검색어에 대한 결과가 있어야 합니까?', - reportMissingResultsLinkText: '피드백 보내기 클릭' - } - } - } - } + // askAi: "내-어시스턴트-ID" + // 또는 + askAi: { + // 최소한 Algolia에서 받은 assistantId를 제공해야 합니다 + assistantId: 'XXXYYY', + // 선택적 재정의 — 생략하면 상위 appId/apiKey/indexName 값이 재사용됩니다 + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -268,129 +248,108 @@ export default defineConfig({ }) ``` -[이 옵션들](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts)은 재작성 할 수 있습니다. 이에 대해 자세히 알고 싶다면 Algolia 공식 문서를 참고하세요. +::: warning 참고 +Ask AI를 사용하지 않으려면 `askAi` 옵션을 생략하면 됩니다. +::: -### 크롤러 구성 {#crawler-config} +### Ask AI 사이드 패널 {#ask-ai-side-panel} -이 사이트에서 사용하는 예제 구성을 소개합니다: +DocSearch v4.5+는 선택적 **Ask AI 사이드 패널**을 지원합니다. 활성화되면 기본적으로 **Ctrl/Cmd+I**로 열 수 있습니다. [사이드 패널 API 참조](https://docsearch.algolia.com/docs/sidepanel/api-reference)에 전체 옵션 목록이 있습니다. ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + // @docsearch/sidepanel-js SidepanelProps API 반영 + panel: { + variant: 'floating', // 또는 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' + } +}) +``` + +키보드 단축키를 비활성화해야 하는 경우 사이드 패널의 `keyboardShortcuts` 옵션을 사용하세요: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } } } }) ``` -### Algolia Ask AI 지원 {#ask-ai} +#### 모드 (auto / sidePanel / hybrid / modal) {#ask-ai-mode} -**Ask AI** 기능을 사용하려면 `askAi` 옵션을 추가하세요: +VitePress가 키워드 검색과 Ask AI를 통합하는 방식을 선택적으로 제어할 수 있습니다: + +- `mode: 'auto'` (기본값): 키워드 검색이 구성된 경우 `hybrid`를 추론하고, 그렇지 않으면 Ask AI 사이드 패널이 구성된 경우 `sidePanel`을 추론합니다. +- `mode: 'sidePanel'`: 사이드 패널만 강제 (키워드 검색 버튼 숨김). +- `mode: 'hybrid'`: 키워드 검색 모달 + Ask AI 사이드 패널 활성화 (키워드 검색 구성 필요). +- `mode: 'modal'`: Ask AI를 DocSearch 모달 내부에 유지 (사이드 패널을 구성한 경우에도). + +#### Ask AI만 (키워드 검색 없음) {#ask-ai-only} + +**Ask AI 사이드 패널만** 사용하려면 최상위 키워드 검색 구성을 생략하고 `askAi` 아래에 자격 증명을 제공할 수 있습니다: ```ts -options: { - appId: '...', - apiKey: '...', - indexName: '...', - askAi: { assistantId: 'XXXYYY' } -} +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } + } + } + } +}) ``` -::: warning 참고 -Ask AI를 사용하지 않으려면 `askAi` 옵션을 생략하면 됩니다. -::: +### 크롤러 구성 {#crawler-config} + +이 사이트에서 사용하는 예제 구성을 소개합니다: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/ko/reference/runtime-api.md b/docs/ko/reference/runtime-api.md index e9a8e530..ee7a4ba3 100644 --- a/docs/ko/reference/runtime-api.md +++ b/docs/ko/reference/runtime-api.md @@ -49,7 +49,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/package.json b/docs/package.json index 0ccd3107..62f5a4bf 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,7 +15,7 @@ "open-cli": "^8.0.0", "postcss-rtlcss": "^5.7.1", "vitepress": "workspace:*", - "vitepress-plugin-group-icons": "^1.6.5", - "vitepress-plugin-llms": "^1.9.3" + "vitepress-plugin-group-icons": "^1.7.1", + "vitepress-plugin-llms": "^1.11.0" } } diff --git a/docs/pt/config.ts b/docs/pt/config.ts index ae71473d..5f71d84f 100644 --- a/docs/pt/config.ts +++ b/docs/pt/config.ts @@ -178,53 +178,79 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: 'Pesquisar documentos', translations: { button: { - buttonText: 'Pesquisar', - buttonAriaLabel: 'Pesquisar' + buttonText: 'Buscar', + buttonAriaLabel: 'Buscar' }, modal: { searchBox: { - clearButtonTitle: 'Limpar pesquisa', - clearButtonAriaLabel: 'Limpar pesquisa', + clearButtonTitle: 'Limpar', + clearButtonAriaLabel: 'Limpar a consulta', closeButtonText: 'Fechar', closeButtonAriaLabel: 'Fechar', - placeholderText: 'Pesquisar documentos', - placeholderTextAskAi: 'Pergunte à IA: ', + placeholderText: 'Buscar na documentação ou perguntar ao Ask AI', + placeholderTextAskAi: 'Faça outra pergunta...', placeholderTextAskAiStreaming: 'Respondendo...', - searchInputLabel: 'Pesquisar', - backToKeywordSearchButtonText: 'Voltar à pesquisa por palavras-chave', + searchInputLabel: 'Buscar', + backToKeywordSearchButtonText: + 'Voltar para a busca por palavra-chave', backToKeywordSearchButtonAriaLabel: - 'Voltar à pesquisa por palavras-chave' + 'Voltar para a busca por palavra-chave', + newConversationPlaceholder: 'Faça uma pergunta', + conversationHistoryTitle: 'Meu histórico de conversas', + startNewConversationText: 'Iniciar uma nova conversa', + viewConversationHistoryText: 'Histórico de conversas', + threadDepthErrorPlaceholder: 'Limite de conversa atingido' + }, + newConversation: { + newConversationTitle: 'Como posso ajudar hoje?', + newConversationDescription: + 'Eu busco na sua documentação para ajudar a encontrar guias de configuração, detalhes de funcionalidades e dicas de solução de problemas rapidamente.' + }, + footer: { + selectText: 'Selecionar', + submitQuestionText: 'Enviar pergunta', + selectKeyAriaLabel: 'Tecla Enter', + navigateText: 'Navegar', + navigateUpKeyAriaLabel: 'Seta para cima', + navigateDownKeyAriaLabel: 'Seta para baixo', + closeText: 'Fechar', + backToSearchText: 'Voltar à busca', + closeKeyAriaLabel: 'Tecla Escape', + poweredByText: 'Com tecnologia de' + }, + errorScreen: { + titleText: 'Não foi possível obter resultados', + helpText: 'Talvez você queira verificar sua conexão de rede.' }, startScreen: { - recentSearchesTitle: 'Histórico de pesquisa', + recentSearchesTitle: 'Recentes', noRecentSearchesText: 'Nenhuma pesquisa recente', - saveRecentSearchButtonTitle: 'Salvar no histórico de pesquisas', - removeRecentSearchButtonTitle: 'Remover do histórico de pesquisas', + saveRecentSearchButtonTitle: 'Salvar esta pesquisa', + removeRecentSearchButtonTitle: 'Remover esta pesquisa do histórico', favoriteSearchesTitle: 'Favoritos', - removeFavoriteSearchButtonTitle: 'Remover dos favoritos', + removeFavoriteSearchButtonTitle: + 'Remover esta pesquisa dos favoritos', recentConversationsTitle: 'Conversas recentes', removeRecentConversationButtonTitle: 'Remover esta conversa do histórico' }, - errorScreen: { - titleText: 'Não foi possível obter resultados', - helpText: 'Verifique sua conexão de rede' - }, noResultsScreen: { - noResultsText: 'Nenhum resultado encontrado', - suggestedQueryText: 'Você pode tentar uma nova consulta', - reportMissingResultsText: 'Acha que deveria haver resultados?', - reportMissingResultsLinkText: 'Clique para enviar feedback' + noResultsText: 'Nenhum resultado encontrado para', + suggestedQueryText: 'Tente pesquisar por', + reportMissingResultsText: + 'Acha que esta consulta deveria retornar resultados?', + reportMissingResultsLinkText: 'Avise-nos.' }, resultsScreen: { - askAiPlaceholder: 'Pergunte à IA: ' + askAiPlaceholder: 'Perguntar à IA: ', + noResultsAskAiPlaceholder: + 'Não encontrou nos documentos? Peça ajuda ao Ask AI: ' }, askAiScreen: { disclaimerText: - 'As respostas são geradas por IA e podem conter erros. Verifique as respostas.', + 'As respostas são geradas por IA e podem conter erros. Verifique.', relatedSourcesText: 'Fontes relacionadas', thinkingText: 'Pensando...', copyButtonText: 'Copiar', @@ -232,23 +258,70 @@ function searchOptions(): Partial { copyButtonTitle: 'Copiar', likeButtonTitle: 'Curtir', dislikeButtonTitle: 'Não curtir', - thanksForFeedbackText: 'Obrigado pelo feedback!', - preToolCallText: 'Pesquisando...', - duringToolCallText: 'Pesquisando ', - afterToolCallText: 'Pesquisa concluída', - aggregatedToolCallText: 'Pesquisa concluída' + thanksForFeedbackText: 'Obrigado pelo seu feedback!', + preToolCallText: 'Buscando...', + duringToolCallText: 'Buscando...', + afterToolCallText: 'Pesquisado', + stoppedStreamingText: 'Você interrompeu esta resposta', + errorTitleText: 'Erro no chat', + threadDepthExceededMessage: + 'Esta conversa foi encerrada para manter respostas precisas.', + startNewConversationButtonText: 'Iniciar uma nova conversa' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'Perguntar à IA', + buttonAriaLabel: 'Perguntar à IA' + } }, - footer: { - selectText: 'Selecionar', - submitQuestionText: 'Enviar pergunta', - selectKeyAriaLabel: 'Tecla Enter', - navigateText: 'Navegar', - navigateUpKeyAriaLabel: 'Seta para cima', - navigateDownKeyAriaLabel: 'Seta para baixo', - closeText: 'Fechar', - backToSearchText: 'Voltar à pesquisa', - closeKeyAriaLabel: 'Tecla Escape', - poweredByText: 'Pesquisa por' + panel: { + translations: { + header: { + title: 'Perguntar à IA', + conversationHistoryTitle: 'Meu histórico de conversas', + newConversationText: 'Iniciar uma nova conversa', + viewConversationHistoryText: 'Histórico de conversas' + }, + promptForm: { + promptPlaceholderText: 'Faça uma pergunta', + promptAnsweringText: 'Respondendo...', + promptAskAnotherQuestionText: 'Faça outra pergunta', + promptDisclaimerText: + 'As respostas são geradas por IA e podem conter erros.', + promptLabelText: + 'Pressione Enter para enviar ou Shift+Enter para nova linha.', + promptAriaLabelText: 'Entrada do prompt' + }, + conversationScreen: { + preToolCallText: 'Buscando...', + searchingText: 'Buscando...', + toolCallResultText: 'Pesquisado', + conversationDisclaimer: + 'As respostas são geradas por IA e podem conter erros. Verifique.', + reasoningText: 'Raciocinando...', + thinkingText: 'Pensando...', + relatedSourcesText: 'Fontes relacionadas', + stoppedStreamingText: 'Você interrompeu esta resposta', + copyButtonText: 'Copiar', + copyButtonCopiedText: 'Copiado!', + likeButtonTitle: 'Curtir', + dislikeButtonTitle: 'Não curtir', + thanksForFeedbackText: 'Obrigado pelo seu feedback!', + errorTitleText: 'Erro no chat' + }, + newConversationScreen: { + titleText: 'Como posso ajudar hoje?', + introductionText: + 'Eu busco na sua documentação para ajudar a encontrar guias de configuração, detalhes de funcionalidades e dicas de solução de problemas rapidamente.' + }, + logo: { + poweredByText: 'Com tecnologia de' + } + } } } } diff --git a/docs/pt/guide/deploy.md b/docs/pt/guide/deploy.md index 7b1423af..7821c7ab 100644 --- a/docs/pt/guide/deploy.md +++ b/docs/pt/guide/deploy.md @@ -105,13 +105,13 @@ Nota: o arquivo `vercel.json` deve ser colocado na raiz do seu **repositório**. ## Guias de Plataforma {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} Configure um novo projeto e altere estas configurações usando seu painel: - **Comando de Compilação:** `npm run docs:build` - **Diretório de Saída:** `docs/.vitepress/dist` -- **Versão do Node:** `18` (ou superior) +- **Versão do Node:** `20` (ou superior) ::: warning Não ative opções como _Auto Minify_ para código HTML. Isso removerá comentários da saída que têm significado para Vue. Haverão erros de incompatibilidade de hidratação se forem removidos. @@ -169,10 +169,8 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment uses: actions/configure-pages@v4 - name: Install dependencies run: npm ci # ou pnpm install / yarn install / bun install - - name: Build with VitePress - run: | - npm run docs:build # ou pnpm docs:build / yarn docs:build / bun run docs:build - touch docs/.vitepress/dist/.nojekyll + - name: Build with VitePress + run: npm run docs:build # ou pnpm docs:build / yarn docs:build / bun run docs:build - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: @@ -202,7 +200,7 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment ### GitLab Pages -1. Defina `outDir` na configuração VitePress como `../public`. Configure a opção `base` para `'//'` se você deseja implantar em `https://.gitlab.io//`. +1. Defina `outDir` na configuração VitePress como `../public`. Configure a opção `base` para `'//'` se você deseja implantar em `https://.gitlab.io//`. Você não precisa de `base` se estiver implantando em um domínio personalizado, páginas de usuário ou grupo, ou se a configuração "Use unique domain" estiver habilitada no GitLab. 2. Crie um arquivo chamado `.gitlab-ci.yml` na raiz do seu projeto com o conteúdo abaixo. Isso construirá e implantará seu site sempre que você fizer alterações no conteúdo: @@ -223,7 +221,7 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment - main ``` -### Azure Static Web Apps {#azure-static-web-apps} +### Azure 1. Siga a [documentação oficial](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration). @@ -233,7 +231,11 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +Você pode implantar seu projeto VitePress com a [CloudRay](https://cloudray.io/) seguindo estas [instruções](https://cloudray.io/articles/how-to-deploy-vitepress-site). + +### Firebase 1. Crie `firebase.json` e `.firebaserc` na raiz do seu projeto: @@ -264,14 +266,6 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment firebase deploy ``` -### Surge - -1. Após executar `npm run docs:build`, execute este comando para implantar: - - ```sh - npx surge docs/.vitepress/dist - ``` - ### Heroku 1. Siga a documentação e o guia fornecidos em [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static). @@ -284,10 +278,66 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment } ``` -### Edgio +### Hostinger -Consulte [Criar e Implantar um Aplicativo VitePress no Edgio](https://docs.edg.io/guides/vitepress). +Você pode implantar seu projeto VitePress com a [Hostinger](https://www.hostinger.com/web-apps-hosting) seguindo estas [instruções](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/). Ao configurar as opções de build, escolha VitePress como framework e ajuste o diretório raiz para `./docs`. -### Kinsta Static Site Hosting {#kinsta-static-site-hosting} +### Kinsta Você pode implantar seu site VitePress em [Kinsta](https://kinsta.com/static-site-hosting/) seguindo estas [instruções](https://kinsta.com/docs/vitepress-static-site-example/). + +### Stormkit + +Você pode implantar seu projeto VitePress na [Stormkit](https://www.stormkit.io) seguindo estas [instruções](https://stormkit.io/blog/how-to-deploy-vitepress). + +### Surge + +1. Após executar `npm run docs:build`, execute este comando para implantar: + + ```sh + npx surge docs/.vitepress/dist + ``` + +### Nginx + +Aqui está um exemplo de configuração de bloco de servidor Nginx. Essa configuração inclui compressão gzip para ativos comuns baseados em texto, regras para servir os arquivos estáticos do seu site VitePress com cabeçalhos de cache apropriados, assim como lidar com `cleanUrls: true`. + +```nginx +server { + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + listen 80; + server_name _; + index index.html; + + location / { + # content location + root /app; + + # exact matches -> reverse clean urls -> folders -> not found + try_files $uri $uri.html $uri/ =404; + + # non existent pages + error_page 404 /404.html; + + # a folder without index.html raises 403 in this setup + error_page 403 /404.html; + + # adjust caching headers + # files in the assets folder have hashes filenames + location ~* ^/assets/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + } +} +``` + +Essa configuração presume que o site VitePress compilado está localizado no diretório `/app` no seu servidor. Ajuste a diretiva `root` de acordo caso os arquivos do site estejam em outro lugar. + +::: warning Não use index.html por padrão +A resolução de try_files não deve padronizar para index.html como em outras aplicações Vue. Isso resultará em um estado de página inválido. +::: + +Mais informações podem ser encontradas na [documentação oficial do nginx](https://nginx.org/en/docs/), nestas issues [#2837](https://github.com/vuejs/vitepress/discussions/2837), [#3235](https://github.com/vuejs/vitepress/issues/3235) assim como neste [post do blog](https://blog.mehdi.cc/articles/vitepress-cleanurls-on-nginx-environment#readings) de Mehdi Merah. diff --git a/docs/pt/guide/markdown.md b/docs/pt/guide/markdown.md index a300585c..bfcc591f 100644 --- a/docs/pt/guide/markdown.md +++ b/docs/pt/guide/markdown.md @@ -771,7 +771,7 @@ Por exemplo, você pode incluir um arquivo markdown relativo usando isto: ## Conceitos Básicos - + ``` **Arquivo da Parte** (`parts/basics.md`) @@ -807,7 +807,7 @@ Também suporta a seleção de um intervalo de linhas: ## Conceitos Básicos - + ``` **Arquivo da Parte** (`parts/basics.md`) diff --git a/docs/pt/reference/default-theme-search.md b/docs/pt/reference/default-theme-search.md index 4db22900..44c5b8ac 100644 --- a/docs/pt/reference/default-theme-search.md +++ b/docs/pt/reference/default-theme-search.md @@ -39,18 +39,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - zh: { + pt: { // torne isto `root` se quiser traduzir a localidade padrão translations: { button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' + buttonText: 'Pesquisar', + buttonAriaLabel: 'Pesquisar' }, modal: { - noResultsText: '无法找到相关结果', - resetButtonTitle: '清除查询条件', + displayDetails: 'Mostrar lista detalhada', + resetButtonTitle: 'Redefinir pesquisa', + backButtonTitle: 'Fechar pesquisa', + noResultsText: 'Nenhum resultado', footer: { - selectText: '选择', - navigateText: '切换' + selectText: 'Selecionar', + selectKeyAriaLabel: 'Enter', + navigateText: 'Navegar', + navigateUpKeyAriaLabel: 'Seta para cima', + navigateDownKeyAriaLabel: 'Seta para baixo', + closeText: 'Fechar', + closeKeyAriaLabel: 'Esc' } } } @@ -62,7 +69,7 @@ export default defineConfig({ }) ``` -### Opções MiniSearch {#mini-search-options} +### Opções MiniSearch {#minisearch-options} Você pode configurar o MiniSearch assim: @@ -116,7 +123,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // retorne a string HTML + // retorna uma string HTML } } } @@ -141,7 +148,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' - if (env.relativePath.startsWith('algum/caminho')) return '' + if (env.relativePath.startsWith('some/path')) return '' return html } } @@ -167,7 +174,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -197,10 +204,23 @@ export default defineConfig({ }) ``` -### i18n {#algolia-search-i18n} {#algolia-search-i18n} +### i18n {#algolia-search-i18n} Você pode usar uma configuração como esta para usar a pesquisa multilínguas: +
+Clique para expandir + +<<< @/snippets/algolia-i18n.ts + +
+ +Consulte a [documentação oficial da Algolia](https://docsearch.algolia.com/docs/api#translations) para saber mais. Para começar rapidamente, você também pode copiar as traduções usadas por este site do [nosso repositório no GitHub](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code). + +### Suporte ao Algolia Ask AI {#ask-ai} + +Se quiser incluir o **Ask AI**, adicione `askAi` em `options`: + ```ts import { defineConfig } from 'vitepress' @@ -212,48 +232,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' - }, - modal: { - searchBox: { - resetButtonTitle: '清除查询条件', - resetButtonAriaLabel: '清除查询条件', - cancelButtonText: '取消', - cancelButtonAriaLabel: '取消' - }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除' - }, - errorScreen: { - titleText: '无法获取结果', - helpText: '你可能需要检查你的网络连接' - }, - footer: { - selectText: '选择', - navigateText: '切换', - closeText: '关闭', - searchByText: '搜索提供者' - }, - noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' - } - } - } - } + // askAi: "SEU-ID-DO-ASSISTENTE" + // OU + askAi: { + // no mínimo, você deve fornecer o assistantId recebido da Algolia + assistantId: 'XXXYYY', + // substituições opcionais — se omitidas, os valores appId/apiKey/indexName de nível superior são reutilizados + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -261,129 +248,108 @@ export default defineConfig({ }) ``` -[Essas opções](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) podem ser sobrepostas. Consulte a documentação oficial Algolia para obter mais informações sobre elas. +::: warning Nota +Caso queira apenas a pesquisa por palavra-chave, omita `askAi`. +::: -### Configuração _Crawler_ {#crawler-config} +### Painel Lateral do Ask AI {#ask-ai-side-panel} -Aqui está um exemplo de configuração baseado na qual este site usa: +O DocSearch v4.5+ suporta um **painel lateral do Ask AI** opcional. Quando habilitado, pode ser aberto com **Ctrl/Cmd+I** por padrão. A [Referência da API do Painel Lateral](https://docsearch.algolia.com/docs/sidepanel/api-reference) contém a lista completa de opções. ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + // Espelha a API do @docsearch/sidepanel-js SidepanelProps + panel: { + variant: 'floating', // ou 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' + } +}) +``` + +Se precisar desabilitar o atalho de teclado, use a opção `keyboardShortcuts` do painel lateral: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } } } }) ``` -### Suporte ao Algolia Ask AI {#ask-ai} +#### Modo (auto / sidePanel / hybrid / modal) {#ask-ai-mode} -Se quiser incluir o **Ask AI**, adicione `askAi` em `options`: +Você pode controlar opcionalmente como o VitePress integra a pesquisa por palavra-chave e o Ask AI: + +- `mode: 'auto'` (padrão): infere `hybrid` quando a pesquisa por palavra-chave está configurada, caso contrário `sidePanel` quando o painel lateral do Ask AI está configurado. +- `mode: 'sidePanel'`: força apenas o painel lateral (oculta o botão de pesquisa por palavra-chave). +- `mode: 'hybrid'`: habilita o modal de pesquisa por palavra-chave + painel lateral do Ask AI (requer configuração de pesquisa por palavra-chave). +- `mode: 'modal'`: mantém o Ask AI dentro do modal do DocSearch (mesmo se você configurou o painel lateral). + +#### Apenas Ask AI (sem pesquisa por palavra-chave) {#ask-ai-only} + +Se quiser usar **apenas o painel lateral do Ask AI**, você pode omitir a configuração de pesquisa por palavra-chave de nível superior e fornecer as credenciais em `askAi`: ```ts -options: { - appId: '...', - apiKey: '...', - indexName: '...', - askAi: { assistantId: 'XXXYYY' } -} +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } + } + } + } +}) ``` -::: warning Nota -Caso queira apenas a pesquisa por palavra-chave, omita `askAi`. -::: +### Configuração _Crawler_ {#crawler-config} + +Aqui está um exemplo de configuração baseado na qual este site usa: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/pt/reference/runtime-api.md b/docs/pt/reference/runtime-api.md index ed6476ac..559e2fed 100644 --- a/docs/pt/reference/runtime-api.md +++ b/docs/pt/reference/runtime-api.md @@ -45,7 +45,7 @@ interface PageData { titleTemplate?: string | boolean description: string relativePath: string - filePath: string, + filePath: string headers: Header[] frontmatter: Record params?: Record diff --git a/docs/ru/config.ts b/docs/ru/config.ts index e196d193..515cffba 100644 --- a/docs/ru/config.ts +++ b/docs/ru/config.ts @@ -178,7 +178,6 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: 'Поиск в документации', translations: { button: { buttonText: 'Поиск', @@ -186,45 +185,70 @@ function searchOptions(): Partial { }, modal: { searchBox: { - clearButtonTitle: 'Очистить поиск', - clearButtonAriaLabel: 'Очистить поиск', + clearButtonTitle: 'Очистить', + clearButtonAriaLabel: 'Очистить запрос', closeButtonText: 'Закрыть', closeButtonAriaLabel: 'Закрыть', - placeholderText: 'Поиск в документации', - placeholderTextAskAi: 'Задайте вопрос ИИ: ', - placeholderTextAskAiStreaming: 'Формируется ответ...', + placeholderText: 'Поиск по документации или задайте вопрос Ask AI', + placeholderTextAskAi: 'Задайте другой вопрос...', + placeholderTextAskAiStreaming: 'Отвечаю...', searchInputLabel: 'Поиск', - backToKeywordSearchButtonText: - 'Вернуться к поиску по ключевым словам', + backToKeywordSearchButtonText: 'Назад к поиску по ключевым словам', backToKeywordSearchButtonAriaLabel: - 'Вернуться к поиску по ключевым словам' + 'Назад к поиску по ключевым словам', + newConversationPlaceholder: 'Задайте вопрос', + conversationHistoryTitle: 'Моя история разговоров', + startNewConversationText: 'Начать новый разговор', + viewConversationHistoryText: 'История разговоров', + threadDepthErrorPlaceholder: 'Достигнут лимит разговора' }, - startScreen: { - recentSearchesTitle: 'История поиска', - noRecentSearchesText: 'Нет истории поиска', - saveRecentSearchButtonTitle: 'Сохранить в истории поиска', - removeRecentSearchButtonTitle: 'Удалить из истории поиска', - favoriteSearchesTitle: 'Избранное', - removeFavoriteSearchButtonTitle: 'Удалить из избранного', - recentConversationsTitle: 'Недавние диалоги', - removeRecentConversationButtonTitle: 'Удалить этот диалог из истории' + newConversation: { + newConversationTitle: 'Чем могу помочь сегодня?', + newConversationDescription: + 'Я ищу по вашей документации, чтобы быстро помочь найти руководства по настройке, детали функций и советы по устранению неполадок.' + }, + footer: { + selectText: 'Выбрать', + submitQuestionText: 'Отправить вопрос', + selectKeyAriaLabel: 'Клавиша Enter', + navigateText: 'Навигация', + navigateUpKeyAriaLabel: 'Стрелка вверх', + navigateDownKeyAriaLabel: 'Стрелка вниз', + closeText: 'Закрыть', + backToSearchText: 'Назад к поиску', + closeKeyAriaLabel: 'Клавиша Escape', + poweredByText: 'При поддержке' }, errorScreen: { - titleText: 'Невозможно получить результаты', - helpText: 'Проверьте подключение к Интернету' + titleText: 'Не удалось получить результаты', + helpText: 'Возможно, стоит проверить подключение к сети.' + }, + startScreen: { + recentSearchesTitle: 'Недавние', + noRecentSearchesText: 'Нет недавних поисков', + saveRecentSearchButtonTitle: 'Сохранить этот поиск', + removeRecentSearchButtonTitle: 'Удалить этот поиск из истории', + favoriteSearchesTitle: 'Избранное', + removeFavoriteSearchButtonTitle: 'Удалить этот поиск из избранного', + recentConversationsTitle: 'Недавние разговоры', + removeRecentConversationButtonTitle: + 'Удалить этот разговор из истории' }, noResultsScreen: { - noResultsText: 'Ничего не найдено', - suggestedQueryText: 'Попробуйте изменить запрос', - reportMissingResultsText: 'Считаете, что результаты должны быть?', - reportMissingResultsLinkText: 'Сообщите об этом' + noResultsText: 'Не найдено результатов для', + suggestedQueryText: 'Попробуйте поискать', + reportMissingResultsText: + 'Считаете, что по этому запросу должны быть результаты?', + reportMissingResultsLinkText: 'Сообщите нам.' }, resultsScreen: { - askAiPlaceholder: 'Задайте вопрос ИИ: ' + askAiPlaceholder: 'Спросить ИИ: ', + noResultsAskAiPlaceholder: + 'Не нашли в документации? Попросите Ask AI помочь: ' }, askAiScreen: { disclaimerText: - 'Ответы генерируются ИИ и могут содержать ошибки. Проверяйте информацию.', + 'Ответы генерируются ИИ и могут содержать ошибки. Проверьте их.', relatedSourcesText: 'Связанные источники', thinkingText: 'Думаю...', copyButtonText: 'Копировать', @@ -233,22 +257,69 @@ function searchOptions(): Partial { likeButtonTitle: 'Нравится', dislikeButtonTitle: 'Не нравится', thanksForFeedbackText: 'Спасибо за отзыв!', - preToolCallText: 'Поиск...', - duringToolCallText: 'Поиск ', - afterToolCallText: 'Поиск завершён', - aggregatedToolCallText: 'Поиск завершён' + preToolCallText: 'Ищу...', + duringToolCallText: 'Ищу...', + afterToolCallText: 'Искал', + stoppedStreamingText: 'Вы остановили этот ответ', + errorTitleText: 'Ошибка чата', + threadDepthExceededMessage: + 'Этот разговор закрыт, чтобы сохранить точность ответов.', + startNewConversationButtonText: 'Начать новый разговор' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: 'Спросить ИИ', + buttonAriaLabel: 'Спросить ИИ' + } }, - footer: { - selectText: 'выбрать', - submitQuestionText: 'Отправить вопрос', - selectKeyAriaLabel: 'Клавиша Enter', - navigateText: 'перейти', - navigateUpKeyAriaLabel: 'Стрелка вверх', - navigateDownKeyAriaLabel: 'Стрелка вниз', - closeText: 'закрыть', - backToSearchText: 'Вернуться к поиску', - closeKeyAriaLabel: 'Клавиша Esc', - poweredByText: 'поиск от' + panel: { + translations: { + header: { + title: 'Спросить ИИ', + conversationHistoryTitle: 'Моя история разговоров', + newConversationText: 'Начать новый разговор', + viewConversationHistoryText: 'История разговоров' + }, + promptForm: { + promptPlaceholderText: 'Задайте вопрос', + promptAnsweringText: 'Отвечаю...', + promptAskAnotherQuestionText: 'Задайте другой вопрос', + promptDisclaimerText: + 'Ответы генерируются ИИ и могут содержать ошибки.', + promptLabelText: + 'Нажмите Enter, чтобы отправить, или Shift+Enter для новой строки.', + promptAriaLabelText: 'Ввод запроса' + }, + conversationScreen: { + preToolCallText: 'Ищу...', + searchingText: 'Ищу...', + toolCallResultText: 'Искал', + conversationDisclaimer: + 'Ответы генерируются ИИ и могут содержать ошибки. Проверьте их.', + reasoningText: 'Рассуждаю...', + thinkingText: 'Думаю...', + relatedSourcesText: 'Связанные источники', + stoppedStreamingText: 'Вы остановили этот ответ', + copyButtonText: 'Копировать', + copyButtonCopiedText: 'Скопировано!', + likeButtonTitle: 'Нравится', + dislikeButtonTitle: 'Не нравится', + thanksForFeedbackText: 'Спасибо за отзыв!', + errorTitleText: 'Ошибка чата' + }, + newConversationScreen: { + titleText: 'Чем могу помочь сегодня?', + introductionText: + 'Я ищу по вашей документации, чтобы быстро помочь найти руководства по настройке, детали функций и советы по устранению неполадок.' + }, + logo: { + poweredByText: 'При поддержке' + } + } } } } diff --git a/docs/ru/guide/deploy.md b/docs/ru/guide/deploy.md index 83c361d8..3b310524 100644 --- a/docs/ru/guide/deploy.md +++ b/docs/ru/guide/deploy.md @@ -105,7 +105,7 @@ Cache-Control: max-age=31536000,immutable ## Руководства по платформам {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render} +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} Создайте новый проект и измените эти настройки с помощью панели управления: @@ -117,7 +117,7 @@ Cache-Control: max-age=31536000,immutable Не включайте такие опции, как _Auto Minify_ для HTML-кода. Он удалит из вывода комментарии, которые имеют значение для Vue. При их удалении могут возникать ошибки несоответствия гидратации. ::: -### GitHub Pages {#github-pages} +### GitHub Pages 1. Создайте файл с именем `deploy.yml` в директории `.github/workflows` вашего проекта с примерно таким содержанием: @@ -198,7 +198,7 @@ Cache-Control: max-age=31536000,immutable 3. Внесите свои изменения в ветку `main` и дождитесь завершения процесса GitHub Actions. Вы должны увидеть, что ваш сайт развёрнут по адресу `https://.github.io/[repository]/` или `https:///` в зависимости от ваших настроек. Ваш сайт будет автоматически разворачиваться при каждом внесении изменений в ветке `main`. -### GitLab Pages {#gitlab-pages} +### GitLab Pages 1. Установите значение `../public` для параметра `outDir` в конфигурации VitePress. Настройте опцию `base` на `'/<репозиторий>/'`, если вы хотите развернуть ваш проект по адресу `https://<имя пользователя>.gitlab.io/<репозиторий>/`. Вам не нужна опция `base`, если вы выполняете развёртывание на личном домене, страницах пользователя или группы, или если в GitLab включен параметр «Использовать уникальный домен». @@ -221,7 +221,7 @@ Cache-Control: max-age=31536000,immutable - main ``` -### Статические веб-приложения Azure {#azure-static-web-apps} +### Azure 1. Следуйте [официальной документации](https://docs.microsoft.com/ru-ru/azure/static-web-apps/build-configuration). @@ -231,7 +231,11 @@ Cache-Control: max-age=31536000,immutable - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +Вы можете развернуть свой проект VitePress с [CloudRay](https://cloudray.io/), следуя этим [инструкциям](https://cloudray.io/articles/how-to-deploy-vitepress-site). + +### Firebase 1. Создайте `firebase.json` и `.firebaserc` в корне вашего проекта: @@ -262,15 +266,7 @@ Cache-Control: max-age=31536000,immutable firebase deploy ``` -### Surge {#surge} - -1. После запуска `npm run docs:build` выполните эту команду для развёртывания: - - ```sh - npx surge docs/.vitepress/dist - ``` - -### Heroku {#heroku} +### Heroku 1. Следуйте документации и руководству, приведённому в [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static). @@ -282,11 +278,11 @@ Cache-Control: max-age=31536000,immutable } ``` -### Edgio {#edgio} +### Hostinger -См. [Создание и развёртывание приложения VitePress в Edgio](https://docs.edg.io/applications/v6/sites_frameworks/getting_started/vitepress). +Вы можете развернуть свой проект VitePress на [Hostinger](https://www.hostinger.com/web-apps-hosting), следуя этим [инструкциям](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/). При настройке параметров сборки выберите VitePress в качестве фреймворка и укажите корневой каталог `./docs`. -### Хостинг статических файлов Kinsta {#kinsta-static-site-hosting} +### Kinsta Вы можете развернуть свой сайт VitePress на [Kinsta](https://kinsta.com/static-site-hosting/), следуя этим [инструкциям](https://kinsta.com/docs/vitepress-static-site-example/). @@ -294,6 +290,14 @@ Cache-Control: max-age=31536000,immutable Вы можете развернуть свой проект VitePress на [Stormkit](https://www.stormkit.io), следуя следующим [инструкциям](https://stormkit.io/blog/how-to-deploy-vitepress). +### Surge + +1. После запуска `npm run docs:build` выполните эту команду для развёртывания: + + ```sh + npx surge docs/.vitepress/dist + ``` + ### Nginx Вот пример конфигурации блока сервера Nginx. Эта настройка включает сжатие gzip для общих текстовых ресурсов, правила обслуживания статических файлов вашего сайта VitePress с правильными заголовками кэширования и обработку параметра `cleanUrls: true`. diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md index a7413885..6e0cd567 100644 --- a/docs/ru/guide/markdown.md +++ b/docs/ru/guide/markdown.md @@ -795,7 +795,7 @@ export default config ## Основы - + ``` **Файл части** (`parts/basics.md`) @@ -831,7 +831,7 @@ export default config ## Основы - + ``` **Файл части** (`parts/basics.md`) @@ -867,8 +867,8 @@ export default config ## Основы - - + + ``` **Часть файла** (`parts/basics.md`) @@ -919,7 +919,7 @@ export default config ```md ## Мой дополнительный раздел - + ``` **Соответствующий код** @@ -943,7 +943,7 @@ export default config и включить его следующим образом: ```md - + ``` ## Математические уравнения {#math-equations} diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index 9cdc9438..16bad58d 100644 --- a/docs/ru/reference/default-theme-search.md +++ b/docs/ru/reference/default-theme-search.md @@ -29,6 +29,7 @@ export default defineConfig({ - - - +- ### i18n {#local-search-i18n} @@ -43,25 +44,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - ru: { // используйте ключ `root`, если хотите перевести локаль по умолчанию + ru: { // используйте `root`, если хотите перевести локаль по умолчанию translations: { button: { buttonText: 'Поиск', buttonAriaLabel: 'Поиск' }, modal: { - displayDetails: 'Отобразить подробный список', + displayDetails: 'Показать подробный список', resetButtonTitle: 'Сбросить поиск', backButtonTitle: 'Закрыть поиск', - noResultsText: 'Нет результатов по запросу', + noResultsText: 'Нет результатов', footer: { - selectText: 'выбрать', - selectKeyAriaLabel: 'выбрать', - navigateText: 'перейти', - navigateUpKeyAriaLabel: 'стрелка вверх', - navigateDownKeyAriaLabel: 'стрелка вниз', - closeText: 'закрыть', - closeKeyAriaLabel: 'esc' + selectText: 'Выбрать', + selectKeyAriaLabel: 'Enter', + navigateText: 'Навигация', + navigateUpKeyAriaLabel: 'Стрелка вверх', + navigateDownKeyAriaLabel: 'Стрелка вниз', + closeText: 'Закрыть', + closeKeyAriaLabel: 'Esc' } } } @@ -127,7 +128,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // возвращаем html + // вернуть строку HTML } } } @@ -178,7 +179,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -212,6 +213,19 @@ export default defineConfig({ Пример конфигурации для использования многоязычного поиска: +
+Нажмите, чтобы развернуть + +<<< @/snippets/algolia-i18n.ts + +
+ +Подробности см. в [официальной документации Algolia](https://docsearch.algolia.com/docs/api#translations). Чтобы быстрее начать, можно также скопировать переводы, используемые на этом сайте, из [нашего репозитория GitHub](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code). + +### Поддержка Ask AI в Algolia {#ask-ai} + +Если вы хотите добавить функцию **Ask AI**, передайте параметр `askAi` (или любые из его отдельных полей) внутри объекта `options`: + ```ts import { defineConfig } from 'vitepress' @@ -223,79 +237,15 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - ru: { - placeholder: 'Поиск в документации', - translations: { - button: { - buttonText: 'Поиск', - buttonAriaLabel: 'Поиск' - }, - modal: { - searchBox: { - clearButtonTitle: 'Очистить поиск', - clearButtonAriaLabel: 'Очистить поиск', - closeButtonText: 'Закрыть', - closeButtonAriaLabel: 'Закрыть', - placeholderText: 'Поиск в документации', - placeholderTextAskAi: 'Задайте вопрос ИИ:', - placeholderTextAskAiStreaming: 'Формируется ответ...', - searchInputLabel: 'Поиск', - backToKeywordSearchButtonText: 'Вернуться к поиску по ключевым словам', - backToKeywordSearchButtonAriaLabel: 'Вернуться к поиску по ключевым словам' - }, - startScreen: { - recentSearchesTitle: 'История поиска', - noRecentSearchesText: 'Нет истории поиска', - saveRecentSearchButtonTitle: 'Сохранить в истории поиска', - removeRecentSearchButtonTitle: 'Удалить из истории поиска', - favoriteSearchesTitle: 'Избранное', - removeFavoriteSearchButtonTitle: 'Удалить из избранного', - recentConversationsTitle: 'Последние диалоги', - removeRecentConversationButtonTitle: 'Удалить диалог из истории' - }, - errorScreen: { - titleText: 'Невозможно получить результаты', - helpText: 'Проверьте подключение к Интернету' - }, - noResultsScreen: { - noResultsText: 'Ничего не найдено', - suggestedQueryText: 'Попробуйте изменить запрос', - reportMissingResultsText: 'Считаете, что результаты должны быть?', - reportMissingResultsLinkText: 'Сообщите об этом' - }, - resultsScreen: { - askAiPlaceholder: 'Задайте вопрос ИИ: ' - }, - askAiScreen: { - disclaimerText: 'Ответ сгенерирован ИИ и может быть неточным. Пожалуйста, проверьте информацию самостоятельно.', - relatedSourcesText: 'Связанные источники', - thinkingText: 'Думаю...', - copyButtonText: 'Копировать', - copyButtonCopiedText: 'Скопировано!', - copyButtonTitle: 'Копировать', - likeButtonTitle: 'Нравится', - dislikeButtonTitle: 'Не нравится', - thanksForFeedbackText: 'Спасибо за ваш отзыв!', - preToolCallText: 'Идёт поиск...', - duringToolCallText: 'Поиск ', - afterToolCallText: 'Поиск выполнен' - }, - footer: { - selectText: 'выбрать', - submitQuestionText: 'Отправить вопрос', - selectKeyAriaLabel: 'Клавиша Enter', - navigateText: 'перейти', - navigateUpKeyAriaLabel: 'Стрелка вверх', - navigateDownKeyAriaLabel: 'Стрелка вниз', - closeText: 'закрыть', - backToSearchText: 'Вернуться к поиску', - closeKeyAriaLabel: 'Клавиша Esc', - poweredByText: 'поиск от' - } - } - } - } + // askAi: "ВАШ-ID-АССИСТЕНТА" + // ИЛИ + askAi: { + // как минимум нужно указать assistantId, полученный от Algolia + assistantId: 'XXXYYY', + // необязательные переопределения — если их нет, используются значения appId/apiKey/indexName верхнего уровня + // apiKey: '...', + // appId: '...', + // indexName: '...' } } } @@ -303,11 +253,13 @@ export default defineConfig({ }) ``` -[Эти параметры](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) можно переопределить. Чтобы узнать о них больше, обратитесь к официальной документации Algolia. +::: warning Примечание +Если вы хотите использовать обычный поиск по ключевым словам без Ask AI, просто не указывайте свойство `askAi` +::: -### Поддержка Ask AI в Algolia {#ask-ai} +### Боковая панель Ask AI {#ask-ai-side-panel} -Если вы хотите добавить функцию **Ask AI**, передайте параметр `askAi` (или любые из его отдельных полей) внутри объекта `options`: +DocSearch v4.5+ поддерживает опциональную **боковую панель Ask AI**. Когда она включена, её можно открыть с помощью **Ctrl/Cmd+I** по умолчанию. [Справочник API боковой панели](https://docsearch.algolia.com/docs/sidepanel/api-reference) содержит полный список опций. ```ts import { defineConfig } from 'vitepress' @@ -320,15 +272,18 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - // askAi: "ID-ВАШЕГО-АССИСТЕНТА" - // ИЛИ askAi: { - // минимум вы должны указать assistantId, полученный от Algolia assistantId: 'XXXYYY', - // опциональные переопределения – если не указаны, используются значения appId/apiKey/indexName верхнего уровня - // apiKey: '...', - // appId: '...', - // indexName: '...' + sidePanel: { + // Отражает API @docsearch/sidepanel-js SidepanelProps + panel: { + variant: 'floating', // или 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true + } + } } } } @@ -336,116 +291,70 @@ export default defineConfig({ }) ``` -::: warning Примечание -Если вы хотите использовать обычный поиск по ключевым словам без Ask AI, просто не указывайте свойство `askAi` -::: +Если вам нужно отключить сочетание клавиш, используйте опцию `keyboardShortcuts` боковой панели: -Переводы для интерфейса Ask AI находятся в `options.translations.modal.askAiScreen` и `options.translations.resultsScreen` — полный список ключей смотрите в [типах](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts). +```ts +import { defineConfig } from 'vitepress' -### Конфигурация поискового робота {#crawler-config} +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } + } + } +}) +``` -Вот пример конфигурации, основанной на той, что используется на этом сайте: +#### Режим (auto / sidePanel / hybrid / modal) {#ask-ai-mode} + +Вы можете опционально контролировать, как VitePress интегрирует поиск по ключевым словам и Ask AI: + +- `mode: 'auto'` (по умолчанию): выводит `hybrid`, когда настроен поиск по ключевым словам, иначе `sidePanel`, когда настроена боковая панель Ask AI. +- `mode: 'sidePanel'`: принудительно использовать только боковую панель (скрывает кнопку поиска по ключевым словам). +- `mode: 'hybrid'`: включает модальное окно поиска по ключевым словам + боковую панель Ask AI (требует настройки поиска по ключевым словам). +- `mode: 'modal'`: сохраняет Ask AI внутри модального окна DocSearch (даже если вы настроили боковую панель). + +#### Только Ask AI (без поиска по ключевым словам) {#ask-ai-only} + +Если вы хотите использовать **только боковую панель Ask AI**, вы можете опустить конфигурацию поиска по ключевым словам верхнего уровня и предоставить учётные данные в `askAi`: ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' - } } }) -``` \ No newline at end of file +``` + +### Конфигурация поискового робота {#crawler-config} + +Вот пример конфигурации, основанной на той, что используется на этом сайте: + +<<< @/snippets/algolia-crawler.js diff --git a/docs/snippets/algolia-crawler.js b/docs/snippets/algolia-crawler.js new file mode 100644 index 00000000..054afa56 --- /dev/null +++ b/docs/snippets/algolia-crawler.js @@ -0,0 +1,101 @@ +new Crawler({ + appId: '...', + apiKey: '...', + rateLimit: 8, + startUrls: ['https://vitepress.dev/'], + renderJavaScript: false, + sitemaps: [], + exclusionPatterns: [], + ignoreCanonicalTo: false, + discoveryPatterns: ['https://vitepress.dev/**'], + schedule: 'at 05:10 on Saturday', + actions: [ + { + indexName: 'vitepress', + pathsToMatch: ['https://vitepress.dev/**'], + recordExtractor: ({ $, helpers }) => { + return helpers.docsearch({ + recordProps: { + lvl1: '.content h1', + content: '.content p, .content li', + lvl0: { + selectors: 'section.has-active div h2', + defaultValue: 'Documentation' + }, + lvl2: '.content h2', + lvl3: '.content h3', + lvl4: '.content h4', + lvl5: '.content h5' + }, + indexHeadings: true + }) + } + } + ], + initialIndexSettings: { + vitepress: { + attributesForFaceting: ['type', 'lang'], + attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], + attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], + attributesToSnippet: ['content:10'], + camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], + searchableAttributes: [ + 'unordered(hierarchy_radio_camel.lvl0)', + 'unordered(hierarchy_radio.lvl0)', + 'unordered(hierarchy_radio_camel.lvl1)', + 'unordered(hierarchy_radio.lvl1)', + 'unordered(hierarchy_radio_camel.lvl2)', + 'unordered(hierarchy_radio.lvl2)', + 'unordered(hierarchy_radio_camel.lvl3)', + 'unordered(hierarchy_radio.lvl3)', + 'unordered(hierarchy_radio_camel.lvl4)', + 'unordered(hierarchy_radio.lvl4)', + 'unordered(hierarchy_radio_camel.lvl5)', + 'unordered(hierarchy_radio.lvl5)', + 'unordered(hierarchy_radio_camel.lvl6)', + 'unordered(hierarchy_radio.lvl6)', + 'unordered(hierarchy_camel.lvl0)', + 'unordered(hierarchy.lvl0)', + 'unordered(hierarchy_camel.lvl1)', + 'unordered(hierarchy.lvl1)', + 'unordered(hierarchy_camel.lvl2)', + 'unordered(hierarchy.lvl2)', + 'unordered(hierarchy_camel.lvl3)', + 'unordered(hierarchy.lvl3)', + 'unordered(hierarchy_camel.lvl4)', + 'unordered(hierarchy.lvl4)', + 'unordered(hierarchy_camel.lvl5)', + 'unordered(hierarchy.lvl5)', + 'unordered(hierarchy_camel.lvl6)', + 'unordered(hierarchy.lvl6)', + 'content' + ], + distinct: true, + attributeForDistinct: 'url', + customRanking: [ + 'desc(weight.pageRank)', + 'desc(weight.level)', + 'asc(weight.position)' + ], + ranking: [ + 'words', + 'filters', + 'typo', + 'attribute', + 'proximity', + 'exact', + 'custom' + ], + highlightPreTag: '', + highlightPostTag: '', + minWordSizefor1Typo: 3, + minWordSizefor2Typos: 7, + allowTyposOnNumericTokens: false, + minProximity: 1, + ignorePlurals: true, + advancedSyntax: true, + attributeCriteriaComputedByMinProximity: true, + removeWordsIfNoResults: 'allOptional' + } + } +}) diff --git a/docs/snippets/algolia-i18n.ts b/docs/snippets/algolia-i18n.ts new file mode 100644 index 00000000..c57816c3 --- /dev/null +++ b/docs/snippets/algolia-i18n.ts @@ -0,0 +1,155 @@ +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + locales: { + zh: { + translations: { + button: { + buttonText: '搜索', + buttonAriaLabel: '搜索' + }, + modal: { + searchBox: { + clearButtonTitle: '清除', + clearButtonAriaLabel: '清除查询', + closeButtonText: '关闭', + closeButtonAriaLabel: '关闭', + placeholderText: '搜索文档或向 AI 提问', + placeholderTextAskAi: '再问一个问题...', + placeholderTextAskAiStreaming: '正在回答...', + searchInputLabel: '搜索', + backToKeywordSearchButtonText: '返回关键词搜索', + backToKeywordSearchButtonAriaLabel: '返回关键词搜索', + newConversationPlaceholder: '提问', + conversationHistoryTitle: '我的对话历史', + startNewConversationText: '开始新的对话', + viewConversationHistoryText: '对话历史', + threadDepthErrorPlaceholder: '对话已达上限' + }, + newConversation: { + newConversationTitle: '我今天能帮你什么?', + newConversationDescription: + '我会搜索你的文档,快速帮你找到设置指南、功能细节和故障排除提示。' + }, + footer: { + selectText: '选择', + submitQuestionText: '提交问题', + selectKeyAriaLabel: '回车键', + navigateText: '导航', + navigateUpKeyAriaLabel: '向上箭头', + navigateDownKeyAriaLabel: '向下箭头', + closeText: '关闭', + backToSearchText: '返回搜索', + closeKeyAriaLabel: 'Esc 键', + poweredByText: '由…提供支持' + }, + errorScreen: { + titleText: '无法获取结果', + helpText: '你可能需要检查网络连接。' + }, + startScreen: { + recentSearchesTitle: '最近', + noRecentSearchesText: '暂无最近搜索', + saveRecentSearchButtonTitle: '保存此搜索', + removeRecentSearchButtonTitle: '从历史记录中移除此搜索', + favoriteSearchesTitle: '收藏', + removeFavoriteSearchButtonTitle: '从收藏中移除此搜索', + recentConversationsTitle: '最近对话', + removeRecentConversationButtonTitle: '从历史记录中移除此对话' + }, + noResultsScreen: { + noResultsText: '未找到相关结果', + suggestedQueryText: '尝试搜索', + reportMissingResultsText: '认为此查询应该有结果?', + reportMissingResultsLinkText: '告诉我们。' + }, + resultsScreen: { + askAiPlaceholder: '询问 AI:', + noResultsAskAiPlaceholder: '文档里没找到?让 Ask AI 帮忙:' + }, + askAiScreen: { + disclaimerText: '回答由 AI 生成,可能会出错。请核实。', + relatedSourcesText: '相关来源', + thinkingText: '思考中...', + copyButtonText: '复制', + copyButtonCopiedText: '已复制!', + copyButtonTitle: '复制', + likeButtonTitle: '喜欢', + dislikeButtonTitle: '不喜欢', + thanksForFeedbackText: '感谢你的反馈!', + preToolCallText: '搜索中...', + duringToolCallText: '搜索中...', + afterToolCallText: '已搜索', + stoppedStreamingText: '你已停止此回复', + errorTitleText: '聊天错误', + threadDepthExceededMessage: '为保持回答准确,此对话已关闭。', + startNewConversationButtonText: '开始新的对话' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: '询问 AI', + buttonAriaLabel: '询问 AI' + } + }, + panel: { + translations: { + header: { + title: '询问 AI', + conversationHistoryTitle: '我的对话历史', + newConversationText: '开始新的对话', + viewConversationHistoryText: '对话历史' + }, + promptForm: { + promptPlaceholderText: '提问', + promptAnsweringText: '正在回答...', + promptAskAnotherQuestionText: '再问一个问题', + promptDisclaimerText: '回答由 AI 生成,可能会出错。', + promptLabelText: '按回车发送,Shift+回车换行。', + promptAriaLabelText: '问题输入' + }, + conversationScreen: { + preToolCallText: '搜索中...', + searchingText: '搜索中...', + toolCallResultText: '已搜索', + conversationDisclaimer: + '回答由 AI 生成,可能会出错。请核实。', + reasoningText: '推理中...', + thinkingText: '思考中...', + relatedSourcesText: '相关来源', + stoppedStreamingText: '你已停止此回复', + copyButtonText: '复制', + copyButtonCopiedText: '已复制!', + likeButtonTitle: '喜欢', + dislikeButtonTitle: '不喜欢', + thanksForFeedbackText: '感谢你的反馈!', + errorTitleText: '聊天错误' + }, + newConversationScreen: { + titleText: '我今天能帮你什么?', + introductionText: + '我会搜索你的文档,快速帮你找到设置指南、功能细节和故障排除提示。' + }, + logo: { + poweredByText: '由…提供支持' + } + } + } + } + } + } + } + } + } + } +}) diff --git a/docs/zh/config.ts b/docs/zh/config.ts index f6bbdf02..91687c54 100644 --- a/docs/zh/config.ts +++ b/docs/zh/config.ts @@ -171,74 +171,139 @@ function sidebarReference(): DefaultTheme.SidebarItem[] { function searchOptions(): Partial { return { - placeholder: '搜索文档', translations: { button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' + buttonText: '搜索', + buttonAriaLabel: '搜索' }, modal: { searchBox: { - clearButtonTitle: '清除查询条件', - clearButtonAriaLabel: '清除查询条件', + clearButtonTitle: '清除', + clearButtonAriaLabel: '清除查询', closeButtonText: '关闭', closeButtonAriaLabel: '关闭', - placeholderText: '搜索文档', - placeholderTextAskAi: '向 AI 提问:', - placeholderTextAskAiStreaming: '回答中...', + placeholderText: '搜索文档或向 AI 提问', + placeholderTextAskAi: '再问一个问题...', + placeholderTextAskAiStreaming: '正在回答...', searchInputLabel: '搜索', - backToKeywordSearchButtonText: '返回关键字搜索', - backToKeywordSearchButtonAriaLabel: '返回关键字搜索' + backToKeywordSearchButtonText: '返回关键词搜索', + backToKeywordSearchButtonAriaLabel: '返回关键词搜索', + newConversationPlaceholder: '提问', + conversationHistoryTitle: '我的对话历史', + startNewConversationText: '开始新的对话', + viewConversationHistoryText: '对话历史', + threadDepthErrorPlaceholder: '对话已达上限' }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除', - recentConversationsTitle: '最近的对话', - removeRecentConversationButtonTitle: '从历史记录中删除对话' + newConversation: { + newConversationTitle: '我今天能帮你什么?', + newConversationDescription: + '我会搜索你的文档,快速帮你找到设置指南、功能细节和故障排除提示。' + }, + footer: { + selectText: '选择', + submitQuestionText: '提交问题', + selectKeyAriaLabel: '回车键', + navigateText: '导航', + navigateUpKeyAriaLabel: '向上箭头', + navigateDownKeyAriaLabel: '向下箭头', + closeText: '关闭', + backToSearchText: '返回搜索', + closeKeyAriaLabel: 'Esc 键', + poweredByText: '由…提供支持' }, errorScreen: { titleText: '无法获取结果', - helpText: '你可能需要检查你的网络连接' + helpText: '你可能需要检查网络连接。' + }, + startScreen: { + recentSearchesTitle: '最近', + noRecentSearchesText: '暂无最近搜索', + saveRecentSearchButtonTitle: '保存此搜索', + removeRecentSearchButtonTitle: '从历史记录中移除此搜索', + favoriteSearchesTitle: '收藏', + removeFavoriteSearchButtonTitle: '从收藏中移除此搜索', + recentConversationsTitle: '最近对话', + removeRecentConversationButtonTitle: '从历史记录中移除此对话' }, noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' + noResultsText: '未找到相关结果', + suggestedQueryText: '尝试搜索', + reportMissingResultsText: '认为此查询应该有结果?', + reportMissingResultsLinkText: '告诉我们。' }, resultsScreen: { - askAiPlaceholder: '向 AI 提问: ' + askAiPlaceholder: '询问 AI:', + noResultsAskAiPlaceholder: '文档里没找到?让 Ask AI 帮忙:' }, askAiScreen: { - disclaimerText: '答案由 AI 生成,可能不准确,请自行验证。', + disclaimerText: '回答由 AI 生成,可能会出错。请核实。', relatedSourcesText: '相关来源', thinkingText: '思考中...', copyButtonText: '复制', copyButtonCopiedText: '已复制!', copyButtonTitle: '复制', - likeButtonTitle: '赞', - dislikeButtonTitle: '踩', + likeButtonTitle: '喜欢', + dislikeButtonTitle: '不喜欢', thanksForFeedbackText: '感谢你的反馈!', preToolCallText: '搜索中...', - duringToolCallText: '搜索 ', + duringToolCallText: '搜索中...', afterToolCallText: '已搜索', - aggregatedToolCallText: '已搜索' + stoppedStreamingText: '你已停止此回复', + errorTitleText: '聊天错误', + threadDepthExceededMessage: '为保持回答准确,此对话已关闭。', + startNewConversationButtonText: '开始新的对话' + } + } + }, + askAi: { + sidePanel: { + button: { + translations: { + buttonText: '询问 AI', + buttonAriaLabel: '询问 AI' + } }, - footer: { - selectText: '选择', - submitQuestionText: '提交问题', - selectKeyAriaLabel: 'Enter 键', - navigateText: '切换', - navigateUpKeyAriaLabel: '向上箭头', - navigateDownKeyAriaLabel: '向下箭头', - closeText: '关闭', - backToSearchText: '返回搜索', - closeKeyAriaLabel: 'Esc 键', - poweredByText: '搜索提供者' + panel: { + translations: { + header: { + title: '询问 AI', + conversationHistoryTitle: '我的对话历史', + newConversationText: '开始新的对话', + viewConversationHistoryText: '对话历史' + }, + promptForm: { + promptPlaceholderText: '提问', + promptAnsweringText: '正在回答...', + promptAskAnotherQuestionText: '再问一个问题', + promptDisclaimerText: '回答由 AI 生成,可能会出错。', + promptLabelText: '按回车发送,Shift+回车换行。', + promptAriaLabelText: '问题输入' + }, + conversationScreen: { + preToolCallText: '搜索中...', + searchingText: '搜索中...', + toolCallResultText: '已搜索', + conversationDisclaimer: '回答由 AI 生成,可能会出错。请核实。', + reasoningText: '推理中...', + thinkingText: '思考中...', + relatedSourcesText: '相关来源', + stoppedStreamingText: '你已停止此回复', + copyButtonText: '复制', + copyButtonCopiedText: '已复制!', + likeButtonTitle: '喜欢', + dislikeButtonTitle: '不喜欢', + thanksForFeedbackText: '感谢你的反馈!', + errorTitleText: '聊天错误' + }, + newConversationScreen: { + titleText: '我今天能帮你什么?', + introductionText: + '我会搜索你的文档,快速帮你找到设置指南、功能细节和故障排除提示。' + }, + logo: { + poweredByText: '由…提供支持' + } + } } } } diff --git a/docs/zh/guide/deploy.md b/docs/zh/guide/deploy.md index 489bc766..c0fafe38 100644 --- a/docs/zh/guide/deploy.md +++ b/docs/zh/guide/deploy.md @@ -105,7 +105,7 @@ Cache-Control: max-age=31536000,immutable ## 各平台部署指南 {#platform-guides} -### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#generic} 使用仪表板创建新项目并更改这些设置: @@ -200,7 +200,7 @@ Cache-Control: max-age=31536000,immutable ### GitLab Pages -1. 如果你想部署到 `https:// .gitlab.io/ /`,将 VitePress 配置中的 `outDir` 设置为 `../public`。将 `base` 选项配置为 `'//'`。 +1. 如果你想部署到 `https:// .gitlab.io/ /`,将 VitePress 配置中的 `outDir` 设置为 `../public`。将 `base` 选项配置为 `'//'`。如果你部署到自定义域名、用户或组织页面,或在 GitLab 中启用了“Use unique domain”设置,则不需要 `base`。 2. 在项目的根目录中创建一个名为 `.gitlab-ci.yml` 的文件,其中包含以下内容。每当你更改内容时,这都会构建和部署你的站点: @@ -221,7 +221,7 @@ Cache-Control: max-age=31536000,immutable - main ``` -### Azure 静态 web 应用 {#azure-static-web-apps} +### Azure 1. 参考[官方文档](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration)。 @@ -231,7 +231,11 @@ Cache-Control: max-age=31536000,immutable - **`output_location`**: `docs/.vitepress/dist` - **`app_build_command`**: `npm run docs:build` -### Firebase {#firebase} +### CloudRay + +你可以按照这些[说明](https://cloudray.io/articles/how-to-deploy-vitepress-site)使用 [CloudRay](https://cloudray.io/) 部署你的 VitePress 项目。 + +### Firebase 1. 在项目的根目录下创建 `firebase.json` 和 `.firebaserc`: @@ -262,14 +266,6 @@ Cache-Control: max-age=31536000,immutable firebase deploy ``` -### Surge - -1. 运行 `npm run docs:build` 后,运行此命令进行部署: - - ```sh - npx surge docs/.vitepress/dist - ``` - ### Heroku 1. 参考 [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static) 中给出的文档和指南。 @@ -282,11 +278,11 @@ Cache-Control: max-age=31536000,immutable } ``` -### Edgio +### Hostinger -请参阅[创建并部署 VitePress 应用程序到 Edgio](https://docs.edg.io/guides/vitepress)。 +你可以按照这些[说明](https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/)使用 [Hostinger](https://www.hostinger.com/web-apps-hosting) 部署你的 VitePress 项目。在配置构建设置时,选择 VitePress 作为框架,并将根目录调整为 `./docs`。 -### Kinsta 静态站点托管 {#kinsta-static-site-hosting} +### Kinsta 你可以按照这些[说明](https://kinsta.com/docs/vitepress-static-site-example/) 在 [Kinsta](https://kinsta.com/static-site-hosting/) 上部署 VitePress 站点。 @@ -294,6 +290,14 @@ Cache-Control: max-age=31536000,immutable 你可以按照这些[说明](https://stormkit.io/blog/how-to-deploy-vitepress)将你的 VitePress 项目部署到 [Stormkit](https://www.stormkit.io)。 +### Surge + +1. 运行 `npm run docs:build` 后,运行此命令进行部署: + + ```sh + npx surge docs/.vitepress/dist + ``` + ### Nginx 下面是一个 Nginx 服务器块配置示例。此配置包括对基于文本的常见资源的 gzip 压缩、使用适当缓存头为 VitePress 站点静态文件提供服务的规则以及处理 `cleanUrls: true` 的方法。 diff --git a/docs/zh/guide/markdown.md b/docs/zh/guide/markdown.md index aaad599f..8f469468 100644 --- a/docs/zh/guide/markdown.md +++ b/docs/zh/guide/markdown.md @@ -771,7 +771,7 @@ export default config ## Basics - + ``` **Part file** (`parts/basics.md`) @@ -807,7 +807,7 @@ Can be created using `.foorc.json`. ## Basics - + ``` **Part file** (`parts/basics.md`) diff --git a/docs/zh/reference/default-theme-search.md b/docs/zh/reference/default-theme-search.md index 6f31fd2f..a95c907a 100644 --- a/docs/zh/reference/default-theme-search.md +++ b/docs/zh/reference/default-theme-search.md @@ -39,18 +39,25 @@ export default defineConfig({ provider: 'local', options: { locales: { - zh: { + zh: { // 如果你想翻译默认语言,请将此处设为 `root` translations: { button: { - buttonText: '搜索文档', - buttonAriaLabel: '搜索文档' + buttonText: '搜索', + buttonAriaLabel: '搜索' }, modal: { - noResultsText: '无法找到相关结果', - resetButtonTitle: '清除查询条件', + displayDetails: '显示详细列表', + resetButtonTitle: '重置搜索', + backButtonTitle: '关闭搜索', + noResultsText: '没有结果', footer: { selectText: '选择', - navigateText: '切换' + selectKeyAriaLabel: '输入', + navigateText: '导航', + navigateUpKeyAriaLabel: '上箭头', + navigateDownKeyAriaLabel: '下箭头', + closeText: '关闭', + closeKeyAriaLabel: 'Esc' } } } @@ -62,7 +69,7 @@ export default defineConfig({ }) ``` -### MiniSearch 配置项 {#mini-search-options} +### MiniSearch 配置项 {#minisearch-options} 你可以像这样配置 MiniSearch : @@ -116,7 +123,7 @@ export default defineConfig({ * @param {import('markdown-it-async')} md */ async _render(src, env, md) { - // 返回 html 字符串 + // 返回 HTML 字符串 } } } @@ -167,7 +174,7 @@ export default defineConfig({ async _render(src, env, md) { const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return await md.renderAsync(`# ${env.frontmatter.title}`) + html + return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html return html } } @@ -201,6 +208,19 @@ export default defineConfig({ 你可以使用这样的配置来使用多语言搜索: +
+点击展开 + +<<< @/snippets/algolia-i18n.ts + +
+ +更多信息请参考[官方 Algolia 文档](https://docsearch.algolia.com/docs/api#translations)。想要快速开始,你也可以从[我们的 GitHub 仓库](https://github.com/search?q=repo:vuejs/vitepress+%22function+searchOptions%22&type=code)复制此站点使用的翻译。 + +### Algolia Ask AI 支持 {#ask-ai} + +如果需要启用 **Ask AI**,只需在 `options` 中添加 `askAi`: + ```ts import { defineConfig } from 'vitepress' @@ -212,72 +232,51 @@ export default defineConfig({ appId: '...', apiKey: '...', indexName: '...', - locales: { - zh: { - placeholder: '搜索文档', - translations: { - button: { buttonText: '搜索文档', buttonAriaLabel: '搜索文档' }, - modal: { - searchBox: { - clearButtonTitle: '清除查询条件', - clearButtonAriaLabel: '清除查询条件', - closeButtonText: '关闭', - closeButtonAriaLabel: '关闭', - placeholderText: '搜索文档', - placeholderTextAskAi: '向 AI 提问:', - placeholderTextAskAiStreaming: '回答中...', - searchInputLabel: '搜索', - backToKeywordSearchButtonText: '返回关键字搜索', - backToKeywordSearchButtonAriaLabel: '返回关键字搜索' - }, - startScreen: { - recentSearchesTitle: '搜索历史', - noRecentSearchesText: '没有搜索历史', - saveRecentSearchButtonTitle: '保存至搜索历史', - removeRecentSearchButtonTitle: '从搜索历史中移除', - favoriteSearchesTitle: '收藏', - removeFavoriteSearchButtonTitle: '从收藏中移除', - recentConversationsTitle: '最近的对话', - removeRecentConversationButtonTitle: '从历史记录中删除对话' - }, - errorScreen: { - titleText: '无法获取结果', - helpText: '请检查网络连接' - }, - noResultsScreen: { - noResultsText: '无法找到相关结果', - suggestedQueryText: '你可以尝试查询', - reportMissingResultsText: '你认为该查询应该有结果?', - reportMissingResultsLinkText: '点击反馈' - }, - resultsScreen: { askAiPlaceholder: '向 AI 提问: ' }, - askAiScreen: { - disclaimerText: '答案由 AI 生成,可能不准确,请自行验证。', - relatedSourcesText: '相关来源', - thinkingText: '思考中...', - copyButtonText: '复制', - copyButtonCopiedText: '已复制!', - copyButtonTitle: '复制', - likeButtonTitle: '赞', - dislikeButtonTitle: '踩', - thanksForFeedbackText: '感谢你的反馈!', - preToolCallText: '搜索中...', - duringToolCallText: '搜索 ', - afterToolCallText: '已搜索' - }, - footer: { - selectText: '选择', - submitQuestionText: '提交问题', - selectKeyAriaLabel: 'Enter 键', - navigateText: '切换', - navigateUpKeyAriaLabel: '向上箭头', - navigateDownKeyAriaLabel: '向下箭头', - closeText: '关闭', - backToSearchText: '返回搜索', - closeKeyAriaLabel: 'Esc 键', - poweredByText: '搜索提供者' - } - } + // askAi: "你的助手ID" + // 或 + askAi: { + // 至少需要提供从 Algolia 获取的 assistantId + assistantId: 'XXXYYY', + // 可选覆盖 — 若省略,将复用顶层 appId/apiKey/indexName 的值 + // apiKey: '...', + // appId: '...', + // indexName: '...' + } + } + } + } +}) +``` + +::: warning 提示 +若仅需关键词搜索,可省略 `askAi`。 +::: + +### Ask AI 侧边栏 {#ask-ai-side-panel} + +DocSearch v4.5+ 支持可选的 **Ask AI 侧边栏**。启用后,默认可通过 **Ctrl/Cmd+I** 打开。完整的选项列表请参阅[侧边栏 API 参考](https://docsearch.algolia.com/docs/sidepanel/api-reference)。 + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + // 镜像 @docsearch/sidepanel-js SidepanelProps API + panel: { + variant: 'floating', // 或 'inline' + side: 'right', + width: '360px', + expandedWidth: '580px', + suggestedQuestions: true } } } @@ -287,131 +286,70 @@ export default defineConfig({ }) ``` -### Algolia Ask AI 支持 {#ask-ai} - -如果需要启用 **Ask AI**,只需在 `options` 中添加 `askAi`: +如果需要禁用键盘快捷键,请使用侧边栏的 `keyboardShortcuts` 选项: ```ts -options: { - appId: '...', - apiKey: '...', - indexName: '...', - askAi: { - assistantId: 'XXXYYY' +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + askAi: { + assistantId: 'XXXYYY', + sidePanel: { + keyboardShortcuts: { + 'Ctrl/Cmd+I': false + } + } + } + } + } } -} +}) ``` -::: warning 提示 -若仅需关键词搜索,可省略 `askAi`。 -::: +#### 模式 (auto / sidePanel / hybrid / modal) {#ask-ai-mode} -[这些选项](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts)可以被覆盖。请参阅 Algolia 官方文档以了解更多信息。 +你可以选择性地控制 VitePress 如何集成关键词搜索和 Ask AI: -### 爬虫配置 {#crawler-config} +- `mode: 'auto'`(默认):当配置了关键词搜索时推断为 `hybrid`,否则当配置了 Ask AI 侧边栏时推断为 `sidePanel`。 +- `mode: 'sidePanel'`:强制仅使用侧边栏(隐藏关键词搜索按钮)。 +- `mode: 'hybrid'`:启用关键词搜索模态框 + Ask AI 侧边栏(需要关键词搜索配置)。 +- `mode: 'modal'`:将 Ask AI 保留在 DocSearch 模态框内(即使你配置了侧边栏)。 -以下是基于此站点使用的示例配置: +#### 仅 Ask AI(无关键词搜索) {#ask-ai-only} + +如果你想**仅使用 Ask AI 侧边栏**,可以省略顶级关键词搜索配置,并在 `askAi` 下提供凭据: ```ts -new Crawler({ - appId: '...', - apiKey: '...', - rateLimit: 8, - startUrls: ['https://vitepress.dev/'], - renderJavaScript: false, - sitemaps: [], - exclusionPatterns: [], - ignoreCanonicalTo: false, - discoveryPatterns: ['https://vitepress.dev/**'], - schedule: 'at 05:10 on Saturday', - actions: [ - { - indexName: 'vitepress', - pathsToMatch: ['https://vitepress.dev/**'], - recordExtractor: ({ $, helpers }) => { - return helpers.docsearch({ - recordProps: { - lvl1: '.content h1', - content: '.content p, .content li', - lvl0: { - selectors: 'section.has-active div h2', - defaultValue: 'Documentation' - }, - lvl2: '.content h2', - lvl3: '.content h3', - lvl4: '.content h4', - lvl5: '.content h5' - }, - indexHeadings: true - }) +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + mode: 'sidePanel', + askAi: { + assistantId: 'XXXYYY', + appId: '...', + apiKey: '...', + indexName: '...', + sidePanel: true + } } } - ], - initialIndexSettings: { - vitepress: { - attributesForFaceting: ['type', 'lang'], - attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], - attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], - attributesToSnippet: ['content:10'], - camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], - searchableAttributes: [ - 'unordered(hierarchy_radio_camel.lvl0)', - 'unordered(hierarchy_radio.lvl0)', - 'unordered(hierarchy_radio_camel.lvl1)', - 'unordered(hierarchy_radio.lvl1)', - 'unordered(hierarchy_radio_camel.lvl2)', - 'unordered(hierarchy_radio.lvl2)', - 'unordered(hierarchy_radio_camel.lvl3)', - 'unordered(hierarchy_radio.lvl3)', - 'unordered(hierarchy_radio_camel.lvl4)', - 'unordered(hierarchy_radio.lvl4)', - 'unordered(hierarchy_radio_camel.lvl5)', - 'unordered(hierarchy_radio.lvl5)', - 'unordered(hierarchy_radio_camel.lvl6)', - 'unordered(hierarchy_radio.lvl6)', - 'unordered(hierarchy_camel.lvl0)', - 'unordered(hierarchy.lvl0)', - 'unordered(hierarchy_camel.lvl1)', - 'unordered(hierarchy.lvl1)', - 'unordered(hierarchy_camel.lvl2)', - 'unordered(hierarchy.lvl2)', - 'unordered(hierarchy_camel.lvl3)', - 'unordered(hierarchy.lvl3)', - 'unordered(hierarchy_camel.lvl4)', - 'unordered(hierarchy.lvl4)', - 'unordered(hierarchy_camel.lvl5)', - 'unordered(hierarchy.lvl5)', - 'unordered(hierarchy_camel.lvl6)', - 'unordered(hierarchy.lvl6)', - 'content' - ], - distinct: true, - attributeForDistinct: 'url', - customRanking: [ - 'desc(weight.pageRank)', - 'desc(weight.level)', - 'asc(weight.position)' - ], - ranking: [ - 'words', - 'filters', - 'typo', - 'attribute', - 'proximity', - 'exact', - 'custom' - ], - highlightPreTag: '', - highlightPostTag: '', - minWordSizefor1Typo: 3, - minWordSizefor2Typos: 7, - allowTyposOnNumericTokens: false, - minProximity: 1, - ignorePlurals: true, - advancedSyntax: true, - attributeCriteriaComputedByMinProximity: true, - removeWordsIfNoResults: 'allOptional' - } } }) ``` + +### 爬虫配置 {#crawler-config} + +以下是基于此站点使用的示例配置: + +<<< @/snippets/algolia-crawler.js diff --git a/package.json b/package.json index 74b31f6f..5f2ba39b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "2.0.0-alpha.15", + "version": "2.0.0-alpha.16", "description": "Vite & Vue powered static site generator", "keywords": [ "vite", @@ -51,14 +51,15 @@ "lib" ], "scripts": { - "dev": "rimraf dist && pnpm dev:shared && pnpm dev:start", + "clean": "node -e \"require('node:fs').rmSync('./dist',{recursive:!0,force:!0,maxRetries:10})\"", + "dev": "pnpm clean && pnpm dev:shared && pnpm dev:start", "dev:start": "pnpm --stream '/^dev:(client|node|watch)$/'", "dev:client": "tsc --sourcemap -w --preserveWatchOutput -p src/client", "dev:node": "DEV=true pnpm build:node -w", "dev:shared": "node scripts/copyShared", "dev:watch": "node scripts/watchAndCopy", "build": "pnpm build:prepare && pnpm build:client && pnpm build:node", - "build:prepare": "rimraf dist && node scripts/copyShared", + "build:prepare": "pnpm clean && node scripts/copyShared", "build:client": "vue-tsc --noEmit -p src/client && tsc -p src/client && node scripts/copyClient", "build:node": "tsc -p src/node --noEmit && rollup --config rollup.config.ts --configPlugin esbuild", "test": "pnpm --aggregate-output --reporter=append-only '/^test:(unit|e2e|init)$/'", @@ -95,28 +96,29 @@ "*": "prettier --experimental-cli --ignore-unknown --write" }, "dependencies": { - "@docsearch/css": "^4.3.2", - "@docsearch/js": "^4.3.2", - "@iconify-json/simple-icons": "^1.2.59", - "@shikijs/core": "^3.15.0", - "@shikijs/transformers": "^3.15.0", - "@shikijs/types": "^3.15.0", + "@docsearch/css": "^4.5.3", + "@docsearch/js": "^4.5.3", + "@docsearch/sidepanel-js": "^4.5.3", + "@iconify-json/simple-icons": "^1.2.69", + "@shikijs/core": "^3.22.0", + "@shikijs/transformers": "^3.22.0", + "@shikijs/types": "^3.22.0", "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.1", + "@vitejs/plugin-vue": "^6.0.4", "@vue/devtools-api": "^8.0.5", - "@vue/shared": "^3.5.24", - "@vueuse/core": "^14.0.0", - "@vueuse/integrations": "^14.0.0", - "focus-trap": "^7.6.6", + "@vue/shared": "^3.5.27", + "@vueuse/core": "^14.2.0", + "@vueuse/integrations": "^14.2.0", + "focus-trap": "^8.0.0", "mark.js": "8.11.1", "minisearch": "^7.2.0", - "shiki": "^3.15.0", - "vite": "^7.2.2", - "vue": "^3.5.24" + "shiki": "^3.22.0", + "vite": "^7.3.1", + "vue": "^3.5.27" }, "devDependencies": { - "@clack/prompts": "^1.0.0-alpha.6", - "@iconify/utils": "^3.0.2", + "@clack/prompts": "^1.0.0", + "@iconify/utils": "^3.1.0", "@mdit-vue/plugin-component": "^3.0.2", "@mdit-vue/plugin-frontmatter": "^3.0.2", "@mdit-vue/plugin-headers": "^3.0.2", @@ -135,51 +137,50 @@ "@types/lodash.template": "^4.5.3", "@types/mark.js": "^8.11.12", "@types/markdown-it-attrs": "^4.1.3", - "@types/markdown-it-container": "^2.0.10", + "@types/markdown-it-container": "^4.0.0", "@types/markdown-it-emoji": "^3.0.1", "@types/minimist": "^1.2.5", - "@types/node": "^24.10.1", + "@types/node": "^25.2.0", "@types/picomatch": "^4.0.2", "@types/prompts": "^2.4.9", "chokidar": "^4.0.3", "conventional-changelog": "^7.1.1", "conventional-changelog-angular": "^8.1.0", "cross-spawn": "^7.0.6", - "esbuild": "^0.25.12", - "execa": "^9.6.0", - "fs-extra": "^11.3.2", + "esbuild": "^0.27.2", + "execa": "^9.6.1", + "fs-extra": "^11.3.3", "get-port": "^7.1.0", "gray-matter": "^4.0.3", - "lint-staged": "^16.2.6", + "lint-staged": "^16.2.7", "lodash.template": "^4.5.0", - "lru-cache": "^11.2.2", + "lru-cache": "^11.2.5", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-async": "^2.2.0", "markdown-it-attrs": "^4.3.1", - "markdown-it-cjk-friendly": "^1.3.2", + "markdown-it-cjk-friendly": "^2.0.1", "markdown-it-container": "^4.0.0", "markdown-it-emoji": "^3.0.0", "markdown-it-mathjax3": "^4.3.2", "minimist": "^1.2.8", "nanoid": "^5.1.6", - "obug": "^2.0.0", - "ora": "^9.0.0", + "obug": "^2.1.1", + "ora": "^9.1.0", "oxc-minify": "^0.98.0", "p-map": "^7.0.4", - "package-directory": "^8.1.0", + "package-directory": "^8.2.0", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "picomatch": "^4.0.3", - "playwright-chromium": "^1.56.1", + "playwright-chromium": "^1.58.1", "polka": "^1.0.0-next.28", "postcss": "^8.5.6", - "postcss-selector-parser": "^7.1.0", - "prettier": "^3.6.2", + "postcss-selector-parser": "^7.1.1", + "prettier": "^3.8.1", "prompts": "^2.4.2", "punycode": "^2.3.1", - "rimraf": "^6.1.0", - "rollup": "^4.53.2", + "rollup": "^4.57.1", "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "^6.2.1", "semver": "^7.7.3", @@ -189,7 +190,7 @@ "tinyglobby": "^0.2.15", "typescript": "^5.9.3", "vitest": "4.0.0-beta.4", - "vue-tsc": "^3.1.4", + "vue-tsc": "^3.2.4", "wait-on": "^9.0.3" }, "peerDependencies": { @@ -208,5 +209,5 @@ "optional": true } }, - "packageManager": "pnpm@10.22.0" + "packageManager": "pnpm@10.28.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a82ff3ff..674e9efd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,44 +27,47 @@ importers: .: dependencies: '@docsearch/css': - specifier: ^4.3.2 - version: 4.3.2 + specifier: ^4.5.3 + version: 4.5.3 '@docsearch/js': - specifier: ^4.3.2 - version: 4.3.2 + specifier: ^4.5.3 + version: 4.5.3 + '@docsearch/sidepanel-js': + specifier: ^4.5.3 + version: 4.5.3 '@iconify-json/simple-icons': - specifier: ^1.2.59 - version: 1.2.59 + specifier: ^1.2.69 + version: 1.2.69 '@shikijs/core': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.22.0 + version: 3.22.0 '@shikijs/transformers': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.22.0 + version: 3.22.0 '@shikijs/types': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.22.0 + version: 3.22.0 '@types/markdown-it': specifier: ^14.1.2 version: 14.1.2 '@vitejs/plugin-vue': - specifier: ^6.0.1 - version: 6.0.1(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) + specifier: ^6.0.4 + version: 6.0.4(rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@vue/devtools-api': specifier: ^8.0.5 version: 8.0.5 '@vue/shared': - specifier: ^3.5.24 - version: 3.5.24 + specifier: ^3.5.27 + version: 3.5.27 '@vueuse/core': - specifier: ^14.0.0 - version: 14.0.0(vue@3.5.24(typescript@5.9.3)) + specifier: ^14.2.0 + version: 14.2.0(vue@3.5.27(typescript@5.9.3)) '@vueuse/integrations': - specifier: ^14.0.0 - version: 14.0.0(axios@1.13.2)(focus-trap@7.6.6)(vue@3.5.24(typescript@5.9.3)) + specifier: ^14.2.0 + version: 14.2.0(axios@1.13.4)(focus-trap@8.0.0)(vue@3.5.27(typescript@5.9.3)) focus-trap: - specifier: ^7.6.6 - version: 7.6.6 + specifier: ^8.0.0 + version: 8.0.0 mark.js: specifier: 8.11.1 version: 8.11.1 @@ -72,21 +75,21 @@ importers: specifier: ^7.2.0 version: 7.2.0 shiki: - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.22.0 + version: 3.22.0 vite: specifier: npm:rolldown-vite@latest - version: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + version: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) vue: - specifier: ^3.5.24 - version: 3.5.24(typescript@5.9.3) + specifier: ^3.5.27 + version: 3.5.27(typescript@5.9.3) devDependencies: '@clack/prompts': - specifier: ^1.0.0-alpha.6 - version: 1.0.0-alpha.6 + specifier: ^1.0.0 + version: 1.0.0 '@iconify/utils': - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^3.1.0 + version: 3.1.0 '@mdit-vue/plugin-component': specifier: ^3.0.2 version: 3.0.2 @@ -113,19 +116,19 @@ importers: version: 1.0.0-next.28 '@rollup/plugin-alias': specifier: ^6.0.0 - version: 6.0.0(rollup@4.53.2) + version: 6.0.0(rollup@4.57.1) '@rollup/plugin-commonjs': specifier: ^29.0.0 - version: 29.0.0(rollup@4.53.2) + version: 29.0.0(rollup@4.57.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.53.2) + version: 6.1.0(rollup@4.57.1) '@rollup/plugin-node-resolve': specifier: ^16.0.3 - version: 16.0.3(rollup@4.53.2) + version: 16.0.3(rollup@4.57.1) '@rollup/plugin-replace': specifier: ^6.0.3 - version: 6.0.3(rollup@4.53.2) + version: 6.0.3(rollup@4.57.1) '@types/cross-spawn': specifier: ^6.0.6 version: 6.0.6 @@ -142,8 +145,8 @@ importers: specifier: ^4.1.3 version: 4.1.3(patch_hash=ef05082c7886d283042ddf9103f1408fc36fd8665ef278c82b3da0659441dfb6) '@types/markdown-it-container': - specifier: ^2.0.10 - version: 2.0.10 + specifier: ^4.0.0 + version: 4.0.0 '@types/markdown-it-emoji': specifier: ^3.0.1 version: 3.0.1 @@ -151,8 +154,8 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.2.0 + version: 25.2.0 '@types/picomatch': specifier: ^4.0.2 version: 4.0.2 @@ -172,14 +175,14 @@ importers: specifier: ^7.0.6 version: 7.0.6 esbuild: - specifier: ^0.25.12 - version: 0.25.12 + specifier: ^0.27.2 + version: 0.27.2 execa: - specifier: ^9.6.0 - version: 9.6.0 + specifier: ^9.6.1 + version: 9.6.1 fs-extra: - specifier: ^11.3.2 - version: 11.3.2 + specifier: ^11.3.3 + version: 11.3.3 get-port: specifier: ^7.1.0 version: 7.1.0 @@ -187,29 +190,29 @@ importers: specifier: ^4.0.3 version: 4.0.3 lint-staged: - specifier: ^16.2.6 - version: 16.2.6 + specifier: ^16.2.7 + version: 16.2.7 lodash.template: specifier: ^4.5.0 version: 4.5.0 lru-cache: - specifier: ^11.2.2 - version: 11.2.2 + specifier: ^11.2.5 + version: 11.2.5 markdown-it: specifier: ^14.1.0 - version: 14.1.0 + version: 14.1.1 markdown-it-anchor: specifier: ^9.2.0 - version: 9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + version: 9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.1.1) markdown-it-async: specifier: ^2.2.0 version: 2.2.0 markdown-it-attrs: specifier: ^4.3.1 - version: 4.3.1(patch_hash=12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e)(markdown-it@14.1.0) + version: 4.3.1(patch_hash=12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e)(markdown-it@14.1.1) markdown-it-cjk-friendly: - specifier: ^1.3.2 - version: 1.3.2(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + specifier: ^2.0.1 + version: 2.0.1(@types/markdown-it@14.1.2)(markdown-it@14.1.1) markdown-it-container: specifier: ^4.0.0 version: 4.0.0 @@ -226,11 +229,11 @@ importers: specifier: ^5.1.6 version: 5.1.6 obug: - specifier: ^2.0.0 - version: 2.0.0(ms@2.1.3) + specifier: ^2.1.1 + version: 2.1.1 ora: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.1.0 + version: 9.1.0 oxc-minify: specifier: ^0.98.0 version: 0.98.0 @@ -238,8 +241,8 @@ importers: specifier: ^7.0.4 version: 7.0.4 package-directory: - specifier: ^8.1.0 - version: 8.1.0 + specifier: ^8.2.0 + version: 8.2.0 path-to-regexp: specifier: ^6.3.0 version: 6.3.0 @@ -250,8 +253,8 @@ importers: specifier: ^4.0.3 version: 4.0.3 playwright-chromium: - specifier: ^1.56.1 - version: 1.56.1 + specifier: ^1.58.1 + version: 1.58.1 polka: specifier: ^1.0.0-next.28 version: 1.0.0-next.28 @@ -259,29 +262,26 @@ importers: specifier: ^8.5.6 version: 8.5.6 postcss-selector-parser: - specifier: ^7.1.0 - version: 7.1.0 + specifier: ^7.1.1 + version: 7.1.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.8.1 + version: 3.8.1 prompts: specifier: ^2.4.2 version: 2.4.2 punycode: specifier: ^2.3.1 version: 2.3.1 - rimraf: - specifier: ^6.1.0 - version: 6.1.0 rollup: - specifier: ^4.53.2 - version: 4.53.2 + specifier: ^4.57.1 + version: 4.57.1 rollup-plugin-dts: specifier: 6.1.1 - version: 6.1.1(rollup@4.53.2)(typescript@5.9.3) + version: 6.1.1(rollup@4.57.1)(typescript@5.9.3) rollup-plugin-esbuild: specifier: ^6.2.1 - version: 6.2.1(esbuild@0.25.12)(rollup@4.53.2) + version: 6.2.1(esbuild@0.27.2)(rollup@4.57.1) semver: specifier: ^7.7.3 version: 7.7.3 @@ -302,10 +302,10 @@ importers: version: 5.9.3 vitest: specifier: 4.0.0-beta.4 - version: 4.0.0-beta.4(@types/debug@4.1.12)(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + version: 4.0.0-beta.4(@types/debug@4.1.12)(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) vue-tsc: - specifier: ^3.1.4 - version: 3.1.4(typescript@5.9.3) + specifier: ^3.2.4 + version: 3.2.4(typescript@5.9.3) wait-on: specifier: ^9.0.3 version: 9.0.3 @@ -340,22 +340,19 @@ importers: specifier: workspace:* version: link:.. vitepress-plugin-group-icons: - specifier: ^1.6.5 - version: 1.6.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + specifier: ^1.7.1 + version: 1.7.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) vitepress-plugin-llms: - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.11.0 + version: 1.11.0 packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/utils@9.3.0': - resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': @@ -366,23 +363,23 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@clack/core@0.3.5': resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} - '@clack/core@1.0.0-alpha.6': - resolution: {integrity: sha512-eG5P45+oShFG17u9I1DJzLkXYB1hpUgTLi32EfsMjSHLEqJUR8BOBCVFkdbUX2g08eh/HCi6UxNGpPhaac1LAA==} + '@clack/core@1.0.0': + resolution: {integrity: sha512-Orf9Ltr5NeiEuVJS8Rk2XTw3IxNC2Bic3ash7GgYeA8LJ/zmSNpSQ/m5UAhe03lA6KFgklzZ5KTHs4OAMA/SAQ==} - '@clack/prompts@1.0.0-alpha.6': - resolution: {integrity: sha512-75NCtYOgDHVBE2nLdKPTDYOaESxO0GLAKC7INREp5VbS988Xua1u+588VaGlcvXiLc/kSwc25Cd+4PeTSpY6QQ==} + '@clack/prompts@1.0.0': + resolution: {integrity: sha512-rWPXg9UaCFqErJVQ+MecOaWsozjaxol4yjnmYcGNipAWzdaWa2x+VJmKfGq7L0APwBohQOYdHC+9RO4qRXej+A==} '@conventional-changelog/git-client@2.5.1': resolution: {integrity: sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==} @@ -396,173 +393,176 @@ packages: conventional-commits-parser: optional: true - '@docsearch/css@4.3.2': - resolution: {integrity: sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==} + '@docsearch/css@4.5.3': + resolution: {integrity: sha512-kUpHaxn0AgI3LQfyzTYkNUuaFY4uEz/Ym9/N/FvyDE+PzSgZsCyDH9jE49B6N6f1eLCm9Yp64J9wENd6vypdxA==} + + '@docsearch/js@4.5.3': + resolution: {integrity: sha512-rcBiUMCXbZLqrLIT6F6FDcrG/tyvM2WM0zum6NPbIiQNDQxbSgmNc+/bToS0rxBsXaxiU64esiWoS02WqrWLsg==} - '@docsearch/js@4.3.2': - resolution: {integrity: sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==} + '@docsearch/sidepanel-js@4.5.3': + resolution: {integrity: sha512-DmcZYc1ZMMcabtKrCU2RIf1z09LwazKCyoPFU/ijJiBg2LdqMLmkyDKHGy1OIYEyUx4ok5RIbkVGaRfD55BqZQ==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -590,30 +590,26 @@ packages: '@iconify-json/logos@1.2.10': resolution: {integrity: sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA==} - '@iconify-json/simple-icons@1.2.59': - resolution: {integrity: sha512-fYx/InyQsWFW4wVxWka3CGDJ6m/fXoTqWBSl+oA3FBXO5RhPAb6S3Y5bRgCPnrYevErH8VjAL0TZevIqlN2PhQ==} + '@iconify-json/simple-icons@1.2.69': + resolution: {integrity: sha512-T/rhy5n7pzE0ZOxQVlF68SNPCYYjRBpddjgjrJO5WWVRG8es5BQmvxIE9kKF+t2hhPGvuGQFpXmUyqbOtnxirQ==} - '@iconify-json/vscode-icons@1.2.35': - resolution: {integrity: sha512-LWI0uBk2oZ+tjbLR6NyPWCu+A+alo0xsEU10j/NYMJhcIM4meMBTL10TlTIGJr/tiI5IybdXUKs5woAGjLsbhA==} + '@iconify-json/vscode-icons@1.2.40': + resolution: {integrity: sha512-Q7JIWAxENwmcRg4EGRY+u16gBwrAj6mWeuSmuyuPvNvoTJHh8Ss8qoeDhrFYNgtWqNkzH5hSf4b2T9XLK5MsrA==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.0.2': - resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -660,8 +656,8 @@ packages: resolution: {integrity: sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==} engines: {node: '>=20.0.0'} - '@napi-rs/wasm-runtime@1.0.7': - resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -716,36 +712,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-arm64-musl@0.98.0': resolution: {integrity: sha512-TOGEzv2tr/lGttB6MIYExXdkMxWDVUqxFcu4AQ25e/Jk0kq5IVyDNmLfKzUin5r/1nmOJEpuBeS3xq0VPmtU7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-minify/binding-linux-riscv64-gnu@0.98.0': resolution: {integrity: sha512-zTyb36zh3s2ZDwRP3c5VEs2aS+CECXmpmgEWds+1bawELuueozsr455lqDE1qNcIMUS/AxeX9DCE4vM+LHYHfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-s390x-gnu@0.98.0': resolution: {integrity: sha512-UafNlOq0Uy/PmfkMuSWSpBAW+55QlGny1ysLMK1D6l2xC8SjFTheWHVjQVChHhgKFZxT1NypV/cbTQyh06mAYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-gnu@0.98.0': resolution: {integrity: sha512-P/9krmxwtLbxdT339jEm4XUHUFMN4lzjqqvGwBug6NxPvN1sppSl06CNXzHQ6H7/oSftZIyAmsOaLWknhm30uw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-musl@0.98.0': resolution: {integrity: sha512-XpbZ15Lm3eFg8+VLAKgTmu+9VVMb7B2Cz6LOGd0EqMwPYaC+I84O8RM55/vU1fSH58BZByOnjeVWf4RPOSz7UA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-minify/binding-wasm32-wasi@0.98.0': resolution: {integrity: sha512-VVNRbDWHZ7+Viv14Vy1y2yutOzLdivtVKKtcSt+xFSoS2wDhkn0KtRMnNTBVUnxjYqkwrDaDfcqhez5jA5bAUA==} @@ -764,12 +766,12 @@ packages: cpu: [x64] os: [win32] - '@oxc-project/runtime@0.97.0': - resolution: {integrity: sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==} + '@oxc-project/runtime@0.101.0': + resolution: {integrity: sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==} engines: {node: ^20.19.0 || >=22.12.0} - '@oxc-project/types@0.97.0': - resolution: {integrity: sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ==} + '@oxc-project/types@0.101.0': + resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} '@polka/compression@1.0.0-next.28': resolution: {integrity: sha512-aDmrBhgHJtxE+jy145WfhW9WmTAFmES/dNnn1LAs8UnnkFgBUj4T8I4ScQ9+rOkpDZStvnVP5iqhN3tvt7O1NA==} @@ -778,94 +780,92 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rolldown/binding-android-arm64@1.0.0-beta.50': - resolution: {integrity: sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag==} + '@rolldown/binding-android-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.50': - resolution: {integrity: sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.50': - resolution: {integrity: sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA==} + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + resolution: {integrity: sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.50': - resolution: {integrity: sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + resolution: {integrity: sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50': - resolution: {integrity: sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + resolution: {integrity: sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50': - resolution: {integrity: sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.50': - resolution: {integrity: sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.50': - resolution: {integrity: sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.50': - resolution: {integrity: sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.50': - resolution: {integrity: sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.50': - resolution: {integrity: sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + resolution: {integrity: sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50': - resolution: {integrity: sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50': - resolution: {integrity: sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.50': - resolution: {integrity: sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.29': - resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rolldown/pluginutils@1.0.0-beta.50': - resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -921,139 +921,167 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.2': - resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.2': - resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.2': - resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.2': - resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.2': - resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.2': - resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': - resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.53.2': - resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.53.2': - resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.53.2': - resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.53.2': - resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.53.2': - resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.53.2': - resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.53.2': - resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.53.2': - resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.53.2': - resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.53.2': - resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.53.2': - resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.2': - resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.2': - resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.2': - resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.2': - resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@3.15.0': - resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==} + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} - '@shikijs/engine-javascript@3.15.0': - resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} - '@shikijs/engine-oniguruma@3.15.0': - resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} - '@shikijs/langs@3.15.0': - resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} - '@shikijs/themes@3.15.0': - resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} - '@shikijs/transformers@3.15.0': - resolution: {integrity: sha512-Hmwip5ovvSkg+Kc41JTvSHHVfCYF+C8Cp1omb5AJj4Xvd+y9IXz2rKJwmFRGsuN0vpHxywcXJ1+Y4B9S7EG1/A==} + '@shikijs/transformers@3.22.0': + resolution: {integrity: sha512-E7eRV7mwDBjueLF6852n2oYeJYxBq3NSsDk+uyruYAXONv4U8holGmIrT+mPRJQ1J1SNOH6L8G19KRzmBawrFw==} - '@shikijs/types@3.15.0': - resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1070,8 +1098,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1112,8 +1140,8 @@ packages: '@types/lodash.template@4.5.3': resolution: {integrity: sha512-Mo0UYKLu1oXgkV9TVoXZLlXXjyIXlW7ZQRxi/4gQJmzJr63dmicE8gG0OkPjYTKBrBic852q0JzqrtNUWLBIyA==} - '@types/lodash@4.17.20': - resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} '@types/mark.js@8.11.12': resolution: {integrity: sha512-244ZnaIBpz4c6xutliAnYVZp6xJlmC569jZqnR3ElO1Y01ooYASSVQEqpd2x0A2UfrgVMs5V9/9tUAdZaDMytQ==} @@ -1121,8 +1149,8 @@ packages: '@types/markdown-it-attrs@4.1.3': resolution: {integrity: sha512-1JsseFdHD6rQHsPcy4W3xx/whxvZ09Z+CqPpnOtrGtpmkFW07N11q7oM383//LtoKv54yn+HGnk6r4ZHUTHJVg==} - '@types/markdown-it-container@2.0.10': - resolution: {integrity: sha512-zv+YxrlSYRq51e9kzm3orv4OvF4U79Ll1OyplNXr00o4ZC/8PukJk/jEWH7CnsMtrSWZlyv0czhz42jm9J4uLw==} + '@types/markdown-it-container@4.0.0': + resolution: {integrity: sha512-GmD8OECLfzPHv8VyvFRzslqdwXoDBJ2H40fxXFjrarbqvJZSB/BJKZXN5e3k7Mx7GQanSNzTYhzeS3H9o0gAOw==} '@types/markdown-it-emoji@3.0.1': resolution: {integrity: sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==} @@ -1142,11 +1170,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@22.19.8': + resolution: {integrity: sha512-ebO/Yl+EAvVe8DnMfi+iaAyIqYdK0q/q0y0rw82INWEKJOBe6b/P3YWE8NW7oOlF/nXFNrHwhARrN/hdgDkraA==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@24.10.10': + resolution: {integrity: sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==} + + '@types/node@25.2.0': + resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1175,11 +1206,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@6.0.1': - resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + '@vitejs/plugin-vue@6.0.4': + resolution: {integrity: sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 vue: ^3.2.25 '@vitest/expect@4.0.0-beta.4': @@ -1199,8 +1230,8 @@ packages: '@vitest/pretty-format@4.0.0-beta.4': resolution: {integrity: sha512-BW9Y/t5tGLFi1DgNzs9R4EDqh3MVGiPFBTPGZLK+Y7jBUOFINmLTYTVz1iDnSFLwTOpHxAQfERyOmcu429OQog==} - '@vitest/pretty-format@4.0.10': - resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} '@vitest/runner@4.0.0-beta.4': resolution: {integrity: sha512-27ptMzYl0dNvN6o1jmKDsEX0gR3IwulSgPwJVvoKSQntUFUqMeQh0jbNtdZj60li49Rxbh/rdSE25D/7ABJAJg==} @@ -1214,26 +1245,26 @@ packages: '@vitest/utils@4.0.0-beta.4': resolution: {integrity: sha512-AYAKmvweKomQ71BSmM4uuLdj7Lwb7go2tNLoNijObvmwwandidbcNoJzr2MZNm406RtUq+ZN9JsEYhID7uTgNw==} - '@volar/language-core@2.4.23': - resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} - '@volar/source-map@2.4.23': - resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} - '@volar/typescript@2.4.23': - resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} - '@vue/compiler-core@3.5.24': - resolution: {integrity: sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==} + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} - '@vue/compiler-dom@3.5.24': - resolution: {integrity: sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==} + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} - '@vue/compiler-sfc@3.5.24': - resolution: {integrity: sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==} + '@vue/compiler-sfc@3.5.27': + resolution: {integrity: sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==} - '@vue/compiler-ssr@3.5.24': - resolution: {integrity: sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==} + '@vue/compiler-ssr@3.5.27': + resolution: {integrity: sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==} '@vue/devtools-api@8.0.5': resolution: {integrity: sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==} @@ -1244,44 +1275,39 @@ packages: '@vue/devtools-shared@8.0.5': resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} - '@vue/language-core@3.1.4': - resolution: {integrity: sha512-n/58wm8SkmoxMWkUNUH/PwoovWe4hmdyPJU2ouldr3EPi1MLoS7iDN46je8CsP95SnVBs2axInzRglPNKvqMcg==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@vue/language-core@3.2.4': + resolution: {integrity: sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==} - '@vue/reactivity@3.5.24': - resolution: {integrity: sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==} + '@vue/reactivity@3.5.27': + resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} - '@vue/runtime-core@3.5.24': - resolution: {integrity: sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==} + '@vue/runtime-core@3.5.27': + resolution: {integrity: sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==} - '@vue/runtime-dom@3.5.24': - resolution: {integrity: sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==} + '@vue/runtime-dom@3.5.27': + resolution: {integrity: sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==} - '@vue/server-renderer@3.5.24': - resolution: {integrity: sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==} + '@vue/server-renderer@3.5.27': + resolution: {integrity: sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==} peerDependencies: - vue: 3.5.24 + vue: 3.5.27 - '@vue/shared@3.5.24': - resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} - '@vueuse/core@14.0.0': - resolution: {integrity: sha512-d6tKRWkZE8IQElX2aHBxXOMD478fHIYV+Dzm2y9Ag122ICBpNKtGICiXKOhWU3L1kKdttDD9dCMS4bGP3jhCTQ==} + '@vueuse/core@14.2.0': + resolution: {integrity: sha512-tpjzVl7KCQNVd/qcaCE9XbejL38V6KJAEq/tVXj7mDPtl6JtzmUdnXelSS+ULRkkrDgzYVK7EerQJvd2jR794Q==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@14.0.0': - resolution: {integrity: sha512-5A0X7q9qyLtM3xyghq5nK/NEESf7cpcZlkQgXTMuW4JWiAMYxc1ImdhhGrk4negFBsq3ejvAlRmLdNrkcTzk1Q==} + '@vueuse/integrations@14.2.0': + resolution: {integrity: sha512-Yuo5XbIi6XkfSXOYKd5SBZwyBEyO3Hd41eeG2555hDbE0Maz/P0BfPJDYhgDXjS9xI0jkWUUp1Zh5lXHOgkwLw==} peerDependencies: async-validator: ^4 axios: ^1 change-case: ^5 drauu: ^0.4 - focus-trap: ^7 + focus-trap: ^7 || ^8 fuse.js: ^7 idb-keyval: ^6 jwt-decode: ^4 @@ -1316,11 +1342,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@14.0.0': - resolution: {integrity: sha512-6yoGqbJcMldVCevkFiHDBTB1V5Hq+G/haPlGIuaFZHpXC0HADB0EN1ryQAAceiW+ryS3niUwvdFbGiqHqBrfVA==} + '@vueuse/metadata@14.2.0': + resolution: {integrity: sha512-i3axTGjU8b13FtyR4Keeama+43iD+BwX9C2TmzBVKqjSHArF03hjkp2SBZ1m72Jk2UtrX0aYCugBq2R1fhkuAQ==} - '@vueuse/shared@14.0.0': - resolution: {integrity: sha512-mTCA0uczBgurRlwVaQHfG0Ja7UdGe4g9mwffiJmvLiTtp1G4AQyIjej6si/k8c8pUwTfVpNufck+23gXptPAkw==} + '@vueuse/shared@14.2.0': + resolution: {integrity: sha512-Z0bmluZTlAXgUcJ4uAFaML16JcD8V0QG00Db3quR642I99JXIDRa2MI2LGxiLVhcBjVnL1jOzIvT5TT2lqJlkA==} peerDependencies: vue: ^3.5.0 @@ -1337,8 +1363,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - alien-signals@3.1.0: - resolution: {integrity: sha512-yufC6VpSy8tK3I0lO67pjumo5JvDQVQyr38+3OHqe6CHl1t2VZekKZ7EKKZSqk0cRmE7U7tfZbpXiKNzuc+ckg==} + alien-signals@3.1.2: + resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1383,8 +1409,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.13.2: - resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1392,8 +1418,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - birpc@2.8.0: - resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1437,8 +1463,8 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} cheerio-select@1.6.0: @@ -1456,8 +1482,8 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-spinners@3.3.0: - resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} cli-truncate@5.1.1: @@ -1489,8 +1515,8 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} commander@6.2.1: @@ -1506,9 +1532,6 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.2: - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - conventional-changelog-angular@8.1.0: resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} engines: {node: '>=18'} @@ -1572,8 +1595,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} @@ -1587,8 +1610,8 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.4.0: - resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} define-lazy-prop@3.0.0: @@ -1654,6 +1677,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -1677,8 +1704,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -1713,24 +1740,21 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@9.6.0: - resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -1742,8 +1766,8 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -1776,8 +1800,8 @@ packages: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} - focus-trap@7.6.6: - resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} + focus-trap@8.0.0: + resolution: {integrity: sha512-Aa84FOGHs99vVwufDMdq2qgOwXPC2e9U66GcqBhn1/jEHPDhJaP8PYhkIbqG9lhfL5Kddk/567lj46LLHYCRUw==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -1788,10 +1812,6 @@ packages: debug: optional: true - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -1800,8 +1820,8 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - fs-extra@11.3.2: - resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} fsevents@2.3.3: @@ -1840,22 +1860,13 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-tsconfig@4.13.1: + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@11.1.0: - resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} - engines: {node: 20 || >=22} - hasBin: true - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1897,9 +1908,6 @@ packages: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} - htm@3.1.1: - resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -1995,16 +2003,12 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - joi@18.0.1: - resolution: {integrity: sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==} + joi@18.0.2: + resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} engines: {node: '>= 20'} js-tokens@4.0.0: @@ -2033,84 +2037,85 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.6: - resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} + lint-staged@16.2.7: + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true @@ -2118,10 +2123,6 @@ packages: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} - local-pkg@1.1.2: - resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} - engines: {node: '>=14'} - lodash._reinterpolate@3.0.0: resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} @@ -2132,8 +2133,8 @@ packages: lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} @@ -2152,8 +2153,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} engines: {node: 20 || >=22} magic-string@0.30.21: @@ -2177,9 +2178,9 @@ packages: peerDependencies: markdown-it: '>= 9.0.0' - markdown-it-cjk-friendly@1.3.2: - resolution: {integrity: sha512-6d7MmSnmD1rHTE3iNftpvdvv4sqV0VSBaPQCC1FsIipB2050/WxlJzSLtDp7QPWFF1lfpLu/N5/OUroaZqCv/w==} - engines: {node: '>=16'} + markdown-it-cjk-friendly@2.0.1: + resolution: {integrity: sha512-fW32K+Y9XP6mt0x2rmn/aXZ/IGRsox+GP3D0QMNxc1IDxlieSuCwvDLcVyXeYyv5a/A2Y762GLVsFOiphQ6lrg==} + engines: {node: '>=18'} peerDependencies: '@types/markdown-it': '*' markdown-it: '*' @@ -2200,6 +2201,10 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + markdown-title@1.0.2: resolution: {integrity: sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ==} engines: {node: '>=6'} @@ -2221,8 +2226,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -2342,17 +2347,13 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - minisearch@7.2.0: resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} @@ -2412,13 +2413,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - obug@2.0.0: - resolution: {integrity: sha512-dpSQuPXoKUjulinHmXjZV1YIRhOLEqBl1J6PYi9mRQR2dYcSK+OULRr+GuT1vufk2f40mtIOqmSL/aTikjmq5Q==} - peerDependencies: - ms: ^2.0.0 - peerDependenciesMeta: - ms: - optional: true + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} @@ -2427,8 +2423,8 @@ packages: oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@4.3.3: - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} open-cli@8.0.0: resolution: {integrity: sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A==} @@ -2439,8 +2435,8 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - ora@9.0.0: - resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + ora@9.1.0: + resolution: {integrity: sha512-53uuLsXHOAJl5zLrUrzY9/kE+uIFEx7iaH4g2BIJQK4LZjY4LpCCYZVKDWIkL+F01wAaCg93duQ1whnK/AmY1A==} engines: {node: '>=20'} oxc-minify@0.98.0: @@ -2451,15 +2447,12 @@ packages: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} - package-directory@8.1.0: - resolution: {integrity: sha512-qHKRW0pw3lYdZMQVkjDBqh8HlamH/LCww2PH7OWEp4Qrt3SFeYMNpnJrQzlSnGrDD5zGR51XqBh7FnNCdVNEHA==} + package-directory@8.2.0: + resolution: {integrity: sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==} engines: {node: '>=18'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-manager-detector@1.5.0: - resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} @@ -2485,16 +2478,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2506,8 +2492,8 @@ packages: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} - perfect-debounce@2.0.0: - resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2528,16 +2514,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - - playwright-chromium@1.56.1: - resolution: {integrity: sha512-5TU+NMrofQg2j+DwIaQL/9eC84hs5YGz5Wng8OOdgq+kmu8usPLedxx2pJJ1Pb2TNFNiz3167RsUNFFvY3srNA==} + playwright-chromium@1.58.1: + resolution: {integrity: sha512-IZEji6VuJWIW+oCLp+sUSH7FCDNVGQxJSBMgHXKA/S0S5Ykdek9TO//mVsiWx9GwiOrApOb1WSxUJgK6zo/cUw==} engines: {node: '>=18'} hasBin: true - playwright-core@1.56.1: - resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} + playwright-core@1.58.1: + resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==} engines: {node: '>=18'} hasBin: true @@ -2551,16 +2534,16 @@ packages: peerDependencies: postcss: ^8.4.21 - postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} hasBin: true @@ -2594,9 +2577,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2618,8 +2598,8 @@ packages: regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} @@ -2660,18 +2640,13 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@6.1.0: - resolution: {integrity: sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==} - engines: {node: 20 || >=22} - hasBin: true - - rolldown-vite@7.2.5: - resolution: {integrity: sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA==} + rolldown-vite@7.3.1: + resolution: {integrity: sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - esbuild: ^0.25.0 + esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -2705,8 +2680,8 @@ packages: yaml: optional: true - rolldown@1.0.0-beta.50: - resolution: {integrity: sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A==} + rolldown@1.0.0-beta.53: + resolution: {integrity: sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2724,8 +2699,8 @@ packages: esbuild: '>=0.18.0' rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.53.2: - resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2747,8 +2722,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -2767,8 +2743,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.15.0: - resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==} + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2863,8 +2839,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} engines: {node: '>=20'} string_decoder@1.3.0: @@ -2900,23 +2876,23 @@ packages: resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} engines: {node: '>=16'} - superjson@2.2.5: - resolution: {integrity: sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==} + 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.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} - tempy@3.1.0: - resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + tempy@3.2.0: + resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} engines: {node: '>=14.16'} tinybench@2.9.0: @@ -2957,8 +2933,8 @@ packages: resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} engines: {node: '>=14.16'} - tokenx@1.2.1: - resolution: {integrity: sha512-lVhFIhR2qh3uUyUA8Ype+HGzcokUJbHmRSN1TJKOe4Y26HkawQuLiGkUCkR5LD9dx+Rtp+njrwzPL8AHHYQSYA==} + tokenx@1.3.0: + resolution: {integrity: sha512-NLdXTEZkKiO0gZuLtMoZKjCXTREXeZZt8nnnNeyoXtNZAfG/GKGSbQtLU5STspc0rMSwcA+UJfWZkbNU01iKmQ==} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -2996,8 +2972,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -3039,8 +3015,8 @@ packages: unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -3071,11 +3047,11 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vitepress-plugin-group-icons@1.6.5: - resolution: {integrity: sha512-+pg4+GKDq2fLqKb1Sat5p1p4SuIZ5tEPxu8HjpwoeecZ/VaXKy6Bdf0wyjedjaTAyZQzXbvyavJegqAcQ+B0VA==} + vitepress-plugin-group-icons@1.7.1: + resolution: {integrity: sha512-3ZPcIqwHNBg1btrOOSecOqv8yJxHdu3W2ugxE5LusclDF005LAm60URMEmBQrkgl4JvM32AqJirqghK6lGIk8g==} - vitepress-plugin-llms@1.9.3: - resolution: {integrity: sha512-iU6LQVGS35urNGW/RXHTtt9gj6kprV9ptJDX7ZiC+kgFtqiBMDo2bdXh2YG+KUGU3geKZWkWZcurhnrNCmofsA==} + vitepress-plugin-llms@1.11.0: + resolution: {integrity: sha512-n6fjWzBNKy40p8cij+d2cHiC2asNW1eQKdmc06gX9VAv7vWppIoVLH/f7Ht1bK0vSpGzzW2QimvNfbfv1oCdJw==} vitest@4.0.0-beta.4: resolution: {integrity: sha512-LWwBGvfWUinm0ATarVmXuzhGvL8HyydanPwQLAY21fvrUhXHyP04UvMYF5t+3TcXQdXPIP5AiVm09J+AbIwKhg==} @@ -3108,14 +3084,14 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-tsc@3.1.4: - resolution: {integrity: sha512-GsRJxttj4WkmXW/zDwYPGMJAN3np/4jTzoDFQTpTsI5Vg/JKMWamBwamlmLihgSVHO66y9P7GX+uoliYxeI4Hw==} + vue-tsc@3.2.4: + resolution: {integrity: sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==} hasBin: true peerDependencies: typescript: '>=5.0.0' - vue@3.5.24: - resolution: {integrity: sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==} + vue@3.5.27: + resolution: {integrity: sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3161,10 +3137,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -3177,8 +3149,8 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaml@2.8.1: - resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} hasBin: true @@ -3204,12 +3176,10 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.5.0 + package-manager-detector: 1.6.0 tinyexec: 1.0.2 - '@antfu/utils@9.3.0': {} - - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 @@ -3220,11 +3190,11 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.5': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 - '@babel/types@7.28.5': + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -3234,14 +3204,14 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/core@1.0.0-alpha.6': + '@clack/core@1.0.0': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@1.0.0-alpha.6': + '@clack/prompts@1.0.0': dependencies: - '@clack/core': 1.0.0-alpha.6 + '@clack/core': 1.0.0 picocolors: 1.1.1 sisteransi: 1.0.5 @@ -3254,19 +3224,19 @@ snapshots: conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.2.1 - '@docsearch/css@4.3.2': {} + '@docsearch/css@4.5.3': {} - '@docsearch/js@4.3.2': - dependencies: - htm: 3.1.1 + '@docsearch/js@4.5.3': {} - '@emnapi/core@1.7.1': + '@docsearch/sidepanel-js@4.5.3': {} + + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -3276,82 +3246,82 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.27.2': optional: true '@hapi/address@5.1.1': @@ -3374,44 +3344,28 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.59': + '@iconify-json/simple-icons@1.2.69': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.35': + '@iconify-json/vscode-icons@1.2.40': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.0.2': + '@iconify/utils@3.1.0': dependencies: '@antfu/install-pkg': 1.1.0 - '@antfu/utils': 9.3.0 '@iconify/types': 2.0.0 - debug: 4.4.3 - globals: 15.15.0 - kolorist: 1.8.0 - local-pkg: 1.1.2 mlly: 1.8.0 - transitivePeerDependencies: - - supports-color '@isaacs/balanced-match@4.0.1': {} - '@isaacs/brace-expansion@5.0.0': + '@isaacs/brace-expansion@5.0.1': dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/sourcemap-codec@1.5.5': {} '@kwsites/file-exists@1.1.1': @@ -3440,54 +3394,54 @@ snapshots: '@mdit-vue/plugin-component@3.0.2': dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/plugin-frontmatter@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 gray-matter: 4.0.3 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/plugin-headers@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/plugin-sfc@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/plugin-title@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/plugin-toc@3.0.2': dependencies: '@mdit-vue/shared': 3.0.2 '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/shared@3.0.2': dependencies: '@mdit-vue/types': 3.0.2 '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 '@mdit-vue/types@3.0.2': {} - '@napi-rs/wasm-runtime@1.0.7': + '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -3501,7 +3455,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 '@oxc-minify/binding-android-arm64@0.98.0': optional: true @@ -3541,7 +3495,7 @@ snapshots: '@oxc-minify/binding-wasm32-wasi@0.98.0': dependencies: - '@napi-rs/wasm-runtime': 1.0.7 + '@napi-rs/wasm-runtime': 1.1.1 optional: true '@oxc-minify/binding-win32-arm64-msvc@0.98.0': @@ -3550,69 +3504,66 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.98.0': optional: true - '@oxc-project/runtime@0.97.0': {} + '@oxc-project/runtime@0.101.0': {} - '@oxc-project/types@0.97.0': {} + '@oxc-project/types@0.101.0': {} '@polka/compression@1.0.0-next.28': {} '@polka/url@1.0.0-next.29': {} - '@rolldown/binding-android-arm64@1.0.0-beta.50': + '@rolldown/binding-android-arm64@1.0.0-beta.53': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.50': + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.50': + '@rolldown/binding-darwin-x64@1.0.0-beta.53': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.50': + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.50': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.50': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.50': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.50': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.50': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': dependencies: - '@napi-rs/wasm-runtime': 1.0.7 + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.50': - optional: true + '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rolldown/pluginutils@1.0.0-beta.29': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} - '@rolldown/pluginutils@1.0.0-beta.50': {} - - '@rollup/plugin-alias@6.0.0(rollup@4.53.2)': + '@rollup/plugin-alias@6.0.0(rollup@4.57.1)': optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/plugin-commonjs@29.0.0(rollup@4.53.2)': + '@rollup/plugin-commonjs@29.0.0(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -3620,139 +3571,148 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/plugin-json@6.1.0(rollup@4.53.2)': + '@rollup/plugin-json@6.1.0(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/plugin-replace@6.0.3(rollup@4.53.2)': + '@rollup/plugin-replace@6.0.3(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) magic-string: 0.30.21 optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/pluginutils@5.3.0(rollup@4.53.2)': + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.2 + rollup: 4.57.1 - '@rollup/rollup-android-arm-eabi@4.53.2': + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.53.2': + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.53.2': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.53.2': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.2': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.2': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.2': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.2': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.2': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.2': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.2': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.2': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.2': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.2': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.2': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.2': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.2': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.2': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.2': + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@3.15.0': + '@shikijs/core@3.22.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.15.0': + '@shikijs/engine-javascript@3.22.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.3 + oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@3.15.0': + '@shikijs/engine-oniguruma@3.22.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.15.0': + '@shikijs/langs@3.22.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.22.0 - '@shikijs/themes@3.15.0': + '@shikijs/themes@3.22.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.22.0 - '@shikijs/transformers@3.15.0': + '@shikijs/transformers@3.22.0': dependencies: - '@shikijs/core': 3.15.0 - '@shikijs/types': 3.15.0 + '@shikijs/core': 3.22.0 + '@shikijs/types': 3.22.0 - '@shikijs/types@3.15.0': + '@shikijs/types@3.22.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -3762,15 +3722,15 @@ snapshots: '@simple-libs/child-process-utils@1.0.1': dependencies: '@simple-libs/stream-utils': 1.1.0 - '@types/node': 22.19.1 + '@types/node': 22.19.8 '@simple-libs/stream-utils@1.1.0': dependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.8 '@sindresorhus/merge-streams@4.0.0': {} - '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} '@tokenizer/token@0.3.0': {} @@ -3786,7 +3746,7 @@ snapshots: '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.2.0 '@types/debug@4.1.12': dependencies: @@ -3799,7 +3759,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 24.10.1 + '@types/node': 25.2.0 '@types/hast@3.0.4': dependencies: @@ -3811,15 +3771,15 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.2.0 '@types/linkify-it@5.0.0': {} '@types/lodash.template@4.5.3': dependencies: - '@types/lodash': 4.17.20 + '@types/lodash': 4.17.23 - '@types/lodash@4.17.20': {} + '@types/lodash@4.17.23': {} '@types/mark.js@8.11.12': dependencies: @@ -3829,7 +3789,7 @@ snapshots: dependencies: '@types/markdown-it': 14.1.2 - '@types/markdown-it-container@2.0.10': + '@types/markdown-it-container@4.0.0': dependencies: '@types/markdown-it': 14.1.2 @@ -3852,11 +3812,15 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.19.1': + '@types/node@22.19.8': dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': + '@types/node@24.10.10': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.2.0': dependencies: undici-types: 7.16.0 @@ -3866,14 +3830,14 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.2.0 kleur: 3.0.3 '@types/resolve@1.20.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.2.0 '@types/sizzle@2.3.10': {} @@ -3883,11 +3847,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@6.0.1(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.4(rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': dependencies: - '@rolldown/pluginutils': 1.0.0-beta.29 - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) - vue: 3.5.24(typescript@5.9.3) + '@rolldown/pluginutils': 1.0.0-rc.2 + vite: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) + vue: 3.5.27(typescript@5.9.3) '@vitest/expect@4.0.0-beta.4': dependencies: @@ -3897,19 +3861,19 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@4.0.0-beta.4(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1))': + '@vitest/mocker@4.0.0-beta.4(rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.0-beta.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + vite: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) '@vitest/pretty-format@4.0.0-beta.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.10': + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 @@ -3935,47 +3899,47 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@volar/language-core@2.4.23': + '@volar/language-core@2.4.27': dependencies: - '@volar/source-map': 2.4.23 + '@volar/source-map': 2.4.27 - '@volar/source-map@2.4.23': {} + '@volar/source-map@2.4.27': {} - '@volar/typescript@2.4.23': + '@volar/typescript@2.4.27': dependencies: - '@volar/language-core': 2.4.23 + '@volar/language-core': 2.4.27 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.24': + '@vue/compiler-core@3.5.27': dependencies: - '@babel/parser': 7.28.5 - '@vue/shared': 3.5.24 - entities: 4.5.0 + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.27 + entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.24': + '@vue/compiler-dom@3.5.27': dependencies: - '@vue/compiler-core': 3.5.24 - '@vue/shared': 3.5.24 + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 - '@vue/compiler-sfc@3.5.24': + '@vue/compiler-sfc@3.5.27': dependencies: - '@babel/parser': 7.28.5 - '@vue/compiler-core': 3.5.24 - '@vue/compiler-dom': 3.5.24 - '@vue/compiler-ssr': 3.5.24 - '@vue/shared': 3.5.24 + '@babel/parser': 7.29.0 + '@vue/compiler-core': 3.5.27 + '@vue/compiler-dom': 3.5.27 + '@vue/compiler-ssr': 3.5.27 + '@vue/shared': 3.5.27 estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.24': + '@vue/compiler-ssr@3.5.27': dependencies: - '@vue/compiler-dom': 3.5.24 - '@vue/shared': 3.5.24 + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 '@vue/devtools-api@8.0.5': dependencies: @@ -3984,74 +3948,72 @@ snapshots: '@vue/devtools-kit@8.0.5': dependencies: '@vue/devtools-shared': 8.0.5 - birpc: 2.8.0 + birpc: 2.9.0 hookable: 5.5.3 mitt: 3.0.1 - perfect-debounce: 2.0.0 + perfect-debounce: 2.1.0 speakingurl: 14.0.1 - superjson: 2.2.5 + superjson: 2.2.6 '@vue/devtools-shared@8.0.5': dependencies: rfdc: 1.4.1 - '@vue/language-core@3.1.4(typescript@5.9.3)': + '@vue/language-core@3.2.4': dependencies: - '@volar/language-core': 2.4.23 - '@vue/compiler-dom': 3.5.24 - '@vue/shared': 3.5.24 - alien-signals: 3.1.0 + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 + alien-signals: 3.1.2 muggle-string: 0.4.1 path-browserify: 1.0.1 picomatch: 4.0.3 - optionalDependencies: - typescript: 5.9.3 - '@vue/reactivity@3.5.24': + '@vue/reactivity@3.5.27': dependencies: - '@vue/shared': 3.5.24 + '@vue/shared': 3.5.27 - '@vue/runtime-core@3.5.24': + '@vue/runtime-core@3.5.27': dependencies: - '@vue/reactivity': 3.5.24 - '@vue/shared': 3.5.24 + '@vue/reactivity': 3.5.27 + '@vue/shared': 3.5.27 - '@vue/runtime-dom@3.5.24': + '@vue/runtime-dom@3.5.27': dependencies: - '@vue/reactivity': 3.5.24 - '@vue/runtime-core': 3.5.24 - '@vue/shared': 3.5.24 + '@vue/reactivity': 3.5.27 + '@vue/runtime-core': 3.5.27 + '@vue/shared': 3.5.27 csstype: 3.2.3 - '@vue/server-renderer@3.5.24(vue@3.5.24(typescript@5.9.3))': + '@vue/server-renderer@3.5.27(vue@3.5.27(typescript@5.9.3))': dependencies: - '@vue/compiler-ssr': 3.5.24 - '@vue/shared': 3.5.24 - vue: 3.5.24(typescript@5.9.3) + '@vue/compiler-ssr': 3.5.27 + '@vue/shared': 3.5.27 + vue: 3.5.27(typescript@5.9.3) - '@vue/shared@3.5.24': {} + '@vue/shared@3.5.27': {} - '@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3))': + '@vueuse/core@14.2.0(vue@3.5.27(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.0.0 - '@vueuse/shared': 14.0.0(vue@3.5.24(typescript@5.9.3)) - vue: 3.5.24(typescript@5.9.3) + '@vueuse/metadata': 14.2.0 + '@vueuse/shared': 14.2.0(vue@3.5.27(typescript@5.9.3)) + vue: 3.5.27(typescript@5.9.3) - '@vueuse/integrations@14.0.0(axios@1.13.2)(focus-trap@7.6.6)(vue@3.5.24(typescript@5.9.3))': + '@vueuse/integrations@14.2.0(axios@1.13.4)(focus-trap@8.0.0)(vue@3.5.27(typescript@5.9.3))': dependencies: - '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) - '@vueuse/shared': 14.0.0(vue@3.5.24(typescript@5.9.3)) - vue: 3.5.24(typescript@5.9.3) + '@vueuse/core': 14.2.0(vue@3.5.27(typescript@5.9.3)) + '@vueuse/shared': 14.2.0(vue@3.5.27(typescript@5.9.3)) + vue: 3.5.27(typescript@5.9.3) optionalDependencies: - axios: 1.13.2 - focus-trap: 7.6.6 + axios: 1.13.4 + focus-trap: 8.0.0 - '@vueuse/metadata@14.0.0': {} + '@vueuse/metadata@14.2.0': {} - '@vueuse/shared@14.0.0(vue@3.5.24(typescript@5.9.3))': + '@vueuse/shared@14.2.0(vue@3.5.27(typescript@5.9.3))': dependencies: - vue: 3.5.24(typescript@5.9.3) + vue: 3.5.27(typescript@5.9.3) '@xmldom/xmldom@0.9.8': {} @@ -4061,7 +4023,7 @@ snapshots: acorn@8.15.0: {} - alien-signals@3.1.0: {} + alien-signals@3.1.2: {} ansi-colors@4.1.3: {} @@ -4093,7 +4055,7 @@ snapshots: asynckit@0.4.0: {} - axios@1.13.2: + axios@1.13.4: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 @@ -4105,7 +4067,7 @@ snapshots: base64-js@1.5.1: {} - birpc@2.8.0: {} + birpc@2.9.0: {} boolbase@1.0.0: {} @@ -4134,7 +4096,7 @@ snapshots: chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 loupe: 3.2.1 pathval: 2.0.1 @@ -4147,7 +4109,7 @@ snapshots: character-entities@2.0.2: {} - check-error@2.1.1: {} + check-error@2.1.3: {} cheerio-select@1.6.0: dependencies: @@ -4175,12 +4137,12 @@ snapshots: dependencies: restore-cursor: 5.1.0 - cli-spinners@3.3.0: {} + cli-spinners@3.4.0: {} cli-truncate@5.1.1: dependencies: slice-ansi: 7.1.2 - string-width: 8.1.0 + string-width: 8.1.1 cliui@8.0.1: dependencies: @@ -4204,7 +4166,7 @@ snapshots: commander@13.1.0: {} - commander@14.0.2: {} + commander@14.0.3: {} commander@6.2.1: {} @@ -4217,8 +4179,6 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.2: {} - conventional-changelog-angular@8.1.0: dependencies: compare-func: 2.0.0 @@ -4283,7 +4243,7 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.2.0: + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -4293,7 +4253,7 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.4.0: + default-browser@5.5.0: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -4354,6 +4314,8 @@ snapshots: entities@4.5.0: {} + entities@7.0.1: {} + environment@1.1.0: {} es-define-property@1.0.1: {} @@ -4373,34 +4335,34 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.12: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} @@ -4420,11 +4382,11 @@ snapshots: event-target-shim@5.0.1: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} events@3.3.0: {} - execa@9.6.0: + execa@9.6.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 @@ -4439,9 +4401,7 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 - expect-type@1.2.2: {} - - exsolve@1.0.8: {} + expect-type@1.3.0: {} extend-shallow@2.0.1: dependencies: @@ -4457,7 +4417,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -4489,17 +4449,12 @@ snapshots: find-up-simple@1.0.1: {} - focus-trap@7.6.6: + focus-trap@8.0.0: dependencies: - tabbable: 6.3.0 + tabbable: 6.4.0 follow-redirects@1.15.11: {} - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -4510,7 +4465,7 @@ snapshots: format@0.2.2: {} - fs-extra@11.3.2: + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 @@ -4552,7 +4507,7 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.13.0: + get-tsconfig@4.13.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -4560,17 +4515,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@11.1.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 - - globals@15.15.0: {} - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -4609,7 +4553,7 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 @@ -4625,8 +4569,6 @@ snapshots: dependencies: lru-cache: 10.4.3 - htm@3.1.1: {} - html-void-elements@3.0.0: {} htmlparser2@5.0.1: @@ -4699,13 +4641,9 @@ snapshots: isexe@2.0.0: {} - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - jiti@1.21.7: {} - joi@18.0.1: + joi@18.0.2: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 @@ -4713,7 +4651,7 @@ snapshots: '@hapi/pinpoint': 2.0.1 '@hapi/tlds': 1.1.4 '@hapi/topo': 6.0.2 - '@standard-schema/spec': 1.0.0 + '@standard-schema/spec': 1.1.0 js-tokens@4.0.0: optional: true @@ -4745,86 +4683,78 @@ snapshots: kleur@3.0.3: {} - kolorist@1.8.0: {} - - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.31.1: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.31.1: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.31.1: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.31.1: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.31.1: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.31.1: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.31.1: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.31.1: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.31.1: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.31.1: optional: true - lightningcss@1.30.2: + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - lint-staged@16.2.6: + lint-staged@16.2.7: dependencies: - commander: 14.0.2 + commander: 14.0.3 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.8.1 + yaml: 2.8.2 listr2@9.0.5: dependencies: cli-truncate: 5.1.1 colorette: 2.0.20 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.2 - local-pkg@1.1.2: - dependencies: - mlly: 1.8.0 - pkg-types: 2.3.0 - quansync: 0.2.11 - lodash._reinterpolate@3.0.0: {} lodash.template@4.5.0: @@ -4836,7 +4766,7 @@ snapshots: dependencies: lodash._reinterpolate: 3.0.0 - lodash@4.17.21: {} + lodash@4.17.23: {} log-symbols@7.0.1: dependencies: @@ -4857,7 +4787,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.5: {} magic-string@0.30.21: dependencies: @@ -4865,24 +4795,24 @@ snapshots: mark.js@8.11.1: {} - markdown-it-anchor@9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.1.0): + markdown-it-anchor@9.2.0(patch_hash=cdc28e7c329be30688ad192126ba505446611fbe526ad51483e4b1287aa35cf9)(@types/markdown-it@14.1.2)(markdown-it@14.1.1): dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 markdown-it-async@2.2.0: dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 - markdown-it-attrs@4.3.1(patch_hash=12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e)(markdown-it@14.1.0): + markdown-it-attrs@4.3.1(patch_hash=12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e)(markdown-it@14.1.1): dependencies: - markdown-it: 14.1.0 + markdown-it: 14.1.1 - markdown-it-cjk-friendly@1.3.2(@types/markdown-it@14.1.2)(markdown-it@14.1.0): + markdown-it-cjk-friendly@2.0.1(@types/markdown-it@14.1.2)(markdown-it@14.1.1): dependencies: get-east-asian-width: 1.4.0 - markdown-it: 14.1.0 + markdown-it: 14.1.1 optionalDependencies: '@types/markdown-it': 14.1.2 @@ -4906,6 +4836,15 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-it@14.1.1: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-title@1.0.2: {} math-intrinsics@1.1.0: {} @@ -4921,7 +4860,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -4950,7 +4889,7 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 - mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -4959,7 +4898,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -4971,7 +4910,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: @@ -4992,7 +4931,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -5074,7 +5013,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -5112,7 +5051,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.3 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -5149,14 +5088,12 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.1.1: + minimatch@10.1.2: dependencies: - '@isaacs/brace-expansion': 5.0.0 + '@isaacs/brace-expansion': 5.0.1 minimist@1.2.8: {} - minipass@7.1.2: {} - minisearch@7.2.0: {} mitt@3.0.1: {} @@ -5168,7 +5105,7 @@ snapshots: acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.1 + ufo: 1.6.3 mrmime@2.0.1: {} @@ -5203,9 +5140,7 @@ snapshots: dependencies: boolbase: 1.0.0 - obug@2.0.0(ms@2.1.3): - optionalDependencies: - ms: 2.1.3 + obug@2.1.1: {} onetime@7.0.0: dependencies: @@ -5213,10 +5148,10 @@ snapshots: oniguruma-parser@0.12.1: {} - oniguruma-to-es@4.3.3: + oniguruma-to-es@4.3.4: dependencies: oniguruma-parser: 0.12.1 - regex: 6.0.1 + regex: 6.1.0 regex-recursion: 6.0.2 open-cli@8.0.0: @@ -5225,26 +5160,25 @@ snapshots: get-stdin: 9.0.0 meow: 12.1.1 open: 10.2.0 - tempy: 3.1.0 + tempy: 3.2.0 open@10.2.0: dependencies: - default-browser: 5.4.0 + default-browser: 5.5.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 - ora@9.0.0: + ora@9.1.0: dependencies: chalk: 5.6.2 cli-cursor: 5.0.0 - cli-spinners: 3.3.0 + cli-spinners: 3.4.0 is-interactive: 2.0.0 is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.2.2 string-width: 5.1.2 - strip-ansi: 7.1.2 oxc-minify@0.98.0: optionalDependencies: @@ -5266,13 +5200,11 @@ snapshots: p-map@7.0.4: {} - package-directory@8.1.0: + package-directory@8.2.0: dependencies: find-up-simple: 1.0.1 - package-json-from-dist@1.0.1: {} - - package-manager-detector@1.5.0: {} + package-manager-detector@1.6.0: {} parse-ms@4.0.0: {} @@ -5290,22 +5222,15 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.1: - dependencies: - lru-cache: 11.2.2 - minipass: 7.1.2 - path-to-regexp@6.3.0: {} - path-to-regexp@8.3.0: {} - pathe@2.0.3: {} pathval@2.0.1: {} peek-readable@5.4.2: {} - perfect-debounce@2.0.0: {} + perfect-debounce@2.1.0: {} picocolors@1.1.1: {} @@ -5321,17 +5246,11 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - pkg-types@2.3.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.8 - pathe: 2.0.3 - - playwright-chromium@1.56.1: + playwright-chromium@1.58.1: dependencies: - playwright-core: 1.56.1 + playwright-core: 1.58.1 - playwright-core@1.56.1: {} + playwright-core@1.58.1: {} polka@1.0.0-next.28: dependencies: @@ -5343,7 +5262,7 @@ snapshots: postcss: 8.5.6 rtlcss: 4.3.0 - postcss-selector-parser@7.1.0: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -5354,7 +5273,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.6.2: {} + prettier@3.8.1: {} pretty-bytes@7.1.0: {} @@ -5377,8 +5296,6 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.11: {} - queue-microtask@1.2.3: {} readable-stream@4.7.0: @@ -5401,7 +5318,7 @@ snapshots: regex-utilities@2.3.0: {} - regex@6.0.1: + regex@6.1.0: dependencies: regex-utilities: 2.3.0 @@ -5459,92 +5376,89 @@ snapshots: rfdc@1.4.1: {} - rimraf@6.1.0: - dependencies: - glob: 11.1.0 - package-json-from-dist: 1.0.1 - - rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1): + rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2): dependencies: - '@oxc-project/runtime': 0.97.0 + '@oxc-project/runtime': 0.101.0 fdir: 6.5.0(picomatch@4.0.3) - lightningcss: 1.30.2 + lightningcss: 1.31.1 picomatch: 4.0.3 postcss: 8.5.6 - rolldown: 1.0.0-beta.50 + rolldown: 1.0.0-beta.53 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.1 - esbuild: 0.25.12 + '@types/node': 25.2.0 + esbuild: 0.27.2 fsevents: 2.3.3 jiti: 1.21.7 - yaml: 2.8.1 + yaml: 2.8.2 - rolldown@1.0.0-beta.50: + rolldown@1.0.0-beta.53: dependencies: - '@oxc-project/types': 0.97.0 - '@rolldown/pluginutils': 1.0.0-beta.50 + '@oxc-project/types': 0.101.0 + '@rolldown/pluginutils': 1.0.0-beta.53 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.50 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.50 - '@rolldown/binding-darwin-x64': 1.0.0-beta.50 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.50 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.50 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.50 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.50 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.50 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.50 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.50 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.50 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.50 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.50 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.50 - - rollup-plugin-dts@6.1.1(rollup@4.53.2)(typescript@5.9.3): + '@rolldown/binding-android-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-x64': 1.0.0-beta.53 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.53 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 + + rollup-plugin-dts@6.1.1(rollup@4.57.1)(typescript@5.9.3): dependencies: magic-string: 0.30.21 - rollup: 4.53.2 + rollup: 4.57.1 typescript: 5.9.3 optionalDependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 - rollup-plugin-esbuild@6.2.1(esbuild@0.25.12)(rollup@4.53.2): + rollup-plugin-esbuild@6.2.1(esbuild@0.27.2)(rollup@4.57.1): dependencies: debug: 4.4.3 es-module-lexer: 1.7.0 - esbuild: 0.25.12 - get-tsconfig: 4.13.0 - rollup: 4.53.2 + esbuild: 0.27.2 + get-tsconfig: 4.13.1 + rollup: 4.57.1 unplugin-utils: 0.2.5 transitivePeerDependencies: - supports-color - rollup@4.53.2: + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.2 - '@rollup/rollup-android-arm64': 4.53.2 - '@rollup/rollup-darwin-arm64': 4.53.2 - '@rollup/rollup-darwin-x64': 4.53.2 - '@rollup/rollup-freebsd-arm64': 4.53.2 - '@rollup/rollup-freebsd-x64': 4.53.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 - '@rollup/rollup-linux-arm-musleabihf': 4.53.2 - '@rollup/rollup-linux-arm64-gnu': 4.53.2 - '@rollup/rollup-linux-arm64-musl': 4.53.2 - '@rollup/rollup-linux-loong64-gnu': 4.53.2 - '@rollup/rollup-linux-ppc64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-musl': 4.53.2 - '@rollup/rollup-linux-s390x-gnu': 4.53.2 - '@rollup/rollup-linux-x64-gnu': 4.53.2 - '@rollup/rollup-linux-x64-musl': 4.53.2 - '@rollup/rollup-openharmony-arm64': 4.53.2 - '@rollup/rollup-win32-arm64-msvc': 4.53.2 - '@rollup/rollup-win32-ia32-msvc': 4.53.2 - '@rollup/rollup-win32-x64-gnu': 4.53.2 - '@rollup/rollup-win32-x64-msvc': 4.53.2 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 rtlcss@4.3.0: @@ -5566,7 +5480,7 @@ snapshots: safe-buffer@5.2.1: {} - sax@1.4.3: {} + sax@1.4.4: {} section-matter@1.0.0: dependencies: @@ -5581,14 +5495,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.15.0: + shiki@3.22.0: dependencies: - '@shikijs/core': 3.15.0 - '@shikijs/engine-javascript': 3.15.0 - '@shikijs/engine-oniguruma': 3.15.0 - '@shikijs/langs': 3.15.0 - '@shikijs/themes': 3.15.0 - '@shikijs/types': 3.15.0 + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -5616,10 +5530,10 @@ snapshots: sitemap@9.0.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 24.10.10 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.3 + sax: 1.4.4 slice-ansi@7.1.2: dependencies: @@ -5684,7 +5598,7 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 - string-width@8.1.0: + string-width@8.1.1: dependencies: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -5721,17 +5635,17 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 - superjson@2.2.5: + superjson@2.2.6: dependencies: copy-anything: 4.0.5 supports-preserve-symlinks-flag@1.0.0: {} - tabbable@6.3.0: {} + tabbable@6.4.0: {} temp-dir@3.0.0: {} - tempy@3.1.0: + tempy@3.2.0: dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 @@ -5766,7 +5680,7 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tokenx@1.2.1: {} + tokenx@1.3.0: {} totalist@3.0.1: {} @@ -5790,7 +5704,7 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.6.1: {} + ufo@1.6.3: {} uglify-js@3.19.3: optional: true @@ -5840,7 +5754,7 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.1 - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 @@ -5872,13 +5786,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@4.0.0-beta.4(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1): + vite-node@4.0.0-beta.4(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + vite: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - esbuild @@ -5893,12 +5807,12 @@ snapshots: - tsx - yaml - vitepress-plugin-group-icons@1.6.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1): + vitepress-plugin-group-icons@1.7.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2): dependencies: '@iconify-json/logos': 1.2.10 - '@iconify-json/vscode-icons': 1.2.35 - '@iconify/utils': 3.0.2 - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + '@iconify-json/vscode-icons': 1.2.40 + '@iconify/utils': 3.1.0 + vite: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - esbuild @@ -5908,43 +5822,42 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml - vitepress-plugin-llms@1.9.3: + vitepress-plugin-llms@1.11.0: dependencies: gray-matter: 4.0.3 markdown-it: 14.1.0 markdown-title: 1.0.2 mdast-util-from-markdown: 2.0.2 millify: 6.1.0 - minimatch: 10.1.1 - path-to-regexp: 8.3.0 + minimatch: 10.1.2 + path-to-regexp: 6.3.0 picocolors: 1.1.1 pretty-bytes: 7.1.0 remark: 15.0.1 remark-frontmatter: 5.0.0 - tokenx: 1.2.1 + tokenx: 1.3.0 unist-util-remove: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 transitivePeerDependencies: - supports-color - vitest@4.0.0-beta.4(@types/debug@4.1.12)(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1): + vitest@4.0.0-beta.4(@types/debug@4.1.12)(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 4.0.0-beta.4 - '@vitest/mocker': 4.0.0-beta.4(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.10 + '@vitest/mocker': 4.0.0-beta.4(rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.0-beta.4 '@vitest/snapshot': 4.0.0-beta.4 '@vitest/spy': 4.0.0-beta.4 '@vitest/utils': 4.0.0-beta.4 chai: 5.3.3 debug: 4.4.3 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 pathe: 2.0.3 picomatch: 4.0.3 @@ -5954,12 +5867,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) - vite-node: 4.0.0-beta.4(@types/node@24.10.1)(esbuild@0.25.12)(jiti@1.21.7)(yaml@2.8.1) + vite: rolldown-vite@7.3.1(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) + vite-node: 4.0.0-beta.4(@types/node@25.2.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.10.1 + '@types/node': 25.2.0 transitivePeerDependencies: - esbuild - jiti @@ -5976,27 +5889,27 @@ snapshots: vscode-uri@3.1.0: {} - vue-tsc@3.1.4(typescript@5.9.3): + vue-tsc@3.2.4(typescript@5.9.3): dependencies: - '@volar/typescript': 2.4.23 - '@vue/language-core': 3.1.4(typescript@5.9.3) + '@volar/typescript': 2.4.27 + '@vue/language-core': 3.2.4 typescript: 5.9.3 - vue@3.5.24(typescript@5.9.3): + vue@3.5.27(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.5.24 - '@vue/compiler-sfc': 3.5.24 - '@vue/runtime-dom': 3.5.24 - '@vue/server-renderer': 3.5.24(vue@3.5.24(typescript@5.9.3)) - '@vue/shared': 3.5.24 + '@vue/compiler-dom': 3.5.27 + '@vue/compiler-sfc': 3.5.27 + '@vue/runtime-dom': 3.5.27 + '@vue/server-renderer': 3.5.27(vue@3.5.27(typescript@5.9.3)) + '@vue/shared': 3.5.27 optionalDependencies: typescript: 5.9.3 wait-on@9.0.3: dependencies: - axios: 1.13.2 - joi: 18.0.1 - lodash: 4.17.21 + axios: 1.13.4 + joi: 18.0.2 + lodash: 4.17.23 minimist: 1.2.8 rxjs: 7.8.2 transitivePeerDependencies: @@ -6041,12 +5954,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -6059,7 +5966,7 @@ snapshots: y18n@5.0.8: {} - yaml@2.8.1: {} + yaml@2.8.2: {} yargs-parser@21.1.1: {} diff --git a/src/client/app/composables/copyCode.ts b/src/client/app/composables/copyCode.ts index 3d920a85..f0fc998d 100644 --- a/src/client/app/composables/copyCode.ts +++ b/src/client/app/composables/copyCode.ts @@ -48,7 +48,7 @@ export function useCopyCode() { async function copyToClipboard(text: string) { try { - return navigator.clipboard.writeText(text) + await navigator.clipboard.writeText(text) } catch { const element = document.createElement('textarea') const previouslyFocusedElement = document.activeElement diff --git a/src/client/theme-default/components/VPAlgoliaSearchBox.vue b/src/client/theme-default/components/VPAlgoliaSearchBox.vue index 02baf5b7..26df2b7c 100644 --- a/src/client/theme-default/components/VPAlgoliaSearchBox.vue +++ b/src/client/theme-default/components/VPAlgoliaSearchBox.vue @@ -1,84 +1,238 @@ diff --git a/src/client/theme-default/components/VPFeature.vue b/src/client/theme-default/components/VPFeature.vue index ff36fe97..e0e49b18 100644 --- a/src/client/theme-default/components/VPFeature.vue +++ b/src/client/theme-default/components/VPFeature.vue @@ -41,8 +41,10 @@ defineProps<{ />

-

- +
    +
  • +
+