@docsearch/react 5.0.0-beta.0 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/esm/{AskAiScreenState-D0IZsCMJ.d.ts → AskAiScreenState-Bw2WIgv_.d.ts} +6 -3
- package/dist/esm/{DocSearch-Dq5Utfyb.d.ts → DocSearch-CVj6U-nI.d.ts} +6 -20
- package/dist/esm/{DocSearchAskAiModal-CCrk6YLb.js → DocSearchAskAiModal-BczGFkvR.js} +32 -39
- package/dist/esm/DocSearchAskAiModal-BczGFkvR.js.map +1 -0
- package/dist/esm/{DocSearchAskAiModal-BwbMrrHv.d.ts → DocSearchAskAiModal-MF2py4NM.d.ts} +5 -5
- package/dist/esm/{DocSearchButton-CRlNPf5k.d.ts → DocSearchButton-CZM_jACU.d.ts} +2 -2
- package/dist/esm/{DocSearchModal-CpvDjo1O.js → DocSearchModal-D_tfhoN1.js} +13 -21
- package/dist/esm/DocSearchModal-D_tfhoN1.js.map +1 -0
- package/dist/esm/askaiModal.d.ts +1 -1
- package/dist/esm/askaiModal.js +1 -1
- package/dist/esm/button.d.ts +1 -1
- package/dist/esm/docsearchAi.d.ts +5 -10
- package/dist/esm/docsearchAi.js +14 -4
- package/dist/esm/docsearchAi.js.map +1 -1
- package/dist/esm/{index-Dl8FMlR5.d.ts → index-Bqqv4HmN.d.ts} +19 -9
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +15 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/modal.d.ts +1 -1
- package/dist/esm/modal.js +1 -1
- package/dist/esm/{normalizeDocSearchIndexes-DAzlMybx.js → normalizeDocSearchIndexes-D8P3VEXa.js} +90 -55
- package/dist/esm/normalizeDocSearchIndexes-D8P3VEXa.js.map +1 -0
- package/dist/esm/sidepanel.d.ts +16 -24
- package/dist/esm/sidepanel.js +17 -14
- package/dist/esm/sidepanel.js.map +1 -1
- package/dist/esm/{useDocSearchKeyboardEvents-68G8dw6c.d.ts → useDocSearchKeyboardEvents-u23fFhR9.d.ts} +2 -2
- package/dist/esm/useDocSearchKeyboardEvents.d.ts +1 -1
- package/dist/esm/{useSuggestedQuestions-D2TGVPsI.js → useSuggestedQuestions-Ds7H1JCr.js} +69 -55
- package/dist/esm/useSuggestedQuestions-Ds7H1JCr.js.map +1 -0
- package/dist/esm/useTheme.d.ts +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/umd/index.js +34 -32
- package/dist/umd/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/esm/DocSearchAskAiModal-CCrk6YLb.js.map +0 -1
- package/dist/esm/DocSearchModal-CpvDjo1O.js.map +0 -1
- package/dist/esm/normalizeDocSearchIndexes-DAzlMybx.js.map +0 -1
- package/dist/esm/useSuggestedQuestions-D2TGVPsI.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docsearch/react",
|
|
3
3
|
"description": "React package for DocSearch, the best search experience for docs.",
|
|
4
|
-
"version": "5.0.0-beta.
|
|
4
|
+
"version": "5.0.0-beta.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://docsearch.algolia.com",
|
|
7
7
|
"repository": {
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"@ai-sdk/react": "^2.0.30",
|
|
51
51
|
"@algolia/autocomplete-core": "1.19.2",
|
|
52
52
|
"@base-ui/react": "^1.5.0",
|
|
53
|
-
"@docsearch/core": "5.0.0-beta.
|
|
54
|
-
"@docsearch/css": "5.0.0-beta.
|
|
53
|
+
"@docsearch/core": "5.0.0-beta.2",
|
|
54
|
+
"@docsearch/css": "5.0.0-beta.2",
|
|
55
55
|
"ai": "^5.0.30",
|
|
56
56
|
"algoliasearch": "^5.28.0",
|
|
57
57
|
"marked": "^16.3.0",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@algolia/autocomplete-core": "1.19.2",
|
|
62
|
-
"@docsearch/core": "5.0.0-beta.
|
|
62
|
+
"@docsearch/core": "5.0.0-beta.2",
|
|
63
63
|
"@testing-library/jest-dom": "6.6.3",
|
|
64
64
|
"@testing-library/react": "16.2.0",
|
|
65
65
|
"preact": "11.0.0-beta.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocSearchAskAiModal-CCrk6YLb.js","names":[],"sources":["../../src/icons/MessageIcon.tsx","../../src/AggregatedSearchBlock.tsx","../../src/AskAiScreen.tsx","../../src/components/ui/RecentConversationsResults.tsx","../../src/components/AskAiStartScreen.tsx","../../src/ConversationHistoryScreen.tsx","../../src/NewConversationScreen.tsx","../../src/AskAiScreenState.tsx","../../src/ModalHeading.tsx","../../src/components/AskAiSearchBox.tsx","../../src/utils/createAskAiSources.ts","../../src/DocSearchAskAiModal.tsx"],"sourcesContent":["import React, { type JSX } from 'react';\n\nexport function MessageIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n","import React, { type JSX, Fragment } from 'react';\n\nimport type { AskAiScreenTranslations } from './AskAiScreen';\nimport { SearchIcon } from './icons';\n\ninterface AggregatedSearchBlockProps {\n queries: string[];\n translations: AskAiScreenTranslations;\n onSearchQueryClick: (query: string) => void;\n}\n\n// allow translators to return either simple string parts or a fully custom node\nexport interface AggregatedToolCallParts {\n before?: string;\n separator?: string;\n lastSeparator?: string;\n after?: string;\n}\n\n// default english implementation (\"Searched for \\\"A\\\", \\\"B\\\" and \\\"C\\\"\")\nconst defaultAggregatedToolCallParts: AggregatedToolCallParts = {\n before: 'Searched for ',\n separator: ', ',\n lastSeparator: ' and ',\n after: '',\n};\n\nexport function AggregatedSearchBlock({\n queries,\n translations,\n onSearchQueryClick,\n}: AggregatedSearchBlockProps): JSX.Element | null {\n // no queries? no render\n if (queries.length === 0) return null;\n\n // if the translator provides a fully custom node, render it and bail out.\n if (typeof translations.aggregatedToolCallNode === 'function') {\n return (\n <>{translations.aggregatedToolCallNode(queries, onSearchQueryClick)}</>\n );\n }\n\n // otherwise fall back to the classic english-pattern renderer.\n const parts = translations.aggregatedToolCallText\n ? translations.aggregatedToolCallText(queries)\n : defaultAggregatedToolCallParts;\n\n const {\n before = '',\n separator = ', ',\n lastSeparator = ' and ',\n after = '',\n } = parts || {};\n\n return (\n <div className=\"DocSearch-AskAiScreen-MessageContent-Tool Tool--AggregatedResult\">\n <SearchIcon size={18} />\n <span>\n {before && <span>{before}</span>}\n {queries.map((q, idx) => (\n // eslint-disable-next-line react/no-array-index-key\n <Fragment key={q + idx}>\n <span\n role=\"button\"\n tabIndex={0}\n className=\"DocSearch-AskAiScreen-MessageContent-Tool-Query\"\n onKeyDown={(e) => {\n if (e.key === 'enter' || e.key === ' ') {\n e.preventDefault();\n onSearchQueryClick(q);\n }\n }}\n onClick={() => onSearchQueryClick(q)}\n >\n "{q}"\n </span>\n {idx < queries.length - 2 && separator}\n {idx === queries.length - 2 && lastSeparator}\n </Fragment>\n ))}\n {after && <span>{after}</span>}\n </span>\n </div>\n );\n}\n","import type { UseChatHelpers } from '@ai-sdk/react';\nimport React, { type JSX, useMemo } from 'react';\n\nimport { AggregatedSearchBlock } from './AggregatedSearchBlock';\nimport type { AskAiScreenStateProps } from './AskAiScreenState';\nimport { ConversationPromptSuggestions } from './components/ConversationPromptSuggestions';\nimport { FeedbackActions } from './components/FeedbackActions';\nimport { SourcesPanel } from './components/SourcesPanel';\nimport { ToolCall, type ToolCallTranslations } from './components/ToolCall';\nimport { AlertIcon, LoadingIcon, SparklesIcon } from './icons';\nimport { MemoizedMarkdown } from './MemoizedMarkdown';\nimport type { StoredSearchPlugin } from './stored-searches';\nimport type {\n InternalDocSearchHit,\n OnAskAiFeedback,\n StoredAskAiState,\n} from './types';\nimport { type AIMessage, type ToolCalls } from './types/AskiAi';\nimport {\n extractLinksFromMessage,\n getMessageContent,\n isThreadDepthError,\n isAIToolPart,\n getAgentPromptSuggestions,\n} from './utils/ai';\nimport { groupConsecutiveToolResults } from './utils/groupConsecutiveToolResults';\n\nexport type AskAiScreenTranslations = Partial<\n // Inherit the shared tool-call translations, but expose the search-related\n // keys under AskAiScreen's own public names (see mapping below).\n Omit<ToolCallTranslations, 'searchingText' | 'toolCallResultText'> & {\n // Misc texts\n disclaimerText: string;\n relatedSourcesText: string;\n thinkingText: string;\n copyButtonText: string;\n copyButtonCopiedText: string;\n // Feedback buttons\n copyButtonTitle: string;\n likeButtonTitle: string;\n dislikeButtonTitle: string;\n thanksForFeedbackText: string;\n // Negative feedback note panel\n feedbackPanelTitle: string;\n feedbackDetailsPlaceholder: string;\n feedbackDisclaimerText: string;\n feedbackSubmitButtonText: string;\n feedbackCloseButtonTitle: string;\n feedbackTagIncorrect: string;\n feedbackTagNotWhatIAsked: string;\n feedbackTagSlowOrBuggy: string;\n feedbackTagStyleOrTone: string;\n feedbackTagSafetyOrLegal: string;\n feedbackTagOther: string;\n // Tool call texts\n /**\n * Text shown while assistant is performing search tool call. Maps to\n * `ToolCallTranslations.searchingText`.\n */\n duringToolCallText: string;\n /**\n * Text shown while assistant is finished performing tool call. Maps to\n * `ToolCallTranslations.toolCallResultText`.\n */\n afterToolCallText: string;\n /**\n * Build the full jsx element for the aggregated search block. If provided,\n * completely overrides the default english renderer.\n */\n aggregatedToolCallNode?: (\n queries: string[],\n onSearchQueryClick: (query: string) => void\n ) => React.ReactNode;\n /**\n * Generate the list connective parts only (backwards compatibility).\n * Receives full list of queries and should return translation parts for\n * before/after/separators. Example: (qs) => ({ before: 'searched for ',\n * separator: ', ', lastSeparator: ' and ', after: '' }).\n */\n aggregatedToolCallText?: (queries: string[]) => {\n before?: string;\n separator?: string;\n lastSeparator?: string;\n after?: string;\n };\n /** Message that's shown when user has stopped the streaming of a message. */\n stoppedStreamingText: string;\n /** Error title shown if there is an error while chatting. */\n errorTitleText: string;\n /** Message shown when thread depth limit is exceeded (AI-217 error). */\n threadDepthExceededMessage: string;\n /** Button text for starting a new conversation after thread depth error. */\n startNewConversationButtonText: string;\n suggestedPromptsTitleText: string;\n }\n>;\n\n/**\n * Maps AskAiScreen's public translation keys to the shared\n * `ToolCallTranslations` shape consumed by the `ToolCall` component, applying\n * default English values.\n */\nfunction toToolCallTranslations(\n translations: AskAiScreenTranslations\n): ToolCallTranslations {\n const {\n preToolCallText = 'Searching...',\n duringToolCallText = 'Searching...',\n afterToolCallText = 'Searched for',\n savedMemoryToolResultText = 'Saved to memory',\n memoryToolResultText = 'Used memory to enhance results',\n } = translations;\n\n return {\n preToolCallText,\n searchingText: duringToolCallText,\n toolCallResultText: afterToolCallText,\n savedMemoryToolResultText,\n memoryToolResultText,\n };\n}\n\ntype AskAiScreenProps = Omit<\n AskAiScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n messages: AIMessage[];\n tools: ToolCalls;\n status: UseChatHelpers<AIMessage>['status'];\n askAiError?: Error;\n translations?: AskAiScreenTranslations;\n onNewConversation: () => void;\n onSelectPromptSuggestion: (prompt: string) => void;\n memoryEnabled?: boolean;\n};\n\ninterface AskAiScreenHeaderProps {\n disclaimerText: string;\n}\n\nexport interface Exchange {\n id: string;\n userMessage: AIMessage;\n assistantMessage: AIMessage | null;\n}\n\nfunction AskAiScreenDisclaimer({\n disclaimerText,\n}: AskAiScreenHeaderProps): JSX.Element {\n return (\n <p className=\"DocSearch-AskAiScreen-Disclaimer\">\n <SparklesIcon /> {disclaimerText}\n </p>\n );\n}\n\ninterface AskAiExchangeCardProps {\n exchange: Exchange;\n askAiError?: Error;\n isLastExchange: boolean;\n loadingStatus: UseChatHelpers<AIMessage>['status'];\n onSearchQueryClick: (query: string) => void;\n translations: AskAiScreenTranslations;\n tools: ToolCalls;\n conversations: StoredSearchPlugin<StoredAskAiState>;\n onFeedback?: OnAskAiFeedback;\n memoryEnabled?: boolean;\n onSelectPromptSuggestion: (prompt: string) => void;\n}\n\nfunction AskAiExchangeCard({\n exchange,\n askAiError,\n isLastExchange,\n loadingStatus,\n onSearchQueryClick,\n translations,\n tools,\n conversations,\n onFeedback,\n memoryEnabled,\n onSelectPromptSuggestion,\n}: AskAiExchangeCardProps): JSX.Element {\n const { userMessage, assistantMessage } = exchange;\n\n const {\n stoppedStreamingText = 'You stopped this response',\n errorTitleText = 'Chat error',\n relatedSourcesText,\n suggestedPromptsTitleText = 'Suggested prompts',\n } = translations;\n\n const toolCallTranslations = useMemo(\n () => toToolCallTranslations(translations),\n [translations]\n );\n\n const isThreadDepth = isThreadDepthError(askAiError);\n\n const assistantContent = useMemo(\n () => getMessageContent(assistantMessage),\n [assistantMessage]\n );\n const userContent = useMemo(\n () => getMessageContent(userMessage),\n [userMessage]\n );\n\n const urlsToDisplay = React.useMemo(\n () => extractLinksFromMessage(assistantMessage),\n [assistantMessage]\n );\n\n const displayParts = React.useMemo(() => {\n return groupConsecutiveToolResults(assistantMessage?.parts || []);\n }, [assistantMessage]);\n\n const promptSuggestions = useMemo(() => {\n if (!isLastExchange) return [];\n return getAgentPromptSuggestions(assistantMessage?.parts || []);\n }, [assistantMessage, isLastExchange]);\n\n const wasStopped =\n userMessage.metadata?.stopped || assistantMessage?.metadata?.stopped;\n\n const showActions =\n !wasStopped &&\n (!isLastExchange ||\n (isLastExchange &&\n loadingStatus === 'ready' &&\n Boolean(assistantMessage)));\n\n const isThinking =\n ['submitted', 'streaming'].includes(loadingStatus) &&\n isLastExchange &&\n !displayParts.some((part) => part.type !== 'step-start');\n\n const messageId = assistantMessage?.id || exchange.id;\n\n return (\n <div className=\"DocSearch-AskAiScreen-Response-Container\">\n <div className=\"DocSearch-AskAiScreen-Response\">\n <div className=\"DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user\">\n <p className=\"DocSearch-AskAiScreen-Query\">\n {userContent?.text ?? ''}\n </p>\n </div>\n <div className=\"DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant\">\n <div className=\"DocSearch-AskAiScreen-MessageContent\">\n {loadingStatus === 'error' &&\n askAiError &&\n isLastExchange &&\n !isThreadDepth && (\n <div className=\"DocSearch-AskAiScreen-Error\" role=\"alert\">\n <AlertIcon aria-hidden=\"true\" />\n <div className=\"DocSearch-AskAiScreen-Error-Content\">\n <h4 className=\"DocSearch-AskAiScreen-Error-Title\">\n {errorTitleText}\n </h4>\n <MemoizedMarkdown\n content={askAiError.message}\n copyButtonText=\"\"\n copyButtonCopiedText=\"\"\n isStreaming={false}\n />\n </div>\n </div>\n )}\n {isThinking && (\n <div\n className=\"DocSearch-AskAiScreen-MessageContent-Thinking\"\n role=\"status\"\n >\n <span className=\"shimmer\">\n {translations.thinkingText || 'Thinking...'}\n </span>\n <span className=\"DocSearch-AskAi-Thinking-Skeleton shimmer\" />\n <span className=\"DocSearch-AskAi-Thinking-Skeleton DocSearch-AskAi-Thinking-Skeleton--short shimmer\" />\n </div>\n )}\n {displayParts.map((part, idx) => {\n const index = idx;\n\n if (typeof part === 'string') {\n return (\n <MemoizedMarkdown\n key={index}\n content={part}\n copyButtonText={translations.copyButtonText || 'Copy'}\n copyButtonCopiedText={\n translations.copyButtonCopiedText || 'Copied!'\n }\n isStreaming={loadingStatus === 'streaming'}\n />\n );\n }\n\n if (isAIToolPart(part)) {\n return (\n <ToolCall\n key={index}\n translations={toolCallTranslations}\n part={part}\n tools={tools}\n memoryEnabled={memoryEnabled}\n onSearchQueryClick={onSearchQueryClick}\n />\n );\n }\n\n if (part.type === 'aggregated-tool-call') {\n return (\n <AggregatedSearchBlock\n key={index}\n queries={part.queries}\n translations={translations}\n onSearchQueryClick={onSearchQueryClick}\n />\n );\n }\n\n if (part.type === 'reasoning' && part.state === 'streaming') {\n return (\n <div\n key={index}\n className=\"DocSearch-AskAiScreen-MessageContent-Reasoning shimmer\"\n >\n <LoadingIcon className=\"DocSearch-AskAiScreen-SmallerLoadingIcon\" />\n <span className=\"shimmer\">Reasoning...</span>\n </div>\n );\n }\n\n if (part.type === 'text') {\n return (\n <MemoizedMarkdown\n key={index}\n content={part.text}\n copyButtonText={translations.copyButtonText || 'Copy'}\n copyButtonCopiedText={\n translations.copyButtonCopiedText || 'Copied!'\n }\n isStreaming={part.state === 'streaming'}\n />\n );\n }\n\n // fallback for unknown part type\n return null;\n })}\n </div>\n\n {wasStopped && (\n <p className=\"DocSearck-AskAiScreen-MessageContent-Stopped\">\n {stoppedStreamingText}\n </p>\n )}\n </div>\n <div className=\"DocSearch-AskAiScreen-Answer-Footer\">\n <SourcesPanel links={urlsToDisplay} titleText={relatedSourcesText} />\n <FeedbackActions\n id={messageId}\n showActions={showActions}\n latestAssistantMessageContent={assistantContent?.text || null}\n translations={translations}\n conversations={conversations}\n onFeedback={onFeedback}\n />\n </div>\n\n {promptSuggestions.length > 0 && (\n <ConversationPromptSuggestions\n title={suggestedPromptsTitleText}\n suggestions={promptSuggestions}\n onSelectPromptSuggestion={onSelectPromptSuggestion}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport function AskAiScreen({\n translations = {},\n ...props\n}: AskAiScreenProps): JSX.Element | null {\n const {\n disclaimerText = 'Answers are generated with AI which can make mistakes.',\n threadDepthExceededMessage = 'This conversation is now closed to keep responses accurate.',\n startNewConversationButtonText = 'Start a new conversation',\n } = translations;\n\n const { messages, tools, askAiError, status, memoryEnabled } = props;\n\n // Check if there's a thread depth error\n const hasThreadDepthError = useMemo(() => {\n return status === 'error' && isThreadDepthError(askAiError);\n }, [status, askAiError]);\n\n // Group messages into exchanges (user + assistant pairs)\n const exchanges: Exchange[] = useMemo(() => {\n const grouped: Exchange[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'user') {\n const userMessage = messages[i];\n const assistantMessage =\n messages[i + 1]?.role === 'assistant' ? messages[i + 1] : null;\n grouped.push({ id: userMessage.id, userMessage, assistantMessage });\n if (assistantMessage) {\n i++;\n }\n }\n }\n\n // If there's a thread depth error, remove the last exchange (the one that triggered the error)\n // We only want to show successful exchanges\n if (hasThreadDepthError && grouped.length > 0) {\n // Check if the last exchange has no assistant message (failed to complete)\n const lastExchange = grouped[grouped.length - 1];\n if (!lastExchange.assistantMessage) {\n grouped.pop();\n }\n }\n\n return grouped;\n }, [messages, hasThreadDepthError]);\n\n const handleSearchQueryClick = (query: string): void => {\n props.onAskAiToggle(false);\n props.setQuery(query);\n };\n\n // Only show the thread depth error if we have assistant messages\n const showThreadDepthError =\n hasThreadDepthError && messages.some((m) => m.role === 'assistant');\n\n return (\n <div className=\"DocSearch-AskAiScreen DocSearch-AskAiScreen-Container\">\n {/* Thread Depth Error */}\n {showThreadDepthError && (\n <div className=\"DocSearch-AskAiScreen-MessageContent DocSearch-AskAiScreen-Error DocSearch-AskAiScreen-Error--ThreadDepth\">\n <div className=\"DocSearch-AskAiScreen-Error-Content\">\n <p>\n {threadDepthExceededMessage}{' '}\n <button\n type=\"button\"\n className=\"DocSearch-ThreadDepthError-Link\"\n onClick={props.onNewConversation}\n >\n {startNewConversationButtonText}\n </button>{' '}\n to continue.\n </p>\n </div>\n </div>\n )}\n\n <AskAiScreenDisclaimer disclaimerText={disclaimerText} />\n\n <div className=\"DocSearch-AskAiScreen-Body\">\n <div className=\"DocSearch-AskAiScreen-ExchangesList\">\n {exchanges\n .slice()\n .reverse()\n .map((exchange, index) => (\n <AskAiExchangeCard\n key={exchange.id}\n exchange={exchange}\n askAiError={props.askAiError}\n isLastExchange={index === 0}\n loadingStatus={props.status}\n translations={translations}\n tools={tools}\n conversations={props.conversations}\n memoryEnabled={memoryEnabled}\n onSearchQueryClick={handleSearchQueryClick}\n onFeedback={props.onFeedback}\n onSelectPromptSuggestion={props.onSelectPromptSuggestion}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { AskAiScreenStateProps } from '../../AskAiScreenState';\nimport { CloseIcon, MessageIcon } from '../../icons';\nimport { Results } from '../../Results';\nimport type { InternalDocSearchHit } from '../../types';\nimport { getCollection } from '../../utils';\n\nexport type RecentConversationsResultsTranslations = Partial<{\n recentConversationsTitle: string;\n removeRecentConversationButtonTitle: string;\n}>;\n\ntype RecentConversationsResultsProps = Omit<\n AskAiScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n translations?: RecentConversationsResultsTranslations;\n};\n\nexport function RecentConversationsResults({\n translations = {},\n ...props\n}: RecentConversationsResultsProps): JSX.Element | null {\n const {\n recentConversationsTitle = 'Resume AI conversations',\n removeRecentConversationButtonTitle = 'Remove this conversation from history',\n } = translations;\n const recentConversations = getCollection(props.state, 'recentConversations');\n\n if (!recentConversations) {\n return null;\n }\n\n return (\n <Results\n {...props}\n title={recentConversationsTitle}\n collection={recentConversations}\n renderIcon={() => (\n <div className=\"DocSearch-Hit-icon DocSearch-Hit-icon--small\">\n <MessageIcon />\n </div>\n )}\n renderAction={({ item }) => (\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button\"\n title={removeRecentConversationButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.conversations.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n )}\n />\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { AskAiScreenStateProps } from '../AskAiScreenState';\nimport type { InternalDocSearchHit } from '../types';\n\nimport type { RecentConversationsResultsTranslations } from './ui/RecentConversationsResults';\nimport { RecentConversationsResults } from './ui/RecentConversationsResults';\nimport type { StoredSearchesSectionsTranslations } from './ui/StoredSearchesSections';\nimport { StoredSearchesSections } from './ui/StoredSearchesSections';\n\nexport type AskAiStartScreenTranslations =\n RecentConversationsResultsTranslations & StoredSearchesSectionsTranslations;\n\ntype AskAiStartScreenProps = Omit<\n AskAiScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n hasCollections: boolean;\n translations?: AskAiStartScreenTranslations;\n};\n\nexport function AskAiStartScreen({\n translations = {},\n ...props\n}: AskAiStartScreenProps): JSX.Element | null {\n return (\n <div className=\"DocSearch-Dropdown-Container\">\n <RecentConversationsResults {...props} translations={translations} />\n <StoredSearchesSections {...props} translations={translations} />\n </div>\n );\n}\n","import type { JSX } from 'react';\nimport React from 'react';\n\nimport type { AskAiScreenStateProps } from './AskAiScreenState';\nimport { CloseIcon, SparklesIcon } from './icons';\nimport { Results } from './Results';\nimport type { ResultsScreenTranslations } from './ResultsScreen';\nimport type { InternalDocSearchHit } from './types';\nimport { getCollection } from './utils';\n\ntype ConversationHistoryScreenProps = Omit<\n AskAiScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n translations?: ResultsScreenTranslations;\n};\n\nexport function ConversationHistoryScreen({\n onAskAiToggle,\n ...props\n}: ConversationHistoryScreenProps): JSX.Element | null {\n const collection = React.useMemo(\n () => getCollection(props.state, 'recentConversations'),\n [props.state]\n );\n\n React.useEffect(() => {\n if (!collection || collection.items.length === 0) {\n onAskAiToggle(true);\n }\n }, [collection, onAskAiToggle]);\n\n if (!collection) {\n return null;\n }\n\n return (\n <div className=\"DocSearch-Dropdown-Container DocSearch-Conversation-History\">\n <Results\n {...props}\n key={collection.source.sourceId}\n title=\"\"\n translations={props.translations}\n collection={collection}\n renderIcon={() => (\n <div className=\"DocSearch-Hit-icon\">\n <SparklesIcon />\n </div>\n )}\n renderAction={({ item }) => (\n <div className=\"DocSearch-Hit-action\">\n <button\n type=\"button\"\n className=\"DocSearch-Hit-action-button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n props.conversations.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n )}\n />\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { SuggestedQuestionHit } from './types';\n\nexport type NewConversationTranslations = Partial<{\n newConversationTitle: string;\n newConversationDescription: string;\n}>;\n\ninterface NewConversationProps {\n suggestedQuestions?: SuggestedQuestionHit[];\n selectSuggestedQuestion: (question: SuggestedQuestionHit) => void;\n translations?: NewConversationTranslations;\n}\n\nexport function NewConversationScreen({\n translations = {},\n suggestedQuestions = [],\n selectSuggestedQuestion,\n}: NewConversationProps): JSX.Element {\n const {\n newConversationTitle = 'How can I help you today?',\n newConversationDescription = 'I search through your documentation to help you find setup guides, feature details and troubleshooting tips, fast.',\n } = translations;\n\n return (\n <div className=\"DocSearch-NewConversationScreen\">\n <h3 className=\"DocSearch-NewConversationScreen-Title\">\n {newConversationTitle}\n </h3>\n <p className=\"DocSearch-NewConversationScreen-Description\">\n {newConversationDescription}\n </p>\n\n <div className=\"DocSearch-NewConversationScreen-SuggestedQuestions\">\n {suggestedQuestions.map((question) => (\n <button\n key={question.objectID}\n type=\"button\"\n className=\"DocSearch-NewConversationScreen-SuggestedQuestion\"\n onClick={() => selectSuggestedQuestion(question)}\n >\n {question.question}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { UseChatHelpers } from '@ai-sdk/react';\nimport type {\n AutocompleteApi,\n AutocompleteState,\n BaseItem,\n} from '@algolia/autocomplete-core';\nimport type { JSX } from 'react';\nimport React from 'react';\n\nimport type { AskAiScreenTranslations } from './AskAiScreen';\nimport { AskAiScreen } from './AskAiScreen';\nimport type { AskAiStartScreenTranslations } from './components/AskAiStartScreen';\nimport { AskAiStartScreen } from './components/AskAiStartScreen';\nimport { ConversationHistoryScreen } from './ConversationHistoryScreen';\nimport type { DocSearchProps } from './DocSearch';\nimport type { ErrorScreenTranslations } from './ErrorScreen';\nimport { ErrorScreen } from './ErrorScreen';\nimport type { NewConversationTranslations } from './NewConversationScreen';\nimport { NewConversationScreen } from './NewConversationScreen';\nimport type { NoResultsScreenTranslations } from './NoResultsScreen';\nimport { NoResultsScreen } from './NoResultsScreen';\nimport type { ResultsScreenTranslations } from './ResultsScreen';\nimport { ResultsScreen } from './ResultsScreen';\nimport type { StoredSearchPlugin } from './stored-searches';\nimport type {\n InternalDocSearchHit,\n OnAskAiFeedback,\n StoredAskAiState,\n StoredDocSearchHit,\n SuggestedQuestionHit,\n} from './types';\nimport type { AIMessage, AskAiState, ToolCalls } from './types/AskiAi';\n\nexport type AskAiScreenStateTranslations = Partial<{\n errorScreen: ErrorScreenTranslations;\n startScreen: AskAiStartScreenTranslations;\n noResultsScreen: NoResultsScreenTranslations;\n resultsScreen: ResultsScreenTranslations;\n askAiScreen: AskAiScreenTranslations;\n newConversation: NewConversationTranslations;\n}>;\n\nexport interface AskAiScreenStateProps<\n TItem extends BaseItem,\n> extends AutocompleteApi<\n TItem,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n state: AutocompleteState<TItem>;\n recentSearches: StoredSearchPlugin<StoredDocSearchHit>;\n favoriteSearches: StoredSearchPlugin<StoredDocSearchHit>;\n conversations: StoredSearchPlugin<StoredAskAiState>;\n onItemClick: (\n item: InternalDocSearchHit,\n event: KeyboardEvent | MouseEvent\n ) => void;\n onAskAiToggle: (toggle: boolean) => void;\n isAskAiActive: boolean;\n canHandleAskAi: boolean;\n inputRef: React.MutableRefObject<HTMLInputElement | null>;\n hitComponent: DocSearchProps['hitComponent'];\n indexName: DocSearchProps['indexName'];\n messages: UseChatHelpers<AIMessage>['messages'];\n tools: ToolCalls;\n status: UseChatHelpers<AIMessage>['status'];\n askAiError?: Error;\n disableUserPersonalization: boolean;\n resultsFooterComponent: DocSearchProps['resultsFooterComponent'];\n translations: AskAiScreenStateTranslations;\n getMissingResultsUrl?: DocSearchProps['getMissingResultsUrl'];\n hasCollections: boolean;\n onFeedback?: OnAskAiFeedback;\n askAiState: AskAiState;\n selectAskAiQuestion: (toggle: boolean, query: string) => void;\n suggestedQuestions: SuggestedQuestionHit[];\n selectSuggestedQuestion: (question: SuggestedQuestionHit) => void;\n onNewConversation: () => void;\n memoryEnabled?: boolean;\n resultBadgeKey?: string;\n}\n\nexport const AskAiScreenState = React.memo(\n ({\n translations = {},\n selectAskAiQuestion,\n ...props\n }: AskAiScreenStateProps<InternalDocSearchHit>): JSX.Element => {\n const handleSelectPromptSuggestion = React.useCallback(\n (prompt: string) => {\n selectAskAiQuestion(true, prompt);\n },\n [selectAskAiQuestion]\n );\n\n if (\n props.canHandleAskAi &&\n props.isAskAiActive &&\n props.askAiState === 'conversation-history'\n ) {\n return (\n <ConversationHistoryScreen\n selectAskAiQuestion={selectAskAiQuestion}\n {...props}\n />\n );\n }\n\n if (\n props.canHandleAskAi &&\n props.isAskAiActive &&\n props.askAiState === 'new-conversation'\n ) {\n return (\n <NewConversationScreen\n translations={translations?.newConversation}\n selectSuggestedQuestion={props.selectSuggestedQuestion}\n suggestedQuestions={props.suggestedQuestions}\n />\n );\n }\n\n if (props.isAskAiActive && props.canHandleAskAi) {\n return (\n <AskAiScreen\n {...props}\n messages={props.messages}\n tools={props.tools}\n status={props.status}\n askAiError={props.askAiError}\n translations={translations?.askAiScreen}\n memoryEnabled={props.memoryEnabled}\n selectAskAiQuestion={selectAskAiQuestion}\n onSelectPromptSuggestion={handleSelectPromptSuggestion}\n />\n );\n }\n\n if (props.state?.status === 'error') {\n return <ErrorScreen translations={translations?.errorScreen} />;\n }\n\n if (!props.state.query) {\n return (\n <AskAiStartScreen\n {...props}\n hasCollections={props.hasCollections}\n translations={translations?.startScreen}\n selectAskAiQuestion={selectAskAiQuestion}\n />\n );\n }\n\n if (!props.hasCollections && !props.canHandleAskAi) {\n return (\n <NoResultsScreen\n {...props}\n translations={translations?.noResultsScreen}\n />\n );\n }\n\n return (\n <>\n <ResultsScreen {...props} translations={translations?.resultsScreen} />\n {props.canHandleAskAi &&\n !props.hasCollections && (\n // if there's one collection it is the ask ai action, show the no results screen\n <NoResultsScreen\n {...props}\n translations={translations?.noResultsScreen}\n />\n )}\n </>\n );\n },\n function areEqual(_prevProps, nextProps) {\n // We don't update the screen when Autocomplete is loading or stalled to\n // avoid UI flashes:\n // - Empty screen → Results screen\n // - NoResults screen → NoResults screen with another query\n return (\n nextProps.state.status === 'loading' ||\n nextProps.state.status === 'stalled'\n );\n }\n);\n","import React from 'react';\nimport type { JSX } from 'react';\n\ntype ModalHeadingProps = {\n heading: string;\n shimmer?: boolean;\n};\n\nexport function ModalHeading({\n heading,\n shimmer = false,\n}: ModalHeadingProps): JSX.Element {\n return (\n <span className={`DocSearch-Modal-heading${shimmer ? ' shimmer' : ''}`}>\n {heading}\n </span>\n );\n}\n","import type { UseChatHelpers } from '@ai-sdk/react';\nimport type {\n AutocompleteApi,\n AutocompleteState,\n} from '@algolia/autocomplete-core';\nimport React, { type JSX, type RefObject } from 'react';\n\nimport {\n ConversationHistoryIcon,\n MoreVerticalIcon,\n NewConversationIcon,\n StopIcon,\n BackIcon,\n} from '../icons';\nimport { Menu } from '../Menu';\nimport { ModalHeading } from '../ModalHeading';\nimport type { InternalDocSearchHit } from '../types';\nimport type { AIMessage, AskAiState } from '../types/AskiAi';\nimport { getCollection } from '../utils';\n\nimport { SearchBoxForm } from './ui/SearchBoxForm';\n\nexport type AskAiSearchBoxTranslations = Partial<{\n clearButtonTitle: string;\n clearButtonAriaLabel: string;\n closeButtonText: string;\n closeButtonAriaLabel: string;\n placeholderText: string;\n placeholderTextAskAi: string;\n placeholderTextAskAiStreaming: string;\n enterKeyHint: string;\n enterKeyHintAskAi: string;\n searchInputLabel: string;\n backToKeywordSearchButtonText: string;\n backToKeywordSearchButtonAriaLabel: string;\n newConversationPlaceholder: string;\n conversationHistoryTitle: string;\n startNewConversationText: string;\n viewConversationHistoryText: string;\n threadDepthErrorPlaceholder: string;\n}>;\n\ninterface AskAiSearchBoxProps extends AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n state: AutocompleteState<InternalDocSearchHit>;\n autoFocus: boolean;\n inputRef: RefObject<HTMLInputElement | null>;\n onClose: () => void;\n onAskAiToggle: (toggle: boolean) => void;\n onAskAgain: (query: string) => void;\n onStopAskAiStreaming: () => Promise<void>;\n placeholder: string;\n isAskAiActive: boolean;\n askAiStatus: UseChatHelpers<AIMessage>['status'];\n askAiError?: Error;\n isFromSelection: boolean;\n translations?: AskAiSearchBoxTranslations;\n askAiState: AskAiState;\n setAskAiState: (state: AskAiState) => void;\n onNewConversation: () => void;\n onViewConversationHistory: () => void;\n isThreadDepthError?: boolean;\n}\n\nexport function AskAiSearchBox({\n translations = {},\n askAiState,\n onAskAiToggle,\n setAskAiState,\n ...props\n}: AskAiSearchBoxProps): JSX.Element {\n const {\n clearButtonTitle = 'Clear',\n clearButtonAriaLabel = 'Clear the query',\n closeButtonText = 'Close',\n closeButtonAriaLabel = 'Close',\n searchInputLabel = 'Search',\n backToKeywordSearchButtonText = 'Back to keyword search',\n backToKeywordSearchButtonAriaLabel = 'Back to keyword search',\n placeholderTextAskAiStreaming = 'Answering...',\n newConversationPlaceholder = 'Ask a question',\n conversationHistoryTitle = 'My conversation history',\n startNewConversationText = 'Start a new conversation',\n viewConversationHistoryText = 'Conversation history',\n threadDepthErrorPlaceholder = 'Conversation limit reached',\n } = translations;\n\n const hasRecentConversations = React.useMemo(() => {\n const askAiSource = getCollection(props.state, 'recentConversations');\n\n if (!askAiSource) {\n return false;\n }\n\n return askAiSource.items.length > 0;\n }, [props.state]);\n\n const baseInputProps = props.getInputProps({\n inputElement: props.inputRef.current!,\n autoFocus: props.autoFocus,\n });\n const blockedKeys = new Set(['ArrowUp', 'ArrowDown', 'Enter']);\n const origOnKeyDown = baseInputProps.onKeyDown;\n const origOnChange = baseInputProps.onChange;\n const isAskAiStreaming =\n props.askAiStatus === 'streaming' || props.askAiStatus === 'submitted';\n const renderMoreOptions =\n props.isAskAiActive && askAiState !== 'conversation-history';\n\n // Use the thread depth error state passed from parent\n const isThreadDepthError = props.isThreadDepthError || false;\n let searchPlaceholder = props.placeholder;\n\n if (askAiState === 'new-conversation') {\n searchPlaceholder = newConversationPlaceholder;\n }\n\n // Override placeholder when thread depth error occurs (only in Ask AI mode)\n if (isThreadDepthError && props.isAskAiActive) {\n searchPlaceholder = threadDepthErrorPlaceholder;\n }\n\n let heading: string | null = null;\n\n if (isAskAiStreaming) {\n heading = placeholderTextAskAiStreaming;\n }\n\n if (askAiState === 'conversation-history') {\n heading = conversationHistoryTitle;\n }\n\n // when returning to another status than streaming or submitted, we focus on the input\n React.useEffect(() => {\n if (\n props.askAiStatus !== 'streaming' &&\n props.askAiStatus !== 'submitted' &&\n props.inputRef.current\n ) {\n props.inputRef.current.focus();\n }\n }, [props.askAiStatus, props.inputRef]);\n\n /**\n * We need to block the default behavior of the input when Ask AI is active.\n * This is because the input is used to ask another question when the user\n * presses enter.\n *\n * Learn more on default autocomplete behavior:\n * https://github.com/algolia/autocomplete/blob/next/packages/autocomplete-core/src/getDefaultProps.ts.\n */\n const inputProps = {\n enterKeyHint: props.isAskAiActive\n ? ('enter' as const)\n : ('search' as const),\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>): void => {\n let askAiHandled = false;\n // block these up, down, enter listeners when Ask AI is active\n if (props.isAskAiActive && blockedKeys.has(e.key)) {\n // enter key asks another question\n if (e.key === 'Enter' && !isAskAiStreaming && props.state.query) {\n props.onAskAgain(props.state.query);\n }\n\n askAiHandled = true;\n }\n\n if (askAiHandled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n origOnKeyDown?.(e);\n },\n onChange: (e: React.ChangeEvent<HTMLInputElement>): void => {\n if (props.isAskAiActive) {\n props.setQuery(e.currentTarget.value);\n // block search when Ask AI is active\n // we don't want to trigger the search when the user types\n // we already know they are asking a question\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n origOnChange?.(e);\n },\n disabled: isAskAiStreaming || (isThreadDepthError && props.isAskAiActive),\n };\n\n const handleAskAiBackClick = React.useCallback((): void => {\n // If there's a thread depth error, start a new conversation instead of exiting\n if (isThreadDepthError) {\n props.onNewConversation();\n return;\n }\n\n if (askAiState === 'conversation-history') {\n onAskAiToggle(true);\n setAskAiState('initial');\n return;\n }\n\n onAskAiToggle(false);\n }, [askAiState, isThreadDepthError, onAskAiToggle, setAskAiState, props]);\n\n const leadingElement = props.isAskAiActive ? (\n <button\n type=\"button\"\n tabIndex={0}\n className=\"DocSearch-Action DocSearch-AskAi-Return\"\n title={backToKeywordSearchButtonText}\n aria-label={backToKeywordSearchButtonAriaLabel}\n onClick={handleAskAiBackClick}\n >\n <BackIcon />\n </button>\n ) : undefined;\n const inputOverlay = heading ? (\n <ModalHeading heading={heading} shimmer={isAskAiStreaming} />\n ) : null;\n const actionsBeforeClose = (\n <>\n {!props.isAskAiActive && (\n <>\n <button\n className=\"DocSearch-Clear\"\n type=\"reset\"\n aria-label={clearButtonAriaLabel}\n hidden={!props.state.query}\n tabIndex={props.state.query ? 0 : -1}\n aria-hidden={!props.state.query ? 'true' : 'false'}\n >\n {clearButtonTitle}\n </button>\n\n {props.state.query && <div className=\"DocSearch-Divider\" />}\n </>\n )}\n\n {isAskAiStreaming && (\n <>\n <button\n type=\"button\"\n className=\"DocSearch-Action DocSearch-StopStreaming\"\n onClick={props.onStopAskAiStreaming}\n >\n <StopIcon />\n </button>\n\n <div className=\"DocSearch-Divider\" />\n </>\n )}\n\n {renderMoreOptions && (\n <>\n <Menu>\n <Menu.Trigger className=\"DocSearch-Action\">\n <MoreVerticalIcon />\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item onClick={props.onNewConversation}>\n <NewConversationIcon />\n {startNewConversationText}\n </Menu.Item>\n {hasRecentConversations && (\n <Menu.Item onClick={props.onViewConversationHistory}>\n <ConversationHistoryIcon />\n {viewConversationHistoryText}\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu>\n\n <div className=\"DocSearch-Divider\" />\n </>\n )}\n </>\n );\n\n return (\n <SearchBoxForm\n {...props}\n placeholder={searchPlaceholder}\n clearButtonTitle={clearButtonTitle}\n clearButtonAriaLabel={clearButtonAriaLabel}\n closeButtonText={closeButtonText}\n closeButtonAriaLabel={closeButtonAriaLabel}\n searchInputLabel={searchInputLabel}\n leadingElement={leadingElement}\n inputOverlay={inputOverlay}\n hideInput={Boolean(heading)}\n actionsBeforeClose={actionsBeforeClose}\n inputProps={inputProps}\n />\n );\n}\n","import type { AutocompleteSource } from '@algolia/autocomplete-core';\nimport type { SearchResponse } from 'algoliasearch/lite';\n\nimport type { DocSearchTransformClient } from '../DocSearch';\nimport type { PromptSuggestions } from '../DocSearchAI';\nimport type { InternalDocSearchHit } from '../types';\nimport type { AIMessage, PromptSuggestion } from '../types/AskiAi';\n\nimport { SOURCE_IDS } from './collections';\n\nconst MAX_RECENT_CONVERSATIONS_DISPLAYED = 3;\n\nconst EMPTY_RESULT_CONTENT = {\n value: '',\n matchLevel: 'none',\n matchedWords: [],\n} satisfies InternalDocSearchHit['_highlightResult']['content'];\nconst EMPTY_HIERARCHY_HIGHLIGHT_RESULT = {\n lvl0: EMPTY_RESULT_CONTENT,\n lvl1: EMPTY_RESULT_CONTENT,\n lvl2: EMPTY_RESULT_CONTENT,\n lvl3: EMPTY_RESULT_CONTENT,\n lvl4: EMPTY_RESULT_CONTENT,\n lvl5: EMPTY_RESULT_CONTENT,\n lvl6: EMPTY_RESULT_CONTENT,\n} satisfies InternalDocSearchHit['_highlightResult']['hierarchy'];\nconst EMPTY_HIGHLIGHT_RESULT: InternalDocSearchHit['_highlightResult'] = {\n content: EMPTY_RESULT_CONTENT,\n hierarchy: EMPTY_HIERARCHY_HIGHLIGHT_RESULT,\n hierarchy_camel: [],\n};\nconst EMPTY_SNIPPET_RESULT: InternalDocSearchHit['_snippetResult'] = {\n content: EMPTY_RESULT_CONTENT,\n hierarchy: EMPTY_HIERARCHY_HIGHLIGHT_RESULT,\n hierarchy_camel: [],\n};\n\nexport function buildRecentConversationSources({\n conversations,\n disableUserPersonalization,\n setMessages,\n onAskAiToggle,\n}: {\n conversations: { getAll: () => unknown[] };\n disableUserPersonalization: boolean;\n setMessages: (messages: AIMessage[]) => void;\n onAskAiToggle: (toggle: boolean) => void;\n}): Array<\n AutocompleteSource<InternalDocSearchHit & { messages?: AIMessage[] }>\n> {\n return [\n {\n sourceId: SOURCE_IDS.recentConversations,\n getItems(): InternalDocSearchHit[] {\n if (disableUserPersonalization) {\n return [];\n }\n return (\n conversations.getAll() as unknown as InternalDocSearchHit[]\n ).slice(0, MAX_RECENT_CONVERSATIONS_DISPLAYED);\n },\n onSelect({ item }): void {\n if (item.messages) {\n setMessages(item.messages);\n onAskAiToggle(true);\n }\n },\n },\n ];\n}\n\nfunction createAskAiHit({\n query,\n objectID,\n lvl0,\n}: {\n query: string;\n objectID: string;\n lvl0: string;\n}): InternalDocSearchHit {\n return {\n type: 'askAI',\n query,\n url_without_anchor: '',\n objectID,\n content: null,\n url: '',\n anchor: null,\n hierarchy: {\n lvl0,\n lvl1: query,\n lvl2: null,\n lvl3: null,\n lvl4: null,\n lvl5: null,\n lvl6: null,\n },\n _highlightResult: EMPTY_HIGHLIGHT_RESULT,\n _snippetResult: EMPTY_SNIPPET_RESULT,\n __docsearch_parent: null,\n };\n}\n\nasync function getPromptSuggestions({\n query,\n indexName,\n searchClient,\n hitsPerPage = 3,\n}: {\n query: string;\n indexName: string;\n searchClient: DocSearchTransformClient;\n hitsPerPage?: number;\n}): Promise<InternalDocSearchHit[]> {\n try {\n const { results } = await searchClient.search<PromptSuggestion>({\n requests: [\n {\n query,\n indexName,\n hitsPerPage,\n attributesToRetrieve: ['prompt'],\n },\n ],\n });\n\n const res = results[0] as SearchResponse<PromptSuggestion>;\n\n return res.hits.map((hit) =>\n createAskAiHit({\n query: hit.prompt,\n objectID: hit.objectID,\n lvl0: 'Prompt Suggestions',\n })\n );\n // NOTE: Not checking the exception here and just returning empty array since this isn't the hot path\n } catch {\n return [];\n }\n}\n\nexport async function buildAskAiActionSources({\n query,\n handleSelectAskAiQuestion,\n promptSuggestionsOptions,\n searchClient,\n}: {\n query: string;\n handleSelectAskAiQuestion: (toggle: boolean, query: string) => void;\n promptSuggestionsOptions?: PromptSuggestions;\n searchClient: DocSearchTransformClient;\n}): Promise<Array<AutocompleteSource<InternalDocSearchHit>>> {\n const promptSuggestions = promptSuggestionsOptions\n ? await getPromptSuggestions({\n query,\n indexName: promptSuggestionsOptions.indexName,\n hitsPerPage: promptSuggestionsOptions.hitsPerPage,\n searchClient,\n })\n : [];\n\n return [\n {\n sourceId: SOURCE_IDS.askAI,\n getItems(): InternalDocSearchHit[] {\n return [\n createAskAiHit({ query, objectID: 'ask-ai-button', lvl0: 'Ask AI' }),\n ...promptSuggestions,\n ];\n },\n onSelect({ item }): void {\n if (item.type === 'askAI' && item.query) {\n handleSelectAskAiQuestion(true, item.query);\n }\n },\n },\n ];\n}\n","import { createAutocomplete } from '@algolia/autocomplete-core';\nimport type { InitialAskAiMessage, OnAskAiToggle } from '@docsearch/core';\nimport type { ChatRequestOptions } from 'ai';\nimport React, { type JSX } from 'react';\n\nimport type { AskAiScreenStateTranslations } from './AskAiScreenState';\nimport { AskAiScreenState } from './AskAiScreenState';\nimport type { AskAiSearchBoxTranslations } from './components/AskAiSearchBox';\nimport { AskAiSearchBox } from './components/AskAiSearchBox';\nimport type { FacetBarTranslations } from './components/FacetBar';\nimport { FacetBar } from './components/FacetBar';\nimport { ModalShell } from './components/ui/ModalShell';\nimport type { DocSearchAIProps } from './DocSearchAI';\nimport type { FooterTranslations } from './Footer';\nimport { Footer } from './Footer';\nimport { Hit } from './Hit';\nimport { useDocSearchFacets } from './hooks/useDocSearchFacets';\nimport { useSendItemClickEvent } from './hooks/useDocSearchInsights';\nimport { useInitialModalQuery } from './hooks/useInitialModalQuery';\nimport { useModalEnvironment } from './hooks/useModalEnvironment';\nimport { useModalRefs } from './hooks/useModalRefs';\nimport { useRefreshOnInitialQuery } from './hooks/useRefreshOnInitialQuery';\nimport { useSaveRecentSearch } from './hooks/useSaveRecentSearch';\nimport { useStoredDocSearches } from './hooks/useStoredDocSearches';\nimport type { NewConversationTranslations } from './NewConversationScreen';\nimport type {\n DocSearchState,\n InternalDocSearchHit,\n OnAskAiFeedback,\n StoredAskAiMessage,\n StoredAskAiState,\n SuggestedQuestionHit,\n} from './types';\nimport { type AskAiState } from './types/AskiAi';\nimport { useAskAi } from './useAskAi';\nimport { useSearchClient } from './useSearchClient';\nimport { useSuggestedQuestions } from './useSuggestedQuestions';\nimport {\n identity,\n isModifierEvent,\n noop,\n scrollTo as scrollToUtils,\n SOURCE_IDS,\n} from './utils';\nimport {\n buildDummyAskAiHit,\n isThreadDepthError,\n EMPTY_TOOLS,\n} from './utils/ai';\nimport {\n buildAskAiActionSources,\n buildRecentConversationSources,\n} from './utils/createAskAiSources';\nimport {\n buildNoQuerySources,\n buildQuerySources,\n type BuildQuerySourcesState,\n} from './utils/createDocSearchSources';\nimport { normalizeDocSearchIndexes } from './utils/normalizeDocSearchIndexes';\n\nexport type DocSearchAskAiModalTranslations = AskAiScreenStateTranslations &\n Partial<{\n searchBox: AskAiSearchBoxTranslations;\n newConversation: NewConversationTranslations;\n footer: FooterTranslations;\n facets: FacetBarTranslations;\n }>;\n\nexport type DocSearchAskAiModalProps = DocSearchAIProps & {\n initialScrollY: number;\n onAskAiToggle: OnAskAiToggle;\n onClose?: () => void;\n isAskAiActive?: boolean;\n translations?: DocSearchAskAiModalTranslations;\n isHybridModeSupported?: boolean;\n};\n\nexport function DocSearchAskAiModal({\n appId,\n apiKey,\n askAi,\n maxResultsPerGroup,\n theme,\n onClose = noop,\n transformItems = identity,\n hitComponent = Hit,\n resultsFooterComponent = (): JSX.Element | null => null,\n navigator,\n initialScrollY = 0,\n transformSearchClient = identity,\n disableUserPersonalization = false,\n initialQuery: initialQueryFromProp = '',\n translations = {},\n getMissingResultsUrl,\n insights = false,\n onAskAiToggle,\n interceptAskAiEvent,\n isAskAiActive = false,\n recentSearchesLimit = 7,\n recentSearchesWithFavoritesLimit = 4,\n indices = [],\n indexName,\n searchParameters,\n facets,\n isHybridModeSupported = false,\n ...props\n}: DocSearchAskAiModalProps): JSX.Element {\n const {\n footer: footerTranslations,\n searchBox: searchBoxTranslations,\n facets: facetBarTranslations,\n ...screenStateTranslations\n } = translations;\n const [state, setState] = React.useState<\n DocSearchState<InternalDocSearchHit>\n >({\n query: '',\n collections: [],\n completion: null,\n context: {},\n isOpen: false,\n activeItemId: null,\n status: 'idle',\n });\n\n // check if the instance is configured to handle ask ai\n const canHandleAskAi = Boolean(askAi);\n\n let placeholder =\n translations?.searchBox?.placeholderText ||\n props.placeholder ||\n 'Search docs';\n\n if (canHandleAskAi) {\n placeholder =\n translations?.searchBox?.placeholderText ||\n 'Search docs or ask AI a question';\n }\n\n if (isAskAiActive) {\n placeholder =\n translations?.searchBox?.placeholderTextAskAi ||\n 'Ask another question...';\n }\n\n const {\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n inputRef,\n snippetLength,\n } = useModalRefs();\n const { initialQuery, initialQueryFromSelection } =\n useInitialModalQuery(initialQueryFromProp);\n\n const searchClient = useSearchClient(appId, apiKey, transformSearchClient);\n\n const askAiConfig = typeof askAi === 'object' ? askAi : null;\n const askAiConfigurationId = askAiConfig\n ? askAiConfig.assistantId\n : (askAi as string);\n const askAiSearchParameters = askAiConfig?.searchParameters;\n const [askAiState, setAskAiState] = React.useState<AskAiState>('initial');\n const suggestedQuestions = useSuggestedQuestions({\n assistantId: askAiConfigurationId,\n searchClient,\n suggestedQuestionsEnabled: askAiConfig?.suggestedQuestions,\n });\n const memoryEnabled = askAiConfig?.memory?.enabled ?? false;\n const tools = askAiConfig?.tools ?? EMPTY_TOOLS;\n\n const indexes = React.useMemo(\n () =>\n normalizeDocSearchIndexes({\n indexName,\n indices,\n searchParameters,\n }),\n [indexName, indices, searchParameters]\n );\n const defaultIndexName = indexes[0].name;\n\n const autocompleteRef =\n React.useRef<\n ReturnType<\n typeof createAutocomplete<\n InternalDocSearchHit,\n React.FormEvent<HTMLFormElement>,\n React.MouseEvent,\n React.KeyboardEvent\n >\n >\n >(undefined);\n\n const {\n visibleFacets,\n facetSelections,\n facetSelectionsRef,\n handleFacetSelectionChange,\n clearFacetSelections,\n } = useDocSearchFacets({\n facets,\n indexes,\n searchClient,\n onSelectionsChange: () => autocompleteRef.current?.refresh(),\n });\n\n const { favoriteSearches, recentSearches } = useStoredDocSearches({\n defaultIndexName,\n recentSearchesLimit,\n recentSearchesWithFavoritesLimit,\n });\n\n const [stoppedStream, setStoppedStream] = React.useState(false);\n\n const {\n chatId,\n messages,\n status,\n setMessages,\n sendMessage,\n stopAskAiStreaming,\n askAiError,\n sendFeedback,\n conversations,\n startNewConversation,\n restoreConversation,\n } = useAskAi({\n assistantId: askAiConfigurationId,\n apiKey: askAiConfig?.apiKey || apiKey,\n appId: askAiConfig?.appId || appId,\n indexName: askAiConfig?.indexName || defaultIndexName,\n searchParameters: askAiSearchParameters,\n tools,\n memory: askAiConfig?.memory,\n indices: askAiConfig?.indices,\n });\n\n const prevStatus = React.useRef(status);\n React.useEffect(() => {\n if (disableUserPersonalization) {\n return;\n }\n // if we just transitioned from \"streaming\" → \"ready\", persist\n if (prevStatus.current === 'streaming' && status === 'ready') {\n // if we stopped the stream, store it on the most recent message\n if (stoppedStream && messages.at(-1)) {\n messages.at(-1)!.metadata = {\n stopped: true,\n };\n }\n\n for (const part of messages[0].parts) {\n if (part.type === 'text') {\n conversations.add(buildDummyAskAiHit(part.text, messages, chatId));\n }\n }\n }\n prevStatus.current = status;\n }, [\n status,\n messages,\n conversations,\n disableUserPersonalization,\n stoppedStream,\n chatId,\n ]);\n\n // Check if there's a thread depth error (AI-217)\n const hasThreadDepthError = React.useMemo(() => {\n return (\n status === 'error' && isThreadDepthError(askAiError as Error | undefined)\n );\n }, [status, askAiError]);\n\n const saveRecentSearch = useSaveRecentSearch({\n favoriteSearches,\n recentSearches,\n disableUserPersonalization,\n });\n const sendItemClickEvent = useSendItemClickEvent(state);\n\n const handleSelectAskAiQuestion = React.useCallback(\n (\n toggle: boolean,\n query: string,\n suggestedQuestion: SuggestedQuestionHit | undefined = undefined\n ) => {\n if (toggle) {\n const initialMessage: InitialAskAiMessage = {\n query,\n suggestedQuestionId: suggestedQuestion?.objectID,\n };\n\n if (interceptAskAiEvent?.(initialMessage)) {\n // Consumer handled it. Avoid *all* default Ask AI behavior.\n if (autocompleteRef.current) {\n autocompleteRef.current.setQuery('');\n }\n return;\n }\n }\n\n if (toggle && askAiState === 'new-conversation') {\n setAskAiState('initial');\n }\n\n onAskAiToggle(toggle, {\n query,\n suggestedQuestionId: suggestedQuestion?.objectID,\n });\n\n // If we're in hybrid mode, we don't need to send the message,\n // it will be handled by the Sidepanel.\n if (isHybridModeSupported) return;\n\n setStoppedStream(false);\n\n const messageOptions: ChatRequestOptions = {};\n\n if (suggestedQuestion) {\n messageOptions.body = {\n suggestedQuestionId: suggestedQuestion.objectID,\n };\n }\n\n sendMessage(\n {\n role: 'user',\n parts: [\n {\n type: 'text',\n text: query,\n },\n ],\n },\n messageOptions\n );\n\n if (dropdownRef.current) {\n // some test environments (like jsdom) don't implement element.scrollTo\n const el = dropdownRef.current;\n if (typeof (el as any).scrollTo === 'function') {\n el.scrollTo({ top: 0, behavior: 'smooth' });\n } else {\n // fallback for environments without scrollTo support\n el.scrollTop = 0;\n }\n }\n\n // clear the query\n if (autocompleteRef.current) {\n autocompleteRef.current.setQuery('');\n }\n },\n [\n askAiState,\n onAskAiToggle,\n isHybridModeSupported,\n sendMessage,\n dropdownRef,\n interceptAskAiEvent,\n ]\n );\n\n // feedback handler\n const handleFeedbackSubmit = React.useCallback<OnAskAiFeedback>(\n async (messageId, feedback): Promise<void> => {\n if (!askAiConfigurationId || !appId) return;\n await sendFeedback(messageId, feedback);\n },\n [askAiConfigurationId, appId, sendFeedback]\n );\n\n if (!autocompleteRef.current) {\n autocompleteRef.current = createAutocomplete({\n id: 'docsearch',\n defaultActiveItemId: 0,\n openOnFocus: true,\n initialState: {\n query: initialQuery,\n context: {\n searchSuggestions: [],\n },\n },\n insights: Boolean(insights),\n navigator,\n onStateChange(changes) {\n setState(changes.state);\n },\n async getSources({ query, state: sourcesState, setContext, setStatus }) {\n if (!query) {\n const noQuerySources = buildNoQuerySources({\n recentSearches,\n favoriteSearches,\n saveRecentSearch,\n onClose,\n disableUserPersonalization,\n });\n\n const recentConversationSource = canHandleAskAi\n ? buildRecentConversationSources({\n conversations,\n disableUserPersonalization,\n setMessages,\n onAskAiToggle,\n })\n : [];\n return [...recentConversationSource, ...noQuerySources];\n }\n\n const querySourcesState: BuildQuerySourcesState = {\n context: sourcesState.context,\n };\n\n const algoliaSourcesPromise = buildQuerySources({\n query,\n state: querySourcesState,\n setContext,\n setStatus,\n searchClient,\n indexes,\n snippetLength,\n insights: Boolean(insights),\n appId,\n apiKey,\n maxResultsPerGroup,\n transformItems,\n saveRecentSearch,\n onClose,\n facetSelections: facetSelectionsRef,\n });\n\n const askAiSourcesPromise = canHandleAskAi\n ? buildAskAiActionSources({\n query,\n handleSelectAskAiQuestion,\n promptSuggestionsOptions: askAiConfig?.promptSuggestions,\n searchClient,\n })\n : Promise.resolve([]);\n\n const [askAiSources, algoliaSources] = await Promise.all([\n askAiSourcesPromise,\n algoliaSourcesPromise,\n ]);\n\n // Combine Algolia results (once resolved) with the Ask AI source\n return [...askAiSources, ...algoliaSources];\n },\n });\n }\n\n const autocomplete = autocompleteRef.current;\n\n const { getEnvironmentProps, getRootProps, refresh } = autocomplete;\n\n useModalEnvironment({\n getEnvironmentProps,\n containerRef,\n dropdownRef,\n formElementRef,\n inputRef,\n initialScrollY,\n modalRef,\n snippetLength,\n theme,\n });\n\n React.useEffect(() => {\n if (dropdownRef.current && !isAskAiActive) {\n scrollToUtils(dropdownRef.current);\n }\n }, [state.query, isAskAiActive, dropdownRef]);\n\n useRefreshOnInitialQuery({ initialQuery, inputRef, refresh });\n\n const hasCurrentMessages = messages.length > 0;\n\n // Refresh the autocomplete results when ask ai is toggled off\n // helps return to the previous ac state and start screen\n React.useEffect(() => {\n if (!isAskAiActive) {\n autocomplete.refresh();\n\n if (hasCurrentMessages) {\n startNewConversation();\n }\n }\n }, [isAskAiActive, autocomplete, startNewConversation, hasCurrentMessages]);\n\n // Track external state in order to manage internal askAiState\n React.useEffect(() => {\n setAskAiState('initial');\n }, [isAskAiActive, setAskAiState]);\n\n const onStopAskAiStreaming = async (): Promise<void> => {\n setStoppedStream(true);\n\n await stopAskAiStreaming();\n };\n\n const handleNewConversation = (): void => {\n startNewConversation();\n setAskAiState('new-conversation');\n };\n\n const handleViewConversationHistory = (): void => {\n setAskAiState('conversation-history');\n };\n\n const selectSuggestedQuestion = (\n suggestedQuestion: SuggestedQuestionHit\n ): void => {\n handleSelectAskAiQuestion(\n true,\n suggestedQuestion.question,\n suggestedQuestion\n );\n };\n\n // hide the dropdown on idle and no collections\n let showDocsearchDropdown = true;\n const hasCollections = state.collections.some(\n (collection) =>\n collection.source.sourceId !== SOURCE_IDS.askAI &&\n collection.items.length > 0\n );\n if (\n state.status === 'idle' &&\n hasCollections === false &&\n state.query.length === 0 &&\n !isAskAiActive\n ) {\n showDocsearchDropdown = false;\n }\n\n return (\n <ModalShell\n state={state}\n containerRef={containerRef}\n modalRef={modalRef}\n formElementRef={formElementRef}\n dropdownRef={dropdownRef}\n getRootProps={getRootProps}\n showDropdown={showDocsearchDropdown}\n searchBox={\n <AskAiSearchBox\n {...autocomplete}\n state={state}\n placeholder={placeholder || 'Search docs'}\n autoFocus={initialQuery.length === 0}\n inputRef={inputRef}\n isFromSelection={\n Boolean(initialQuery) && initialQuery === initialQueryFromSelection\n }\n translations={searchBoxTranslations}\n isAskAiActive={isAskAiActive}\n askAiStatus={status}\n askAiError={askAiError}\n askAiState={askAiState}\n setAskAiState={setAskAiState}\n isThreadDepthError={\n hasThreadDepthError && askAiState !== 'new-conversation'\n }\n onClose={onClose}\n onAskAiToggle={onAskAiToggle}\n onAskAgain={(query) => {\n handleSelectAskAiQuestion(true, query);\n }}\n onStopAskAiStreaming={onStopAskAiStreaming}\n onNewConversation={handleNewConversation}\n onViewConversationHistory={handleViewConversationHistory}\n />\n }\n filterBar={\n !isAskAiActive && state.query !== '' ? (\n <FacetBar\n facets={visibleFacets}\n selections={facetSelections}\n translations={facetBarTranslations}\n clearSelections={clearFacetSelections}\n onSelectionChange={handleFacetSelectionChange}\n />\n ) : null\n }\n screenState={\n <AskAiScreenState\n {...autocomplete}\n indexName={defaultIndexName}\n state={state}\n hitComponent={hitComponent}\n resultsFooterComponent={resultsFooterComponent}\n disableUserPersonalization={disableUserPersonalization}\n recentSearches={recentSearches}\n favoriteSearches={favoriteSearches}\n conversations={conversations}\n inputRef={inputRef}\n translations={screenStateTranslations}\n getMissingResultsUrl={getMissingResultsUrl}\n isAskAiActive={isAskAiActive}\n canHandleAskAi={canHandleAskAi}\n messages={messages}\n tools={tools}\n askAiError={askAiError}\n status={status}\n hasCollections={hasCollections}\n askAiState={askAiState}\n selectAskAiQuestion={handleSelectAskAiQuestion}\n suggestedQuestions={suggestedQuestions}\n selectSuggestedQuestion={selectSuggestedQuestion}\n memoryEnabled={memoryEnabled}\n resultBadgeKey={props.resultBadgeKey}\n onAskAiToggle={onAskAiToggle}\n onNewConversation={handleNewConversation}\n onItemClick={(item, event) => {\n if (item.type === 'askAI' && item.query) {\n if (item.anchor === 'stored' && 'messages' in item) {\n const hitMessages = item.messages as StoredAskAiMessage[];\n restoreConversation(\n hitMessages,\n (item as StoredAskAiState).chatId\n );\n const initialMessage: InitialAskAiMessage = {\n query: item.query,\n messageId: hitMessages[0].id,\n };\n\n if (interceptAskAiEvent?.(initialMessage)) {\n if (autocompleteRef.current) {\n autocompleteRef.current.setQuery('');\n }\n event.preventDefault();\n return;\n }\n\n onAskAiToggle(true, initialMessage);\n } else {\n handleSelectAskAiQuestion(true, item.query);\n }\n setAskAiState('initial');\n event.preventDefault();\n return;\n }\n\n sendItemClickEvent(item);\n saveRecentSearch(item);\n if (!isModifierEvent(event)) {\n onClose();\n }\n }}\n onFeedback={handleFeedbackSubmit}\n />\n }\n footer={\n <Footer\n translations={footerTranslations}\n isAskAiActive={isAskAiActive}\n />\n }\n onClose={onClose}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAEA,SAAgB,cAA2B;CACzC,OACE,oCAAC,OAAD;EACE,OAAM;EACN,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;CAGZ,GADH,oCAAC,QAAD,EAAM,GAAE,gEAAiE,EACtE;AAET;;;;ACEA,MAAM,iCAA0D;CAC9D,QAAQ;CACR,WAAW;CACX,eAAe;CACf,OAAO;AACT;AAEA,SAAgB,sBAAsB,EACpC,SACA,cACA,sBACiD;CAEjD,IAAI,QAAQ,WAAW,GAAG,OAAO;CAGjC,IAAI,OAAO,aAAa,2BAA2B,YACjD,OACE,0DAAG,aAAa,uBAAuB,SAAS,kBAAkB,CAAI;CAS1E,MAAM,EACJ,SAAS,IACT,YAAY,MACZ,gBAAgB,SAChB,QAAQ,QARI,aAAa,yBACvB,aAAa,uBAAuB,OAAO,IAC3C,mCAOS,CAAC;CAEd,OACE,oCAAC,OAAD,EAAK,WAAU,mEA2BV,GA1BH,oCAAC,YAAD,EAAY,MAAM,GAAK,IACvB,oCAAC,cACE,UAAU,oCAAC,cAAM,MAAa,GAC9B,QAAQ,KAAK,GAAG,QAEf,oCAAC,UAAD,EAAU,KAAK,IAAI,IAiBT,GAhBR,oCAAC,QAAD;EACE,MAAK;EACL,UAAU;EACV,WAAU;EACV,YAAY,MAAM;GAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;IACtC,EAAE,eAAe;IACjB,mBAAmB,CAAC;GACtB;EACF;EACA,eAAe,mBAAmB,CAAC;CAG/B,GAFL,MACQ,GAAE,IACL,GACL,MAAM,QAAQ,SAAS,KAAK,WAC5B,QAAQ,QAAQ,SAAS,KAAK,aACvB,CACX,GACA,SAAS,oCAAC,cAAM,KAAY,CACzB,CACH;AAET;;;;qBC2SE;;;;;;AAzRF,SAAS,uBACP,cACsB;CACtB,MAAM,EACJ,kBAAkB,gBAClB,qBAAqB,gBACrB,oBAAoB,gBACpB,4BAA4B,mBAC5B,uBAAuB,qCACrB;CAEJ,OAAO;EACL;EACA,eAAe;EACf,oBAAoB;EACpB;EACA;CACF;AACF;AA0BA,SAAS,sBAAsB,EAC7B,kBACsC;CACtC,OACE,oCAAC,KAAD,EAAG,WAAU,mCAEV,GADD,oCAAC,kBAAc,GAAC,KAAE,cACjB;AAEP;AAgBA,SAAS,kBAAkB,EACzB,UACA,YACA,gBACA,eACA,oBACA,cACA,OACA,eACA,YACA,eACA,4BACsC;;CACtC,MAAM,EAAE,aAAa,qBAAqB;CAE1C,MAAM,EACJ,uBAAuB,6BACvB,iBAAiB,cACjB,oBACA,4BAA4B,wBAC1B;CAEJ,MAAM,uBAAuB,cACrB,uBAAuB,YAAY,GACzC,CAAC,YAAY,CACf;CAEA,MAAM,gBAAgB,mBAAmB,UAAU;CAEnD,MAAM,mBAAmB,cACjB,kBAAkB,gBAAgB,GACxC,CAAC,gBAAgB,CACnB;CACA,MAAM,cAAc,cACZ,kBAAkB,WAAW,GACnC,CAAC,WAAW,CACd;CAEA,MAAM,gBAAgB,MAAM,cACpB,wBAAwB,gBAAgB,GAC9C,CAAC,gBAAgB,CACnB;CAEA,MAAM,eAAe,MAAM,cAAc;EACvC,OAAO,iGAA4B,iBAAkB,UAAS,CAAC,CAAC;CAClE,GAAG,CAAC,gBAAgB,CAAC;CAErB,MAAM,oBAAoB,cAAc;EACtC,IAAI,CAAC,gBAAgB,OAAO,CAAC;EAC7B,OAAO,+FAA0B,iBAAkB,UAAS,CAAC,CAAC;CAChE,GAAG,CAAC,kBAAkB,cAAc,CAAC;CAErC,MAAM,uCACJ,YAAY,wFAAU,kGAAW,iBAAkB,wFAAU;CAE/D,MAAM,cACJ,CAAC,eACA,CAAC,kBACC,kBACC,kBAAkB,WAClB,QAAQ,gBAAgB;CAE9B,MAAM,aACJ,CAAC,aAAa,WAAW,CAAC,CAAC,SAAS,aAAa,KACjD,kBACA,CAAC,aAAa,MAAM,SAAS,KAAK,SAAS,YAAY;CAEzD,MAAM,iFAAY,iBAAkB,OAAM,SAAS;CAEnD,OACE,oCAAC,OAAD,EAAK,WAAU,2CA0IV,GAzIH,oCAAC,OAAD,EAAK,WAAU,iCAwIV,GAvIH,oCAAC,OAAD,EAAK,WAAU,oEAIV,GAHH,oCAAC,KAAD,EAAG,WAAU,8BAEV,kFADA,YAAa,qEAAQ,EACrB,CACA,GACL,oCAAC,OAAD,EAAK,WAAU,yEA8GV,GA7GH,oCAAC,OAAD,EAAK,WAAU,uCAsGV,GArGF,kBAAkB,WACjB,cACA,kBACA,CAAC,iBACC,oCAAC,OAAD;EAAK,WAAU;EAA8B,MAAK;CAa7C,GAZH,oCAAC,WAAD,EAAW,eAAY,OAAQ,IAC/B,oCAAC,OAAD,EAAK,WAAU,sCAUV,GATH,oCAAC,MAAD,EAAI,WAAU,oCAEV,GADD,cACC,GACJ,oCAAC,kBAAD;EACE,SAAS,WAAW;EACpB,gBAAe;EACf,sBAAqB;EACrB,aAAa;CACd,EACE,CACF,GAER,cACC,oCAAC,OAAD;EACE,WAAU;EACV,MAAK;CAOF,GALH,oCAAC,QAAD,EAAM,WAAU,UAEV,GADH,aAAa,gBAAgB,aAC1B,GACN,oCAAC,QAAD,EAAM,WAAU,4CAA6C,IAC7D,oCAAC,QAAD,EAAM,WAAU,qFAAsF,EACnG,GAEN,aAAa,KAAK,MAAM,QAAQ;EAC/B,MAAM,QAAQ;EAEd,IAAI,OAAO,SAAS,UAClB,OACE,oCAAC,kBAAD;GACE,KAAK;GACL,SAAS;GACT,gBAAgB,aAAa,kBAAkB;GAC/C,sBACE,aAAa,wBAAwB;GAEvC,aAAa,kBAAkB;EAChC;EAIL,IAAI,aAAa,IAAI,GACnB,OACE,oCAAC,UAAD;GACE,KAAK;GACL,cAAc;GACR;GACC;GACQ;GACK;EACrB;EAIL,IAAI,KAAK,SAAS,wBAChB,OACE,oCAAC,uBAAD;GACE,KAAK;GACL,SAAS,KAAK;GACA;GACM;EACrB;EAIL,IAAI,KAAK,SAAS,eAAe,KAAK,UAAU,aAC9C,OACE,oCAAC,OAAD;GACE,KAAK;GACL,WAAU;EAIP,GAFH,oCAAC,aAAD,EAAa,WAAU,2CAA4C,IACnE,oCAAC,QAAD,EAAM,WAAU,UAA4B,GAAlB,cAAkB,CACzC;EAIT,IAAI,KAAK,SAAS,QAChB,OACE,oCAAC,kBAAD;GACE,KAAK;GACL,SAAS,KAAK;GACd,gBAAgB,aAAa,kBAAkB;GAC/C,sBACE,aAAa,wBAAwB;GAEvC,aAAa,KAAK,UAAU;EAC7B;EAKL,OAAO;CACT,CAAC,CACE,GAEJ,cACC,oCAAC,KAAD,EAAG,WAAU,+CAEV,GADA,oBACA,CAEF,GACL,oCAAC,OAAD,EAAK,WAAU,sCAUV,GATH,oCAAC,cAAD;EAAc,OAAO;EAAe,WAAW;CAAqB,IACpE,oCAAC,iBAAD;EACE,IAAI;EACS;EACb,oGAA+B,iBAAkB,SAAQ;EAC3C;EACC;EACH;CACb,EACE,GAEJ,kBAAkB,SAAS,KAC1B,oCAAC,+BAAD;EACE,OAAO;EACP,aAAa;EACa;CAC3B,EAEA,CACF;AAET;AAEA,SAAgB,YAAY,MAGa;KAHb,EAC1B,eAAe,CAAC,YACb;CAEH,MAAM,EACJ,iBAAiB,0DACjB,6BAA6B,+DAC7B,iCAAiC,+BAC/B;CAEJ,MAAM,EAAE,UAAU,OAAO,YAAY,QAAQ,kBAAkB;CAG/D,MAAM,sBAAsB,cAAc;EACxC,OAAO,WAAW,WAAW,mBAAmB,UAAU;CAC5D,GAAG,CAAC,QAAQ,UAAU,CAAC;CAGvB,MAAM,YAAwB,cAAc;EAC1C,MAAM,UAAsB,CAAC;EAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,IAAI,SAAS,EAAE,CAAC,SAAS,QAAQ;;GAC/B,MAAM,cAAc,SAAS;GAC7B,MAAM,iCACJ,SAAS,IAAI,0DAAI,UAAS,cAAc,SAAS,IAAI,KAAK;GAC5D,QAAQ,KAAK;IAAE,IAAI,YAAY;IAAI;IAAa;GAAiB,CAAC;GAClE,IAAI,kBACF;EAEJ;EAKF,IAAI,uBAAuB,QAAQ,SAAS,GAG1C;OAAI,CADiB,QAAQ,QAAQ,SAAS,EAC7B,CAAC,kBAChB,QAAQ,IAAI;EACd;EAGF,OAAO;CACT,GAAG,CAAC,UAAU,mBAAmB,CAAC;CAElC,MAAM,0BAA0B,UAAwB;EACtD,MAAM,cAAc,KAAK;EACzB,MAAM,SAAS,KAAK;CACtB;CAGA,MAAM,uBACJ,uBAAuB,SAAS,MAAM,MAAM,EAAE,SAAS,WAAW;CAEpE,OACE,oCAAC,OAAD,EAAK,WAAU,wDA6CV,GA3CF,wBACC,oCAAC,OAAD,EAAK,WAAU,4GAcV,GAbH,oCAAC,OAAD,EAAK,WAAU,sCAYV,GAXH,oCAAC,WACE,4BAA4B,KAC7B,oCAAC,UAAD;EACE,MAAK;EACL,WAAU;EACV,SAAS,MAAM;CAGT,GADL,8BACK,GAAE,KAAI,cAEb,CACA,CACF,GAGP,oCAAC,uBAAD,EAAuC,eAAiB,IAExD,oCAAC,OAAD,EAAK,WAAU,6BAsBV,GArBH,oCAAC,OAAD,EAAK,WAAU,sCAoBV,GAnBF,UACE,MAAM,CAAC,CACP,QAAQ,CAAC,CACT,KAAK,UAAU,UACd,oCAAC,mBAAD;EACE,KAAK,SAAS;EACJ;EACV,YAAY,MAAM;EAClB,gBAAgB,UAAU;EAC1B,eAAe,MAAM;EACP;EACP;EACP,eAAe,MAAM;EACN;EACf,oBAAoB;EACpB,YAAY,MAAM;EAClB,0BAA0B,MAAM;CACjC,EACF,CACA,CACF,CACF;AAET;;;;qBC/cE;AADF,SAAgB,2BAA2B,MAGa;KAHb,EACzC,eAAe,CAAC,YACb;CAEH,MAAM,EACJ,2BAA2B,2BAC3B,sCAAsC,4CACpC;CACJ,MAAM,sBAAsB,cAAc,MAAM,OAAO,qBAAqB;CAE5E,IAAI,CAAC,qBACH,OAAO;CAGT,OACE,oCAAC,2CACK;EACJ,OAAO;EACP,YAAY;EACZ,kBACE,oCAAC,OAAD,EAAK,WAAU,+CAEV,GADH,oCAAC,iBAAa,CACX;EAEP,eAAe,EAAE,WACf,oCAAC,OAAD,EAAK,WAAU,uBAcV,GAbH,oCAAC,UAAD;GACE,WAAU;GACV,OAAO;GACP,MAAK;GACL,UAAU,UAAU;IAClB,MAAM,eAAe;IACrB,MAAM,gBAAgB;IACtB,MAAM,cAAc,OAAO,IAAI;IAC/B,MAAM,QAAQ;GAChB;EAGM,GADN,oCAAC,eAAW,CACN,CACL;EAER;AAEL;;;;qBCzCE;AADF,SAAgB,iBAAiB,MAGa;KAHb,EAC/B,eAAe,CAAC,YACb;CAEH,OACE,oCAAC,OAAD,EAAK,WAAU,+BAGV,GAFH,oCAAC,8DAA+B,cAAqB,cAAe,IACpE,oCAAC,0DAA2B,cAAqB,cAAe,EAC7D;AAET;;;;qBCbE;AADF,SAAgB,0BAA0B,MAGa;KAHb,EACxC,wBACG;CAEH,MAAM,aAAa,MAAM,cACjB,cAAc,MAAM,OAAO,qBAAqB,GACtD,CAAC,MAAM,KAAK,CACd;CAEA,MAAM,gBAAgB;EACpB,IAAI,CAAC,cAAc,WAAW,MAAM,WAAW,GAC7C,cAAc,IAAI;CAEtB,GAAG,CAAC,YAAY,aAAa,CAAC;CAE9B,IAAI,CAAC,YACH,OAAO;CAGT,OACE,oCAAC,OAAD,EAAK,WAAU,8DA6BV,GA5BH,oCAAC,2CACK;EACJ,KAAK,WAAW,OAAO;EACvB,OAAM;EACN,cAAc,MAAM;EACR;EACZ,kBACE,oCAAC,OAAD,EAAK,WAAU,qBAEV,GADH,oCAAC,kBAAc,CACZ;EAEP,eAAe,EAAE,WACf,oCAAC,OAAD,EAAK,WAAU,uBAaV,GAZH,oCAAC,UAAD;GACE,MAAK;GACL,WAAU;GACV,UAAU,MAAM;IACd,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,MAAM,cAAc,OAAO,IAAI;IAC/B,MAAM,QAAQ;GAChB;EAGM,GADN,oCAAC,eAAW,CACN,CACL;EAER,EACE;AAET;;;;ACrDA,SAAgB,sBAAsB,EACpC,eAAe,CAAC,GAChB,qBAAqB,CAAC,GACtB,2BACoC;CACpC,MAAM,EACJ,uBAAuB,6BACvB,6BAA6B,yHAC3B;CAEJ,OACE,oCAAC,OAAD,EAAK,WAAU,kCAoBV,GAnBH,oCAAC,MAAD,EAAI,WAAU,wCAEV,GADD,oBACC,GACJ,oCAAC,KAAD,EAAG,WAAU,8CAEV,GADA,0BACA,GAEH,oCAAC,OAAD,EAAK,WAAU,qDAWV,GAVF,mBAAmB,KAAK,aACvB,oCAAC,UAAD;EACE,KAAK,SAAS;EACd,MAAK;EACL,WAAU;EACV,eAAe,wBAAwB,QAAQ;CAGzC,GADL,SAAS,QACJ,CACT,CACE,CACF;AAET;;;;qBCqCI,gBACA;AAHJ,MAAa,mBAAmB,MAAM,MACnC,SAI+D;;KAJ/D,EACC,eAAe,CAAC,GAChB,8BACG;CAEH,MAAM,+BAA+B,MAAM,aACxC,WAAmB;EAClB,oBAAoB,MAAM,MAAM;CAClC,GACA,CAAC,mBAAmB,CACtB;CAEA,IACE,MAAM,kBACN,MAAM,iBACN,MAAM,eAAe,wBAErB,OACE,oCAAC,4CACsB,uBACjB,KACL;CAIL,IACE,MAAM,kBACN,MAAM,iBACN,MAAM,eAAe,oBAErB,OACE,oCAAC,uBAAD;EACE,0EAAc,aAAc;EAC5B,yBAAyB,MAAM;EAC/B,oBAAoB,MAAM;CAC3B;CAIL,IAAI,MAAM,iBAAiB,MAAM,gBAC/B,OACE,oCAAC,+CACK;EACJ,UAAU,MAAM;EAChB,OAAO,MAAM;EACb,QAAQ,MAAM;EACd,YAAY,MAAM;EAClB,0EAAc,aAAc;EAC5B,eAAe,MAAM;EACA;EACrB,0BAA0B;EAC3B;CAIL,qBAAI,MAAM,mEAAO,YAAW,SAC1B,OAAO,oCAAC,aAAD,EAAa,0EAAc,aAAc,YAAc;CAGhE,IAAI,CAAC,MAAM,MAAM,OACf,OACE,oCAAC,oDACK;EACJ,gBAAgB,MAAM;EACtB,0EAAc,aAAc;EACP;EACtB;CAIL,IAAI,CAAC,MAAM,kBAAkB,CAAC,MAAM,gBAClC,OACE,oCAAC,mDACK,cACJ,0EAAc,aAAc,iBAC7B;CAIL,OACE,0DACE,oCAAC,iDAAkB,cAAO,0EAAc,aAAc,eAAgB,IACrE,MAAM,kBACL,CAAC,MAAM,kBAEL,oCAAC,mDACK,cACJ,0EAAc,aAAc,iBAC7B,EAEL;AAEN,GACA,SAAS,SAAS,YAAY,WAAW;CAKvC,OACE,UAAU,MAAM,WAAW,aAC3B,UAAU,MAAM,WAAW;AAE/B,CACF;;;;ACnLA,SAAgB,aAAa,EAC3B,SACA,UAAU,SACuB;CACjC,OACE,oCAAC,QAAD,EAAM,WAAW,0BAA0B,UAAU,aAAa,KAE5D,GADH,OACG;AAEV;;;;;CCoDE;CACA;CACA;CACA;;AAJF,SAAgB,eAAe,MAMM;KANN,EAC7B,eAAe,CAAC,GAChB,YACA,eACA,wBACG;CAEH,MAAM,EACJ,mBAAmB,SACnB,uBAAuB,mBACvB,kBAAkB,SAClB,uBAAuB,SACvB,mBAAmB,UACnB,gCAAgC,0BAChC,qCAAqC,0BACrC,gCAAgC,gBAChC,6BAA6B,kBAC7B,2BAA2B,2BAC3B,2BAA2B,4BAC3B,8BAA8B,wBAC9B,8BAA8B,iCAC5B;CAEJ,MAAM,yBAAyB,MAAM,cAAc;EACjD,MAAM,cAAc,cAAc,MAAM,OAAO,qBAAqB;EAEpE,IAAI,CAAC,aACH,OAAO;EAGT,OAAO,YAAY,MAAM,SAAS;CACpC,GAAG,CAAC,MAAM,KAAK,CAAC;CAEhB,MAAM,iBAAiB,MAAM,cAAc;EACzC,cAAc,MAAM,SAAS;EAC7B,WAAW,MAAM;CACnB,CAAC;CACD,MAAM,8BAAc,IAAI,IAAI;EAAC;EAAW;EAAa;CAAO,CAAC;CAC7D,MAAM,gBAAgB,eAAe;CACrC,MAAM,eAAe,eAAe;CACpC,MAAM,mBACJ,MAAM,gBAAgB,eAAe,MAAM,gBAAgB;CAC7D,MAAM,oBACJ,MAAM,iBAAiB,eAAe;CAGxC,MAAM,qBAAqB,MAAM,sBAAsB;CACvD,IAAI,oBAAoB,MAAM;CAE9B,IAAI,eAAe,oBACjB,oBAAoB;CAItB,IAAI,sBAAsB,MAAM,eAC9B,oBAAoB;CAGtB,IAAI,UAAyB;CAE7B,IAAI,kBACF,UAAU;CAGZ,IAAI,eAAe,wBACjB,UAAU;CAIZ,MAAM,gBAAgB;EACpB,IACE,MAAM,gBAAgB,eACtB,MAAM,gBAAgB,eACtB,MAAM,SAAS,SAEf,MAAM,SAAS,QAAQ,MAAM;CAEjC,GAAG,CAAC,MAAM,aAAa,MAAM,QAAQ,CAAC;;;;;;;;;CAUtC,MAAM,aAAa;EACjB,cAAc,MAAM,gBACf,UACA;EACL,YAAY,MAAmD;GAC7D,IAAI,eAAe;GAEnB,IAAI,MAAM,iBAAiB,YAAY,IAAI,EAAE,GAAG,GAAG;IAEjD,IAAI,EAAE,QAAQ,WAAW,CAAC,oBAAoB,MAAM,MAAM,OACxD,MAAM,WAAW,MAAM,MAAM,KAAK;IAGpC,eAAe;GACjB;GAEA,IAAI,cAAc;IAChB,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB;GACF;GAEA,oEAAgB,CAAC;EACnB;EACA,WAAW,MAAiD;GAC1D,IAAI,MAAM,eAAe;IACvB,MAAM,SAAS,EAAE,cAAc,KAAK;IAIpC,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB;GACF;GACA,iEAAe,CAAC;EAClB;EACA,UAAU,oBAAqB,sBAAsB,MAAM;CAC7D;CAEA,MAAM,uBAAuB,MAAM,kBAAwB;EAEzD,IAAI,oBAAoB;GACtB,MAAM,kBAAkB;GACxB;EACF;EAEA,IAAI,eAAe,wBAAwB;GACzC,cAAc,IAAI;GAClB,cAAc,SAAS;GACvB;EACF;EAEA,cAAc,KAAK;CACrB,GAAG;EAAC;EAAY;EAAoB;EAAe;EAAe;CAAK,CAAC;CAExE,MAAM,iBAAiB,MAAM,gBAC3B,oCAAC,UAAD;EACE,MAAK;EACL,UAAU;EACV,WAAU;EACV,OAAO;EACP,cAAY;EACZ,SAAS;CAGH,GADN,oCAAC,cAAU,CACL,IACN;CACJ,MAAM,eAAe,UACnB,oCAAC,cAAD;EAAuB;EAAS,SAAS;CAAmB,KAC1D;CACJ,MAAM,qBACJ,0DACG,CAAC,MAAM,iBACN,0DACE,oCAAC,UAAD;EACE,WAAU;EACV,MAAK;EACL,cAAY;EACZ,QAAQ,CAAC,MAAM,MAAM;EACrB,UAAU,MAAM,MAAM,QAAQ,IAAI;EAClC,eAAa,CAAC,MAAM,MAAM,QAAQ,SAAS;CAGrC,GADL,gBACK,GAEP,MAAM,MAAM,SAAS,oCAAC,OAAD,EAAK,WAAU,oBAAqB,EAC1D,GAGH,oBACC,0DACE,oCAAC,UAAD;EACE,MAAK;EACL,WAAU;EACV,SAAS,MAAM;CAGT,GADN,oCAAC,cAAU,CACL,GAER,oCAAC,OAAD,EAAK,WAAU,oBAAqB,EACpC,GAGH,qBACC,0DACE,oCAAC,YACC,oCAAC,KAAK,SAAN,EAAc,WAAU,mBAEV,GADZ,oCAAC,sBAAkB,CACP,GACd,oCAAC,KAAK,eACJ,oCAAC,KAAK,MAAN,EAAW,SAAS,MAAM,kBAGf,GAFT,oCAAC,yBAAqB,GACrB,wBACQ,GACV,0BACC,oCAAC,KAAK,MAAN,EAAW,SAAS,MAAM,0BAGf,GAFT,oCAAC,6BAAyB,GACzB,2BACQ,CAED,CACV,GAEN,oCAAC,OAAD,EAAK,WAAU,oBAAqB,EACpC,CAEJ;CAGJ,OACE,oCAAC,iDACK;EACJ,aAAa;EACK;EACI;EACL;EACK;EACJ;EACF;EACF;EACd,WAAW,QAAQ,OAAO;EACN;EACR;EACb;AAEL;;;;AClSA,MAAM,qCAAqC;AAE3C,MAAM,uBAAuB;CAC3B,OAAO;CACP,YAAY;CACZ,cAAc,CAAC;AACjB;AACA,MAAM,mCAAmC;CACvC,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;AACR;AACA,MAAM,yBAAmE;CACvE,SAAS;CACT,WAAW;CACX,iBAAiB,CAAC;AACpB;AACA,MAAM,uBAA+D;CACnE,SAAS;CACT,WAAW;CACX,iBAAiB,CAAC;AACpB;AAEA,SAAgB,+BAA+B,EAC7C,eACA,4BACA,aACA,iBAQA;CACA,OAAO,CACL;EACE,UAAU,WAAW;EACrB,WAAmC;GACjC,IAAI,4BACF,OAAO,CAAC;GAEV,OACE,cAAc,OAAO,CAAC,CACtB,MAAM,GAAG,kCAAkC;EAC/C;EACA,SAAS,EAAE,QAAc;GACvB,IAAI,KAAK,UAAU;IACjB,YAAY,KAAK,QAAQ;IACzB,cAAc,IAAI;GACpB;EACF;CACF,CACF;AACF;AAEA,SAAS,eAAe,EACtB,OACA,UACA,QAKuB;CACvB,OAAO;EACL,MAAM;EACN;EACA,oBAAoB;EACpB;EACA,SAAS;EACT,KAAK;EACL,QAAQ;EACR,WAAW;GACT;GACA,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;EACR;EACA,kBAAkB;EAClB,gBAAgB;EAChB,oBAAoB;CACtB;AACF;AAEA,eAAe,qBAAqB,EAClC,OACA,WACA,cACA,cAAc,KAMoB;CAClC,IAAI;EACF,MAAM,EAAE,YAAY,MAAM,aAAa,OAAyB,EAC9D,UAAU,CACR;GACE;GACA;GACA;GACA,sBAAsB,CAAC,QAAQ;EACjC,CACF,EACF,CAAC;EAID,OAFY,QAAQ,EAEV,CAAC,KAAK,KAAK,QACnB,eAAe;GACb,OAAO,IAAI;GACX,UAAU,IAAI;GACd,MAAM;EACR,CAAC,CACH;CAEF,kBAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,eAAsB,wBAAwB,EAC5C,OACA,2BACA,0BACA,gBAM2D;CAC3D,MAAM,oBAAoB,2BACtB,MAAM,qBAAqB;EACzB;EACA,WAAW,yBAAyB;EACpC,aAAa,yBAAyB;EACtC;CACF,CAAC,IACD,CAAC;CAEL,OAAO,CACL;EACE,UAAU,WAAW;EACrB,WAAmC;GACjC,OAAO,CACL,eAAe;IAAE;IAAO,UAAU;IAAiB,MAAM;GAAS,CAAC,GACnE,GAAG,iBACL;EACF;EACA,SAAS,EAAE,QAAc;GACvB,IAAI,KAAK,SAAS,WAAW,KAAK,OAChC,0BAA0B,MAAM,KAAK,KAAK;EAE9C;CACF,CACF;AACF;;;;;CCnGE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;CAIE;CACA;CACA;;AAjCJ,SAAgB,oBAAoB,MA6BM;;KA7BN,EAClC,OACA,QACA,OACA,oBACA,OACA,UAAU,MACV,iBAAiB,UACjB,eAAe,KACf,+BAAmD,MACnD,WACA,iBAAiB,GACjB,wBAAwB,UACxB,6BAA6B,OAC7B,cAAc,uBAAuB,IACrC,eAAe,CAAC,GAChB,sBACA,WAAW,OACX,eACA,qBACA,gBAAgB,OAChB,sBAAsB,GACtB,mCAAmC,GACnC,UAAU,CAAC,GACX,WACA,kBACA,QACA,wBAAwB,gBACrB;CAEH,MAAM,EACJ,QAAQ,oBACR,WAAW,uBACX,QAAQ,uCACL,mDACD;CACJ,MAAM,CAAC,OAAO,YAAY,MAAM,SAE9B;EACA,OAAO;EACP,aAAa,CAAC;EACd,YAAY;EACZ,SAAS,CAAC;EACV,QAAQ;EACR,cAAc;EACd,QAAQ;CACV,CAAC;CAGD,MAAM,iBAAiB,QAAQ,KAAK;CAEpC,IAAI,4FACF,aAAc,yFAAW,oBACzB,MAAM,eACN;CAEF,IAAI,gBAAgB;;EAClB,6FACE,aAAc,2FAAW,oBACzB;CACJ;CAEA,IAAI,eAAe;;EACjB,6FACE,aAAc,2FAAW,yBACzB;CACJ;CAEA,MAAM,EACJ,cACA,UACA,gBACA,aACA,UACA,kBACE,aAAa;CACjB,MAAM,EAAE,cAAc,8BACpB,qBAAqB,oBAAoB;CAE3C,MAAM,eAAe,gBAAgB,OAAO,QAAQ,qBAAqB;CAEzE,MAAM,cAAc,OAAO,UAAU,WAAW,QAAQ;CACxD,MAAM,uBAAuB,cACzB,YAAY,cACX;CACL,MAAM,kFAAwB,YAAa;CAC3C,MAAM,CAAC,YAAY,iBAAiB,MAAM,SAAqB,SAAS;CACxE,MAAM,qBAAqB,sBAAsB;EAC/C,aAAa;EACb;EACA,qFAA2B,YAAa;CAC1C,CAAC;CACD,MAAM,kHAAgB,YAAa,kFAAQ,gFAAW;CACtD,MAAM,wFAAQ,YAAa,wEAAS;CAEpC,MAAM,UAAU,MAAM,cAElB,0BAA0B;EACxB;EACA;EACA;CACF,CAAC,GACH;EAAC;EAAW;EAAS;CAAgB,CACvC;CACA,MAAM,mBAAmB,QAAQ,EAAE,CAAC;CAEpC,MAAM,kBACJ,MAAM,OASJ,MAAS;CAEb,MAAM,EACJ,eACA,iBACA,oBACA,4BACA,yBACE,mBAAmB;EACrB;EACA;EACA;EACA,0BAA0B;;mDAAgB,uFAAS,QAAQ;;CAC7D,CAAC;CAED,MAAM,EAAE,kBAAkB,mBAAmB,qBAAqB;EAChE;EACA;EACA;CACF,CAAC;CAED,MAAM,CAAC,eAAe,oBAAoB,MAAM,SAAS,KAAK;CAE9D,MAAM,EACJ,QACA,UACA,QACA,aACA,aACA,oBACA,YACA,cACA,eACA,sBACA,wBACE,SAAS;EACX,aAAa;EACb,mEAAQ,YAAa,WAAU;EAC/B,kEAAO,YAAa,UAAS;EAC7B,sEAAW,YAAa,cAAa;EACrC,kBAAkB;EAClB;EACA,kEAAQ,YAAa;EACrB,mEAAS,YAAa;CACxB,CAAC;CAED,MAAM,aAAa,MAAM,OAAO,MAAM;CACtC,MAAM,gBAAgB;EACpB,IAAI,4BACF;EAGF,IAAI,WAAW,YAAY,eAAe,WAAW,SAAS;GAE5D,IAAI,iBAAiB,SAAS,GAAG,EAAE,GACjC,SAAS,GAAG,EAAE,CAAC,CAAE,WAAW,EAC1B,SAAS,KACX;GAGF,KAAK,MAAM,QAAQ,SAAS,EAAE,CAAC,OAC7B,IAAI,KAAK,SAAS,QAChB,cAAc,IAAI,mBAAmB,KAAK,MAAM,UAAU,MAAM,CAAC;EAGvE;EACA,WAAW,UAAU;CACvB,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAGD,MAAM,sBAAsB,MAAM,cAAc;EAC9C,OACE,WAAW,WAAW,mBAAmB,UAA+B;CAE5E,GAAG,CAAC,QAAQ,UAAU,CAAC;CAEvB,MAAM,mBAAmB,oBAAoB;EAC3C;EACA;EACA;CACF,CAAC;CACD,MAAM,qBAAqB,sBAAsB,KAAK;CAEtD,MAAM,4BAA4B,MAAM,aAEpC,QACA,OACA,oBAAsD,WACnD;EACH,IAAI,QAAQ;GACV,MAAM,iBAAsC;IAC1C;IACA,2FAAqB,kBAAmB;GAC1C;GAEA,8EAAI,oBAAsB,cAAc,GAAG;IAEzC,IAAI,gBAAgB,SAClB,gBAAgB,QAAQ,SAAS,EAAE;IAErC;GACF;EACF;EAEA,IAAI,UAAU,eAAe,oBAC3B,cAAc,SAAS;EAGzB,cAAc,QAAQ;GACpB;GACA,2FAAqB,kBAAmB;EAC1C,CAAC;EAID,IAAI,uBAAuB;EAE3B,iBAAiB,KAAK;EAEtB,MAAM,iBAAqC,CAAC;EAE5C,IAAI,mBACF,eAAe,OAAO,EACpB,qBAAqB,kBAAkB,SACzC;EAGF,YACE;GACE,MAAM;GACN,OAAO,CACL;IACE,MAAM;IACN,MAAM;GACR,CACF;EACF,GACA,cACF;EAEA,IAAI,YAAY,SAAS;GAEvB,MAAM,KAAK,YAAY;GACvB,IAAI,OAAQ,GAAW,aAAa,YAClC,GAAG,SAAS;IAAE,KAAK;IAAG,UAAU;GAAS,CAAC;QAG1C,GAAG,YAAY;EAEnB;EAGA,IAAI,gBAAgB,SAClB,gBAAgB,QAAQ,SAAS,EAAE;CAEvC,GACA;EACE;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAGA,MAAM,uBAAuB,MAAM,YACjC,OAAO,WAAW,aAA4B;EAC5C,IAAI,CAAC,wBAAwB,CAAC,OAAO;EACrC,MAAM,aAAa,WAAW,QAAQ;CACxC,GACA;EAAC;EAAsB;EAAO;CAAY,CAC5C;CAEA,IAAI,CAAC,gBAAgB,SACnB,gBAAgB,UAAU,mBAAmB;EAC3C,IAAI;EACJ,qBAAqB;EACrB,aAAa;EACb,cAAc;GACZ,OAAO;GACP,SAAS,EACP,mBAAmB,CAAC,EACtB;EACF;EACA,UAAU,QAAQ,QAAQ;EAC1B;EACA,cAAc,SAAS;GACrB,SAAS,QAAQ,KAAK;EACxB;EACA,MAAM,WAAW,EAAE,OAAO,OAAO,cAAc,YAAY,aAAa;GACtE,IAAI,CAAC,OAAO;IACV,MAAM,iBAAiB,oBAAoB;KACzC;KACA;KACA;KACA;KACA;IACF,CAAC;IAUD,OAAO,CAAC,GARyB,iBAC7B,+BAA+B;KAC7B;KACA;KACA;KACA;IACF,CAAC,IACD,CAAC,GACgC,GAAG,cAAc;GACxD;GAMA,MAAM,wBAAwB,kBAAkB;IAC9C;IACA,OAAO,EALP,SAAS,aAAa,QAKC;IACvB;IACA;IACA;IACA;IACA;IACA,UAAU,QAAQ,QAAQ;IAC1B;IACA;IACA;IACA;IACA;IACA;IACA,iBAAiB;GACnB,CAAC;GAED,MAAM,sBAAsB,iBACxB,wBAAwB;IACtB;IACA;IACA,oFAA0B,YAAa;IACvC;GACF,CAAC,IACD,QAAQ,QAAQ,CAAC,CAAC;GAEtB,MAAM,CAAC,cAAc,kBAAkB,MAAM,QAAQ,IAAI,CACvD,qBACA,qBACF,CAAC;GAGD,OAAO,CAAC,GAAG,cAAc,GAAG,cAAc;EAC5C;CACF,CAAC;CAGH,MAAM,eAAe,gBAAgB;CAErC,MAAM,EAAE,qBAAqB,cAAc,YAAY;CAEvD,oBAAoB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,gBAAgB;EACpB,IAAI,YAAY,WAAW,CAAC,eAC1B,SAAc,YAAY,OAAO;CAErC,GAAG;EAAC,MAAM;EAAO;EAAe;CAAW,CAAC;CAE5C,yBAAyB;EAAE;EAAc;EAAU;CAAQ,CAAC;CAE5D,MAAM,qBAAqB,SAAS,SAAS;CAI7C,MAAM,gBAAgB;EACpB,IAAI,CAAC,eAAe;GAClB,aAAa,QAAQ;GAErB,IAAI,oBACF,qBAAqB;EAEzB;CACF,GAAG;EAAC;EAAe;EAAc;EAAsB;CAAkB,CAAC;CAG1E,MAAM,gBAAgB;EACpB,cAAc,SAAS;CACzB,GAAG,CAAC,eAAe,aAAa,CAAC;CAEjC,MAAM,uBAAuB,YAA2B;EACtD,iBAAiB,IAAI;EAErB,MAAM,mBAAmB;CAC3B;CAEA,MAAM,8BAAoC;EACxC,qBAAqB;EACrB,cAAc,kBAAkB;CAClC;CAEA,MAAM,sCAA4C;EAChD,cAAc,sBAAsB;CACtC;CAEA,MAAM,2BACJ,sBACS;EACT,0BACE,MACA,kBAAkB,UAClB,iBACF;CACF;CAGA,IAAI,wBAAwB;CAC5B,MAAM,iBAAiB,MAAM,YAAY,MACtC,eACC,WAAW,OAAO,aAAa,WAAW,SAC1C,WAAW,MAAM,SAAS,CAC9B;CACA,IACE,MAAM,WAAW,UACjB,mBAAmB,SACnB,MAAM,MAAM,WAAW,KACvB,CAAC,eAED,wBAAwB;CAG1B,OACE,oCAAC,YAAD;EACS;EACO;EACJ;EACM;EACH;EACC;EACd,cAAc;EACd,WACE,oCAAC,kDACK;GACG;GACP,aAAa,eAAe;GAC5B,WAAW,aAAa,WAAW;GACzB;GACV,iBACE,QAAQ,YAAY,KAAK,iBAAiB;GAE5C,cAAc;GACC;GACf,aAAa;GACD;GACA;GACG;GACf,oBACE,uBAAuB,eAAe;GAE/B;GACM;GACf,aAAa,UAAU;IACrB,0BAA0B,MAAM,KAAK;GACvC;GACsB;GACtB,mBAAmB;GACnB,2BAA2B;GAC5B;EAEH,WACE,CAAC,iBAAiB,MAAM,UAAU,KAChC,oCAAC,UAAD;GACE,QAAQ;GACR,YAAY;GACZ,cAAc;GACd,iBAAiB;GACjB,mBAAmB;EACpB,KACC;EAEN,aACE,oCAAC,oDACK;GACJ,WAAW;GACJ;GACO;GACU;GACI;GACZ;GACE;GACH;GACL;GACV,cAAc;GACQ;GACP;GACC;GACN;GACH;GACK;GACJ;GACQ;GACJ;GACZ,qBAAqB;GACD;GACK;GACV;GACf,gBAAgB,MAAM;GACP;GACf,mBAAmB;GACnB,cAAc,MAAM,UAAU;IAC5B,IAAI,KAAK,SAAS,WAAW,KAAK,OAAO;KACvC,IAAI,KAAK,WAAW,YAAY,cAAc,MAAM;MAClD,MAAM,cAAc,KAAK;MACzB,oBACE,aACC,KAA0B,MAC7B;MACA,MAAM,iBAAsC;OAC1C,OAAO,KAAK;OACZ,WAAW,YAAY,EAAE,CAAC;MAC5B;MAEA,8EAAI,oBAAsB,cAAc,GAAG;OACzC,IAAI,gBAAgB,SAClB,gBAAgB,QAAQ,SAAS,EAAE;OAErC,MAAM,eAAe;OACrB;MACF;MAEA,cAAc,MAAM,cAAc;KACpC,OACE,0BAA0B,MAAM,KAAK,KAAK;KAE5C,cAAc,SAAS;KACvB,MAAM,eAAe;KACrB;IACF;IAEA,mBAAmB,IAAI;IACvB,iBAAiB,IAAI;IACrB,IAAI,CAAC,gBAAgB,KAAK,GACxB,QAAQ;GAEZ;GACA,YAAY;GACb;EAEH,QACE,oCAAC,QAAD;GACE,cAAc;GACC;EAChB;EAEM;CACV;AAEL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocSearchModal-CpvDjo1O.js","names":[],"sources":["../../src/components/KeywordSearchBox.tsx","../../src/components/KeywordStartScreen.tsx","../../src/ScreenState.tsx","../../src/DocSearchModal.tsx"],"sourcesContent":["import type {\n AutocompleteApi,\n AutocompleteState,\n} from '@algolia/autocomplete-core';\nimport React, { type JSX, type RefObject } from 'react';\n\nimport type { InternalDocSearchHit } from '../types';\n\nimport { SearchBoxForm } from './ui/SearchBoxForm';\n\nexport type KeywordSearchBoxTranslations = Partial<{\n clearButtonTitle: string;\n clearButtonAriaLabel: string;\n closeButtonText: string;\n closeButtonAriaLabel: string;\n placeholderText: string;\n enterKeyHint: string;\n searchInputLabel: string;\n}>;\n\ninterface KeywordSearchBoxProps extends AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n state: AutocompleteState<InternalDocSearchHit>;\n autoFocus: boolean;\n inputRef: RefObject<HTMLInputElement | null>;\n onClose: () => void;\n placeholder: string;\n isFromSelection: boolean;\n translations?: KeywordSearchBoxTranslations;\n}\n\nexport function KeywordSearchBox({\n translations = {},\n ...props\n}: KeywordSearchBoxProps): JSX.Element {\n const {\n clearButtonTitle = 'Clear',\n clearButtonAriaLabel = 'Clear the query',\n closeButtonText = 'Close',\n closeButtonAriaLabel = 'Close',\n searchInputLabel = 'Search',\n } = translations;\n\n const actionsBeforeClose = (\n <>\n <button\n className=\"DocSearch-Clear\"\n type=\"reset\"\n aria-label={clearButtonAriaLabel}\n hidden={!props.state.query}\n tabIndex={props.state.query ? 0 : -1}\n aria-hidden={!props.state.query ? 'true' : 'false'}\n >\n {clearButtonTitle}\n </button>\n\n {props.state.query && <div className=\"DocSearch-Divider\" />}\n </>\n );\n\n return (\n <SearchBoxForm\n {...props}\n clearButtonTitle={clearButtonTitle}\n clearButtonAriaLabel={clearButtonAriaLabel}\n closeButtonText={closeButtonText}\n closeButtonAriaLabel={closeButtonAriaLabel}\n searchInputLabel={searchInputLabel}\n inputProps={{\n enterKeyHint: 'search',\n }}\n actionsBeforeClose={actionsBeforeClose}\n />\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { ScreenStateProps } from '../ScreenState';\nimport type { InternalDocSearchHit } from '../types';\n\nimport type { StoredSearchesSectionsTranslations } from './ui/StoredSearchesSections';\nimport { StoredSearchesSections } from './ui/StoredSearchesSections';\n\nexport type KeywordStartScreenTranslations = StoredSearchesSectionsTranslations;\n\ntype KeywordStartScreenProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n hasCollections: boolean;\n translations?: KeywordStartScreenTranslations;\n};\n\nexport function KeywordStartScreen({\n translations = {},\n ...props\n}: KeywordStartScreenProps): JSX.Element | null {\n return (\n <div className=\"DocSearch-Dropdown-Container\">\n <StoredSearchesSections {...props} translations={translations} />\n </div>\n );\n}\n","import type {\n AutocompleteApi,\n AutocompleteState,\n BaseItem,\n} from '@algolia/autocomplete-core';\nimport React from 'react';\n\nimport type { KeywordStartScreenTranslations } from './components/KeywordStartScreen';\nimport { KeywordStartScreen } from './components/KeywordStartScreen';\nimport type { DocSearchProps } from './DocSearch';\nimport type { ErrorScreenTranslations } from './ErrorScreen';\nimport { ErrorScreen } from './ErrorScreen';\nimport type { NoResultsScreenTranslations } from './NoResultsScreen';\nimport { NoResultsScreen } from './NoResultsScreen';\nimport type { ResultsScreenTranslations } from './ResultsScreen';\nimport { ResultsScreen } from './ResultsScreen';\nimport type { StoredSearchPlugin } from './stored-searches';\nimport type { InternalDocSearchHit, StoredDocSearchHit } from './types';\n\nexport type ScreenStateTranslations = Partial<{\n errorScreen: ErrorScreenTranslations;\n startScreen: KeywordStartScreenTranslations;\n noResultsScreen: NoResultsScreenTranslations;\n resultsScreen: ResultsScreenTranslations;\n}>;\n\nexport interface ScreenStateProps<\n TItem extends BaseItem,\n> extends AutocompleteApi<\n TItem,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n state: AutocompleteState<TItem>;\n recentSearches: StoredSearchPlugin<StoredDocSearchHit>;\n favoriteSearches: StoredSearchPlugin<StoredDocSearchHit>;\n onItemClick: (\n item: InternalDocSearchHit,\n event: KeyboardEvent | MouseEvent\n ) => void;\n inputRef: React.MutableRefObject<HTMLInputElement | null>;\n hitComponent: DocSearchProps['hitComponent'];\n indexName: DocSearchProps['indexName'];\n disableUserPersonalization: boolean;\n resultsFooterComponent: DocSearchProps['resultsFooterComponent'];\n translations: ScreenStateTranslations;\n getMissingResultsUrl?: DocSearchProps['getMissingResultsUrl'];\n hasCollections: boolean;\n resultBadgeKey?: string;\n}\n\nexport const ScreenState = React.memo(\n ({ translations = {}, ...props }: ScreenStateProps<InternalDocSearchHit>) => {\n if (props.state?.status === 'error') {\n return <ErrorScreen translations={translations?.errorScreen} />;\n }\n\n if (!props.state.query) {\n return (\n <KeywordStartScreen\n {...props}\n hasCollections={props.hasCollections}\n translations={translations?.startScreen}\n />\n );\n }\n\n if (!props.hasCollections) {\n return (\n <NoResultsScreen\n {...props}\n translations={translations?.noResultsScreen}\n />\n );\n }\n\n return (\n <ResultsScreen {...props} translations={translations?.resultsScreen} />\n );\n },\n function areEqual(_prevProps, nextProps) {\n // We don't update the screen when Autocomplete is loading or stalled to\n // avoid UI flashes:\n // - Empty screen → Results screen\n // - NoResults screen → NoResults screen with another query\n return (\n nextProps.state.status === 'loading' ||\n nextProps.state.status === 'stalled'\n );\n }\n);\n","import { createAutocomplete } from '@algolia/autocomplete-core';\nimport React, { type JSX } from 'react';\n\nimport type { FacetBarTranslations } from './components/FacetBar';\nimport { FacetBar } from './components/FacetBar';\nimport type { KeywordSearchBoxTranslations } from './components/KeywordSearchBox';\nimport { KeywordSearchBox } from './components/KeywordSearchBox';\nimport { ModalShell } from './components/ui/ModalShell';\nimport type { DocSearchProps } from './DocSearch';\nimport type { FooterTranslations } from './Footer';\nimport { Footer } from './Footer';\nimport { Hit } from './Hit';\nimport { useDocSearchFacets } from './hooks/useDocSearchFacets';\nimport { useSendItemClickEvent } from './hooks/useDocSearchInsights';\nimport { useInitialModalQuery } from './hooks/useInitialModalQuery';\nimport { useModalEnvironment } from './hooks/useModalEnvironment';\nimport { useModalRefs } from './hooks/useModalRefs';\nimport { useRefreshOnInitialQuery } from './hooks/useRefreshOnInitialQuery';\nimport { useSaveRecentSearch } from './hooks/useSaveRecentSearch';\nimport { useStoredDocSearches } from './hooks/useStoredDocSearches';\nimport type { ScreenStateTranslations } from './ScreenState';\nimport { ScreenState } from './ScreenState';\nimport type { DocSearchState, InternalDocSearchHit } from './types';\nimport { useSearchClient } from './useSearchClient';\nimport {\n identity,\n isModifierEvent,\n noop,\n scrollTo as scrollToUtils,\n} from './utils';\nimport {\n buildNoQuerySources,\n buildQuerySources,\n type BuildQuerySourcesState,\n} from './utils/createDocSearchSources';\nimport { normalizeDocSearchIndexes } from './utils/normalizeDocSearchIndexes';\n\nexport type ModalTranslations = Partial<{\n searchBox: KeywordSearchBoxTranslations;\n footer: FooterTranslations;\n facets: FacetBarTranslations;\n}> &\n ScreenStateTranslations;\n\nexport type DocSearchModalProps = DocSearchProps & {\n initialScrollY: number;\n onClose?: () => void;\n translations?: ModalTranslations;\n};\n\nexport function DocSearchModal({\n appId,\n apiKey,\n maxResultsPerGroup,\n theme,\n onClose = noop,\n transformItems = identity,\n hitComponent = Hit,\n resultsFooterComponent = (): JSX.Element | null => null,\n navigator,\n initialScrollY = 0,\n transformSearchClient = identity,\n disableUserPersonalization = false,\n initialQuery: initialQueryFromProp = '',\n translations = {},\n getMissingResultsUrl,\n insights = false,\n recentSearchesLimit = 7,\n recentSearchesWithFavoritesLimit = 4,\n indices = [],\n indexName,\n searchParameters,\n facets,\n ...props\n}: DocSearchModalProps): JSX.Element {\n const {\n footer: footerTranslations,\n searchBox: searchBoxTranslations,\n facets: facetBarTranslations,\n ...screenStateTranslations\n } = translations;\n const [state, setState] = React.useState<\n DocSearchState<InternalDocSearchHit>\n >({\n query: '',\n collections: [],\n completion: null,\n context: {},\n isOpen: false,\n activeItemId: null,\n status: 'idle',\n });\n\n const placeholder =\n translations?.searchBox?.placeholderText ||\n props.placeholder ||\n 'Search docs';\n\n const {\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n inputRef,\n snippetLength,\n } = useModalRefs();\n const { initialQuery, initialQueryFromSelection } =\n useInitialModalQuery(initialQueryFromProp);\n\n const searchClient = useSearchClient(appId, apiKey, transformSearchClient);\n\n const indexes = React.useMemo(\n () =>\n normalizeDocSearchIndexes({\n indexName,\n indices,\n searchParameters,\n }),\n [indexName, indices, searchParameters]\n );\n const defaultIndexName = indexes[0].name;\n\n const autocompleteRef =\n React.useRef<\n ReturnType<\n typeof createAutocomplete<\n InternalDocSearchHit,\n React.FormEvent<HTMLFormElement>,\n React.MouseEvent,\n React.KeyboardEvent\n >\n >\n >(undefined);\n\n const {\n visibleFacets,\n facetSelections,\n facetSelectionsRef,\n handleFacetSelectionChange,\n clearFacetSelections,\n } = useDocSearchFacets({\n facets,\n indexes,\n searchClient,\n onSelectionsChange: () => autocompleteRef.current?.refresh(),\n });\n\n const { favoriteSearches, recentSearches } = useStoredDocSearches({\n defaultIndexName,\n recentSearchesLimit,\n recentSearchesWithFavoritesLimit,\n });\n const saveRecentSearch = useSaveRecentSearch({\n favoriteSearches,\n recentSearches,\n disableUserPersonalization,\n });\n const sendItemClickEvent = useSendItemClickEvent(state);\n\n if (!autocompleteRef.current) {\n autocompleteRef.current = createAutocomplete({\n id: 'docsearch',\n defaultActiveItemId: 0,\n openOnFocus: true,\n initialState: {\n query: initialQuery,\n context: {\n searchSuggestions: [],\n },\n },\n insights: Boolean(insights),\n navigator,\n onStateChange(changes) {\n setState(changes.state);\n },\n getSources({ query, state: sourcesState, setContext, setStatus }) {\n if (!query) {\n const noQuerySources = buildNoQuerySources({\n recentSearches,\n favoriteSearches,\n saveRecentSearch,\n onClose,\n disableUserPersonalization,\n });\n return noQuerySources;\n }\n\n const querySourcesState: BuildQuerySourcesState = {\n context: sourcesState.context,\n };\n\n const algoliaSourcesPromise = buildQuerySources({\n query,\n state: querySourcesState,\n setContext,\n setStatus,\n searchClient,\n indexes,\n snippetLength,\n insights: Boolean(insights),\n appId,\n apiKey,\n maxResultsPerGroup,\n transformItems,\n saveRecentSearch,\n onClose,\n facetSelections: facetSelectionsRef,\n });\n\n return algoliaSourcesPromise;\n },\n });\n }\n\n const autocomplete = autocompleteRef.current;\n\n const { getEnvironmentProps, getRootProps, refresh } = autocomplete;\n\n useModalEnvironment({\n getEnvironmentProps,\n containerRef,\n dropdownRef,\n formElementRef,\n inputRef,\n initialScrollY,\n modalRef,\n snippetLength,\n theme,\n });\n\n React.useEffect(() => {\n if (dropdownRef.current) {\n scrollToUtils(dropdownRef.current);\n }\n }, [state.query, dropdownRef]);\n\n useRefreshOnInitialQuery({ initialQuery, inputRef, refresh });\n\n // hide the dropdown on idle and no collections\n let showDocsearchDropdown = true;\n const hasCollections = state.collections.some(\n (collection) => collection.items.length > 0\n );\n if (\n state.status === 'idle' &&\n hasCollections === false &&\n state.query.length === 0\n ) {\n showDocsearchDropdown = false;\n }\n\n return (\n <ModalShell\n state={state}\n containerRef={containerRef}\n modalRef={modalRef}\n formElementRef={formElementRef}\n dropdownRef={dropdownRef}\n getRootProps={getRootProps}\n showDropdown={showDocsearchDropdown}\n searchBox={\n <KeywordSearchBox\n {...autocomplete}\n state={state}\n placeholder={placeholder || 'Search docs'}\n autoFocus={initialQuery.length === 0}\n inputRef={inputRef}\n isFromSelection={\n Boolean(initialQuery) && initialQuery === initialQueryFromSelection\n }\n translations={searchBoxTranslations}\n onClose={onClose}\n />\n }\n filterBar={\n state.query !== '' ? (\n <FacetBar\n facets={visibleFacets}\n selections={facetSelections}\n translations={facetBarTranslations}\n clearSelections={clearFacetSelections}\n onSelectionChange={handleFacetSelectionChange}\n />\n ) : null\n }\n screenState={\n <ScreenState\n {...autocomplete}\n indexName={defaultIndexName}\n state={state}\n hitComponent={hitComponent}\n resultsFooterComponent={resultsFooterComponent}\n disableUserPersonalization={disableUserPersonalization}\n recentSearches={recentSearches}\n favoriteSearches={favoriteSearches}\n inputRef={inputRef}\n translations={screenStateTranslations}\n getMissingResultsUrl={getMissingResultsUrl}\n hasCollections={hasCollections}\n resultBadgeKey={props.resultBadgeKey}\n onItemClick={(item, event) => {\n sendItemClickEvent(item);\n saveRecentSearch(item);\n if (!isModifierEvent(event)) {\n onClose();\n }\n }}\n />\n }\n footer={<Footer translations={footerTranslations} />}\n onClose={onClose}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"normalizeDocSearchIndexes-DAzlMybx.js","names":["Menu","MenuPrimitive","Menu","result"],"sources":["../../src/utils/capitalize.ts","../../src/utils/collections.ts","../../src/utils/decodeHtmlEntities.ts","../../src/utils/getHitItemBreadcrumbs.ts","../../src/utils/getNestedValue.ts","../../src/utils/groupBy.ts","../../src/utils/identity.ts","../../src/utils/isModifierEvent.ts","../../src/utils/noop.ts","../../src/utils/removeHighlightTags.ts","../../src/utils/scrollTo.ts","../../src/icons/SelectIcon.tsx","../../src/icons/ErrorIcon.tsx","../../src/icons/NoResultsIcon.tsx","../../src/icons/PinIcon.tsx","../../src/icons/ChevronIcon.tsx","../../src/icons/CheckIcon.tsx","../../src/utils/facets.ts","../../src/components/ui/Chip.tsx","../../src/components/ui/Menu.tsx","../../src/components/FacetBar.tsx","../../src/components/ui/SearchBoxForm.tsx","../../src/components/ui/ModalShell.tsx","../../src/Footer.tsx","../../src/Hit.tsx","../../src/useFacetValues.ts","../../src/hooks/useDocSearchFacets.ts","../../src/hooks/useDocSearchInsights.ts","../../src/hooks/useInitialModalQuery.ts","../../src/useTouchEvents.ts","../../src/useTrapFocus.ts","../../src/hooks/useDocSearchModalEffects.ts","../../src/hooks/useModalEnvironment.ts","../../src/hooks/useModalRefs.ts","../../src/hooks/useRefreshOnInitialQuery.ts","../../src/hooks/useSaveRecentSearch.ts","../../src/hooks/useStoredDocSearches.ts","../../src/components/ui/HitContent.tsx","../../src/hooks/useRelativeFormattedDate.ts","../../src/Snippet.tsx","../../src/Results.tsx","../../src/components/ui/StoredSearchesSections.tsx","../../src/ErrorScreen.tsx","../../src/NoResultsScreen.tsx","../../src/components/HitResultBadge.tsx","../../src/ResultsScreen.tsx","../../src/utils/createDocSearchSources.ts","../../src/utils/normalizeDocSearchIndexes.ts"],"sourcesContent":["export function capitalize(text: string): string {\n return `${text.charAt(0).toLocaleUpperCase()}${text.substring(1)}`;\n}\n","import type { AutocompleteState, BaseItem } from '@algolia/autocomplete-core';\n\nexport const SOURCE_IDS = {\n askAI: 'askAI',\n favoriteSearches: 'favoriteSearches',\n recentConversations: 'recentConversations',\n recentSearches: 'recentSearches',\n} as const;\n\nexport type KnownSourceId = (typeof SOURCE_IDS)[keyof typeof SOURCE_IDS];\n\ntype Collection<TItem extends BaseItem> =\n AutocompleteState<TItem>['collections'][number];\n\nexport function getCollection<TItem extends BaseItem>(\n state: { collections: Array<Collection<TItem> | null | undefined> },\n sourceId: KnownSourceId\n): Collection<TItem> | undefined {\n return state.collections.find(\n (collection): collection is Collection<TItem> =>\n collection?.source.sourceId === sourceId\n );\n}\n","export function decodeHtmlEntities(text: string): string {\n return text\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, '&');\n}\n","import type { StoredDocSearchHit } from '../types';\n\nimport { decodeHtmlEntities } from './decodeHtmlEntities';\n\nconst LEVELS = [\n 'lvl0',\n 'lvl1',\n 'lvl2',\n 'lvl3',\n 'lvl4',\n 'lvl5',\n 'lvl6',\n] as const;\n\nexport function getHitItemBreadcrumbs<TItem extends StoredDocSearchHit>(\n item: TItem\n): string {\n const currentIndex =\n item.type === 'content' || item.type === 'askAI'\n ? LEVELS.length\n : LEVELS.indexOf(item.type);\n return LEVELS.slice(0, currentIndex)\n .map((lvl) =>\n item.hierarchy[lvl] ? decodeHtmlEntities(item.hierarchy[lvl]) : null\n )\n .filter(Boolean)\n .join(' > ');\n}\n","const segmentsCache = new Map<string, string[]>();\n\nfunction parseKey(key: string): string[] {\n const cachedKey = segmentsCache.get(key);\n if (cachedKey) return cachedKey;\n\n // Parses the key for array indexing and transforms to `.` delimited\n const segments = key\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .replace(/^\\/./, '')\n .split('.');\n\n segmentsCache.set(key, segments);\n\n return segments;\n}\n\nexport function getNestedValue(obj: unknown, key: string): unknown {\n const segments = parseKey(key);\n\n return segments.reduce<unknown>((acc, curr) => {\n if (\n acc &&\n typeof acc === 'object' &&\n Object.prototype.hasOwnProperty.call(acc, curr)\n ) {\n return (acc as Record<string, unknown>)[curr];\n }\n\n return undefined;\n }, obj);\n}\n","export function groupBy<TValue extends Record<string, unknown>>(\n values: TValue[],\n predicate: (value: TValue) => string,\n maxResultsPerGroup?: number\n): Record<string, TValue[]> {\n return values.reduce<Record<string, TValue[]>>((acc, item) => {\n const key = predicate(item);\n\n if (!acc.hasOwnProperty(key)) {\n acc[key] = [];\n }\n\n // We limit each section to show 5 hits maximum.\n // This acts as a frontend alternative to `distinct`.\n if (acc[key].length < (maxResultsPerGroup || 5)) {\n acc[key].push(item);\n }\n\n return acc;\n }, {});\n}\n","export function identity<TParam>(x: TParam): TParam {\n return x;\n}\n","/**\n * Detect when an event is modified with a special key to let the browser\n * trigger its default behavior.\n */\nexport function isModifierEvent<TEvent extends KeyboardEvent | MouseEvent>(\n event: TEvent\n): boolean {\n const isMiddleClick = (event as MouseEvent).button === 1;\n\n return (\n isMiddleClick ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n );\n}\n","export function noop(..._args: any[]): void {}\n","import type { DocSearchHit, InternalDocSearchHit } from '../types';\n\nconst regexHighlightTags = /(<mark>|<\\/mark>)/g;\nconst regexHasHighlightTags = RegExp(regexHighlightTags.source);\n\nexport function removeHighlightTags(\n hit: DocSearchHit | InternalDocSearchHit\n): string {\n const internalDocSearchHit = hit as InternalDocSearchHit;\n\n if (!internalDocSearchHit.__docsearch_parent && !hit._highlightResult) {\n return hit.hierarchy.lvl0;\n }\n\n const lvl0 = internalDocSearchHit.__docsearch_parent\n ? internalDocSearchHit.__docsearch_parent?._highlightResult?.hierarchy?.lvl0\n : hit._highlightResult?.hierarchy?.lvl0;\n\n if (!lvl0) {\n return hit.hierarchy.lvl0;\n }\n\n return lvl0.value && regexHasHighlightTags.test(lvl0.value)\n ? lvl0.value.replace(regexHighlightTags, '')\n : lvl0.value;\n}\n","export function scrollTo(el: HTMLElement): void {\n // some test environments (like jsdom) don't implement element.scrollTo\n if (typeof el.scrollTo === 'function') {\n el.scrollTo({ top: 0, behavior: 'smooth' });\n } else {\n // fallback for environments without scrollTo support\n el.scrollTop = 0;\n }\n}\n","import React, { type JSX } from 'react';\n\nexport function SelectIcon(): JSX.Element {\n return (\n <svg\n className=\"DocSearch-Hit-Select-Icon\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n >\n <g\n stroke=\"currentColor\"\n fill=\"none\"\n fillRule=\"evenodd\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 3v4c0 2-2 4-4 4H2\" />\n <path d=\"M8 17l-6-6 6-6\" />\n </g>\n </svg>\n );\n}\n","import React, { type JSX } from 'react';\n\nexport function ErrorIcon(): JSX.Element {\n return (\n <svg\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n fillRule=\"evenodd\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0\" />\n </svg>\n );\n}\n","import React, { type JSX } from 'react';\n\nexport function NoResultsIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#5a5e9a\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m13.5 8.5-5 5\" />\n <path d=\"m8.5 8.5 5 5\" />\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n","import React, { type JSX } from 'react';\n\nexport function PinIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\" />\n </svg>\n );\n}\n","import React, { type JSX } from 'react';\n\nexport function ChevronIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n","import React, { type JSX } from 'react';\n\nexport function CheckIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","import type { DocSearchFacet } from '../DocSearch';\n\nexport const MAX_FACETS = 5;\n\nexport function normalizeFacets(\n facets: DocSearchFacet[] = []\n): DocSearchFacet[] {\n const facetsMap = new Map<string, DocSearchFacet>();\n\n for (const facet of facets) {\n const key = facet.key.trim().toLowerCase();\n if (key.length === 0 || facetsMap.has(key)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (facetsMap.size >= MAX_FACETS) {\n break;\n }\n\n facetsMap.set(key, facet);\n }\n\n if (process.env.NODE_ENV !== 'production' && facets.length > MAX_FACETS) {\n // eslint-disable-next-line no-console\n console.warn(\n `DocSearch supports a maximum of ${MAX_FACETS} facets. Extra facets were ignored.`\n );\n }\n\n return Array.from(facetsMap.values());\n}\n\nexport function getFacetLabel(facet: DocSearchFacet): string {\n if (facet.label) {\n return facet.label;\n }\n\n return facet.key\n .replace(/[._-]+/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n","import React, { type JSX } from 'react';\n\nimport { CloseIcon } from '../../icons';\n\ninterface ChipProps {\n children: React.ReactNode;\n}\n\nexport function Chip({ children }: ChipProps): JSX.Element {\n return <div className=\"DocSearch-Chip\">{children}</div>;\n}\n\nfunction ChipDismiss({\n className,\n type = 'button',\n ...props\n}: React.ComponentProps<'button'>): JSX.Element {\n const cn = `DocSearch-Chip-Dismiss${className ? ` ${className}` : ''}`;\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button type={type} className={cn} tabIndex={0} {...props}>\n <CloseIcon aria-hidden=\"true\" />\n </button>\n );\n}\n\nChip.Dismiss = ChipDismiss;\n","import { Menu as MenuPrimitive } from '@base-ui/react/menu';\nimport React, { type JSX } from 'react';\n\nimport { CheckIcon } from '../../icons';\n\nexport function Menu({ ...props }: MenuPrimitive.Root.Props): JSX.Element {\n return <MenuPrimitive.Root {...props} />;\n}\n\nfunction MenuTrigger({\n className,\n ...props\n}: MenuPrimitive.Trigger.Props): JSX.Element {\n const cn = `DocSearch-Menu-Trigger${className ? ` ${className}` : ''}`;\n return <MenuPrimitive.Trigger className={cn} {...props} />;\n}\n\nMenu.Trigger = MenuTrigger;\n\ntype MenuPopupProps = MenuPrimitive.Popup.Props &\n Pick<MenuPrimitive.Portal.Props, 'container'> &\n Pick<\n MenuPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'collisionBoundary' | 'side' | 'sideOffset'\n >;\n\nfunction MenuPopup({\n align = 'start',\n alignOffset = 0,\n side = 'bottom',\n sideOffset = 4,\n collisionBoundary = 'clipping-ancestors',\n container,\n ...props\n}: MenuPopupProps): JSX.Element {\n return (\n <MenuPrimitive.Portal container={container}>\n <MenuPrimitive.Positioner\n className=\"DocSearch-Menu-Positioner\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n collisionBoundary={collisionBoundary}\n >\n <MenuPrimitive.Popup className=\"DocSearch-Menu-Popup\" {...props} />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nMenu.Popup = MenuPopup;\n\nfunction MenuRadioGroup({\n ...props\n}: MenuPrimitive.RadioGroup.Props): JSX.Element {\n return <MenuPrimitive.RadioGroup {...props} />;\n}\n\nMenu.RadioGroup = MenuRadioGroup;\n\nfunction MenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props): JSX.Element {\n const cn = `DocSearch-Menu-Item DocSearch-Menu-RadioItem${className ? ` ${className}` : ''}`;\n return (\n <MenuPrimitive.RadioItem className={cn} closeOnClick={true} {...props}>\n <span className=\"DocSearch-Menu-RadioItem-Indicator\">\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n );\n}\n\nMenu.RadioItem = MenuRadioItem;\n\nfunction MenuGroupLabel({\n className,\n ...props\n}: MenuPrimitive.GroupLabel.Props): JSX.Element {\n const cn = `DocSearch-Menu-GroupLabel${className ? ` ${className}` : ''}`;\n return <MenuPrimitive.GroupLabel className={cn} {...props} />;\n}\n\nMenu.GroupLabel = MenuGroupLabel;\n","import React, { type JSX } from 'react';\n\nimport type { DocSearchFacet } from '../DocSearch';\nimport { ChevronIcon } from '../icons';\nimport { capitalize } from '../utils';\nimport { getFacetLabel } from '../utils/facets';\n\nimport { Chip } from './ui/Chip';\nimport { Menu } from './ui/Menu';\n\nexport type FacetBarTranslations = Partial<{\n /**\n * Label displayed as the default (all) facet option.\n *\n * @default 'All'\n */\n defaultValueLabel: string;\n /**\n * Facet menu trigger aria label when a facet is selected.\n *\n * @default 'selected'\n */\n facetMenuTriggerAriaLabel: string;\n /**\n * Label displayed for clearing all facets action.\n *\n * @default 'Clear all'\n */\n clearAllLabel: string;\n /**\n * Aria label for the list of possible facets.\n *\n * @default 'Search filters'\n */\n facetsAriaLabel: string;\n /**\n * Aria label for the list of selected facets.\n *\n * @default 'Selected search filters'\n */\n selectedFacetsAriaLabel: string;\n /**\n * Aria label indicating to clear a selected facet.\n *\n * @default 'Clear filter:'\n */\n clearFacetAriaLabel: string;\n}>;\n\nexport interface FacetBarFacet extends DocSearchFacet {\n values: string[];\n}\n\ninterface FacetMenuProps {\n facet: FacetBarFacet;\n selectedValue: string;\n defaultValueLabel: string;\n menuTriggerSelectedAriaLabel: string;\n onSelectionChange: (facet: string, value: string) => void;\n registerTrigger: (facetKey: string, el: HTMLButtonElement | null) => void;\n}\n\nconst FacetMenu = React.memo(function FacetMenu({\n facet,\n selectedValue,\n defaultValueLabel,\n onSelectionChange,\n registerTrigger,\n menuTriggerSelectedAriaLabel,\n}: FacetMenuProps): JSX.Element {\n const label = getFacetLabel(facet);\n const handleValueChange = React.useCallback(\n (value: string) => {\n onSelectionChange(facet.key, value);\n },\n [facet.key, onSelectionChange]\n );\n const triggerRef = React.useCallback(\n (el: HTMLButtonElement | null) => {\n registerTrigger(facet.key, el);\n },\n [facet.key, registerTrigger]\n );\n\n return (\n <Menu>\n <Menu.Trigger\n ref={triggerRef}\n data-has-selection={Boolean(selectedValue)}\n aria-label={\n selectedValue\n ? `${label}, ${selectedValue} ${menuTriggerSelectedAriaLabel}`\n : label\n }\n >\n <span>{capitalize(label)}</span>\n <ChevronIcon />\n </Menu.Trigger>\n <Menu.Popup>\n <Menu.RadioGroup\n value={selectedValue}\n onValueChange={handleValueChange}\n >\n <Menu.RadioItem value=\"\" label={`${defaultValueLabel} ${label}`}>\n {defaultValueLabel}\n </Menu.RadioItem>\n {facet.values.map((value) => (\n <Menu.RadioItem key={value} value={value} label={value}>\n {capitalize(value)}\n </Menu.RadioItem>\n ))}\n </Menu.RadioGroup>\n </Menu.Popup>\n </Menu>\n );\n});\n\ninterface SelectedFacetChipProps {\n facetKey: string;\n facetLabel: string;\n value: string;\n dismissAriaLabel: string;\n onDismiss: (\n facetKey: string,\n event: React.MouseEvent<HTMLButtonElement>\n ) => void;\n}\n\nconst SelectedFacetChip = React.memo(function SelectedFacetChip({\n facetKey,\n facetLabel,\n value,\n dismissAriaLabel,\n onDismiss,\n}: SelectedFacetChipProps): JSX.Element {\n const handleDismissFacet = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onDismiss(facetKey, e);\n },\n [facetKey, onDismiss]\n );\n\n return (\n <Chip>\n {capitalize(value)}\n <Chip.Dismiss\n aria-label={`${dismissAriaLabel} ${capitalize(value)} (${facetLabel})`}\n onClick={handleDismissFacet}\n />\n </Chip>\n );\n});\n\ninterface FacetBarProps {\n facets: FacetBarFacet[];\n selections: Record<string, string>;\n onSelectionChange: (facet: string, value: string) => void;\n clearSelections: () => void;\n translations?: FacetBarTranslations;\n}\n\nexport const FacetBar = React.memo(function FacetBar({\n facets,\n selections,\n onSelectionChange,\n clearSelections,\n translations = {},\n}: FacetBarProps): JSX.Element | null {\n const {\n defaultValueLabel = 'All',\n facetMenuTriggerAriaLabel = 'selected',\n clearAllLabel = 'Clear all',\n facetsAriaLabel = 'Search filters',\n selectedFacetsAriaLabel = 'Selected search filters',\n clearFacetAriaLabel = 'Clear filter:',\n } = translations;\n const selectionsToDisplay = React.useMemo(() => {\n return Object.entries(selections).filter(([_, value]) => Boolean(value));\n }, [selections]);\n\n const triggerRefs = React.useRef(new Map<string, HTMLButtonElement>());\n\n const registerTrigger = React.useCallback(\n (facetKey: string, el: HTMLButtonElement | null) => {\n if (el) {\n triggerRefs.current.set(facetKey, el);\n } else {\n triggerRefs.current.delete(facetKey);\n }\n },\n []\n );\n\n const handleDismissFacet = React.useCallback(\n (facetKey: string, ev: React.MouseEvent<HTMLButtonElement>) => {\n const dismissButton = ev.currentTarget;\n const selectionBar = dismissButton.closest(\n '.DocSearch-FacetSelectionBar'\n );\n\n if (selectionBar) {\n const dismissButtons = Array.from(\n selectionBar.querySelectorAll<HTMLButtonElement>(\n '.DocSearch-Chip-Dismiss'\n )\n );\n const index = dismissButtons.indexOf(dismissButton);\n const target =\n dismissButtons[index + 1] ??\n dismissButtons[index - 1] ??\n triggerRefs.current.get(facetKey);\n\n target?.focus();\n }\n\n onSelectionChange(facetKey, '');\n },\n [onSelectionChange]\n );\n\n const handleClearAll = React.useCallback(() => {\n triggerRefs.current.values().next().value?.focus();\n clearSelections();\n }, [clearSelections]);\n\n const facetLabels = React.useMemo(\n () => new Map(facets.map((f) => [f.key, getFacetLabel(f)])),\n [facets]\n );\n\n if (facets.length === 0) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"DocSearch-FacetBar\"\n role=\"group\"\n aria-label={facetsAriaLabel}\n >\n {facets.map((facet) => {\n const selectedValue = selections[facet.key] ?? '';\n\n return (\n <FacetMenu\n key={facet.key}\n facet={facet}\n selectedValue={selectedValue}\n defaultValueLabel={defaultValueLabel}\n registerTrigger={registerTrigger}\n menuTriggerSelectedAriaLabel={facetMenuTriggerAriaLabel}\n onSelectionChange={onSelectionChange}\n />\n );\n })}\n </div>\n {selectionsToDisplay.length > 0 && (\n <div\n className=\"DocSearch-FacetSelectionBar\"\n role=\"group\"\n aria-label={selectedFacetsAriaLabel}\n >\n {selectionsToDisplay.map(([key, value]) => (\n <SelectedFacetChip\n key={key}\n facetKey={key}\n facetLabel={facetLabels.get(key) ?? key}\n value={value}\n dismissAriaLabel={clearFacetAriaLabel}\n onDismiss={handleDismissFacet}\n />\n ))}\n <button\n type=\"button\"\n className=\"DocSearch-FacetSelectionBar-Action\"\n onClick={handleClearAll}\n >\n {clearAllLabel}\n </button>\n </div>\n )}\n </>\n );\n});\n","import type {\n AutocompleteApi,\n AutocompleteState,\n} from '@algolia/autocomplete-core';\nimport React, { type JSX, type RefObject } from 'react';\n\nimport { MAX_QUERY_SIZE } from '../../constants';\nimport { CloseIcon, LoadingIcon, SearchIcon } from '../../icons';\nimport type { InternalDocSearchHit } from '../../types';\n\ninterface SearchBoxFormProps extends AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n state: AutocompleteState<InternalDocSearchHit>;\n autoFocus: boolean;\n inputRef: RefObject<HTMLInputElement | null>;\n isFromSelection: boolean;\n placeholder: string;\n onClose: () => void;\n clearButtonTitle: string;\n clearButtonAriaLabel: string;\n closeButtonText: string;\n closeButtonAriaLabel: string;\n searchInputLabel: string;\n inputProps?: Partial<React.InputHTMLAttributes<HTMLInputElement>>;\n leadingElement?: React.ReactNode;\n inputOverlay?: React.ReactNode;\n actionsBeforeClose?: React.ReactNode;\n hideInput?: boolean;\n}\n\nexport function SearchBoxForm({\n actionsBeforeClose,\n autoFocus,\n clearButtonAriaLabel,\n clearButtonTitle,\n closeButtonAriaLabel,\n closeButtonText,\n hideInput,\n inputOverlay,\n inputProps,\n inputRef,\n isFromSelection,\n leadingElement,\n onClose,\n placeholder,\n searchInputLabel,\n state,\n ...autocomplete\n}: SearchBoxFormProps): JSX.Element {\n const { onReset } = autocomplete.getFormProps({\n inputElement: inputRef.current,\n });\n\n React.useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus, inputRef]);\n\n React.useEffect(() => {\n if (isFromSelection && inputRef.current) {\n inputRef.current.select();\n }\n }, [isFromSelection, inputRef]);\n\n const baseInputProps = autocomplete.getInputProps({\n inputElement: inputRef.current!,\n autoFocus,\n maxLength: MAX_QUERY_SIZE,\n });\n\n const isKeywordSearchLoading = state.status === 'stalled';\n\n return (\n <form\n className=\"DocSearch-Form\"\n onSubmit={(event) => {\n event.preventDefault();\n }}\n onReset={onReset}\n >\n {leadingElement ||\n (isKeywordSearchLoading ? (\n <div className=\"DocSearch-LoadingIndicator\">\n <LoadingIcon />\n </div>\n ) : (\n <label\n className=\"DocSearch-MagnifierLabel\"\n {...autocomplete.getLabelProps()}\n >\n <SearchIcon />\n <span className=\"DocSearch-VisuallyHiddenForAccessibility\">\n {searchInputLabel}\n </span>\n </label>\n ))}\n\n {inputOverlay}\n\n <input\n className=\"DocSearch-Input\"\n ref={inputRef}\n {...baseInputProps}\n {...inputProps}\n placeholder={placeholder}\n hidden={hideInput}\n />\n\n <div className=\"DocSearch-Actions\">\n {actionsBeforeClose}\n\n <button\n type=\"button\"\n title={closeButtonText}\n className=\"DocSearch-Action DocSearch-Close\"\n aria-label={closeButtonAriaLabel}\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n </div>\n </form>\n );\n}\n","import type { AutocompleteApi } from '@algolia/autocomplete-core';\nimport React, { type JSX } from 'react';\n\nimport type { DocSearchState, InternalDocSearchHit } from '../../types';\n\nexport type ModalShellProps = {\n state: DocSearchState<InternalDocSearchHit>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n modalRef: React.RefObject<HTMLDivElement | null>;\n formElementRef: React.RefObject<HTMLDivElement | null>;\n dropdownRef: React.RefObject<HTMLDivElement | null>;\n getRootProps: AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent<HTMLFormElement>,\n React.MouseEvent,\n React.KeyboardEvent\n >['getRootProps'];\n onClose: () => void;\n showDropdown: boolean;\n searchBox: React.ReactNode;\n filterBar?: React.ReactNode;\n screenState: React.ReactNode;\n footer: React.ReactNode;\n};\n\nexport function ModalShell({\n state,\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n getRootProps,\n onClose,\n showDropdown,\n searchBox,\n filterBar,\n screenState,\n footer,\n}: ModalShellProps): JSX.Element {\n return (\n <div\n ref={containerRef}\n {...getRootProps({ 'aria-expanded': true })}\n className={[\n 'DocSearch',\n 'DocSearch-Container',\n state.status === 'stalled' && 'DocSearch-Container--Stalled',\n state.status === 'error' && 'DocSearch-Container--Errored',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"button\"\n tabIndex={0}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n }}\n >\n <div className=\"DocSearch-Modal\" ref={modalRef}>\n <header className=\"DocSearch-SearchBar\" ref={formElementRef}>\n {searchBox}\n </header>\n\n {filterBar}\n\n {showDropdown && (\n <div className=\"DocSearch-Dropdown\" ref={dropdownRef}>\n {screenState}\n </div>\n )}\n\n <footer className=\"DocSearch-Footer\">{footer}</footer>\n </div>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { AlgoliaLogo } from './AlgoliaLogo';\n\nexport type FooterTranslations = Partial<{\n selectText: string;\n submitQuestionText: string;\n selectKeyAriaLabel: string;\n navigateText: string;\n navigateUpKeyAriaLabel: string;\n navigateDownKeyAriaLabel: string;\n closeText: string;\n backToSearchText: string;\n closeKeyAriaLabel: string;\n poweredByText: string;\n}>;\n\ntype FooterProps = Partial<{\n translations: FooterTranslations;\n isAskAiActive: boolean;\n}>;\n\ninterface CommandIconProps {\n children: React.ReactNode;\n ariaLabel: string;\n}\n\nfunction CommandIcon(props: CommandIconProps): JSX.Element {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n aria-label={props.ariaLabel}\n viewBox=\"0 0 24 24\"\n role=\"img\"\n >\n <g\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.4\"\n >\n {props.children}\n </g>\n </svg>\n );\n}\n\nexport function Footer({\n translations = {},\n isAskAiActive = false,\n}: FooterProps): JSX.Element {\n const {\n selectText = 'Select',\n selectKeyAriaLabel = 'Enter key',\n submitQuestionText = 'Submit question',\n navigateText = 'Navigate',\n navigateUpKeyAriaLabel = 'Arrow up',\n navigateDownKeyAriaLabel = 'Arrow down',\n closeText = 'Close',\n backToSearchText = 'Back to search',\n closeKeyAriaLabel = 'Escape key',\n poweredByText = 'Powered by',\n } = translations;\n\n return (\n <>\n <div className=\"DocSearch-Logo\">\n <AlgoliaLogo translations={{ poweredByText }} />\n </div>\n <ul className=\"DocSearch-Commands\">\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={navigateDownKeyAriaLabel}>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </CommandIcon>\n </kbd>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={navigateUpKeyAriaLabel}>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </CommandIcon>\n </kbd>\n <span className=\"DocSearch-Label\">{navigateText}</span>\n </li>\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={selectKeyAriaLabel}>\n <polyline points=\"9 10 4 15 9 20\" />\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n </CommandIcon>\n </kbd>\n <span className=\"DocSearch-Label\">\n {isAskAiActive ? submitQuestionText : selectText}\n </span>\n </li>\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <span className=\"DocSearch-Escape-Key\">ESC</span>\n </kbd>\n <span className=\"DocSearch-Label\" aria-label={closeKeyAriaLabel}>\n {isAskAiActive ? backToSearchText : closeText}\n </span>\n </li>\n </ul>\n </>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { InternalDocSearchHit, StoredDocSearchHit } from './types';\n\ninterface HitProps {\n hit: InternalDocSearchHit | StoredDocSearchHit;\n children: React.ReactNode;\n}\n\nexport function Hit({ hit, children }: HitProps): JSX.Element {\n return <a href={hit.url}>{children}</a>;\n}\n","import type { SearchResponse } from 'algoliasearch/lite';\nimport React from 'react';\n\nimport type { DocSearchFacet, DocSearchIndex } from './DocSearch';\nimport type { DocSearchHit } from './types';\nimport type { useSearchClient } from './useSearchClient';\n\nexport type FacetValues = Record<string, string[]>;\n\nexport function useFacetValues({\n facets,\n indexes,\n searchClient,\n}: {\n facets: DocSearchFacet[];\n indexes: DocSearchIndex[];\n searchClient: ReturnType<typeof useSearchClient>;\n}): FacetValues {\n const [facetValues, setFacetValues] = React.useState<FacetValues>({});\n\n // Derive stable string keys so the effect only re-runs when the actual\n // facet keys or index names/searchParameters change, not on every render (the `facets` and\n // `indexes` props are recreated on each render and would otherwise loop).\n const stableFacetKeys = facets.map((facet) => facet.key).join(',');\n const stableIndexes = JSON.stringify(\n indexes.map((index) => [index.name, index.searchParameters ?? null])\n );\n\n React.useEffect(() => {\n let isMounted = true;\n\n const facetKeys = stableFacetKeys ? stableFacetKeys.split(',') : [];\n\n if (facetKeys.length === 0 || indexes.length === 0) {\n setFacetValues({});\n return () => {\n isMounted = false;\n };\n }\n\n searchClient\n .search<DocSearchHit>({\n requests: indexes.map((index) => ({\n ...(index.searchParameters ?? {}),\n indexName: index.name,\n query: '',\n hitsPerPage: 0,\n facets: facetKeys,\n })),\n })\n .then(({ results }) => {\n if (!isMounted) {\n return;\n }\n\n const valuesByFacet = facetKeys.reduce<FacetValues>((acc, facet) => {\n acc[facet] = [];\n return acc;\n }, {});\n\n results.forEach((res) => {\n const result = res as SearchResponse<DocSearchHit>;\n Object.entries(result.facets ?? {}).forEach(([facet, values]) => {\n if (!valuesByFacet[facet]) {\n return;\n }\n\n valuesByFacet[facet] = Array.from(\n new Set([...valuesByFacet[facet], ...Object.keys(values)])\n ).sort();\n });\n });\n\n setFacetValues(valuesByFacet);\n })\n .catch(() => {\n if (isMounted) {\n setFacetValues({});\n }\n });\n\n return () => {\n isMounted = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [stableFacetKeys, stableIndexes, searchClient]);\n\n return facetValues;\n}\n","import React from 'react';\n\nimport type { FacetBarFacet } from '../components/FacetBar';\nimport type { DocSearchFacet, DocSearchIndex } from '../DocSearch';\nimport { useFacetValues } from '../useFacetValues';\nimport type { useSearchClient } from '../useSearchClient';\nimport type { FacetSelections } from '../utils/createDocSearchSources';\nimport { normalizeFacets } from '../utils/facets';\n\nexport interface UseDocSearchFacetsProps {\n facets?: DocSearchFacet[];\n indexes: DocSearchIndex[];\n searchClient: ReturnType<typeof useSearchClient>;\n /**\n * Called after any facet selection change. Modals use this to refresh the\n * autocomplete results.\n */\n onSelectionsChange?: () => void;\n}\n\nexport interface UseDocSearchFacetsResult {\n /** Facets that have at least one value, ready to be rendered by `FacetBar`. */\n visibleFacets: FacetBarFacet[];\n facetSelections: FacetSelections;\n /** Always-current selections, for consumption inside `getSources` closures. */\n facetSelectionsRef: React.MutableRefObject<FacetSelections>;\n handleFacetSelectionChange: (facet: string, value: string) => void;\n clearFacetSelections: () => void;\n}\n\nexport function useDocSearchFacets({\n facets,\n indexes,\n searchClient,\n onSelectionsChange,\n}: UseDocSearchFacetsProps): UseDocSearchFacetsResult {\n const normalizedFacets = React.useMemo(\n () => normalizeFacets(facets),\n [facets]\n );\n const facetValues = useFacetValues({\n facets: normalizedFacets,\n indexes,\n searchClient,\n });\n const [facetSelections, setFacetSelections] = React.useState<FacetSelections>(\n {}\n );\n const facetSelectionsRef = React.useRef(facetSelections);\n\n const onSelectionsChangeRef = React.useRef(onSelectionsChange);\n onSelectionsChangeRef.current = onSelectionsChange;\n\n const visibleFacets = React.useMemo(\n () =>\n normalizedFacets\n .map((facet) => ({ ...facet, values: facetValues[facet.key] ?? [] }))\n .filter((facet) => facet.values.length > 0),\n [facetValues, normalizedFacets]\n );\n\n const applySelections = React.useCallback((next: FacetSelections): void => {\n facetSelectionsRef.current = next;\n setFacetSelections(next);\n onSelectionsChangeRef.current?.();\n }, []);\n\n const handleFacetSelectionChange = React.useCallback(\n (facet: string, value: string): void => {\n if (facetSelectionsRef.current[facet] === value) return;\n\n const next = { ...facetSelectionsRef.current };\n\n if (value === '') {\n delete next[facet];\n } else {\n next[facet] = value;\n }\n\n applySelections(next);\n },\n [applySelections]\n );\n\n const clearFacetSelections = React.useCallback(() => {\n if (Object.keys(facetSelectionsRef.current).length === 0) return;\n applySelections({});\n }, [applySelections]);\n\n return {\n visibleFacets,\n facetSelections,\n facetSelectionsRef,\n handleFacetSelectionChange,\n clearFacetSelections,\n };\n}\n","import type { AlgoliaInsightsHit } from '@algolia/autocomplete-core';\nimport React from 'react';\n\nimport type { DocSearchState, InternalDocSearchHit } from '../types';\n\nexport function useSendItemClickEvent(\n state: DocSearchState<InternalDocSearchHit>\n): (item: InternalDocSearchHit) => void {\n return React.useCallback(\n (item: InternalDocSearchHit): void => {\n if (!state.context.algoliaInsightsPlugin || !item.__autocomplete_id) {\n return;\n }\n\n const insightsItem = item as AlgoliaInsightsHit;\n\n state.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch({\n eventName: 'Item Selected',\n index: insightsItem.__autocomplete_indexName,\n items: [insightsItem],\n positions: [item.__autocomplete_id],\n queryID: insightsItem.__autocomplete_queryID,\n });\n },\n [state.context.algoliaInsightsPlugin]\n );\n}\n","import React from 'react';\n\nimport { MAX_QUERY_SIZE } from '../constants';\n\nexport function useInitialModalQuery(initialQueryFromProp: string): {\n initialQuery: string;\n initialQueryFromSelection: string;\n} {\n const initialQueryFromSelection = React.useRef(\n typeof window !== 'undefined'\n ? window.getSelection()!.toString().slice(0, MAX_QUERY_SIZE)\n : ''\n ).current;\n const initialQuery = React.useRef(\n initialQueryFromProp || initialQueryFromSelection\n ).current;\n\n return { initialQuery, initialQueryFromSelection };\n}\n","import type { AutocompleteApi } from '@algolia/autocomplete-core';\nimport React from 'react';\n\ninterface UseTouchEventsProps {\n getEnvironmentProps: AutocompleteApi<any>['getEnvironmentProps'];\n panelElement: HTMLDivElement | null;\n formElement: HTMLDivElement | null;\n inputElement: HTMLInputElement | null;\n}\n\nexport function useTouchEvents({\n getEnvironmentProps,\n panelElement,\n formElement,\n inputElement,\n}: UseTouchEventsProps): void {\n React.useEffect(() => {\n if (!(panelElement && formElement && inputElement)) {\n return undefined;\n }\n\n const { onTouchStart, onTouchMove } = getEnvironmentProps({\n panelElement,\n formElement,\n inputElement,\n });\n\n window.addEventListener('touchstart', onTouchStart);\n window.addEventListener('touchmove', onTouchMove);\n\n return (): void => {\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchmove', onTouchMove);\n };\n }, [getEnvironmentProps, panelElement, formElement, inputElement]);\n}\n","import React from 'react';\n\ninterface UseTrapFocusProps {\n container: HTMLElement | null;\n}\n\nexport function useTrapFocus({ container }: UseTrapFocusProps): void {\n React.useEffect(() => {\n if (!container) {\n return undefined;\n }\n\n const focusableElements = container.querySelectorAll<HTMLElement>(\n 'a[href]:not([disabled]), button:not([disabled]), input:not([disabled])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n function trapFocus(event: KeyboardEvent): void {\n if (event.key !== 'Tab') {\n return;\n }\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n\n container.addEventListener('keydown', trapFocus);\n\n return (): void => {\n container.removeEventListener('keydown', trapFocus);\n };\n }, [container]);\n}\n","import { useTheme } from '@docsearch/core/useTheme';\nimport React from 'react';\n\nimport type { DocSearchTheme } from '../types';\nimport { manageLocalStorageQuota } from '../utils/storage';\n\nexport function useDocSearchModalEffects({\n initialScrollY,\n modalRef,\n snippetLength,\n theme,\n}: {\n initialScrollY: number;\n modalRef: React.RefObject<HTMLDivElement | null>;\n snippetLength: React.MutableRefObject<number>;\n theme?: DocSearchTheme;\n}): void {\n useTheme({ theme });\n\n React.useEffect(() => {\n document.body.classList.add('DocSearch--active');\n\n return (): void => {\n document.body.classList.remove('DocSearch--active');\n window.scrollTo?.(0, initialScrollY);\n };\n }, [initialScrollY]);\n\n React.useEffect(() => {\n manageLocalStorageQuota();\n }, []);\n\n React.useLayoutEffect(() => {\n const scrollBarWidth = window.innerWidth - document.body.clientWidth;\n document.body.style.marginInlineEnd = `${scrollBarWidth}px`;\n\n return (): void => {\n document.body.style.marginInlineEnd = '0px';\n };\n }, []);\n\n React.useEffect(() => {\n if (window.matchMedia('(max-width: 768px)').matches) {\n snippetLength.current = 5;\n }\n }, [snippetLength]);\n\n React.useEffect(() => {\n function setFullViewportHeight(): void {\n if (modalRef.current) {\n const vh = window.innerHeight * 0.01;\n modalRef.current.style.setProperty('--docsearch-vh', `${vh}px`);\n }\n }\n\n setFullViewportHeight();\n window.addEventListener('resize', setFullViewportHeight);\n\n return (): void => {\n window.removeEventListener('resize', setFullViewportHeight);\n };\n }, [modalRef]);\n}\n","import type { AutocompleteApi } from '@algolia/autocomplete-core';\nimport type React from 'react';\n\nimport type { DocSearchTheme, InternalDocSearchHit } from '../types';\nimport { useTouchEvents } from '../useTouchEvents';\nimport { useTrapFocus } from '../useTrapFocus';\n\nimport { useDocSearchModalEffects } from './useDocSearchModalEffects';\n\nexport function useModalEnvironment({\n getEnvironmentProps,\n containerRef,\n dropdownRef,\n formElementRef,\n inputRef,\n initialScrollY,\n modalRef,\n snippetLength,\n theme,\n}: {\n getEnvironmentProps: AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent<HTMLFormElement>,\n React.MouseEvent,\n React.KeyboardEvent\n >['getEnvironmentProps'];\n containerRef: React.RefObject<HTMLDivElement | null>;\n dropdownRef: React.RefObject<HTMLDivElement | null>;\n formElementRef: React.RefObject<HTMLDivElement | null>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n initialScrollY: number;\n modalRef: React.RefObject<HTMLDivElement | null>;\n snippetLength: React.MutableRefObject<number>;\n theme?: DocSearchTheme;\n}): void {\n useTouchEvents({\n getEnvironmentProps,\n panelElement: dropdownRef.current,\n formElement: formElementRef.current,\n inputElement: inputRef.current,\n });\n useTrapFocus({ container: containerRef.current });\n useDocSearchModalEffects({ initialScrollY, modalRef, snippetLength, theme });\n}\n","import React from 'react';\n\nexport function useModalRefs(): {\n containerRef: React.RefObject<HTMLDivElement | null>;\n modalRef: React.RefObject<HTMLDivElement | null>;\n formElementRef: React.RefObject<HTMLDivElement | null>;\n dropdownRef: React.RefObject<HTMLDivElement | null>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n snippetLength: React.MutableRefObject<number>;\n} {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const modalRef = React.useRef<HTMLDivElement | null>(null);\n const formElementRef = React.useRef<HTMLDivElement | null>(null);\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const snippetLength = React.useRef<number>(15);\n\n return {\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n inputRef,\n snippetLength,\n };\n}\n","import React from 'react';\n\nexport function useRefreshOnInitialQuery({\n initialQuery,\n inputRef,\n refresh,\n}: {\n initialQuery: string;\n inputRef: React.RefObject<HTMLInputElement | null>;\n refresh: () => void;\n}): void {\n React.useEffect(() => {\n if (initialQuery.length > 0) {\n refresh();\n\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, [initialQuery, inputRef, refresh]);\n}\n","import React from 'react';\n\nimport type { StoredSearchPlugin } from '../stored-searches';\nimport type { InternalDocSearchHit, StoredDocSearchHit } from '../types';\n\nfunction createSyntheticParent(\n item: InternalDocSearchHit\n): InternalDocSearchHit {\n const hierarchy = item.hierarchy;\n const levels = [\n 'lvl6',\n 'lvl5',\n 'lvl4',\n 'lvl3',\n 'lvl2',\n 'lvl1',\n 'lvl0',\n ] as const;\n const deepestLevel = levels.find((level) => hierarchy[level]);\n\n return {\n ...item,\n type: deepestLevel || 'lvl0',\n content: null,\n };\n}\n\nexport function useSaveRecentSearch({\n favoriteSearches,\n recentSearches,\n disableUserPersonalization,\n}: {\n favoriteSearches: StoredSearchPlugin<StoredDocSearchHit>;\n recentSearches: StoredSearchPlugin<StoredDocSearchHit>;\n disableUserPersonalization: boolean;\n}): (item: InternalDocSearchHit) => void {\n return React.useCallback(\n function saveRecentSearch(item: InternalDocSearchHit): void {\n if (disableUserPersonalization) {\n return;\n }\n\n const search =\n item.type === 'content'\n ? item.__docsearch_parent || createSyntheticParent(item)\n : item;\n\n if (\n search &&\n favoriteSearches\n .getAll()\n .findIndex((x) => x.objectID === search.objectID) === -1\n ) {\n recentSearches.add(search);\n }\n },\n [favoriteSearches, recentSearches, disableUserPersonalization]\n );\n}\n","import React from 'react';\n\nimport { createStoredSearches } from '../stored-searches';\nimport type { StoredDocSearchHit } from '../types';\n\nexport function useStoredDocSearches({\n defaultIndexName,\n recentSearchesLimit,\n recentSearchesWithFavoritesLimit,\n}: {\n defaultIndexName: string;\n recentSearchesLimit: number;\n recentSearchesWithFavoritesLimit: number;\n}): {\n favoriteSearches: ReturnType<typeof createStoredSearches<StoredDocSearchHit>>;\n recentSearches: ReturnType<typeof createStoredSearches<StoredDocSearchHit>>;\n} {\n const favoriteSearches = React.useRef(\n createStoredSearches<StoredDocSearchHit>({\n key: `__DOCSEARCH_FAVORITE_SEARCHES__${defaultIndexName}`,\n limit: 10,\n })\n ).current;\n\n const recentSearches = React.useRef(\n createStoredSearches<StoredDocSearchHit>({\n key: `__DOCSEARCH_RECENT_SEARCHES__${defaultIndexName}`,\n limit:\n favoriteSearches.getAll().length === 0\n ? recentSearchesLimit\n : recentSearchesWithFavoritesLimit,\n })\n ).current;\n\n return { favoriteSearches, recentSearches };\n}\n","import type { JSX, ReactNode } from 'react';\nimport React from 'react';\n\ninterface HitContentProps {\n title: ReactNode;\n subText: ReactNode;\n}\n\nexport function HitContent({ title, subText }: HitContentProps): JSX.Element {\n return (\n <div className=\"DocSearch-Hit-content-wrapper\">\n <span className=\"DocSearch-Hit-title\">{title}</span>\n <span className=\"DocSearch-Hit-path\">{subText}</span>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\n\nconst MS_IN_SECOND = 1000;\nconst MS_IN_MINUTE = MS_IN_SECOND * 60;\nconst MS_IN_HOUR = MS_IN_MINUTE * 60;\nconst MS_IN_DAY = MS_IN_HOUR * 24;\n\nconst UNITS: Array<[number, Intl.RelativeTimeFormatUnit]> = [\n [MS_IN_DAY, 'day'],\n [MS_IN_HOUR, 'hour'],\n [MS_IN_MINUTE, 'minute'],\n [MS_IN_SECOND, 'second'],\n];\n\nexport function useRelativeFormattedDate(\n start: Date | null,\n end = Date.now()\n): string | null {\n const [diff] = useState<[number, Intl.RelativeTimeFormatUnit]>(() => {\n const elapsed = Math.abs(Number(end) - Number(start));\n const [ms, unit] =\n UNITS.find(([threshold]) => elapsed >= threshold) ??\n UNITS[UNITS.length - 1];\n\n return [Math.floor(elapsed / ms), unit];\n });\n\n const formattedDate = useMemo(() => {\n const locale =\n typeof navigator !== 'undefined' ? navigator.language : undefined;\n const [elapsedTime, elapsedUnit] = diff;\n\n return new Intl.RelativeTimeFormat(locale, {\n style: 'long',\n }).format(elapsedTime * -1, elapsedUnit);\n }, [diff]);\n\n return start ? formattedDate : null;\n}\n","import { type JSX, createElement } from 'react';\n\nimport type { StoredDocSearchHit } from './types';\n\nfunction getPropertyByPath(object: Record<string, any>, path: string): any {\n const parts = path.split('.');\n\n return parts.reduce((prev, current) => {\n if (prev?.[current]) return prev[current];\n return null;\n }, object);\n}\n\ninterface SnippetProps<TItem> {\n hit: TItem;\n attribute: string;\n tagName?: string;\n [prop: string]: unknown;\n}\n\nexport function Snippet<TItem extends StoredDocSearchHit>({\n hit,\n attribute,\n tagName = 'span',\n ...rest\n}: SnippetProps<TItem>): JSX.Element {\n return createElement(tagName, {\n ...rest,\n dangerouslySetInnerHTML: {\n __html:\n getPropertyByPath(hit, `_snippetResult.${attribute}.value`) ||\n getPropertyByPath(hit, attribute),\n },\n });\n}\n","import type {\n AutocompleteApi,\n AutocompleteState,\n BaseItem,\n} from '@algolia/autocomplete-core';\nimport React, { type JSX } from 'react';\n\nimport type { HitResultBadgeTranslations } from './components/HitResultBadge';\nimport { HitContent } from './components/ui/HitContent';\nimport type { DocSearchProps } from './DocSearch';\nimport { useRelativeFormattedDate } from './hooks/useRelativeFormattedDate';\nimport { SparklesIcon } from './icons/SparklesIcon';\nimport { Snippet } from './Snippet';\nimport type { InternalDocSearchHit, StoredDocSearchHit } from './types';\nimport { decodeHtmlEntities, getHitItemBreadcrumbs, SOURCE_IDS } from './utils';\n\nexport type ResultsTranslations = HitResultBadgeTranslations &\n Partial<{\n askAiPlaceholder: string;\n noResultsAskAiPlaceholder: string;\n recentConversationTimestampFallback: string;\n askAiResultsTitle: string;\n }>;\ninterface ResultsProps<TItem extends BaseItem> extends AutocompleteApi<\n TItem,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n title?: string | null;\n translations?: ResultsTranslations;\n collection: AutocompleteState<TItem>['collections'][0];\n renderIcon: (props: { item: TItem; index: number }) => React.ReactNode;\n renderAction: (props: { item: TItem }) => React.ReactNode;\n renderResultBadge?: (props: { item: TItem }) => React.ReactNode;\n onItemClick: (item: TItem, event: KeyboardEvent | MouseEvent) => void;\n hitComponent: DocSearchProps['hitComponent'];\n state: AutocompleteState<TItem>;\n sourceIcon?: JSX.Element;\n}\n\nexport function Results<TItem extends StoredDocSearchHit>(\n props: ResultsProps<TItem>\n): JSX.Element | null {\n const { askAiResultsTitle = 'Ask AI Assistant' } = props.translations || {};\n\n const askAiResultsId = React.useId();\n // The collection title, decoded to handle encoded HTML entities\n // If there is not a title, return null to not render anything\n const decodedTitle = React.useMemo(() => {\n if (!props.title) {\n return null;\n }\n\n return decodeHtmlEntities(props.title);\n }, [props.title]);\n\n if (!props.collection || props.collection.items.length === 0) {\n return null;\n }\n\n if (props.collection.source.sourceId === SOURCE_IDS.askAI) {\n return (\n <section className=\"DocSearch-Hits\">\n <h2 id={askAiResultsId} className=\"DocSearch-Hit-source\">\n {askAiResultsTitle}\n </h2>\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n aria-labelledby={askAiResultsId}\n >\n {props.collection.items.map((item) => (\n <AskAiButton\n key={item.objectID}\n item={item}\n translations={props.translations}\n {...props}\n />\n ))}\n </ul>\n </section>\n );\n }\n\n if (props.collection.source.sourceId === SOURCE_IDS.recentConversations) {\n return (\n <section className=\"DocSearch-Hits\">\n <div className=\"DocSearch-Hit-source\">\n <SparklesIcon />\n {decodedTitle}\n </div>\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n >\n {props.collection.items.map((item, index) => {\n return (\n <Result\n key={[props.title, item.objectID].join(':')}\n item={item}\n index={index}\n {...props}\n />\n );\n })}\n </ul>\n </section>\n );\n }\n\n return (\n <section className=\"DocSearch-Hits\">\n <div className=\"DocSearch-Hit-source\">\n {props.sourceIcon ?? null}\n {decodedTitle}\n </div>\n\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n >\n {props.collection.items.map((item, index) => {\n return (\n <Result\n key={[props.title, item.objectID].join(':')}\n item={item}\n index={index}\n {...props}\n />\n );\n })}\n </ul>\n </section>\n );\n}\n\ninterface ResultProps<TItem extends BaseItem> extends ResultsProps<TItem> {\n item: TItem;\n index: number;\n}\n\nfunction Result<TItem extends StoredDocSearchHit>({\n item,\n index,\n renderIcon,\n renderAction,\n getItemProps,\n onItemClick,\n collection,\n hitComponent,\n translations = {},\n renderResultBadge,\n}: ResultProps<TItem>): JSX.Element {\n const Hit = hitComponent!;\n const { recentConversationTimestampFallback = 'A while ago' } = translations;\n const titleAttribute =\n item.type === 'content' ? 'content' : `hierarchy.${item.type}`;\n const breadcrumbs = getHitItemBreadcrumbs(item);\n\n return (\n <li\n className={[\n 'DocSearch-Hit',\n (item as unknown as InternalDocSearchHit).__docsearch_parent &&\n 'DocSearch-Hit--Child',\n ]\n .filter(Boolean)\n .join(' ')}\n {...getItemProps({\n item,\n source: collection.source,\n onClick(event) {\n onItemClick(item, event);\n },\n })}\n >\n <Hit hit={item}>\n <div className=\"DocSearch-Hit-Container\">\n {renderIcon({ item, index })}\n\n {/* lvl0 is special where there wouldn't be any \"parent\" to use for breadcrumbs */}\n {item.type === 'lvl0' && (\n <HitContent\n title={<Snippet hit={item} attribute=\"hierarchy.lvl0\" />}\n subText={<Snippet hit={item} attribute=\"content\" />}\n />\n )}\n\n {item.type === 'askAI' ? (\n <AskAIResultContent\n item={item}\n relativeDateFallbackText={recentConversationTimestampFallback}\n />\n ) : (\n <HitContent\n title={<Snippet hit={item} attribute={titleAttribute} />}\n subText={breadcrumbs}\n />\n )}\n\n {renderResultBadge?.({ item })}\n\n {renderAction({ item })}\n </div>\n </Hit>\n </li>\n );\n}\n\ninterface AskAIResultContentProps<TItem extends StoredDocSearchHit> {\n item: TItem;\n relativeDateFallbackText: string;\n}\n\nfunction AskAIResultContent<TItem extends StoredDocSearchHit>({\n item,\n relativeDateFallbackText,\n}: AskAIResultContentProps<TItem>) {\n const storedDate = item.hierarchy.lvl2 ? new Date(item.hierarchy.lvl2) : null;\n const relativeDate = useRelativeFormattedDate(storedDate);\n\n return (\n <HitContent\n title={decodeHtmlEntities(item.hierarchy.lvl1 || '')}\n subText={relativeDate || relativeDateFallbackText}\n />\n );\n}\n\ninterface AskAiButtonProps<TItem extends BaseItem> extends ResultsProps<TItem> {\n item: TItem;\n translations?: ResultsTranslations;\n state: AutocompleteState<TItem>;\n}\n\nfunction AskAiButton<TItem extends StoredDocSearchHit>({\n item,\n getItemProps,\n onItemClick,\n collection,\n}: AskAiButtonProps<TItem>): JSX.Element | null {\n if (!item.query) return null;\n\n return (\n <li\n className=\"DocSearch-Hit\"\n {...getItemProps({\n item,\n source: collection.source,\n onClick(event) {\n onItemClick(item, event);\n },\n })}\n >\n <div className=\"DocSearch-Hit--AskAI\">\n <div className=\"DocSearch-Hit-AskAIButton DocSearch-Hit-Container\">\n <div className=\" DocSearch-Hit-AskAIButton-icon DocSearch-Hit-icon\">\n <SparklesIcon />\n </div>\n <div className=\"DocSearch-Hit-AskAIButton-title\">\n <span className=\"DocSearch-Hit-AskAIButton-title-query\">\n {item.query}\n </span>\n </div>\n </div>\n </div>\n </li>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { CloseIcon, PinIcon, RecentIcon, SourceIcon } from '../../icons';\nimport { Results } from '../../Results';\nimport type { ScreenStateProps } from '../../ScreenState';\nimport type { InternalDocSearchHit } from '../../types';\nimport { getCollection } from '../../utils';\n\nexport type StoredSearchesSectionsTranslations = Partial<{\n recentSearchesTitle: string;\n noRecentSearchesText: string;\n saveRecentSearchButtonTitle: string;\n removeRecentSearchButtonTitle: string;\n favoriteSearchesTitle: string;\n removeFavoriteSearchButtonTitle: string;\n}>;\n\ntype StoredSearchesSectionsProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n translations?: StoredSearchesSectionsTranslations;\n};\n\nexport function StoredSearchesSections({\n translations = {},\n ...props\n}: StoredSearchesSectionsProps): JSX.Element {\n const {\n recentSearchesTitle = 'Recently viewed docs',\n saveRecentSearchButtonTitle = 'Pin this search',\n removeRecentSearchButtonTitle = 'Remove this search from history',\n favoriteSearchesTitle = 'Pinned',\n removeFavoriteSearchButtonTitle = 'Remove this saved search',\n } = translations;\n const favoriteSearches = getCollection(props.state, 'favoriteSearches');\n const recentSearchesCollection = getCollection(props.state, 'recentSearches');\n\n return (\n <>\n {favoriteSearches && (\n <Results\n {...props}\n title={favoriteSearchesTitle}\n collection={favoriteSearches}\n sourceIcon={<PinIcon />}\n renderIcon={({ item }) => (\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n )}\n renderAction={({ item }) => (\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button\"\n title={removeFavoriteSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.favoriteSearches.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n )}\n />\n )}\n\n {recentSearchesCollection && (\n <Results\n {...props}\n title={recentSearchesTitle}\n collection={recentSearchesCollection}\n sourceIcon={<RecentIcon />}\n renderIcon={({ item }) => (\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n )}\n renderAction={({ item }) => (\n <>\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button DocSearch-Hit-action-button--pin\"\n title={saveRecentSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.favoriteSearches.add(item);\n props.recentSearches.remove(item);\n props.refresh();\n }}\n >\n <PinIcon />\n </button>\n </div>\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button\"\n title={removeRecentSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.recentSearches.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n </>\n )}\n />\n )}\n </>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { ErrorIcon } from './icons';\n\nexport type ErrorScreenTranslations = Partial<{\n titleText: string;\n helpText: string;\n}>;\n\ntype ErrorScreenProps = {\n translations?: ErrorScreenTranslations;\n};\n\nexport function ErrorScreen({\n translations = {},\n}: ErrorScreenProps): JSX.Element {\n const {\n titleText = 'Unable to fetch results',\n helpText = 'You might want to check your network connection.',\n } = translations;\n return (\n <div className=\"DocSearch-ErrorScreen\">\n <div className=\"DocSearch-Screen-Icon\">\n <ErrorIcon />\n </div>\n <p className=\"DocSearch-Title\">{titleText}</p>\n <p className=\"DocSearch-Help\">{helpText}</p>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { NoResultsIcon, SearchIcon } from './icons';\nimport type { ScreenStateProps } from './ScreenState';\nimport type { InternalDocSearchHit } from './types';\n\nexport type NoResultsScreenTranslations = Partial<{\n noResultsText: string;\n suggestedQueryText: string;\n reportMissingResultsText: string;\n reportMissingResultsLinkText: string;\n}>;\n\ntype NoResultsScreenProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n canHandleAskAi?: boolean;\n translations?: NoResultsScreenTranslations;\n};\n\nexport function NoResultsScreen({\n translations = {},\n ...props\n}: NoResultsScreenProps): JSX.Element {\n const {\n noResultsText = 'No results found for',\n suggestedQueryText = 'Try searching for',\n reportMissingResultsText = 'Believe this query should return results?',\n reportMissingResultsLinkText = 'Let us know.',\n } = translations;\n const searchSuggestions: string[] | undefined = props.state.context\n .searchSuggestions as string[];\n\n return (\n <div\n className={`DocSearch-NoResults ${props.canHandleAskAi ? 'DocSearch-NoResults--withAskAi' : ''}`}\n >\n <div className=\"DocSearch-Screen-Icon\">\n <NoResultsIcon />\n </div>\n <p className=\"DocSearch-Title\">\n {noResultsText} \"<strong>{props.state.query}</strong>\"\n </p>\n\n {searchSuggestions && searchSuggestions.length > 0 && (\n <div className=\"DocSearch-NoResults-Prefill-List\">\n <p className=\"DocSearch-Help\">{suggestedQueryText}:</p>\n <div className=\"DocSearch-NoResults-Prefill-List-Items\">\n {searchSuggestions.slice(0, 3).reduce<React.ReactNode[]>(\n (acc, search) => [\n ...acc,\n <p key={search}>\n <SearchIcon size={16} />\n <button\n className=\"DocSearch-Prefill\"\n key={search}\n type=\"button\"\n onClick={() => {\n props.setQuery(search.toLowerCase() + ' ');\n props.refresh();\n props.inputRef.current!.focus();\n }}\n >\n {search}\n </button>\n </p>,\n ],\n []\n )}\n </div>\n </div>\n )}\n\n {props.getMissingResultsUrl && (\n <p className=\"DocSearch-Help\">\n {`${reportMissingResultsText} `}\n <a\n href={props.getMissingResultsUrl({ query: props.state.query })}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {reportMissingResultsLinkText}\n </a>\n </p>\n )}\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { InternalDocSearchHit } from '../types';\nimport { getNestedValue } from '../utils';\n\nexport type HitResultBadgeTranslations = Partial<{\n /**\n * Label text used for screen readers to announce the result badge. Should\n * reflect the key of `resultBadgeKey`.\n *\n * @default 'Category'\n */\n resultBadgeLabelText: string;\n}>;\n\nfunction isRenderablePrimitive(v: unknown): v is boolean | number | string {\n return (\n typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean'\n );\n}\n\ninterface HitResultBadgeProps {\n item: InternalDocSearchHit;\n resultBadgeKey?: string;\n translations?: HitResultBadgeTranslations;\n}\n\nexport function HitResultBadge({\n item,\n resultBadgeKey,\n translations = {},\n}: HitResultBadgeProps): JSX.Element | null {\n if (!resultBadgeKey) {\n return null;\n }\n\n const parsedValue = getNestedValue(item, resultBadgeKey);\n\n if (parsedValue === null || typeof parsedValue === 'undefined') {\n return null;\n }\n\n const { resultBadgeLabelText = 'Category' } = translations;\n\n let badgeValue: string | null = null;\n\n if (isRenderablePrimitive(parsedValue)) {\n badgeValue = String(parsedValue).trim();\n } else if (Array.isArray(parsedValue)) {\n const parts = parsedValue\n .filter(isRenderablePrimitive)\n .map((v) => String(v).trim());\n badgeValue = parts.length > 0 ? parts.join(', ') : null;\n }\n\n if (badgeValue === null || badgeValue.length === 0) {\n return null;\n }\n\n return (\n <div className=\"DocSearch-Hit-badge\">\n <span className=\"DocSearch-VisuallyHiddenForAccessibility\">{`${resultBadgeLabelText}: ${badgeValue}`}</span>\n <span aria-hidden=\"true\">{badgeValue}</span>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { HitResultBadge } from './components/HitResultBadge';\nimport { SelectIcon, SourceIcon } from './icons';\nimport type { ResultsTranslations } from './Results';\nimport { Results } from './Results';\nimport type { ScreenStateProps } from './ScreenState';\nimport type { InternalDocSearchHit } from './types';\n\nexport type ResultsScreenTranslations = Partial<{\n askAiPlaceholder: string;\n noResultsAskAiPlaceholder: string;\n resultsSectionTitle: string;\n askAiResultsTitle: string;\n}> &\n ResultsTranslations;\n\ntype ResultsScreenProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n translations?: ResultsScreenTranslations;\n};\n\nexport function ResultsScreen({\n translations = {},\n resultBadgeKey,\n ...props\n}: ResultsScreenProps): JSX.Element {\n const { resultsSectionTitle = 'Results' } = translations;\n\n const renderIcon = React.useCallback(\n ({ item }: { item: InternalDocSearchHit }) => {\n return (\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n );\n },\n []\n );\n\n const renderAction = React.useCallback(() => {\n return (\n <div className=\"DocSearch-Hit-action\">\n <SelectIcon />\n </div>\n );\n }, []);\n\n const renderResultBadge = React.useCallback(\n ({ item }: { item: InternalDocSearchHit }) => {\n return (\n <HitResultBadge\n item={item}\n resultBadgeKey={resultBadgeKey}\n translations={{\n resultBadgeLabelText: translations.resultBadgeLabelText,\n }}\n />\n );\n },\n [resultBadgeKey, translations.resultBadgeLabelText]\n );\n\n return (\n <div className=\"DocSearch-Dropdown-Container\">\n {props.state.collections.map((collection) => {\n if (collection.items.length === 0) {\n return null;\n }\n\n return (\n <Results\n {...props}\n key={collection.source.sourceId}\n translations={translations}\n title={resultsSectionTitle}\n collection={collection}\n renderIcon={renderIcon}\n renderAction={renderAction}\n renderResultBadge={renderResultBadge}\n />\n );\n })}\n\n {props.resultsFooterComponent && (\n <section className=\"DocSearch-HitsFooter\">\n <props.resultsFooterComponent state={props.state} />\n </section>\n )}\n </div>\n );\n}\n","import type {\n AutocompleteSource,\n AutocompleteState,\n} from '@algolia/autocomplete-core';\nimport type { SearchParamsObject, SearchResponse } from 'algoliasearch/lite';\nimport type React from 'react';\n\nimport type { DocSearchIndex, DocSearchProps } from '../DocSearch';\nimport type {\n DocSearchHit,\n DocSearchState,\n InternalDocSearchHit,\n} from '../types';\nimport type { useSearchClient } from '../useSearchClient';\n\nimport { SOURCE_IDS } from './collections';\nimport { groupBy } from './groupBy';\nimport { identity } from './identity';\nimport { isModifierEvent } from './isModifierEvent';\nimport { removeHighlightTags } from './removeHighlightTags';\n\nexport type BuildQuerySourcesState = Pick<\n AutocompleteState<InternalDocSearchHit>,\n 'context'\n>;\n\nexport type StoredSearchesLike<TItem> = {\n getAll: () => TItem[];\n};\n\nexport type FacetSelections = Record<string, string>;\n\nexport function createFacetFilters(\n searchParametersFacetFilters: SearchParamsObject['facetFilters'],\n facetSelections: FacetSelections\n): SearchParamsObject['facetFilters'] {\n const dynamicFacetFilters = Object.entries(facetSelections)\n .filter(([, value]) => value)\n .map(([facet, value]) => `${facet}:${value}`);\n\n if (dynamicFacetFilters.length === 0) {\n return searchParametersFacetFilters;\n }\n\n if (!searchParametersFacetFilters) {\n return dynamicFacetFilters;\n }\n\n return [...searchParametersFacetFilters, ...dynamicFacetFilters];\n}\n\nexport function buildNoQuerySources({\n recentSearches,\n favoriteSearches,\n saveRecentSearch,\n onClose,\n disableUserPersonalization,\n}: {\n recentSearches: StoredSearchesLike<unknown>;\n favoriteSearches: StoredSearchesLike<unknown>;\n saveRecentSearch: (item: InternalDocSearchHit) => void;\n onClose: () => void;\n disableUserPersonalization: boolean;\n}): Array<AutocompleteSource<InternalDocSearchHit>> {\n if (disableUserPersonalization) {\n return [];\n }\n\n return [\n {\n sourceId: SOURCE_IDS.favoriteSearches,\n onSelect({ item, event }): void {\n saveRecentSearch(item);\n if (!isModifierEvent(event)) {\n onClose();\n }\n },\n getItemUrl({ item }): string {\n return item.url;\n },\n getItems(): InternalDocSearchHit[] {\n return favoriteSearches.getAll() as InternalDocSearchHit[];\n },\n },\n {\n sourceId: SOURCE_IDS.recentSearches,\n onSelect({ item, event }): void {\n saveRecentSearch(item);\n if (!isModifierEvent(event)) {\n onClose();\n }\n },\n getItemUrl({ item }): string {\n return item.url;\n },\n getItems(): InternalDocSearchHit[] {\n return recentSearches.getAll() as InternalDocSearchHit[];\n },\n },\n ];\n}\n\nexport async function buildQuerySources({\n query,\n state: sourcesState,\n setContext,\n setStatus,\n searchClient,\n indexes,\n snippetLength,\n insights,\n appId,\n apiKey,\n maxResultsPerGroup,\n transformItems = identity,\n saveRecentSearch,\n onClose,\n facetSelections,\n}: {\n query: string;\n state: BuildQuerySourcesState;\n setContext: (\n context: Partial<DocSearchState<InternalDocSearchHit>['context']>\n ) => void;\n setStatus: (status: DocSearchState<InternalDocSearchHit>['status']) => void;\n searchClient: ReturnType<typeof useSearchClient>;\n indexes: DocSearchIndex[];\n snippetLength: React.MutableRefObject<number>;\n insights: boolean;\n appId?: string;\n apiKey?: string;\n maxResultsPerGroup?: number;\n transformItems?: DocSearchProps['transformItems'];\n saveRecentSearch: (item: InternalDocSearchHit) => void;\n onClose: () => void;\n facetSelections: React.MutableRefObject<FacetSelections>;\n}): Promise<Array<AutocompleteSource<InternalDocSearchHit>>> {\n const insightsActive = insights;\n\n try {\n const { results } = await searchClient.search<DocSearchHit>({\n requests: indexes.map((index) => {\n const indexName = index.name;\n const searchParams = index.searchParameters;\n const facetFilters = createFacetFilters(\n searchParams?.facetFilters,\n facetSelections.current\n );\n\n return {\n query,\n indexName,\n attributesToRetrieve: searchParams?.attributesToRetrieve ?? [\n 'hierarchy.lvl0',\n 'hierarchy.lvl1',\n 'hierarchy.lvl2',\n 'hierarchy.lvl3',\n 'hierarchy.lvl4',\n 'hierarchy.lvl5',\n 'hierarchy.lvl6',\n 'content',\n 'type',\n 'url',\n ],\n attributesToSnippet: searchParams?.attributesToSnippet ?? [\n `hierarchy.lvl1:${snippetLength.current}`,\n `hierarchy.lvl2:${snippetLength.current}`,\n `hierarchy.lvl3:${snippetLength.current}`,\n `hierarchy.lvl4:${snippetLength.current}`,\n `hierarchy.lvl5:${snippetLength.current}`,\n `hierarchy.lvl6:${snippetLength.current}`,\n `content:${snippetLength.current}`,\n ],\n snippetEllipsisText: searchParams?.snippetEllipsisText ?? '…',\n highlightPreTag: searchParams?.highlightPreTag ?? '<mark>',\n highlightPostTag: searchParams?.highlightPostTag ?? '</mark>',\n hitsPerPage: searchParams?.hitsPerPage ?? 20,\n clickAnalytics: searchParams?.clickAnalytics ?? insightsActive,\n ...(searchParams ?? {}),\n ...(facetFilters ? { facetFilters } : {}),\n };\n }),\n });\n\n return results.flatMap((res) => {\n const result = res as SearchResponse<DocSearchHit>;\n const { hits, nbHits } = result;\n const transformedHits = transformItems(hits);\n const sources = groupBy<DocSearchHit>(\n transformedHits,\n (hit) => removeHighlightTags(hit),\n maxResultsPerGroup\n );\n\n if (\n (sourcesState.context.searchSuggestions as unknown[]).length <\n Object.keys(sources).length\n ) {\n setContext({\n searchSuggestions: {\n ...(sourcesState.context.searchSuggestions ?? []),\n ...Object.keys(sources),\n },\n });\n }\n\n if (nbHits) {\n const currentNbHits = sourcesState.context.nbHits as number | undefined;\n setContext({\n nbHits: (currentNbHits ?? 0) + nbHits,\n });\n }\n\n let insightsParams = {};\n\n if (insightsActive) {\n insightsParams = {\n __autocomplete_indexName: result.index,\n __autocomplete_queryID: result.queryID,\n __autocomplete_algoliaCredentials: { appId, apiKey },\n };\n }\n\n const items = Object.values(sources).flat();\n\n return {\n sourceId: `hits_${result.index}`,\n onSelect({ item, event }): void {\n saveRecentSearch(item);\n if (!isModifierEvent(event)) {\n onClose();\n }\n },\n getItemUrl({ item }): string {\n return item.url;\n },\n getItems() {\n return Object.values(\n groupBy(items, (item) => item.hierarchy.lvl1, maxResultsPerGroup)\n )\n .map((groupedHits) =>\n groupedHits\n .map((item) => {\n let parent: InternalDocSearchHit | null = null;\n\n const potentialParent = groupedHits.find(\n (siblingItem) =>\n siblingItem.type === 'lvl1' &&\n siblingItem.hierarchy.lvl1 === item.hierarchy.lvl1\n ) as InternalDocSearchHit | undefined;\n\n if (item.type !== 'lvl1' && potentialParent) {\n parent = potentialParent;\n }\n\n return {\n ...item,\n __docsearch_parent: parent,\n ...insightsParams,\n };\n })\n .flat()\n )\n .flat();\n },\n };\n });\n } catch (error) {\n if ((error as Error).name === 'RetryError') {\n setStatus('error');\n }\n throw error;\n }\n}\n","import type { SearchParamsObject } from 'algoliasearch/lite';\n\nimport type { DocSearchIndex } from '../DocSearch';\n\nexport function normalizeDocSearchIndexes({\n indexName,\n indices = [],\n searchParameters,\n}: {\n indexName?: string;\n indices?: Array<DocSearchIndex | string>;\n searchParameters?: SearchParamsObject;\n}): DocSearchIndex[] {\n const indexes: DocSearchIndex[] = [];\n\n if (indexName && indexName !== '') {\n indexes.push({\n name: indexName,\n searchParameters,\n });\n }\n\n if (indices.length > 0) {\n indices.forEach((index) => {\n indexes.push(typeof index === 'string' ? { name: index } : index);\n });\n }\n\n if (indexes.length < 1) {\n throw new Error(\n 'Must supply either `indexName` or `indices` for DocSearch to work'\n );\n }\n\n return indexes;\n}\n"],"mappings":"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"}
|