@docsearch/react 5.0.0-beta.2 → 5.0.0-beta.4
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/dist/esm/{AskAiScreenState-Bw2WIgv_.d.ts → AskAiScreenState-Sqbn60f2.d.ts} +2 -2
- package/dist/esm/{DocSearch-CVj6U-nI.d.ts → DocSearch-BVqxFxTw.d.ts} +18 -27
- package/dist/esm/{DocSearchAskAiModal-BczGFkvR.js → DocSearchAskAiModal-ByqIW5ZA.js} +56 -31
- package/dist/esm/DocSearchAskAiModal-ByqIW5ZA.js.map +1 -0
- package/dist/esm/{DocSearchAskAiModal-MF2py4NM.d.ts → DocSearchAskAiModal-DpB7pLCC.d.ts} +4 -4
- package/dist/esm/{DocSearchModal-D_tfhoN1.js → DocSearchModal-CITTG0fe.js} +10 -8
- package/dist/esm/DocSearchModal-CITTG0fe.js.map +1 -0
- package/dist/esm/askaiModal.d.ts +1 -1
- package/dist/esm/askaiModal.js +1 -1
- package/dist/esm/docsearchAi.d.ts +10 -102
- package/dist/esm/docsearchAi.js +1 -1
- package/dist/esm/docsearchAi.js.map +1 -1
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.js +2 -2
- 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-D8P3VEXa.js → normalizeDocSearchIndexes-ChnVvoVt.js} +16 -20
- package/dist/esm/normalizeDocSearchIndexes-ChnVvoVt.js.map +1 -0
- package/dist/esm/sidepanel.d.ts +22 -7
- package/dist/esm/sidepanel.js +27 -10
- package/dist/esm/sidepanel.js.map +1 -1
- package/dist/esm/useDocSearchKeyboardEvents.js +1 -1
- package/dist/esm/useDocSearchKeyboardEvents.js.map +1 -1
- package/dist/esm/useSearchClient-mIHVB6ga.js.map +1 -1
- package/dist/esm/{useSuggestedQuestions-Ds7H1JCr.js → useSuggestedQuestions-BjSZvxwr.js} +233 -36
- package/dist/esm/useSuggestedQuestions-BjSZvxwr.js.map +1 -0
- 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 +33 -33
- package/dist/umd/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/esm/DocSearchAskAiModal-BczGFkvR.js.map +0 -1
- package/dist/esm/DocSearchModal-D_tfhoN1.js.map +0 -1
- package/dist/esm/normalizeDocSearchIndexes-D8P3VEXa.js.map +0 -1
- package/dist/esm/useSuggestedQuestions-Ds7H1JCr.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeDocSearchIndexes-ChnVvoVt.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/isQueryEmpty.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 isQueryEmpty(query?: string): boolean {\n if (!query || query.trim().length === 0) {\n return true;\n }\n\n return false;\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, DocSearchIndex } from '../DocSearch';\n\nimport type { FacetSelections } from './createDocSearchSources';\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\nexport function deriveDefaultSelectedFacetsFromIndex(\n indices: DocSearchIndex[]\n): FacetSelections {\n const defaultFacets: FacetSelections = {};\n\n for (const index of indices) {\n const facetFilters = index.searchParameters?.facetFilters;\n\n for (const facetFilter of Array.isArray(facetFilters)\n ? facetFilters\n : [facetFilters]) {\n if (typeof facetFilter !== 'string') {\n continue;\n }\n\n const separatorIndex = facetFilter.indexOf(':');\n\n if (separatorIndex <= 0) {\n continue;\n }\n\n const key = facetFilter.slice(0, separatorIndex);\n const value = facetFilter.slice(separatorIndex + 1);\n\n if (key && value) {\n defaultFacets[key] = value;\n }\n }\n }\n\n return defaultFacets;\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\nconst MenuTrigger = React.forwardRef<\n HTMLButtonElement,\n MenuPrimitive.Trigger.Props\n>(({ className, ...props }, ref): JSX.Element => {\n const cn = `DocSearch-Menu-Trigger${className ? ` ${className}` : ''}`;\n return <MenuPrimitive.Trigger className={cn} ref={ref} {...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 type { FacetSelections } from '../utils/createDocSearchSources';\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 | null {\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: FacetSelections;\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 visibleFacetKeys = React.useMemo(\n () => new Set(facets.map((f) => f.key)),\n [facets]\n );\n const selectionsToDisplay = React.useMemo(() => {\n return Object.entries(selections).filter(\n ([key, value]) => Boolean(value) && visibleFacetKeys.has(key)\n );\n }, [selections, visibleFacetKeys]);\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 footerAction: React.ReactNode;\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 footerAction,\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 const hasFooterAction =\n footerAction !== null &&\n footerAction !== undefined &&\n typeof footerAction !== 'boolean';\n\n return (\n <>\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 <div className=\"DocSearch-Footer-Actions\">\n {hasFooterAction && (\n <div className=\"DocSearch-Footer-Action\">{footerAction}</div>\n )}\n <div className=\"DocSearch-Logo\">\n <AlgoliaLogo translations={{ poweredByText }} />\n </div>\n </div>\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 return () => {\n isMounted = false;\n };\n }\n\n searchClient\n .search<DocSearchHit>({\n requests: indexes.map((index) => ({\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 {\n deriveDefaultSelectedFacetsFromIndex,\n normalizeFacets,\n} 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 normalizedFacetsRef = React.useRef(normalizedFacets);\n const facetValues = useFacetValues({\n facets: normalizedFacets,\n indexes,\n searchClient,\n });\n const [facetSelections, setFacetSelections] = React.useState<FacetSelections>(\n () => deriveDefaultSelectedFacetsFromIndex(indexes)\n );\n const facetSelectionsRef = React.useRef(facetSelections);\n\n const onSelectionsChangeRef = React.useRef(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 React.useLayoutEffect(() => {\n normalizedFacetsRef.current = normalizedFacets;\n onSelectionsChangeRef.current = onSelectionsChange;\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 const existing = facetSelectionsRef.current[facet];\n\n if (existing === value) return;\n\n const next = { ...facetSelectionsRef.current };\n\n next[facet] = value;\n\n applySelections(next);\n },\n [applySelections]\n );\n\n const clearFacetSelections = React.useCallback(() => {\n if (Object.keys(facetSelectionsRef.current).length === 0) return;\n const next = {};\n\n for (const facet of normalizedFacetsRef.current) {\n if (facetSelectionsRef.current[facet.key]) {\n next[facet.key] = '';\n }\n }\n\n applySelections(next);\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 theme,\n}: {\n initialScrollY: number;\n modalRef: React.RefObject<HTMLDivElement | null>;\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 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 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 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, 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} {\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\n return {\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n inputRef,\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';\nimport { removeHighlightTags } from './utils';\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 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 const title = removeHighlightTags(collection.items[0]);\n\n return (\n <Results\n {...props}\n key={collection.source.sourceId}\n translations={translations}\n title={title}\n collection={collection}\n renderIcon={({ item, index }) => (\n <>\n {item.__docsearch_parent && (\n <svg className=\"DocSearch-Hit-Tree\" viewBox=\"0 0 24 54\">\n <g\n stroke=\"currentColor\"\n fill=\"none\"\n fillRule=\"evenodd\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {item.__docsearch_parent !==\n collection.items[index + 1]?.__docsearch_parent ? (\n <path d=\"M8 6v21M20 27H8.3\" />\n ) : (\n <path d=\"M8 6v42M20 27H8.3\" />\n )}\n </g>\n </svg>\n )}\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n </>\n )}\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 {\n FacetFilters,\n SearchParamsObject,\n SearchResponse,\n} from 'algoliasearch/lite';\nimport type React from 'react';\n\nimport { SNIPPET_LENGTH } from '../constants';\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 selections = Object.entries(facetSelections);\n const selectedFacets = new Set(selections.map(([facet]) => facet));\n const dynamicFacetFilters: string[] = [];\n\n for (const [facet, selection] of selections) {\n if (selection !== '') {\n dynamicFacetFilters.push(`${facet}:${selection}`);\n }\n }\n\n if (selectedFacets.size === 0) {\n return searchParametersFacetFilters;\n }\n\n let configuredFacetFilters: FacetFilters = [];\n\n if (\n searchParametersFacetFilters &&\n Array.isArray(searchParametersFacetFilters)\n ) {\n configuredFacetFilters = searchParametersFacetFilters;\n } else if (searchParametersFacetFilters) {\n configuredFacetFilters = [searchParametersFacetFilters];\n }\n\n const remainingFacetFilters = configuredFacetFilters.filter((facetFilter) => {\n if (typeof facetFilter !== 'string') {\n return true;\n }\n\n const separatorIndex = facetFilter.indexOf(':');\n const facet = facetFilter.slice(0, separatorIndex);\n\n return separatorIndex <= 0 || !selectedFacets.has(facet);\n });\n\n return [...remainingFacetFilters, ...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 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 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:${SNIPPET_LENGTH}`,\n `hierarchy.lvl2:${SNIPPET_LENGTH}`,\n `hierarchy.lvl3:${SNIPPET_LENGTH}`,\n `hierarchy.lvl4:${SNIPPET_LENGTH}`,\n `hierarchy.lvl5:${SNIPPET_LENGTH}`,\n `hierarchy.lvl6:${SNIPPET_LENGTH}`,\n `content:${SNIPPET_LENGTH}`,\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 return Object.values<DocSearchHit[]>(sources).map((items, index) => ({\n sourceId: `hits_${result.index}_${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(): InternalDocSearchHit[] {\n return Object.values(\n groupBy(items, (item) => item.hierarchy.lvl1, maxResultsPerGroup)\n )\n .map((groupedHits) =>\n groupedHits.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 )\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 { DocSearchIndex } from '../DocSearch';\n\nexport function normalizeDocSearchIndexes({\n indices,\n}: {\n indices: Array<DocSearchIndex | string>;\n}): DocSearchIndex[] {\n if (!Array.isArray(indices) || indices.length < 1) {\n throw new Error('Must supply at least one `indices` entry for DocSearch');\n }\n\n const indexes = indices.map((index) =>\n typeof index === 'string' ? { name: index } : index\n );\n\n return indexes;\n}\n"],"mappings":"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"}
|
package/dist/esm/sidepanel.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { o as ToolCalls } from "./index-Bqqv4HmN.js";
|
|
2
|
-
import "./DocSearch-
|
|
3
|
-
import {
|
|
4
|
-
import { r as ToolCallTranslations } from "./AskAiScreenState-
|
|
2
|
+
import "./DocSearch-BVqxFxTw.js";
|
|
3
|
+
import { AgentStudioSearchParameters, Memory } from "./docsearchAi.js";
|
|
4
|
+
import { r as ToolCallTranslations } from "./AskAiScreenState-Sqbn60f2.js";
|
|
5
5
|
import { DocSearchCallbacks, DocSearchCallbacks as DocSearchCallbacks$1, DocSearchRef, DocSearchRef as DocSearchRef$1, DocSearchTheme, InitialAskAiMessage, SidepanelShortcuts } from "@docsearch/core";
|
|
6
6
|
import React, { JSX } from "react";
|
|
7
7
|
import "@ai-sdk/react";
|
|
@@ -76,6 +76,9 @@ type PromptFormTranslations = Partial<{
|
|
|
76
76
|
promptDisclaimerText: string;
|
|
77
77
|
promptLabelText: string;
|
|
78
78
|
promptAriaLabelText: string;
|
|
79
|
+
startNewConversationButtonText: string;
|
|
80
|
+
blockingErrorContinueText: string;
|
|
81
|
+
blockingErrorFallbackText: string;
|
|
79
82
|
}>;
|
|
80
83
|
//#endregion
|
|
81
84
|
//#region src/Sidepanel/types.d.ts
|
|
@@ -335,8 +338,14 @@ type DocSearchSidepanelProps = DocSearchCallbacks$1 & {
|
|
|
335
338
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
336
339
|
*/
|
|
337
340
|
memory?: Memory;
|
|
338
|
-
/**
|
|
339
|
-
|
|
341
|
+
/**
|
|
342
|
+
* Index names for the Agent Studio search tool on this request.
|
|
343
|
+
*
|
|
344
|
+
* Agent Studio expects names only. Put descriptions and tool defaults on the
|
|
345
|
+
* agent configuration. Put per-index runtime overrides in
|
|
346
|
+
* `searchParameters`.
|
|
347
|
+
*/
|
|
348
|
+
indices?: string[];
|
|
340
349
|
};
|
|
341
350
|
declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallbacks$1 & {
|
|
342
351
|
/** The Agent Studio agent ID to use for Ask AI. */
|
|
@@ -379,8 +388,14 @@ declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallb
|
|
|
379
388
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
380
389
|
*/
|
|
381
390
|
memory?: Memory;
|
|
382
|
-
/**
|
|
383
|
-
|
|
391
|
+
/**
|
|
392
|
+
* Index names for the Agent Studio search tool on this request.
|
|
393
|
+
*
|
|
394
|
+
* Agent Studio expects names only. Put descriptions and tool defaults on the
|
|
395
|
+
* agent configuration. Put per-index runtime overrides in
|
|
396
|
+
* `searchParameters`.
|
|
397
|
+
*/
|
|
398
|
+
indices?: string[];
|
|
384
399
|
} & SidepanelSearchParameters & React.RefAttributes<DocSearchRef$1>>;
|
|
385
400
|
//#endregion
|
|
386
401
|
export { ButtonVariant, type DocSearchCallbacks, type DocSearchRef, DocSearchSidepanel, DocSearchSidepanelProps, Sidepanel, SidepanelButton, SidepanelButtonProps, SidepanelButtonTranslations, SidepanelProps, SidepanelRef, SidepanelSearchParameters, SidepanelTranslations };
|
package/dist/esm/sidepanel.js
CHANGED
|
@@ -2,7 +2,7 @@ import { t as _objectSpread2 } from "./objectSpread2-BNmiQYyW.js";
|
|
|
2
2
|
import { n as isAppleDevice, t as ACTION_KEY_DEFAULT } from "./keyboard-BkSdCzTU.js";
|
|
3
3
|
import { n as SearchIcon, t as _objectWithoutProperties } from "./objectWithoutProperties-phqYxDS0.js";
|
|
4
4
|
import { a as AlgoliaLogo, f as RecentIcon, l as CloseIcon, m as LoadingIcon, p as SparklesIcon, t as useSearchClient } from "./useSearchClient-mIHVB6ga.js";
|
|
5
|
-
import {
|
|
5
|
+
import { C as ConversationHistoryIcon, E as AlertIcon, S as NewConversationIcon, T as StopIcon, _ as showAskAiBlockingBannerNewConversationLink, a as MemoizedMarkdown, b as ConversationPromptSuggestions, c as buildDummyAskAiHit, d as getAskAiBlockingBannerMessage, f as getMessageContent, g as isThreadDepthError, h as isAskAiPromptBlockingError, i as groupConsecutiveToolResults, l as extractLinksFromMessage, n as useAskAi, o as ToolCall, p as isAIToolPart, r as Menu, s as EMPTY_TOOLS, t as useSuggestedQuestions, u as getAgentPromptSuggestions, v as SourcesPanel, w as MoreVerticalIcon, x as BackIcon, y as FeedbackActions } from "./useSuggestedQuestions-BjSZvxwr.js";
|
|
6
6
|
import { version } from "./version.js";
|
|
7
7
|
import { DocSearch, useDocSearch } from "@docsearch/core";
|
|
8
8
|
import React, { Fragment, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
@@ -151,7 +151,7 @@ const ConversationExchange = React.forwardRef(({ exchange, translations = {}, is
|
|
|
151
151
|
return /* @__PURE__ */ React.createElement("div", {
|
|
152
152
|
className: "DocSearch-AskAiScreen-Response-Container",
|
|
153
153
|
ref: conversationRef
|
|
154
|
-
}, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Response" }, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user" }, /* @__PURE__ */ React.createElement("p", { className: "DocSearch-AskAiScreen-Query" }, userContent !== null && userContent !== void 0 ? userContent : "")), /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant" }, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent" }, status === "error" && streamError && isLastExchange && /* @__PURE__ */ React.createElement("div", {
|
|
154
|
+
}, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Response" }, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user" }, /* @__PURE__ */ React.createElement("p", { className: "DocSearch-AskAiScreen-Query" }, userContent !== null && userContent !== void 0 ? userContent : "")), /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant" }, /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent" }, status === "error" && streamError && isLastExchange && !isAskAiPromptBlockingError(streamError) && /* @__PURE__ */ React.createElement("div", {
|
|
155
155
|
className: "DocSearch-AskAiScreen-Error",
|
|
156
156
|
role: "alert"
|
|
157
157
|
}, /* @__PURE__ */ React.createElement(AlertIcon, { "aria-hidden": "true" }), /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Error-Content" }, /* @__PURE__ */ React.createElement("h4", { className: "DocSearch-AskAiScreen-Error-Title" }, errorTitleText), /* @__PURE__ */ React.createElement(MemoizedMarkdown, {
|
|
@@ -265,12 +265,13 @@ const NewConversationScreen = ({ suggestedQuestions, onSelectQuestion, translati
|
|
|
265
265
|
//#endregion
|
|
266
266
|
//#region src/Sidepanel/PromptForm.tsx
|
|
267
267
|
const MAX_PROMPT_ROWS = 8;
|
|
268
|
-
const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}, onSend, onStopStreaming }, ref) => {
|
|
268
|
+
const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}, onSend, onStopStreaming, blockingErrorMessage, showBlockingError = false, showNewConversationLink = true, onStartNewConversation }, ref) => {
|
|
269
269
|
const isMobile = useIsMobile();
|
|
270
270
|
const [userPrompt, setUserPrompt] = React.useState("");
|
|
271
271
|
const promptRef = React.useRef(null);
|
|
272
|
+
const blockingErrorId = React.useId();
|
|
272
273
|
React.useImperativeHandle(ref, () => promptRef.current);
|
|
273
|
-
const { promptPlaceholderText = "Ask a question", promptAnsweringText = "Answering...", promptAskAnotherQuestionText = "Ask another question", promptDisclaimerText = "Answers are generated with AI which can make mistakes.", promptLabelText = "Press Enter to send, or Shift and Enter for new line.", promptAriaLabelText = "Prompt input" } = translations;
|
|
274
|
+
const { promptPlaceholderText = "Ask a question", promptAnsweringText = "Answering...", promptAskAnotherQuestionText = "Ask another question", promptDisclaimerText = "Answers are generated with AI which can make mistakes.", promptLabelText = "Press Enter to send, or Shift and Enter for new line.", promptAriaLabelText = "Prompt input", startNewConversationButtonText = "Start a new conversation", blockingErrorContinueText = "to continue.", blockingErrorFallbackText = "This conversation cannot continue." } = translations;
|
|
274
275
|
const managePromptHeight = () => {
|
|
275
276
|
if (!promptRef.current) return;
|
|
276
277
|
const textArea = promptRef.current;
|
|
@@ -284,7 +285,7 @@ const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}
|
|
|
284
285
|
textArea.style.height = `${Math.min(fullHeight, maxHeight)}px`;
|
|
285
286
|
};
|
|
286
287
|
const handleSend = () => {
|
|
287
|
-
if (isStreaming) return;
|
|
288
|
+
if (isStreaming || showBlockingError) return;
|
|
288
289
|
const prompt = userPrompt.trim();
|
|
289
290
|
if (prompt === "") return;
|
|
290
291
|
onSend(prompt);
|
|
@@ -296,7 +297,7 @@ const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}
|
|
|
296
297
|
});
|
|
297
298
|
};
|
|
298
299
|
const handleKeyDown = (e) => {
|
|
299
|
-
if (isStreaming) return;
|
|
300
|
+
if (isStreaming || showBlockingError) return;
|
|
300
301
|
if (e.key === "Enter" && !e.shiftKey) {
|
|
301
302
|
e.preventDefault();
|
|
302
303
|
handleSend();
|
|
@@ -308,11 +309,18 @@ const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}
|
|
|
308
309
|
let promptPlaceholder = promptPlaceholderText;
|
|
309
310
|
if (isStreaming) promptPlaceholder = promptAnsweringText;
|
|
310
311
|
else if (exchanges.length > 0) promptPlaceholder = promptAskAnotherQuestionText;
|
|
311
|
-
return /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Sidepanel-Prompt" }, /* @__PURE__ */ React.createElement("
|
|
312
|
+
return /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Sidepanel-Prompt" }, /* @__PURE__ */ React.createElement("div", {
|
|
313
|
+
id: blockingErrorId,
|
|
314
|
+
role: "alert"
|
|
315
|
+
}, showBlockingError && /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Sidepanel-PromptBlockingBanner" }, /* @__PURE__ */ React.createElement("p", null, blockingErrorMessage !== null && blockingErrorMessage !== void 0 ? blockingErrorMessage : blockingErrorFallbackText), showNewConversationLink && /* @__PURE__ */ React.createElement("p", null, /* @__PURE__ */ React.createElement("button", {
|
|
316
|
+
type: "button",
|
|
317
|
+
className: "DocSearch-ThreadDepthError-Link",
|
|
318
|
+
onClick: onStartNewConversation
|
|
319
|
+
}, startNewConversationButtonText), " ", blockingErrorContinueText))), /* @__PURE__ */ React.createElement("form", {
|
|
312
320
|
className: "DocSearch-Sidepanel-Prompt--form",
|
|
313
321
|
onSubmit: (e) => {
|
|
314
322
|
e.preventDefault();
|
|
315
|
-
if (isStreaming) return;
|
|
323
|
+
if (isStreaming || showBlockingError) return;
|
|
316
324
|
handleSend();
|
|
317
325
|
}
|
|
318
326
|
}, /* @__PURE__ */ React.createElement("textarea", {
|
|
@@ -322,6 +330,9 @@ const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}
|
|
|
322
330
|
value: userPrompt,
|
|
323
331
|
"aria-label": promptAriaLabelText,
|
|
324
332
|
"aria-labelledby": "prompt-label",
|
|
333
|
+
"aria-describedby": showBlockingError ? blockingErrorId : void 0,
|
|
334
|
+
"aria-disabled": showBlockingError,
|
|
335
|
+
readOnly: showBlockingError,
|
|
325
336
|
autoComplete: "off",
|
|
326
337
|
translate: "no",
|
|
327
338
|
rows: isMobile ? 1 : 2,
|
|
@@ -341,7 +352,8 @@ const PromptForm = React.forwardRef(({ exchanges, isStreaming, translations = {}
|
|
|
341
352
|
"aria-label": "Send question",
|
|
342
353
|
title: "Send question",
|
|
343
354
|
className: "DocSearch-Sidepanel-Prompt--submit",
|
|
344
|
-
"aria-disabled": userPrompt === ""
|
|
355
|
+
"aria-disabled": userPrompt === "",
|
|
356
|
+
disabled: showBlockingError
|
|
345
357
|
}, /* @__PURE__ */ React.createElement(SendIcon, null)))), /* @__PURE__ */ React.createElement("p", { className: "DocSearch-Sidepanel-Prompt--disclaimer" }, promptDisclaimerText));
|
|
346
358
|
});
|
|
347
359
|
|
|
@@ -531,6 +543,7 @@ function SidepanelInner({ isOpen = false, onOpen, onClose, agentId, apiKey, appI
|
|
|
531
543
|
searchClient
|
|
532
544
|
});
|
|
533
545
|
const prevStatus = React.useRef(status);
|
|
546
|
+
const showPromptBlockingError = sidepanelState === "conversation" && status === "error" && isAskAiPromptBlockingError(askAiError) && (!isThreadDepthError(askAiError) || messages.some((message) => message.role === "assistant"));
|
|
534
547
|
const handleSend = React.useCallback((prompt) => {
|
|
535
548
|
setStoppedStreaming(false);
|
|
536
549
|
sendMessage({ text: prompt });
|
|
@@ -679,7 +692,11 @@ function SidepanelInner({ isOpen = false, onOpen, onClose, agentId, apiKey, appI
|
|
|
679
692
|
isStreaming,
|
|
680
693
|
translations: translations.promptForm,
|
|
681
694
|
onSend: handleSend,
|
|
682
|
-
onStopStreaming: handleStopStreaming
|
|
695
|
+
onStopStreaming: handleStopStreaming,
|
|
696
|
+
blockingErrorMessage: getAskAiBlockingBannerMessage(askAiError),
|
|
697
|
+
showBlockingError: showPromptBlockingError,
|
|
698
|
+
showNewConversationLink: showAskAiBlockingBannerNewConversationLink(askAiError),
|
|
699
|
+
onStartNewConversation: handleStartNewConversation
|
|
683
700
|
}), /* @__PURE__ */ React.createElement("footer", { className: "DocSearch-Sidepanel-Footer" }, /* @__PURE__ */ React.createElement("span", { className: "DocSearch-Logo DocSearch-Sidepanel--powered-by" }, /* @__PURE__ */ React.createElement(AlgoliaLogo, { translations: translations.logo })))));
|
|
684
701
|
}
|
|
685
702
|
const Sidepanel = React.forwardRef(SidepanelInner);
|