@docsearch/react 5.0.0-beta.1 → 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/README.md +1 -1
- package/dist/esm/{AskAiScreenState-CRHicWbN.d.ts → AskAiScreenState-Sqbn60f2.d.ts} +5 -2
- package/dist/esm/{DocSearch-HJsNvtZr.d.ts → DocSearch-BVqxFxTw.d.ts} +20 -43
- package/dist/esm/{DocSearchAskAiModal-KaA6fBV4.js → DocSearchAskAiModal-C_sH1j8Y.js} +31 -38
- package/dist/esm/DocSearchAskAiModal-C_sH1j8Y.js.map +1 -0
- package/dist/esm/{DocSearchAskAiModal-B7vpLudE.d.ts → DocSearchAskAiModal-DpB7pLCC.d.ts} +4 -4
- package/dist/esm/{DocSearchModal-CpvDjo1O.js → DocSearchModal-CITTG0fe.js} +20 -26
- 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 +13 -110
- package/dist/esm/docsearchAi.js +14 -4
- package/dist/esm/docsearchAi.js.map +1 -1
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.js +15 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/modal.d.ts +1 -1
- package/dist/esm/modal.js +1 -1
- package/dist/esm/{normalizeDocSearchIndexes-DAzlMybx.js → normalizeDocSearchIndexes-ChnVvoVt.js} +105 -74
- package/dist/esm/normalizeDocSearchIndexes-ChnVvoVt.js.map +1 -0
- package/dist/esm/sidepanel.d.ts +31 -27
- package/dist/esm/sidepanel.js +14 -11
- 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-CG2H3qm4.js → useSuggestedQuestions-DwcUPOf_.js} +107 -50
- 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 +44 -42
- package/dist/umd/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/esm/DocSearchAskAiModal-KaA6fBV4.js.map +0 -1
- package/dist/esm/DocSearchModal-CpvDjo1O.js.map +0 -1
- package/dist/esm/normalizeDocSearchIndexes-DAzlMybx.js.map +0 -1
- package/dist/esm/useSuggestedQuestions-CG2H3qm4.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";
|
|
@@ -18,8 +18,10 @@ type ConversationScreenTranslations = Partial<ToolCallTranslations & {
|
|
|
18
18
|
reasoningText: string;
|
|
19
19
|
/** Text show while assistant is thinking. */
|
|
20
20
|
thinkingText: string;
|
|
21
|
-
/** Text shown describing related
|
|
21
|
+
/** Text shown describing a singular related source. */
|
|
22
22
|
relatedSourcesText: string;
|
|
23
|
+
/** Text shown describing multiple related sources. */
|
|
24
|
+
relatedSourcesTextPlural: string;
|
|
23
25
|
/** Message that's shown when user has stopped the streaming of a message. */
|
|
24
26
|
stoppedStreamingText: string;
|
|
25
27
|
/** Text shown for copy button on code snippets. */
|
|
@@ -50,7 +52,7 @@ type ConversationScreenTranslations = Partial<ToolCallTranslations & {
|
|
|
50
52
|
feedbackTagSafetyOrLegal: string;
|
|
51
53
|
feedbackTagOther: string;
|
|
52
54
|
/** Error title shown if there is an error while chatting. */
|
|
53
|
-
errorTitleText:
|
|
55
|
+
errorTitleText: string;
|
|
54
56
|
suggestedPromptsTitleText: string;
|
|
55
57
|
}>;
|
|
56
58
|
//#endregion
|
|
@@ -293,17 +295,12 @@ type SidepanelSearchParameters = {
|
|
|
293
295
|
searchParameters?: AgentStudioSearchParameters;
|
|
294
296
|
};
|
|
295
297
|
type DocSearchSidepanelProps = DocSearchCallbacks$1 & {
|
|
296
|
-
/** The
|
|
297
|
-
|
|
298
|
-
/**
|
|
298
|
+
/** The Agent Studio agent ID to use for Ask AI. */
|
|
299
|
+
agentId: string;
|
|
300
|
+
/** Search only API key. */
|
|
299
301
|
apiKey: string;
|
|
300
|
-
/** Algolia application
|
|
302
|
+
/** Algolia application ID that hosts the Agent Studio agent. */
|
|
301
303
|
appId: string;
|
|
302
|
-
/**
|
|
303
|
-
* The index name to use for the ask AI feature. Your assistant will search
|
|
304
|
-
* this index for relevant documents.
|
|
305
|
-
*/
|
|
306
|
-
indexName: string;
|
|
307
304
|
/**
|
|
308
305
|
* Configuration for keyboard shortcuts. Allows enabling/disabling specific
|
|
309
306
|
* shortcuts.
|
|
@@ -338,21 +335,22 @@ type DocSearchSidepanelProps = DocSearchCallbacks$1 & {
|
|
|
338
335
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
339
336
|
*/
|
|
340
337
|
memory?: Memory;
|
|
341
|
-
/**
|
|
342
|
-
|
|
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[];
|
|
343
346
|
};
|
|
344
347
|
declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallbacks$1 & {
|
|
345
|
-
/** The
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
+
/** The Agent Studio agent ID to use for Ask AI. */
|
|
349
|
+
agentId: string;
|
|
350
|
+
/** Search only API key. */
|
|
348
351
|
apiKey: string;
|
|
349
|
-
/** Algolia application
|
|
352
|
+
/** Algolia application ID that hosts the Agent Studio agent. */
|
|
350
353
|
appId: string;
|
|
351
|
-
/**
|
|
352
|
-
* The index name to use for the ask AI feature. Your assistant will search
|
|
353
|
-
* this index for relevant documents.
|
|
354
|
-
*/
|
|
355
|
-
indexName: string;
|
|
356
354
|
/**
|
|
357
355
|
* Configuration for keyboard shortcuts. Allows enabling/disabling specific
|
|
358
356
|
* shortcuts.
|
|
@@ -387,8 +385,14 @@ declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallb
|
|
|
387
385
|
* @see https://www.algolia.com/doc/guides/algolia-ai/agent-studio/how-to/memory/overview
|
|
388
386
|
*/
|
|
389
387
|
memory?: Memory;
|
|
390
|
-
/**
|
|
391
|
-
|
|
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[];
|
|
392
396
|
} & SidepanelSearchParameters & React.RefAttributes<DocSearchRef$1>>;
|
|
393
397
|
//#endregion
|
|
394
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";
|
|
@@ -133,9 +133,9 @@ function AggregatedSearchBlock({ queries }) {
|
|
|
133
133
|
//#endregion
|
|
134
134
|
//#region src/Sidepanel/ConversationScreen.tsx
|
|
135
135
|
const ConversationExchange = React.forwardRef(({ exchange, translations = {}, isLastExchange, conversations, onFeedback, status, streamError, memoryEnabled, tools, onSelectPromptSuggestion }, conversationRef) => {
|
|
136
|
-
var _userMessage$metadata, _assistantMessage$met
|
|
136
|
+
var _userMessage$metadata, _assistantMessage$met;
|
|
137
137
|
const { userMessage, assistantMessage } = exchange;
|
|
138
|
-
const { reasoningText = "Reasoning...", thinkingText = "Thinking...", searchingText = "Searching...", relatedSourcesText, stoppedStreamingText = "You stopped this response", preToolCallText = "Searching...", toolCallResultText = "Searched for", copyButtonText = "Copy", copyButtonCopiedText = "Copied!", errorTitleText = "Chat error", savedMemoryToolResultText = "Saved to memory", memoryToolResultText = "Used memory to enhance results", suggestedPromptsTitleText = "Suggested prompts" } = translations;
|
|
138
|
+
const { reasoningText = "Reasoning...", thinkingText = "Thinking...", searchingText = "Searching...", relatedSourcesText, relatedSourcesTextPlural, stoppedStreamingText = "You stopped this response", preToolCallText = "Searching...", toolCallResultText = "Searched for", copyButtonText = "Copy", copyButtonCopiedText = "Copied!", errorTitleText = "Chat error", savedMemoryToolResultText = "Saved to memory", memoryToolResultText = "Used memory to enhance results", suggestedPromptsTitleText = "Suggested prompts" } = translations;
|
|
139
139
|
const assistantContent = useMemo(() => getMessageContent(assistantMessage), [assistantMessage]);
|
|
140
140
|
const userContent = useMemo(() => getMessageContent(userMessage), [userMessage]);
|
|
141
141
|
const assistantParts = useMemo(() => groupConsecutiveToolResults((assistantMessage === null || assistantMessage === void 0 ? void 0 : assistantMessage.parts) || []), [assistantMessage]);
|
|
@@ -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" },
|
|
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", {
|
|
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, {
|
|
@@ -202,12 +202,13 @@ const ConversationExchange = React.forwardRef(({ exchange, translations = {}, is
|
|
|
202
202
|
role: "status"
|
|
203
203
|
}, /* @__PURE__ */ React.createElement("span", { className: "DocSearch-shimmer" }, thinkingText), /* @__PURE__ */ React.createElement("span", { className: "DocSearch-AskAi-Thinking-Skeleton DocSearch-shimmer" }), /* @__PURE__ */ React.createElement("span", { className: "DocSearch-AskAi-Thinking-Skeleton DocSearch-AskAi-Thinking-Skeleton--short DocSearch-shimmer" }))), wasStopped && /* @__PURE__ */ React.createElement("p", { className: "DocSearch-AskAiScreen-MessageContent-Stopped" }, stoppedStreamingText)), /* @__PURE__ */ React.createElement("div", { className: "DocSearch-AskAiScreen-Answer-Footer" }, /* @__PURE__ */ React.createElement(SourcesPanel, {
|
|
204
204
|
links: urlsToDisplay,
|
|
205
|
-
titleText: relatedSourcesText
|
|
205
|
+
titleText: relatedSourcesText,
|
|
206
|
+
pluralTitleText: relatedSourcesTextPlural
|
|
206
207
|
}), /* @__PURE__ */ React.createElement(FeedbackActions, {
|
|
207
208
|
isSidepanel: true,
|
|
208
209
|
id: messageId,
|
|
209
210
|
showActions,
|
|
210
|
-
latestAssistantMessageContent:
|
|
211
|
+
latestAssistantMessageContent: assistantContent || null,
|
|
211
212
|
translations,
|
|
212
213
|
conversations,
|
|
213
214
|
onFeedback
|
|
@@ -497,7 +498,7 @@ const useSidepanelWidth = ({ isExpanded, width, expandedWidth }) => {
|
|
|
497
498
|
|
|
498
499
|
//#endregion
|
|
499
500
|
//#region src/Sidepanel/Sidepanel.tsx
|
|
500
|
-
function SidepanelInner({ isOpen = false, onOpen, onClose,
|
|
501
|
+
function SidepanelInner({ isOpen = false, onOpen, onClose, agentId, apiKey, appId, variant = "floating", searchParameters, pushSelector, width, expandedWidth, suggestedQuestions: suggestedQuestionsEnabled = false, translations = {}, keyboardShortcuts, side = "right", initialMessage, tools = EMPTY_TOOLS, memory, indices }, ref) {
|
|
501
502
|
var _memory$enabled;
|
|
502
503
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
|
503
504
|
const [sidepanelState, setSidepanelState] = React.useState("new-conversation");
|
|
@@ -517,8 +518,7 @@ function SidepanelInner({ isOpen = false, onOpen, onClose, assistantId, apiKey,
|
|
|
517
518
|
const searchClient = useSearchClient(appId, apiKey, setSidepanelSearchClient);
|
|
518
519
|
const { chatId, status, sendMessage, stopAskAiStreaming, isStreaming, exchanges, conversations, messages, sendFeedback, askAiError, startNewConversation, restoreConversation } = useAskAi({
|
|
519
520
|
appId,
|
|
520
|
-
|
|
521
|
-
assistantId,
|
|
521
|
+
agentId,
|
|
522
522
|
apiKey,
|
|
523
523
|
searchParameters,
|
|
524
524
|
tools,
|
|
@@ -526,7 +526,7 @@ function SidepanelInner({ isOpen = false, onOpen, onClose, assistantId, apiKey,
|
|
|
526
526
|
indices
|
|
527
527
|
});
|
|
528
528
|
const suggestedQuestions = useSuggestedQuestions({
|
|
529
|
-
|
|
529
|
+
agentId,
|
|
530
530
|
suggestedQuestionsEnabled,
|
|
531
531
|
searchClient
|
|
532
532
|
});
|
|
@@ -725,6 +725,8 @@ const _excluded3 = ["button", "panel"];
|
|
|
725
725
|
function DocSearchSidepanelComponent(_ref, ref) {
|
|
726
726
|
let { keyboardShortcuts, theme, onReady, onOpen, onClose, onSidepanelOpen, onSidepanelClose } = _ref, props = _objectWithoutProperties(_ref, _excluded);
|
|
727
727
|
return /* @__PURE__ */ React.createElement(DocSearch, {
|
|
728
|
+
appId: props.appId,
|
|
729
|
+
apiKey: props.apiKey,
|
|
728
730
|
keyboardShortcuts,
|
|
729
731
|
theme,
|
|
730
732
|
ref,
|
|
@@ -738,7 +740,8 @@ function DocSearchSidepanelComponent(_ref, ref) {
|
|
|
738
740
|
const DocSearchSidepanel = React.forwardRef(DocSearchSidepanelComponent);
|
|
739
741
|
function DocSearchSidepanelComp(_ref2) {
|
|
740
742
|
let { button: buttonProps = {}, panel: _ref3 = {} } = _ref2, { portalContainer } = _ref3, panelProps = _objectWithoutProperties(_ref3, _excluded2), rootProps = _objectWithoutProperties(_ref2, _excluded3);
|
|
741
|
-
const { docsearchState, setDocsearchState, keyboardShortcuts, registerView, initialAskAiMessage } = useDocSearch();
|
|
743
|
+
const { docsearchState, setDocsearchState, keyboardShortcuts, registerView, initialAskAiMessage, appId, apiKey } = useDocSearch();
|
|
744
|
+
if (!appId || !apiKey) throw new Error("`Sidepanel` requires `appId` and `apiKey` props or values configured on the `DocSearch` provider.");
|
|
742
745
|
const toggleSidepanelState = React.useCallback(() => {
|
|
743
746
|
setDocsearchState(docsearchState === "sidepanel" ? "ready" : "sidepanel");
|
|
744
747
|
}, [docsearchState, setDocsearchState]);
|