diff --git a/.changeset/chilly-seals-whisper.md b/.changeset/chilly-seals-whisper.md new file mode 100644 index 00000000000..e8d33a60d9a --- /dev/null +++ b/.changeset/chilly-seals-whisper.md @@ -0,0 +1,5 @@ +--- +'@astrojs/starlight-docsearch': minor +--- + +Upgrades the [DocSearch dependency](https://github.com/algolia/docsearch) to stable v4 diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index a059280810c..3228c6915e8 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -2,6 +2,7 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; import starlightLinksValidator from 'starlight-links-validator'; +import starlightDocSearch from '@astrojs/starlight-docsearch'; import markdocGrammar from './grammars/markdoc.tmLanguage.json'; export const locales = { @@ -189,7 +190,14 @@ export default defineConfig({ errorOnInconsistentLocale: true, }), ] - : [], + : [ + starlightDocSearch({ + appId: 'PMZUYBQDAK', + apiKey: '24b09689d5b4223813d9b8e48563c8f6', + indexName: '[Demo][Tmp] Astro Starlight', + askAi: 'askAIDemo' + }), + ], }), ], }); diff --git a/docs/package.json b/docs/package.json index 2059be1dc02..40b31a78ae0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,6 +18,7 @@ "dependencies": { "@astro-community/astro-embed-youtube": "^0.5.6", "@astrojs/starlight": "workspace:*", + "@astrojs/starlight-docsearch": "workspace:*", "@lunariajs/core": "^0.1.1", "@types/culori": "^2.1.1", "astro": "^5.6.1", diff --git a/docs/src/content/docs/guides/site-search.mdx b/docs/src/content/docs/guides/site-search.mdx index 4489ff2889f..5509bc63f50 100644 --- a/docs/src/content/docs/guides/site-search.mdx +++ b/docs/src/content/docs/guides/site-search.mdx @@ -199,11 +199,16 @@ Add translations of the modal UI for your language using Starlight’s built-in ```json title="src/content/i18n/en.json" { - "docsearch.searchBox.resetButtonTitle": "Clear the query", - "docsearch.searchBox.resetButtonAriaLabel": "Clear the query", - "docsearch.searchBox.cancelButtonText": "Cancel", - "docsearch.searchBox.cancelButtonAriaLabel": "Cancel", + "docsearch.searchBox.clearButtonTitle": "Clear the query", + "docsearch.searchBox.clearButtonAriaLabel": "Clear the query", + "docsearch.searchBox.closeButtonText": "Close", + "docsearch.searchBox.closeButtonAriaLabel": "Close", + "docsearch.searchBox.placeholderText": "Search docs", + "docsearch.searchBox.placeholderTextAskAi": "Ask AI: ", + "docsearch.searchBox.placeholderTextAskAiStreaming": "Answering…", "docsearch.searchBox.searchInputLabel": "Search", + "docsearch.searchBox.backToKeywordSearchButtonText": "Back to keyword search", + "docsearch.searchBox.backToKeywordSearchButtonAriaLabel": "Back to keyword search", "docsearch.startScreen.recentSearchesTitle": "Recent", "docsearch.startScreen.noRecentSearchesText": "No recent searches", @@ -211,24 +216,82 @@ Add translations of the modal UI for your language using Starlight’s built-in "docsearch.startScreen.removeRecentSearchButtonTitle": "Remove this search from history", "docsearch.startScreen.favoriteSearchesTitle": "Favorite", "docsearch.startScreen.removeFavoriteSearchButtonTitle": "Remove this search from favorites", + "docsearch.startScreen.recentConversationsTitle": "Recent conversations", + "docsearch.startScreen.removeRecentConversationButtonTitle": "Remove this conversation from history", "docsearch.errorScreen.titleText": "Unable to fetch results", "docsearch.errorScreen.helpText": "You might want to check your network connection.", "docsearch.footer.selectText": "to select", + "docsearch.footer.submitQuestionText": "Submit question", "docsearch.footer.selectKeyAriaLabel": "Enter key", "docsearch.footer.navigateText": "to navigate", "docsearch.footer.navigateUpKeyAriaLabel": "Arrow up", "docsearch.footer.navigateDownKeyAriaLabel": "Arrow down", "docsearch.footer.closeText": "to close", + "docsearch.footer.backToSearchText": "Back to search", "docsearch.footer.closeKeyAriaLabel": "Escape key", - "docsearch.footer.searchByText": "Search by", + "docsearch.footer.poweredByText": "Search by", "docsearch.noResultsScreen.noResultsText": "No results for", "docsearch.noResultsScreen.suggestedQueryText": "Try searching for", "docsearch.noResultsScreen.reportMissingResultsText": "Believe this query should return results?", - "docsearch.noResultsScreen.reportMissingResultsLinkText": "Let us know." + "docsearch.noResultsScreen.reportMissingResultsLinkText": "Let us know.", + + "docsearch.resultsScreen.askAiPlaceholder": "Ask AI: ", + + "docsearch.askAiScreen.disclaimerText": "Answers are generated by AI and may be inaccurate.", + "docsearch.askAiScreen.relatedSourcesText": "Related sources", + "docsearch.askAiScreen.thinkingText": "Thinking…", + "docsearch.askAiScreen.copyButtonText": "Copy", + "docsearch.askAiScreen.copyButtonCopiedText": "Copied!", + "docsearch.askAiScreen.copyButtonTitle": "Copy", + "docsearch.askAiScreen.likeButtonTitle": "Like", + "docsearch.askAiScreen.dislikeButtonTitle": "Dislike", + "docsearch.askAiScreen.thanksForFeedbackText": "Thanks for your feedback!", + "docsearch.askAiScreen.preToolCallText": "Searching…", + "docsearch.askAiScreen.duringToolCallText": "Searching ", + "docsearch.askAiScreen.afterToolCallText": "Searched", + "docsearch.askAiScreen.aggregatedToolCallText": "Searched" } ``` + +#### Algolia Ask AI + +DocSearch v4 introduces an optional **Ask AI** conversational experience. To enable it, pass the `askAi` option to the Starlight DocSearch plugin — either as a plain string (your **assistant ID**) or as an object with overrides: + +```ts title="astro.config.mjs" ins={15-20} +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import starlightDocSearch from '@astrojs/starlight-docsearch'; + +export default defineConfig({ + integrations: [ + starlight({ + plugins: [ + starlightDocSearch({ + appId: 'YOUR_APP_ID', + apiKey: 'YOUR_SEARCH_API_KEY', + indexName: 'YOUR_INDEX_NAME', + // simplest form — just the assistant ID + // askAi: 'YOUR_ASSISTANT_ID', + + // or full form with per-assistant overrides + askAi: { + assistantId: 'YOUR_ASSISTANT_ID', + // apiKey, appId & indexName default to the top-level values + // but can be overridden individually if needed + // apiKey: '...', + // appId: '...', + // indexName: '...', + }, + }), + ], + }), + ], +}); +``` + +If you want to stick with keyword search only, simply omit the `askAi` property. diff --git a/packages/docsearch/DocSearch.astro b/packages/docsearch/DocSearch.astro index f50c208dc01..2d42e9cb46b 100644 --- a/packages/docsearch/DocSearch.astro +++ b/packages/docsearch/DocSearch.astro @@ -3,10 +3,9 @@ import '@docsearch/css/dist/modal.css'; import type docsearch from '@docsearch/js'; import './variables.css'; -type DocSearchTranslationProps = Pick< - Parameters[0], - 'placeholder' | 'translations' ->; +type DocSearchProps = Parameters[0]; + +type DocSearchTranslationProps = Pick; const pick = (keyStart: string) => Object.fromEntries( @@ -26,8 +25,10 @@ const docsearchTranslations: DocSearchTranslationProps = { searchBox: pick('docsearch.searchBox.'), startScreen: pick('docsearch.startScreen.'), errorScreen: pick('docsearch.errorScreen.'), - footer: pick('docsearch.footer.'), + askAiScreen: pick('docsearch.askAiScreen.'), + resultsScreen: pick('docsearch.resultsScreen.'), noResultsScreen: pick('docsearch.noResultsScreen.'), + footer: pick('docsearch.footer.'), }, }, }; @@ -130,12 +131,60 @@ const docsearchTranslations: DocSearchTranslationProps = { super(); window.addEventListener('DOMContentLoaded', async () => { const { default: docsearch } = await import('@docsearch/js'); - const options = { ...config, container: 'sl-doc-search' }; + type DocSearchProps = Parameters[0]; + + let translations; try { - const translations = JSON.parse(this.dataset.translations || '{}'); - Object.assign(options, translations); + translations = JSON.parse(this.dataset.translations || '{}'); } catch {} - docsearch(options); + + // Extract the page language (e.g. ) and pass it to DocSearch + // as an Algolia facet filter so that the search results are scoped to the current + // language. If users already defined facet filters we preserve them while appending + // the new one. + let searchParameters: DocSearchProps['searchParameters']; + + // Rebuild the askAi prop as an object: + // If the askAi prop is a string, treat it as the assistantId and use + // the default indexName, apiKey and appId from the main options. + // If the askAi prop is an object, spread its explicit values. + const askAiProp = config.askAi; + const isAskAiString = typeof askAiProp === 'string'; + + const askAi = askAiProp + ? { + indexName: isAskAiString ? config.indexName : askAiProp.indexName, + apiKey: isAskAiString ? config.apiKey : askAiProp.apiKey, + appId: isAskAiString ? config.appId : askAiProp.appId, + assistantId: isAskAiString ? askAiProp : askAiProp.assistantId, + searchParameters: {}, + } + : undefined; + + const pageLang = document.documentElement.getAttribute('lang'); + if (pageLang) { + searchParameters = config.searchParameters || {}; + const existingFilters = searchParameters?.facetFilters ?? []; + // Ensure facetFilters is always an array of strings for simplicity. + searchParameters.facetFilters = Array.isArray(existingFilters) + ? [...existingFilters, `lang:${pageLang}`] + : [existingFilters, `lang:${pageLang}`].filter(Boolean); + + if (askAi) { + // Re-use the merged facetFilters from the search parameters so that + // Ask AI uses the same language filtering as the regular search. + askAi.searchParameters = { facetFilters: searchParameters.facetFilters }; + } + + const options = { + ...config, + container: 'sl-doc-search', + translations, + searchParameters, + askAi, + }; + docsearch(options as DocSearchProps); + } }); } } diff --git a/packages/docsearch/README.md b/packages/docsearch/README.md index 8620a36c6b2..3d627d2a35e 100644 --- a/packages/docsearch/README.md +++ b/packages/docsearch/README.md @@ -2,6 +2,8 @@ Algolia DocSearch plugin for the [Starlight][starlight] documentation theme for [Astro][astro]. +Supports DocSearch v4 with optional **Ask AI** conversational search. + ## Documentation See the [Starlight site search guide][docs] for how to use this plugin. diff --git a/packages/docsearch/index.ts b/packages/docsearch/index.ts index e8cc7e5df26..ec5bf3bfbba 100644 --- a/packages/docsearch/index.ts +++ b/packages/docsearch/index.ts @@ -1,92 +1,112 @@ import type { StarlightPlugin } from '@astrojs/starlight/types'; -import type docsearch from '@docsearch/js'; import type { AstroUserConfig, ViteUserConfig } from 'astro'; import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { z } from 'astro/zod'; +import docsearch from '@docsearch/js'; -export type DocSearchClientOptions = Omit< - Parameters[0], - 'container' | 'translations' ->; +export type DocSearchProps = Parameters[0]; -type SearchOptions = DocSearchClientOptions['searchParameters']; +type SearchOptions = DocSearchProps['searchParameters']; -/** DocSearch configuration options. */ -const DocSearchConfigSchema = z - .object({ - // Required config without which DocSearch won’t work. - /** Your Algolia application ID. */ - appId: z.string(), - /** Your Algolia Search API key. */ - apiKey: z.string(), - /** Your Algolia index name. */ - indexName: z.string(), - // Optional DocSearch component config (only the serializable properties can be included here) - /** - * The maximum number of results to display per search group. - * @default 5 - */ - maxResultsPerGroup: z.number().optional(), - /** - * Disable saving recent searches and favorites to the local storage. - * @default false - */ - disableUserPersonalization: z.boolean().optional(), - /** - * Whether to enable the Algolia Insights plugin and send search events to your DocSearch index. - * @default false - */ - insights: z.boolean().optional(), - /** - * The Algolia Search Parameters. - * @see https://www.algolia.com/doc/api-reference/search-api-parameters/ - */ - searchParameters: z.custom(), - }) - .strict() - .or( - z - .object({ - /** - * The path to a JavaScript or TypeScript file containing a default export of options to - * pass to the DocSearch client. - * - * The value can be a path to a local JS/TS file relative to the root of your project, - * e.g. `'/src/docsearch.js'`, or an npm module specifier for a package you installed, - * e.g. `'@company/docsearch-config'`. - * - * Use `clientOptionsModule` when you need to configure options that are not serializable, - * such as `transformSearchClient()` or `resultsFooterComponent()`. - * - * When `clientOptionsModule` is set, all options must be set via the module file. Other - * inline options passed to the plugin in `astro.config.mjs` will be ignored. - * - * @see https://docsearch.algolia.com/docs/api - * - * @example - * // astro.config.mjs - * // ... - * starlightDocSearch({ clientOptionsModule: './src/config/docsearch.ts' }), - * // ... - * - * // src/config/docsearch.ts - * import type { DocSearchClientOptions } from '@astrojs/starlight-docsearch'; - * - * export default { - * appId: '...', - * apiKey: '...', - * indexName: '...', - * getMissingResultsUrl({ query }) { - * return `https://github.com/algolia/docsearch/issues/new?title=${query}`; - * }, - * } satisfies DocSearchClientOptions; - */ - clientOptionsModule: z.string(), - }) - .strict() - ); +// Base schema for shared Algolia configuration properties. +const AlgoliaConfigSchema = z.object({ + /** Your Algolia application ID. */ + appId: z.string(), + /** Your Algolia Search API key. */ + apiKey: z.string(), + /** Your Algolia index name. */ + indexName: z.string(), +}); +// Schema for inline DocSearch client options (without `clientOptionsModule`). +const InlineDocSearchConfigSchema = AlgoliaConfigSchema.extend({ + // Optional DocSearch component config (only the serializable properties can be included here) + /** + * The maximum number of results to display per search group. + * @default 5 + */ + maxResultsPerGroup: z.number().optional(), + /** + * Disable saving recent searches and favorites to the local storage. + * @default false + */ + disableUserPersonalization: z.boolean().optional(), + /** + * Whether to enable the Algolia Insights plugin and send search events to your DocSearch index. + * @default false + */ + insights: z.boolean().optional(), + /** + * The Algolia Search Parameters. + * @see https://www.algolia.com/doc/api-reference/search-api-parameters/ + */ + searchParameters: z.custom().optional(), + /** + * Optional: Enable Algolia Ask AI. + * Can be provided as a string (your `assistantId`) or an object allowing + * per-assistant overrides. + */ + askAi: z + .union([ + z.string(), + AlgoliaConfigSchema.partial().extend({ + assistantId: z.string().nullable().optional(), + searchParameters: z + .object({ + facetFilters: z.custom['facetFilters']>(), + }) + .optional(), + }).strict(), + ]) + .optional(), +}).strict(); + +// Full schema that also allows referencing an external module via `clientOptionsModule`. +const DocSearchConfigSchema = InlineDocSearchConfigSchema.or( + z + .object({ + /** + * The path to a JavaScript or TypeScript file containing a default export of options to + * pass to the DocSearch client. + * + * The value can be a path to a local JS/TS file relative to the root of your project, + * e.g. `'/src/docsearch.js'`, or an npm module specifier for a package you installed, + * e.g. `'@company/docsearch-config'`. + * + * Use `clientOptionsModule` when you need to configure options that are not serializable, + * such as `transformSearchClient()` or `resultsFooterComponent()`. + * + * When `clientOptionsModule` is set, all options must be set via the module file. Other + * inline options passed to the plugin in `astro.config.mjs` will be ignored. + * + * @see https://docsearch.algolia.com/docs/api + * + * @example + * // astro.config.mjs + * // ... + * starlightDocSearch({ clientOptionsModule: './src/config/docsearch.ts' }), + * // ... + * + * // src/config/docsearch.ts + * import type { DocSearchClientOptions } from '@astrojs/starlight-docsearch'; + * + * export default { + * appId: '...', + * apiKey: '...', + * indexName: '...', + * getMissingResultsUrl({ query }) { + * return `https://github.com/algolia/docsearch/issues/new?title=${query}`; + * }, + * } satisfies DocSearchClientOptions; + */ + clientOptionsModule: z.string(), + }) + .strict() +); + +// Export the inline client options type (does NOT include `clientOptionsModule`). +export type DocSearchClientOptions = z.infer; type DocSearchUserConfig = z.infer; /** Starlight DocSearch plugin. */ diff --git a/packages/docsearch/package.json b/packages/docsearch/package.json index 2bfc6e20a94..0dc7700da34 100644 --- a/packages/docsearch/package.json +++ b/packages/docsearch/package.json @@ -28,8 +28,8 @@ "@astrojs/starlight": ">=0.32.0" }, "dependencies": { - "@docsearch/css": "^3.6.0", - "@docsearch/js": "^3.6.0" + "@docsearch/css": "^4.2.0", + "@docsearch/js": "^4.2.0" }, "devDependencies": { "@astrojs/starlight": "workspace:*" diff --git a/packages/docsearch/schema.ts b/packages/docsearch/schema.ts index b227946c686..0e0f24679e4 100644 --- a/packages/docsearch/schema.ts +++ b/packages/docsearch/schema.ts @@ -52,15 +52,25 @@ export const docSearchI18nSchema = () => .object({ // SEARCH BOX /** Default: `Clear the query` */ - 'docsearch.searchBox.resetButtonTitle': z.string(), + 'docsearch.searchBox.clearButtonTitle': z.string(), /** Default: `Clear the query` */ - 'docsearch.searchBox.resetButtonAriaLabel': z.string(), - /** Default: `Cancel` */ - 'docsearch.searchBox.cancelButtonText': z.string(), - /** Default: `Cancel` */ + 'docsearch.searchBox.clearButtonAriaLabel': z.string(), + /** Default: `Close` */ + 'docsearch.searchBox.closeButtonText': z.string(), + /** Default: `Close` */ 'docsearch.searchBox.cancelButtonAriaLabel': z.string(), /** Default: `Search` */ + 'docsearch.searchBox.placeholderText': z.string(), + /** Default: `Ask AI` placeholder */ + 'docsearch.searchBox.placeholderTextAskAi': z.string(), + /** Default: `Answering…` placeholder while streaming */ + 'docsearch.searchBox.placeholderTextAskAiStreaming': z.string(), + /** Default: `Search` */ 'docsearch.searchBox.searchInputLabel': z.string(), + /** Default: `Back to keyword search` */ + 'docsearch.searchBox.backToKeywordSearchButtonText': z.string(), + /** Default: `Back to keyword search` */ + 'docsearch.searchBox.backToKeywordSearchButtonAriaLabel': z.string(), // START SCREEN /** Default: `Recent` */ @@ -75,6 +85,10 @@ export const docSearchI18nSchema = () => 'docsearch.startScreen.favoriteSearchesTitle': z.string(), /** Default: `Remove this search from favorites` */ 'docsearch.startScreen.removeFavoriteSearchButtonTitle': z.string(), + /** Default: `Recent conversations` */ + 'docsearch.startScreen.recentConversationsTitle': z.string(), + /** Default: `Remove this conversation from history` */ + 'docsearch.startScreen.removeRecentConversationButtonTitle': z.string(), // ERROR SCREEN /** Default: `Unable to fetch results` */ @@ -98,7 +112,11 @@ export const docSearchI18nSchema = () => /** Default: `Escape key` */ 'docsearch.footer.closeKeyAriaLabel': z.string(), /** Default: `Search by` */ - 'docsearch.footer.searchByText': z.string(), + 'docsearch.footer.submitQuestionText': z.string(), + /** Default: `Back to search` */ + 'docsearch.footer.backToSearchText': z.string(), + /** Default: `Powered by` */ + 'docsearch.footer.poweredByText': z.string(), // NO RESULTS SCREEN /** Default: `No results for` */ @@ -109,5 +127,37 @@ export const docSearchI18nSchema = () => 'docsearch.noResultsScreen.reportMissingResultsText': z.string(), /** Default: `Let us know.` */ 'docsearch.noResultsScreen.reportMissingResultsLinkText': z.string(), + + // RESULTS SCREEN (Ask AI entry point) + /** Default: `Ask AI: ` */ + 'docsearch.resultsScreen.askAiPlaceholder': z.string(), + + // ASK AI SCREEN translations + /** Default: `Answers are generated with AI which can make mistakes. Verify responses.` */ + 'docsearch.askAiScreen.disclaimerText': z.string(), + /** Default: `Related sources` */ + 'docsearch.askAiScreen.relatedSourcesText': z.string(), + /** Default: `Thinking...` */ + 'docsearch.askAiScreen.thinkingText': z.string(), + /** Default: `Copy` */ + 'docsearch.askAiScreen.copyButtonText': z.string(), + /** Default: `Copied!` */ + 'docsearch.askAiScreen.copyButtonCopiedText': z.string(), + /** Default: `Copy` */ + 'docsearch.askAiScreen.copyButtonTitle': z.string(), + /** Default: `Like` */ + 'docsearch.askAiScreen.likeButtonTitle': z.string(), + /** Default: `Dislike` */ + 'docsearch.askAiScreen.dislikeButtonTitle': z.string(), + /** Default: `Thanks for your feedback!` */ + 'docsearch.askAiScreen.thanksForFeedbackText': z.string(), + /** Default: `Searching...` */ + 'docsearch.askAiScreen.preToolCallText': z.string(), + /** Default: `Searching for ` */ + 'docsearch.askAiScreen.duringToolCallText': z.string(), + /** Default: `Searched for` */ + 'docsearch.askAiScreen.afterToolCallText': z.string(), + /** Default: `Searched for` */ + 'docsearch.askAiScreen.aggregatedToolCallText': z.string(), }) .partial(); diff --git a/packages/docsearch/variables.css b/packages/docsearch/variables.css index b1a0ebd665d..709d2d93304 100644 --- a/packages/docsearch/variables.css +++ b/packages/docsearch/variables.css @@ -7,9 +7,12 @@ --docsearch-highlight-color: var(--docsearch-primary-color); --docsearch-muted-color: var(--sl-color-gray-3); --docsearch-container-background: var(--sl-color-backdrop-overlay); + --docsearch-background-color: var(--sl-color-gray-6); + --docsearch-hit-highlight-color: var(--sl-color-accent-low); + --docsearch-dropdown-menu-background: var(--sl-color-black); /* modal */ - --docsearch-modal-width: 560px; + --docsearch-modal-width: 800px; --docsearch-modal-height: 600px; --docsearch-modal-background: var(--sl-color-gray-6); --docsearch-modal-shadow: var(--sl-shadow-lg); @@ -45,3 +48,6 @@ .DocSearch-Logo svg * { fill: var(--docsearch-muted-color); } +.DocSearch-Label { + color: var(--docsearch-muted-color); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed3d067c219..be44406c4ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: '@astrojs/starlight': specifier: workspace:* version: link:../packages/starlight + '@astrojs/starlight-docsearch': + specifier: workspace:* + version: link:../packages/docsearch '@lunariajs/core': specifier: ^0.1.1 version: 0.1.1 @@ -142,11 +145,11 @@ importers: packages/docsearch: dependencies: '@docsearch/css': - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^4.2.0 + version: 4.2.0 '@docsearch/js': - specifier: ^3.6.0 - version: 3.6.0(@algolia/client-search@4.20.0) + specifier: ^4.2.0 + version: 4.2.0 devDependencies: '@astrojs/starlight': specifier: workspace:* @@ -351,68 +354,6 @@ importers: packages: - '@algolia/autocomplete-core@1.9.3': - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3': - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.9.3': - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.9.3': - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/cache-browser-local-storage@4.20.0': - resolution: {integrity: sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==} - - '@algolia/cache-common@4.20.0': - resolution: {integrity: sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ==} - - '@algolia/cache-in-memory@4.20.0': - resolution: {integrity: sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==} - - '@algolia/client-account@4.20.0': - resolution: {integrity: sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==} - - '@algolia/client-analytics@4.20.0': - resolution: {integrity: sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==} - - '@algolia/client-common@4.20.0': - resolution: {integrity: sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==} - - '@algolia/client-personalization@4.20.0': - resolution: {integrity: sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==} - - '@algolia/client-search@4.20.0': - resolution: {integrity: sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==} - - '@algolia/logger-common@4.20.0': - resolution: {integrity: sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ==} - - '@algolia/logger-console@4.20.0': - resolution: {integrity: sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==} - - '@algolia/requester-browser-xhr@4.20.0': - resolution: {integrity: sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==} - - '@algolia/requester-common@4.20.0': - resolution: {integrity: sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng==} - - '@algolia/requester-node-http@4.20.0': - resolution: {integrity: sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==} - - '@algolia/transporter@4.20.0': - resolution: {integrity: sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -573,28 +514,11 @@ packages: resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@docsearch/css@3.6.0': - resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} + '@docsearch/css@4.2.0': + resolution: {integrity: sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==} - '@docsearch/js@3.6.0': - resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} - - '@docsearch/react@3.6.0': - resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@docsearch/js@4.2.0': + resolution: {integrity: sha512-KBHVPO29QiGUFJYeAqxW0oXtGf/aghNmRrIRPT4/28JAefqoCkNn/ZM/jeQ7fHjl0KNM6C+KlLVYjwyz6lNZnA==} '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -1765,9 +1689,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@4.20.0: - resolution: {integrity: sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==} - ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -3371,9 +3292,6 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - preact@10.18.2: - resolution: {integrity: sha512-X/K43vocUHDg0XhWVmTTMbec4LT/iBMh+csCEqJk+pJqegaXsvjdqN80ZZ3L+93azWCnWCZ+WGwYb8SplxeNjA==} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4313,95 +4231,6 @@ packages: snapshots: - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - '@algolia/client-search': 4.20.0 - algoliasearch: 4.20.0 - - '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)': - dependencies: - '@algolia/client-search': 4.20.0 - algoliasearch: 4.20.0 - - '@algolia/cache-browser-local-storage@4.20.0': - dependencies: - '@algolia/cache-common': 4.20.0 - - '@algolia/cache-common@4.20.0': {} - - '@algolia/cache-in-memory@4.20.0': - dependencies: - '@algolia/cache-common': 4.20.0 - - '@algolia/client-account@4.20.0': - dependencies: - '@algolia/client-common': 4.20.0 - '@algolia/client-search': 4.20.0 - '@algolia/transporter': 4.20.0 - - '@algolia/client-analytics@4.20.0': - dependencies: - '@algolia/client-common': 4.20.0 - '@algolia/client-search': 4.20.0 - '@algolia/requester-common': 4.20.0 - '@algolia/transporter': 4.20.0 - - '@algolia/client-common@4.20.0': - dependencies: - '@algolia/requester-common': 4.20.0 - '@algolia/transporter': 4.20.0 - - '@algolia/client-personalization@4.20.0': - dependencies: - '@algolia/client-common': 4.20.0 - '@algolia/requester-common': 4.20.0 - '@algolia/transporter': 4.20.0 - - '@algolia/client-search@4.20.0': - dependencies: - '@algolia/client-common': 4.20.0 - '@algolia/requester-common': 4.20.0 - '@algolia/transporter': 4.20.0 - - '@algolia/logger-common@4.20.0': {} - - '@algolia/logger-console@4.20.0': - dependencies: - '@algolia/logger-common': 4.20.0 - - '@algolia/requester-browser-xhr@4.20.0': - dependencies: - '@algolia/requester-common': 4.20.0 - - '@algolia/requester-common@4.20.0': {} - - '@algolia/requester-node-http@4.20.0': - dependencies: - '@algolia/requester-common': 4.20.0 - - '@algolia/transporter@4.20.0': - dependencies: - '@algolia/cache-common': 4.20.0 - '@algolia/logger-common': 4.20.0 - '@algolia/requester-common': 4.20.0 - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -4731,27 +4560,9 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@docsearch/css@3.6.0': {} + '@docsearch/css@4.2.0': {} - '@docsearch/js@3.6.0(@algolia/client-search@4.20.0)': - dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@4.20.0) - preact: 10.18.2 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.6.0(@algolia/client-search@4.20.0)': - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - '@docsearch/css': 3.6.0 - algoliasearch: 4.20.0 - transitivePeerDependencies: - - '@algolia/client-search' + '@docsearch/js@4.2.0': {} '@emmetio/abbreviation@2.3.3': dependencies: @@ -5786,23 +5597,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@4.20.0: - dependencies: - '@algolia/cache-browser-local-storage': 4.20.0 - '@algolia/cache-common': 4.20.0 - '@algolia/cache-in-memory': 4.20.0 - '@algolia/client-account': 4.20.0 - '@algolia/client-analytics': 4.20.0 - '@algolia/client-common': 4.20.0 - '@algolia/client-personalization': 4.20.0 - '@algolia/client-search': 4.20.0 - '@algolia/logger-common': 4.20.0 - '@algolia/logger-console': 4.20.0 - '@algolia/requester-browser-xhr': 4.20.0 - '@algolia/requester-common': 4.20.0 - '@algolia/requester-node-http': 4.20.0 - '@algolia/transporter': 4.20.0 - ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -7843,8 +7637,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.18.2: {} - prelude-ls@1.2.1: {} prettier-plugin-astro@0.14.1: