@docsearch/react 5.0.0-beta.2 → 5.0.0-beta.3
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-C_sH1j8Y.js} +9 -9
- package/dist/esm/{DocSearchAskAiModal-BczGFkvR.js.map → DocSearchAskAiModal-C_sH1j8Y.js.map} +1 -1
- 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 +19 -7
- package/dist/esm/sidepanel.js +1 -1
- 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-DwcUPOf_.js} +72 -25
- package/dist/esm/useSuggestedQuestions-DwcUPOf_.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/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";
|
|
@@ -335,8 +335,14 @@ type DocSearchSidepanelProps = DocSearchCallbacks$1 & {
|
|
|
335
335
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
336
336
|
*/
|
|
337
337
|
memory?: Memory;
|
|
338
|
-
/**
|
|
339
|
-
|
|
338
|
+
/**
|
|
339
|
+
* Index names for the Agent Studio search tool on this request.
|
|
340
|
+
*
|
|
341
|
+
* Agent Studio expects names only. Put descriptions and tool defaults on the
|
|
342
|
+
* agent configuration. Put per-index runtime overrides in
|
|
343
|
+
* `searchParameters`.
|
|
344
|
+
*/
|
|
345
|
+
indices?: string[];
|
|
340
346
|
};
|
|
341
347
|
declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallbacks$1 & {
|
|
342
348
|
/** The Agent Studio agent ID to use for Ask AI. */
|
|
@@ -379,8 +385,14 @@ declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallb
|
|
|
379
385
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
380
386
|
*/
|
|
381
387
|
memory?: Memory;
|
|
382
|
-
/**
|
|
383
|
-
|
|
388
|
+
/**
|
|
389
|
+
* Index names for the Agent Studio search tool on this request.
|
|
390
|
+
*
|
|
391
|
+
* Agent Studio expects names only. Put descriptions and tool defaults on the
|
|
392
|
+
* agent configuration. Put per-index runtime overrides in
|
|
393
|
+
* `searchParameters`.
|
|
394
|
+
*/
|
|
395
|
+
indices?: string[];
|
|
384
396
|
} & SidepanelSearchParameters & React.RefAttributes<DocSearchRef$1>>;
|
|
385
397
|
//#endregion
|
|
386
398
|
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 { S as AlertIcon, _ as BackIcon, a as MemoizedMarkdown, b as MoreVerticalIcon, c as buildDummyAskAiHit, d as getMessageContent, f as isAIToolPart, g as ConversationPromptSuggestions, h as FeedbackActions, i as groupConsecutiveToolResults, l as extractLinksFromMessage, m as SourcesPanel, n as useAskAi, o as ToolCall, r as Menu, s as EMPTY_TOOLS, t as useSuggestedQuestions, u as getAgentPromptSuggestions, v as NewConversationIcon, x as StopIcon, y as ConversationHistoryIcon } from "./useSuggestedQuestions-
|
|
5
|
+
import { S as AlertIcon, _ as BackIcon, a as MemoizedMarkdown, b as MoreVerticalIcon, c as buildDummyAskAiHit, d as getMessageContent, f as isAIToolPart, g as ConversationPromptSuggestions, h as FeedbackActions, i as groupConsecutiveToolResults, l as extractLinksFromMessage, m as SourcesPanel, n as useAskAi, o as ToolCall, r as Menu, s as EMPTY_TOOLS, t as useSuggestedQuestions, u as getAgentPromptSuggestions, v as NewConversationIcon, x as StopIcon, y as ConversationHistoryIcon } from "./useSuggestedQuestions-DwcUPOf_.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";
|