From 0d646a66cd44e97adef516a6a36e03365f179906 Mon Sep 17 00:00:00 2001 From: Dylan Tientcheu Date: Sat, 31 Jan 2026 15:06:27 +0100 Subject: [PATCH 01/17] feat(theme): upgrade DocSearch to 4.5 with sidepanel (#5092) --------- Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- .../e2e/local-search/local-search.test.ts | 2 +- .../theme-default/support/docsearch.test.ts | 196 ++ docs/.vitepress/config.ts | 5 +- docs/en/index.md | 6 +- docs/en/reference/default-theme-search.md | 281 +-- docs/es/config.ts | 144 +- docs/es/reference/default-theme-search.md | 319 ++- docs/fa/config.ts | 151 +- docs/fa/reference/default-theme-search.md | 277 ++- docs/ja/config.ts | 144 +- docs/ja/reference/default-theme-search.md | 311 +-- docs/ko/config.ts | 144 +- docs/ko/reference/default-theme-search.md | 283 ++- docs/package.json | 4 +- docs/pt/config.ts | 153 +- docs/pt/reference/default-theme-search.md | 292 ++- docs/ru/config.ts | 153 +- docs/ru/reference/default-theme-search.md | 305 +-- docs/snippets/algolia-crawler.js | 101 + docs/snippets/algolia-i18n.ts | 155 ++ docs/zh/config.ts | 147 +- docs/zh/reference/default-theme-search.md | 312 ++- package.json | 67 +- pnpm-lock.yaml | 1842 ++++++++--------- .../components/VPAlgoliaSearchBox.vue | 273 ++- .../components/VPLocalSearchBox.vue | 31 +- .../theme-default/components/VPNavBar.vue | 34 +- .../components/VPNavBarAskAiButton.vue | 31 + .../components/VPNavBarSearch.vue | 196 +- .../components/VPNavBarSearchButton.vue | 170 +- .../theme-default/components/VPNavScreen.vue | 4 +- src/client/theme-default/styles/docsearch.css | 120 ++ src/client/theme-default/styles/icons.css | 5 +- src/client/theme-default/support/docsearch.ts | 253 +++ .../theme-default/support/reactivity.ts | 14 + src/node/plugin.ts | 4 +- src/node/siteConfig.ts | 46 +- template/.vitepress/theme/style.css | 8 - types/default-theme.d.ts | 10 +- types/docsearch.d.ts | 244 +-- 40 files changed, 3988 insertions(+), 3249 deletions(-) create mode 100644 __tests__/unit/client/theme-default/support/docsearch.test.ts create mode 100644 docs/snippets/algolia-crawler.js create mode 100644 docs/snippets/algolia-i18n.ts create mode 100644 src/client/theme-default/components/VPNavBarAskAiButton.vue create mode 100644 src/client/theme-default/styles/docsearch.css create mode 100644 src/client/theme-default/support/docsearch.ts create mode 100644 src/client/theme-default/support/reactivity.ts 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..7a6626c9 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -118,7 +118,10 @@ export default defineConfig({ appId: '8J64VVRP8K', apiKey: '52f578a92b88ad6abde815aae2b0ad7c', indexName: 'vitepress', - askAi: 'YaVSonfX5bS8' + askAi: { + assistantId: 'YaVSonfX5bS8', + sidePanel: true + } } }, 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 6f386d49..8221bb4a 100644 --- a/docs/en/reference/default-theme-search.md +++ b/docs/en/reference/default-theme-search.md @@ -190,7 +190,7 @@ export default defineConfig({ ## Algolia Search -VitePress supports searching your docs site using [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Refer their getting started guide. In your `.vitepress/config.ts` you'll need to provide at least the following to make it work: +VitePress supports searching your docs site using [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Refer to their getting started guide. In your `.vitepress/config.ts` you'll need to provide at least the following to make it work: ```ts import { defineConfig } from 'vitepress' @@ -213,6 +213,19 @@ export default defineConfig({ You can use a config like this to use 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 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 want to default to keyword search and do not want to 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/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/reference/default-theme-search.md b/docs/es/reference/default-theme-search.md index 5391c3d7..986a3a40 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 } } @@ -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/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/reference/default-theme-search.md b/docs/fa/reference/default-theme-search.md index 033e145e..256c2378 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 را برمی گرداند } } } @@ -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/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/reference/default-theme-search.md b/docs/ja/reference/default-theme-search.md index e15de4ef..70837c10 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 の設定例です。 @@ -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/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/reference/default-theme-search.md b/docs/ko/reference/default-theme-search.md index 03eda030..739d2dcc 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 문자열을 반환 } } } @@ -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/package.json b/docs/package.json index 0ccd3107..973487eb 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.10.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/reference/default-theme-search.md b/docs/pt/reference/default-theme-search.md index 4db22900..b83569c9 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 } } @@ -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/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/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index 9cdc9438..c4ea2b1c 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 } } } @@ -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/reference/default-theme-search.md b/docs/zh/reference/default-theme-search.md index 6f31fd2f..89d8cb89 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 字符串 } } } @@ -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..e91213e7 100644 --- a/package.json +++ b/package.json @@ -95,28 +95,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.68", + "@shikijs/core": "^3.21.0", + "@shikijs/transformers": "^3.21.0", + "@shikijs/types": "^3.21.0", "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^6.0.1", + "@vitejs/plugin-vue": "^6.0.3", "@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.1.0", + "@vueuse/integrations": "^14.1.0", + "focus-trap": "^7.8.0", "mark.js": "8.11.1", "minisearch": "^7.2.0", - "shiki": "^3.15.0", - "vite": "^7.2.2", - "vue": "^3.5.24" + "shiki": "^3.21.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 +136,51 @@ "@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.1.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", "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", + "rimraf": "^6.1.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..dc0534bb 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.68 + version: 1.2.68 '@shikijs/core': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.21.0 + version: 3.21.0 '@shikijs/transformers': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.21.0 + version: 3.21.0 '@shikijs/types': - specifier: ^3.15.0 - version: 3.15.0 + specifier: ^3.21.0 + version: 3.21.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.3 + version: 6.0.3(rolldown-vite@7.3.1(@types/node@25.1.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.1.0 + version: 14.1.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.1.0 + version: 14.1.0(axios@1.13.4)(focus-trap@7.8.0)(vue@3.5.27(typescript@5.9.3)) focus-trap: - specifier: ^7.6.6 - version: 7.6.6 + specifier: ^7.8.0 + version: 7.8.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.21.0 + version: 3.21.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.1.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.1.0 + version: 25.1.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,14 +190,14 @@ 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 @@ -208,8 +211,8 @@ importers: specifier: ^4.3.1 version: 4.3.1(patch_hash=12883b753541724964b5246a739df34c4b76db10415bbb63c35dce408cfe977e)(markdown-it@14.1.0) 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.0) 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 @@ -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,11 +262,11 @@ 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 @@ -271,17 +274,17 @@ importers: specifier: ^2.3.1 version: 2.3.1 rimraf: - specifier: ^6.1.0 - version: 6.1.0 + specifier: ^6.1.2 + version: 6.1.2 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 +305,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.1.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 +343,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.1.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.10.0 + version: 1.10.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.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': @@ -366,23 +366,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.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} 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 +396,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.3.2': - resolution: {integrity: sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==} + '@docsearch/js@4.5.3': + resolution: {integrity: sha512-rcBiUMCXbZLqrLIT6F6FDcrG/tyvM2WM0zum6NPbIiQNDQxbSgmNc+/bToS0rxBsXaxiU64esiWoS02WqrWLsg==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@docsearch/sidepanel-js@4.5.3': + resolution: {integrity: sha512-DmcZYc1ZMMcabtKrCU2RIf1z09LwazKCyoPFU/ijJiBg2LdqMLmkyDKHGy1OIYEyUx4ok5RIbkVGaRfD55BqZQ==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@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,17 +593,17 @@ 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.68': + resolution: {integrity: sha512-bQPl1zuZlX6AnofreA1v7J+hoPncrFMppqGboe/SH54jZO37meiBUGBqNOxEpc0HKfZGxJaVVJwZd4gdMYu3hw==} - '@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==} @@ -610,10 +613,6 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} 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 +659,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 +715,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 +769,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 +783,89 @@ 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.50': - resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} '@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-ppc64-gnu@4.53.2': - resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} + '@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-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.21.0': + resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} - '@shikijs/engine-javascript@3.15.0': - resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + '@shikijs/engine-javascript@3.21.0': + resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==} - '@shikijs/engine-oniguruma@3.15.0': - resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/engine-oniguruma@3.21.0': + resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} - '@shikijs/langs@3.15.0': - resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/langs@3.21.0': + resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} - '@shikijs/themes@3.15.0': - resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/themes@3.21.0': + resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} - '@shikijs/transformers@3.15.0': - resolution: {integrity: sha512-Hmwip5ovvSkg+Kc41JTvSHHVfCYF+C8Cp1omb5AJj4Xvd+y9IXz2rKJwmFRGsuN0vpHxywcXJ1+Y4B9S7EG1/A==} + '@shikijs/transformers@3.21.0': + resolution: {integrity: sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA==} - '@shikijs/types@3.15.0': - resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + '@shikijs/types@3.21.0': + resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} '@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.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + + '@types/node@24.10.9': + resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} '@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.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} 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,38 +1275,33 @@ 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.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@14.0.0': - resolution: {integrity: sha512-5A0X7q9qyLtM3xyghq5nK/NEESf7cpcZlkQgXTMuW4JWiAMYxc1ImdhhGrk4negFBsq3ejvAlRmLdNrkcTzk1Q==} + '@vueuse/integrations@14.1.0': + resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1316,11 +1342,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@14.0.0': - resolution: {integrity: sha512-6yoGqbJcMldVCevkFiHDBTB1V5Hq+G/haPlGIuaFZHpXC0HADB0EN1ryQAAceiW+ryS3niUwvdFbGiqHqBrfVA==} + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} - '@vueuse/shared@14.0.0': - resolution: {integrity: sha512-mTCA0uczBgurRlwVaQHfG0Ja7UdGe4g9mwffiJmvLiTtp1G4AQyIjej6si/k8c8pUwTfVpNufck+23gXptPAkw==} + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} 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: @@ -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==} @@ -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@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} 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,21 +1860,16 @@ 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==} + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} 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==} @@ -1897,9 +1912,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 +2007,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 +2041,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 +2127,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 +2137,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 +2157,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 +2182,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: '*' @@ -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==} @@ -2412,13 +2417,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 +2427,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 +2439,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: @@ -2458,8 +2458,8 @@ packages: 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==} @@ -2492,9 +2492,6 @@ packages: 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 +2503,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 +2525,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 +2545,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 +2588,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 +2609,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 +2651,18 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@6.1.0: - resolution: {integrity: sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==} + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} 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 +2696,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 +2715,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 +2738,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 +2759,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.21.0: + resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2863,8 +2855,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 +2892,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.1.2: + resolution: {integrity: sha512-pD3+21EbFZFBKDnVztX32wU6IBwkalOduWdx1OKvB5y6y1f2Xn8HU/U6o9EmlfdSyUYe9IybirmYPj/7rilA6Q==} engines: {node: '>=14.16'} tinybench@2.9.0: @@ -2957,8 +2949,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 +2988,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 +3031,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 +3063,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.10.0: + resolution: {integrity: sha512-dgD5KV8D9vXlQtAf/KUjSgr3QymH1fHT7XkQ/UuIqvIjnKdzZI+0gT3puGxUBuqgvlFjYWA6f8k80tXl6gwWkw==} vitest@4.0.0-beta.4: resolution: {integrity: sha512-LWwBGvfWUinm0ATarVmXuzhGvL8HyydanPwQLAY21fvrUhXHyP04UvMYF5t+3TcXQdXPIP5AiVm09J+AbIwKhg==} @@ -3108,14 +3100,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 +3153,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 +3165,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 +3192,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.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 @@ -3220,11 +3206,11 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.5': + '@babel/parser@7.28.6': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 - '@babel/types@7.28.5': + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -3234,14 +3220,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 +3240,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 +3262,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,28 +3360,21 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.59': + '@iconify-json/simple-icons@1.2.68': 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': {} @@ -3403,15 +3382,6 @@ snapshots: 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': @@ -3484,10 +3454,10 @@ snapshots: '@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 +3471,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 +3511,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 +3520,64 @@ 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 - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50': + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.50': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': optional: true - '@rolldown/pluginutils@1.0.0-beta.29': {} + '@rolldown/pluginutils@1.0.0-beta.53': {} - '@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 +3585,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.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.53.2': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.53.2': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.53.2': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.53.2': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.2': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.2': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.2': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.2': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.2': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.2': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.2': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.2': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.2': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.2': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.2': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.2': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.2': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.2': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.2': + '@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.21.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.21.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.21.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.21.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.21.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.15.0': + '@shikijs/langs@3.21.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.21.0 - '@shikijs/themes@3.15.0': + '@shikijs/themes@3.21.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.21.0 - '@shikijs/transformers@3.15.0': + '@shikijs/transformers@3.21.0': dependencies: - '@shikijs/core': 3.15.0 - '@shikijs/types': 3.15.0 + '@shikijs/core': 3.21.0 + '@shikijs/types': 3.21.0 - '@shikijs/types@3.15.0': + '@shikijs/types@3.21.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -3762,15 +3736,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.7 '@simple-libs/stream-utils@1.1.0': dependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.7 '@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 +3760,7 @@ snapshots: '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.1.0 '@types/debug@4.1.12': dependencies: @@ -3799,7 +3773,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 24.10.1 + '@types/node': 25.1.0 '@types/hast@3.0.4': dependencies: @@ -3811,15 +3785,15 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.1.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 +3803,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 +3826,15 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.19.1': + '@types/node@22.19.7': dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': + '@types/node@24.10.9': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.1.0': dependencies: undici-types: 7.16.0 @@ -3866,14 +3844,14 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.1.0 kleur: 3.0.3 '@types/resolve@1.20.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.1.0 '@types/sizzle@2.3.10': {} @@ -3883,11 +3861,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.3(rolldown-vite@7.3.1(@types/node@25.1.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-beta.53 + vite: rolldown-vite@7.3.1(@types/node@25.1.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 +3875,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.1.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.1.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 +3913,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.28.6 + '@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.28.6 + '@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 +3962,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.1.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.1.0 + '@vueuse/shared': 14.1.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.1.0(axios@1.13.4)(focus-trap@7.8.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.1.0(vue@3.5.27(typescript@5.9.3)) + '@vueuse/shared': 14.1.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: 7.8.0 - '@vueuse/metadata@14.0.0': {} + '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@14.0.0(vue@3.5.24(typescript@5.9.3))': + '@vueuse/shared@14.1.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 +4037,7 @@ snapshots: acorn@8.15.0: {} - alien-signals@3.1.0: {} + alien-signals@3.1.2: {} ansi-colors@4.1.3: {} @@ -4093,7 +4069,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 +4081,7 @@ snapshots: base64-js@1.5.1: {} - birpc@2.8.0: {} + birpc@2.9.0: {} boolbase@1.0.0: {} @@ -4134,7 +4110,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 +4123,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 +4151,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: @@ -4217,8 +4193,6 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.2: {} - conventional-changelog-angular@8.1.0: dependencies: compare-func: 2.0.0 @@ -4283,7 +4257,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 @@ -4354,6 +4328,8 @@ snapshots: entities@4.5.0: {} + entities@7.0.1: {} + environment@1.1.0: {} es-define-property@1.0.1: {} @@ -4373,34 +4349,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 +4396,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 +4415,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 +4431,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 +4463,12 @@ snapshots: find-up-simple@1.0.1: {} - focus-trap@7.6.6: + focus-trap@7.8.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 +4479,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 +4521,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 +4529,12 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@11.1.0: + glob@13.0.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 +4573,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 +4589,6 @@ snapshots: dependencies: lru-cache: 10.4.3 - htm@3.1.1: {} - html-void-elements@3.0.0: {} htmlparser2@5.0.1: @@ -4699,13 +4661,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 +4671,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,62 +4703,60 @@ 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 listr2: 9.0.5 @@ -4808,23 +4764,17 @@ snapshots: 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 +4786,7 @@ snapshots: dependencies: lodash._reinterpolate: 3.0.0 - lodash@4.17.21: {} + lodash@4.17.23: {} log-symbols@7.0.1: dependencies: @@ -4857,7 +4807,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.5: {} magic-string@0.30.21: dependencies: @@ -4879,7 +4829,7 @@ snapshots: dependencies: markdown-it: 14.1.0 - 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.0): dependencies: get-east-asian-width: 1.4.0 markdown-it: 14.1.0 @@ -4921,7 +4871,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 +4900,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 +4909,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 +4921,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 +4942,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 +5024,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 +5062,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 @@ -5168,7 +5118,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 +5153,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 +5161,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,7 +5173,7 @@ snapshots: get-stdin: 9.0.0 meow: 12.1.1 open: 10.2.0 - tempy: 3.1.0 + tempy: 3.1.2 open@10.2.0: dependencies: @@ -5234,17 +5182,16 @@ snapshots: 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: @@ -5272,7 +5219,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.5.0: {} + package-manager-detector@1.6.0: {} parse-ms@4.0.0: {} @@ -5292,20 +5239,18 @@ snapshots: path-scurry@2.0.1: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.5 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 +5266,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 +5282,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 +5293,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 +5316,6 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.11: {} - queue-microtask@1.2.3: {} readable-stream@4.7.0: @@ -5401,7 +5338,7 @@ snapshots: regex-utilities@2.3.0: {} - regex@6.0.1: + regex@6.1.0: dependencies: regex-utilities: 2.3.0 @@ -5459,92 +5396,94 @@ snapshots: rfdc@1.4.1: {} - rimraf@6.1.0: + rimraf@6.1.2: dependencies: - glob: 11.1.0 + glob: 13.0.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.1.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.1.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.28.6 - 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 +5505,7 @@ snapshots: safe-buffer@5.2.1: {} - sax@1.4.3: {} + sax@1.4.4: {} section-matter@1.0.0: dependencies: @@ -5581,14 +5520,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.15.0: + shiki@3.21.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.21.0 + '@shikijs/engine-javascript': 3.21.0 + '@shikijs/engine-oniguruma': 3.21.0 + '@shikijs/langs': 3.21.0 + '@shikijs/themes': 3.21.0 + '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -5616,10 +5555,10 @@ snapshots: sitemap@9.0.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 24.10.9 '@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 +5623,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 +5660,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.1.2: dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 @@ -5766,7 +5705,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 +5729,7 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.6.1: {} + ufo@1.6.3: {} uglify-js@3.19.3: optional: true @@ -5840,7 +5779,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 +5811,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.1.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.1.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - esbuild @@ -5893,12 +5832,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.1.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.1.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - esbuild @@ -5908,12 +5847,11 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml - vitepress-plugin-llms@1.9.3: + vitepress-plugin-llms@1.10.0: dependencies: gray-matter: 4.0.3 markdown-it: 14.1.0 @@ -5921,30 +5859,30 @@ snapshots: mdast-util-from-markdown: 2.0.2 millify: 6.1.0 minimatch: 10.1.1 - path-to-regexp: 8.3.0 + 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.1.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.1.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 +5892,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.1.0)(esbuild@0.27.2)(jiti@1.21.7)(yaml@2.8.2) + vite-node: 4.0.0-beta.4(@types/node@25.1.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.1.0 transitivePeerDependencies: - esbuild - jiti @@ -5976,27 +5914,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 +5979,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 +5991,7 @@ snapshots: y18n@5.0.8: {} - yaml@2.8.1: {} + yaml@2.8.2: {} yargs-parser@21.1.1: {} 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/VPLocalSearchBox.vue b/src/client/theme-default/components/VPLocalSearchBox.vue index 825a22b5..99abe1ec 100644 --- a/src/client/theme-default/components/VPLocalSearchBox.vue +++ b/src/client/theme-default/components/VPLocalSearchBox.vue @@ -2,7 +2,7 @@ import localSearchIndex from '@localSearchIndex' import { computedAsync, - debouncedWatch, + watchDebounced, onKeyStroke, useEventListener, useLocalStorage, @@ -26,7 +26,7 @@ import { watchEffect, type Ref } from 'vue' -import type { ModalTranslations } from '../../../../types/local-search' +import type { LocalSearchTranslations } from '../../../../types/local-search' import { pathToFile } from '../../app/utils' import { escapeRegExp } from '../../shared' import { useData } from '../composables/data' @@ -113,16 +113,6 @@ const disableDetailedView = computed(() => { ) }) -const buttonText = computed(() => { - const options = theme.value.search?.options ?? theme.value.algolia - - return ( - options?.locales?.[localeIndex.value]?.translations?.button?.buttonText || - options?.translations?.button?.buttonText || - 'Search' - ) -}) - watchEffect(() => { if (disableDetailedView.value) { showDetailedList.value = false @@ -144,7 +134,7 @@ const mark = computedAsync(async () => { const cache = new LRUCache>(16) // 16 files -debouncedWatch( +watchDebounced( () => [searchIndex.value, filterText.value, showDetailedList.value] as const, async ([index, filterTextValue, showDetailedListValue], old, onCleanup) => { if (old?.[0] !== index) { @@ -339,8 +329,12 @@ onKeyStroke('Escape', () => { emit('close') }) -// Translations -const defaultTranslations: { modal: ModalTranslations } = { +/* Translations */ + +const defaultTranslations: LocalSearchTranslations = { + button: { + buttonText: 'Search' + }, modal: { displayDetails: 'Display detailed list', resetButtonTitle: 'Reset search', @@ -360,7 +354,7 @@ const defaultTranslations: { modal: ModalTranslations } = { const translate = createSearchTranslate(defaultTranslations) -// Back +/* Back */ onMounted(() => { // Prevents going to previous site @@ -373,6 +367,7 @@ useEventListener('popstate', (event) => { }) /** Lock body */ + const isLocked = useScrollLock(inBrowser ? document.body : null) onMounted(() => { @@ -432,7 +427,7 @@ function onMouseMove(e: MouseEvent) { @submit.prevent="" >