@docsearch/react 5.0.0-beta.1 → 5.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/dist/esm/{AskAiScreenState-CRHicWbN.d.ts → AskAiScreenState-Bw2WIgv_.d.ts} +5 -2
  3. package/dist/esm/{DocSearch-HJsNvtZr.d.ts → DocSearch-CVj6U-nI.d.ts} +4 -18
  4. package/dist/esm/{DocSearchAskAiModal-KaA6fBV4.js → DocSearchAskAiModal-BczGFkvR.js} +26 -33
  5. package/dist/esm/DocSearchAskAiModal-BczGFkvR.js.map +1 -0
  6. package/dist/esm/{DocSearchAskAiModal-B7vpLudE.d.ts → DocSearchAskAiModal-MF2py4NM.d.ts} +4 -4
  7. package/dist/esm/{DocSearchModal-CpvDjo1O.js → DocSearchModal-D_tfhoN1.js} +13 -21
  8. package/dist/esm/DocSearchModal-D_tfhoN1.js.map +1 -0
  9. package/dist/esm/askaiModal.d.ts +1 -1
  10. package/dist/esm/askaiModal.js +1 -1
  11. package/dist/esm/docsearchAi.d.ts +4 -9
  12. package/dist/esm/docsearchAi.js +14 -4
  13. package/dist/esm/docsearchAi.js.map +1 -1
  14. package/dist/esm/index.d.ts +2 -2
  15. package/dist/esm/index.js +15 -5
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/modal.d.ts +1 -1
  18. package/dist/esm/modal.js +1 -1
  19. package/dist/esm/{normalizeDocSearchIndexes-DAzlMybx.js → normalizeDocSearchIndexes-D8P3VEXa.js} +90 -55
  20. package/dist/esm/normalizeDocSearchIndexes-D8P3VEXa.js.map +1 -0
  21. package/dist/esm/sidepanel.d.ts +14 -22
  22. package/dist/esm/sidepanel.js +14 -11
  23. package/dist/esm/sidepanel.js.map +1 -1
  24. package/dist/esm/{useSuggestedQuestions-CG2H3qm4.js → useSuggestedQuestions-Ds7H1JCr.js} +36 -26
  25. package/dist/esm/useSuggestedQuestions-Ds7H1JCr.js.map +1 -0
  26. package/dist/esm/version.d.ts +1 -1
  27. package/dist/esm/version.js +1 -1
  28. package/dist/esm/version.js.map +1 -1
  29. package/dist/umd/index.js +43 -41
  30. package/dist/umd/index.js.map +1 -1
  31. package/package.json +4 -4
  32. package/dist/esm/DocSearchAskAiModal-KaA6fBV4.js.map +0 -1
  33. package/dist/esm/DocSearchModal-CpvDjo1O.js.map +0 -1
  34. package/dist/esm/normalizeDocSearchIndexes-DAzlMybx.js.map +0 -1
  35. package/dist/esm/useSuggestedQuestions-CG2H3qm4.js.map +0 -1
@@ -87,6 +87,13 @@ function isModifierEvent(event) {
87
87
  return event.button === 1 || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
88
88
  }
89
89
 
90
+ //#endregion
91
+ //#region src/utils/isQueryEmpty.ts
92
+ function isQueryEmpty(query) {
93
+ if (!query || query.trim().length === 0) return true;
94
+ return false;
95
+ }
96
+
90
97
  //#endregion
91
98
  //#region src/utils/noop.ts
92
99
  function noop(..._args) {}
@@ -232,6 +239,22 @@ function getFacetLabel(facet) {
232
239
  if (facet.label) return facet.label;
233
240
  return facet.key.replace(/[._-]+/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
234
241
  }
242
+ function deriveDefaultSelectedFacetsFromIndex(indices) {
243
+ const defaultFacets = {};
244
+ for (const index of indices) {
245
+ var _index$searchParamete;
246
+ const facetFilters = (_index$searchParamete = index.searchParameters) === null || _index$searchParamete === void 0 ? void 0 : _index$searchParamete.facetFilters;
247
+ for (const facetFilter of Array.isArray(facetFilters) ? facetFilters : [facetFilters]) {
248
+ if (typeof facetFilter !== "string") continue;
249
+ const separatorIndex = facetFilter.indexOf(":");
250
+ if (separatorIndex <= 0) continue;
251
+ const key = facetFilter.slice(0, separatorIndex);
252
+ const value = facetFilter.slice(separatorIndex + 1);
253
+ if (key && value) defaultFacets[key] = value;
254
+ }
255
+ }
256
+ return defaultFacets;
257
+ }
235
258
 
236
259
  //#endregion
237
260
  //#region src/components/ui/Chip.tsx
@@ -267,12 +290,14 @@ function Menu$1(_ref) {
267
290
  let props = _extends({}, (_objectDestructuringEmpty(_ref), _ref));
268
291
  return /* @__PURE__ */ React.createElement(Menu.Root, props);
269
292
  }
270
- function MenuTrigger(_ref2) {
293
+ Menu$1.Trigger = React.forwardRef((_ref2, ref) => {
271
294
  let { className } = _ref2, props = _objectWithoutProperties(_ref2, _excluded$5);
272
295
  const cn = `DocSearch-Menu-Trigger${className ? ` ${className}` : ""}`;
273
- return /* @__PURE__ */ React.createElement(Menu.Trigger, _objectSpread2({ className: cn }, props));
274
- }
275
- Menu$1.Trigger = MenuTrigger;
296
+ return /* @__PURE__ */ React.createElement(Menu.Trigger, _objectSpread2({
297
+ className: cn,
298
+ ref
299
+ }, props));
300
+ });
276
301
  function MenuPopup(_ref3) {
277
302
  let { align = "start", alignOffset = 0, side = "bottom", sideOffset = 4, collisionBoundary = "clipping-ancestors", container } = _ref3, props = _objectWithoutProperties(_ref3, _excluded2);
278
303
  return /* @__PURE__ */ React.createElement(Menu.Portal, { container }, /* @__PURE__ */ React.createElement(Menu.Positioner, {
@@ -343,9 +368,10 @@ const SelectedFacetChip = React.memo(function SelectedFacetChip({ facetKey, face
343
368
  });
344
369
  const FacetBar = React.memo(function FacetBar({ facets, selections, onSelectionChange, clearSelections, translations = {} }) {
345
370
  const { defaultValueLabel = "All", facetMenuTriggerAriaLabel = "selected", clearAllLabel = "Clear all", facetsAriaLabel = "Search filters", selectedFacetsAriaLabel = "Selected search filters", clearFacetAriaLabel = "Clear filter:" } = translations;
371
+ const visibleFacetKeys = React.useMemo(() => new Set(facets.map((f) => f.key)), [facets]);
346
372
  const selectionsToDisplay = React.useMemo(() => {
347
- return Object.entries(selections).filter(([_, value]) => Boolean(value));
348
- }, [selections]);
373
+ return Object.entries(selections).filter(([key, value]) => Boolean(value) && visibleFacetKeys.has(key));
374
+ }, [selections, visibleFacetKeys]);
349
375
  const triggerRefs = React.useRef(/* @__PURE__ */ new Map());
350
376
  const registerTrigger = React.useCallback((facetKey, el) => {
351
377
  if (el) triggerRefs.current.set(facetKey, el);
@@ -533,21 +559,15 @@ function useFacetValues({ facets, indexes, searchClient }) {
533
559
  React.useEffect(() => {
534
560
  let isMounted = true;
535
561
  const facetKeys = stableFacetKeys ? stableFacetKeys.split(",") : [];
536
- if (facetKeys.length === 0 || indexes.length === 0) {
537
- setFacetValues({});
538
- return () => {
539
- isMounted = false;
540
- };
541
- }
542
- searchClient.search({ requests: indexes.map((index) => {
543
- var _index$searchParamete2;
544
- return _objectSpread2(_objectSpread2({}, (_index$searchParamete2 = index.searchParameters) !== null && _index$searchParamete2 !== void 0 ? _index$searchParamete2 : {}), {}, {
545
- indexName: index.name,
546
- query: "",
547
- hitsPerPage: 0,
548
- facets: facetKeys
549
- });
550
- }) }).then(({ results }) => {
562
+ if (facetKeys.length === 0 || indexes.length === 0) return () => {
563
+ isMounted = false;
564
+ };
565
+ searchClient.search({ requests: indexes.map((index) => ({
566
+ indexName: index.name,
567
+ query: "",
568
+ hitsPerPage: 0,
569
+ facets: facetKeys
570
+ })) }).then(({ results }) => {
551
571
  if (!isMounted) return;
552
572
  const valuesByFacet = facetKeys.reduce((acc, facet) => {
553
573
  acc[facet] = [];
@@ -579,19 +599,23 @@ function useFacetValues({ facets, indexes, searchClient }) {
579
599
  //#region src/hooks/useDocSearchFacets.ts
580
600
  function useDocSearchFacets({ facets, indexes, searchClient, onSelectionsChange }) {
581
601
  const normalizedFacets = React.useMemo(() => normalizeFacets(facets), [facets]);
602
+ const normalizedFacetsRef = React.useRef(normalizedFacets);
582
603
  const facetValues = useFacetValues({
583
604
  facets: normalizedFacets,
584
605
  indexes,
585
606
  searchClient
586
607
  });
587
- const [facetSelections, setFacetSelections] = React.useState({});
608
+ const [facetSelections, setFacetSelections] = React.useState(() => deriveDefaultSelectedFacetsFromIndex(indexes));
588
609
  const facetSelectionsRef = React.useRef(facetSelections);
589
610
  const onSelectionsChangeRef = React.useRef(onSelectionsChange);
590
- onSelectionsChangeRef.current = onSelectionsChange;
591
611
  const visibleFacets = React.useMemo(() => normalizedFacets.map((facet) => {
592
612
  var _facetValues$facet$ke;
593
613
  return _objectSpread2(_objectSpread2({}, facet), {}, { values: (_facetValues$facet$ke = facetValues[facet.key]) !== null && _facetValues$facet$ke !== void 0 ? _facetValues$facet$ke : [] });
594
614
  }).filter((facet) => facet.values.length > 0), [facetValues, normalizedFacets]);
615
+ React.useLayoutEffect(() => {
616
+ normalizedFacetsRef.current = normalizedFacets;
617
+ onSelectionsChangeRef.current = onSelectionsChange;
618
+ });
595
619
  const applySelections = React.useCallback((next) => {
596
620
  var _onSelectionsChangeRe;
597
621
  facetSelectionsRef.current = next;
@@ -605,13 +629,14 @@ function useDocSearchFacets({ facets, indexes, searchClient, onSelectionsChange
605
629
  handleFacetSelectionChange: React.useCallback((facet, value) => {
606
630
  if (facetSelectionsRef.current[facet] === value) return;
607
631
  const next = _objectSpread2({}, facetSelectionsRef.current);
608
- if (value === "") delete next[facet];
609
- else next[facet] = value;
632
+ next[facet] = value;
610
633
  applySelections(next);
611
634
  }, [applySelections]),
612
635
  clearFacetSelections: React.useCallback(() => {
613
636
  if (Object.keys(facetSelectionsRef.current).length === 0) return;
614
- applySelections({});
637
+ const next = {};
638
+ for (const facet of normalizedFacetsRef.current) if (facetSelectionsRef.current[facet.key]) next[facet.key] = "";
639
+ applySelections(next);
615
640
  }, [applySelections])
616
641
  };
617
642
  }
@@ -1070,10 +1095,6 @@ function HitResultBadge({ item, resultBadgeKey, translations = {} }) {
1070
1095
  const _excluded = ["translations", "resultBadgeKey"];
1071
1096
  function ResultsScreen(_ref) {
1072
1097
  let { translations = {}, resultBadgeKey } = _ref, props = _objectWithoutProperties(_ref, _excluded);
1073
- const { resultsSectionTitle = "Results" } = translations;
1074
- const renderIcon = React.useCallback(({ item }) => {
1075
- return /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Hit-icon" }, /* @__PURE__ */ React.createElement(SourceIcon, { type: item.type }));
1076
- }, []);
1077
1098
  const renderAction = React.useCallback(() => {
1078
1099
  return /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Hit-action" }, /* @__PURE__ */ React.createElement(SelectIcon, null));
1079
1100
  }, []);
@@ -1086,12 +1107,25 @@ function ResultsScreen(_ref) {
1086
1107
  }, [resultBadgeKey, translations.resultBadgeLabelText]);
1087
1108
  return /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Dropdown-Container" }, props.state.collections.map((collection) => {
1088
1109
  if (collection.items.length === 0) return null;
1110
+ const title = removeHighlightTags(collection.items[0]);
1089
1111
  return /* @__PURE__ */ React.createElement(Results, _objectSpread2(_objectSpread2({}, props), {}, {
1090
1112
  key: collection.source.sourceId,
1091
1113
  translations,
1092
- title: resultsSectionTitle,
1114
+ title,
1093
1115
  collection,
1094
- renderIcon,
1116
+ renderIcon: ({ item, index }) => {
1117
+ var _collection$items;
1118
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, item.__docsearch_parent && /* @__PURE__ */ React.createElement("svg", {
1119
+ className: "DocSearch-Hit-Tree",
1120
+ viewBox: "0 0 24 54"
1121
+ }, /* @__PURE__ */ React.createElement("g", {
1122
+ stroke: "currentColor",
1123
+ fill: "none",
1124
+ fillRule: "evenodd",
1125
+ strokeLinecap: "round",
1126
+ strokeLinejoin: "round"
1127
+ }, item.__docsearch_parent !== ((_collection$items = collection.items[index + 1]) === null || _collection$items === void 0 ? void 0 : _collection$items.__docsearch_parent) ? /* @__PURE__ */ React.createElement("path", { d: "M8 6v21M20 27H8.3" }) : /* @__PURE__ */ React.createElement("path", { d: "M8 6v42M20 27H8.3" }))), /* @__PURE__ */ React.createElement("div", { className: "DocSearch-Hit-icon" }, /* @__PURE__ */ React.createElement(SourceIcon, { type: item.type })));
1128
+ },
1095
1129
  renderAction,
1096
1130
  renderResultBadge
1097
1131
  }));
@@ -1101,10 +1135,20 @@ function ResultsScreen(_ref) {
1101
1135
  //#endregion
1102
1136
  //#region src/utils/createDocSearchSources.ts
1103
1137
  function createFacetFilters(searchParametersFacetFilters, facetSelections) {
1104
- const dynamicFacetFilters = Object.entries(facetSelections).filter(([, value]) => value).map(([facet, value]) => `${facet}:${value}`);
1105
- if (dynamicFacetFilters.length === 0) return searchParametersFacetFilters;
1106
- if (!searchParametersFacetFilters) return dynamicFacetFilters;
1107
- return [...searchParametersFacetFilters, ...dynamicFacetFilters];
1138
+ const selections = Object.entries(facetSelections);
1139
+ const selectedFacets = new Set(selections.map(([facet]) => facet));
1140
+ const dynamicFacetFilters = [];
1141
+ for (const [facet, selection] of selections) if (selection !== "") dynamicFacetFilters.push(`${facet}:${selection}`);
1142
+ if (selectedFacets.size === 0) return searchParametersFacetFilters;
1143
+ let configuredFacetFilters = [];
1144
+ if (searchParametersFacetFilters && Array.isArray(searchParametersFacetFilters)) configuredFacetFilters = searchParametersFacetFilters;
1145
+ else if (searchParametersFacetFilters) configuredFacetFilters = [searchParametersFacetFilters];
1146
+ return [...configuredFacetFilters.filter((facetFilter) => {
1147
+ if (typeof facetFilter !== "string") return true;
1148
+ const separatorIndex = facetFilter.indexOf(":");
1149
+ const facet = facetFilter.slice(0, separatorIndex);
1150
+ return separatorIndex <= 0 || !selectedFacets.has(facet);
1151
+ }), ...dynamicFacetFilters];
1108
1152
  }
1109
1153
  function buildNoQuerySources({ recentSearches, favoriteSearches, saveRecentSearch, onClose, disableUserPersonalization }) {
1110
1154
  if (disableUserPersonalization) return [];
@@ -1171,7 +1215,7 @@ async function buildQuerySources({ query, state: sourcesState, setContext, setSt
1171
1215
  highlightPostTag: (_searchParams$highlig2 = searchParams === null || searchParams === void 0 ? void 0 : searchParams.highlightPostTag) !== null && _searchParams$highlig2 !== void 0 ? _searchParams$highlig2 : "</mark>",
1172
1216
  hitsPerPage: (_searchParams$hitsPer = searchParams === null || searchParams === void 0 ? void 0 : searchParams.hitsPerPage) !== null && _searchParams$hitsPer !== void 0 ? _searchParams$hitsPer : 20,
1173
1217
  clickAnalytics: (_searchParams$clickAn = searchParams === null || searchParams === void 0 ? void 0 : searchParams.clickAnalytics) !== null && _searchParams$clickAn !== void 0 ? _searchParams$clickAn : insightsActive
1174
- }, searchParams !== null && searchParams !== void 0 ? searchParams : {}), facetFilters ? { facetFilters } : {});
1218
+ }, searchParams), facetFilters ? { facetFilters } : {});
1175
1219
  }) });
1176
1220
  return results.flatMap((res) => {
1177
1221
  const result = res;
@@ -1194,9 +1238,8 @@ async function buildQuerySources({ query, state: sourcesState, setContext, setSt
1194
1238
  apiKey
1195
1239
  }
1196
1240
  };
1197
- const items = Object.values(sources).flat();
1198
- return {
1199
- sourceId: `hits_${result.index}`,
1241
+ return Object.values(sources).map((items, index) => ({
1242
+ sourceId: `hits_${result.index}_${index}`,
1200
1243
  onSelect({ item, event }) {
1201
1244
  saveRecentSearch(item);
1202
1245
  if (!isModifierEvent(event)) onClose();
@@ -1210,9 +1253,9 @@ async function buildQuerySources({ query, state: sourcesState, setContext, setSt
1210
1253
  const potentialParent = groupedHits.find((siblingItem) => siblingItem.type === "lvl1" && siblingItem.hierarchy.lvl1 === item.hierarchy.lvl1);
1211
1254
  if (item.type !== "lvl1" && potentialParent) parent = potentialParent;
1212
1255
  return _objectSpread2(_objectSpread2({}, item), {}, { __docsearch_parent: parent }, insightsParams);
1213
- }).flat()).flat();
1256
+ })).flat();
1214
1257
  }
1215
- };
1258
+ }));
1216
1259
  });
1217
1260
  } catch (error) {
1218
1261
  if (error.name === "RetryError") setStatus("error");
@@ -1222,19 +1265,11 @@ async function buildQuerySources({ query, state: sourcesState, setContext, setSt
1222
1265
 
1223
1266
  //#endregion
1224
1267
  //#region src/utils/normalizeDocSearchIndexes.ts
1225
- function normalizeDocSearchIndexes({ indexName, indices = [], searchParameters }) {
1226
- const indexes = [];
1227
- if (indexName && indexName !== "") indexes.push({
1228
- name: indexName,
1229
- searchParameters
1230
- });
1231
- if (indices.length > 0) indices.forEach((index) => {
1232
- indexes.push(typeof index === "string" ? { name: index } : index);
1233
- });
1234
- if (indexes.length < 1) throw new Error("Must supply either `indexName` or `indices` for DocSearch to work");
1235
- return indexes;
1268
+ function normalizeDocSearchIndexes({ indices }) {
1269
+ if (!Array.isArray(indices) || indices.length < 1) throw new Error("Must supply at least one `indices` entry for DocSearch");
1270
+ return indices.map((index) => typeof index === "string" ? { name: index } : index);
1236
1271
  }
1237
1272
 
1238
1273
  //#endregion
1239
- export { noop as C, getCollection as D, SOURCE_IDS as E, scrollTo as S, identity as T, Hit as _, NoResultsScreen as a, SearchBoxForm as b, Results as c, useRefreshOnInitialQuery as d, useModalRefs as f, useDocSearchFacets as g, useSendItemClickEvent as h, ResultsScreen as i, useStoredDocSearches as l, useInitialModalQuery as m, buildNoQuerySources as n, ErrorScreen as o, useModalEnvironment as p, buildQuerySources as r, StoredSearchesSections as s, normalizeDocSearchIndexes as t, useSaveRecentSearch as u, Footer as v, isModifierEvent as w, FacetBar as x, ModalShell as y };
1240
- //# sourceMappingURL=normalizeDocSearchIndexes-DAzlMybx.js.map
1274
+ export { noop as C, SOURCE_IDS as D, identity as E, getCollection as O, scrollTo as S, isModifierEvent as T, Hit as _, NoResultsScreen as a, SearchBoxForm as b, Results as c, useRefreshOnInitialQuery as d, useModalRefs as f, useDocSearchFacets as g, useSendItemClickEvent as h, ResultsScreen as i, useStoredDocSearches as l, useInitialModalQuery as m, buildNoQuerySources as n, ErrorScreen as o, useModalEnvironment as p, buildQuerySources as r, StoredSearchesSections as s, normalizeDocSearchIndexes as t, useSaveRecentSearch as u, Footer as v, isQueryEmpty as w, FacetBar as x, ModalShell as y };
1275
+ //# sourceMappingURL=normalizeDocSearchIndexes-D8P3VEXa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeDocSearchIndexes-D8P3VEXa.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(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/g, \"'\")\n .replace(/&amp;/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}>;\n\ninterface CommandIconProps {\n children: React.ReactNode;\n ariaLabel: string;\n}\n\nfunction CommandIcon(props: CommandIconProps): JSX.Element {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n aria-label={props.ariaLabel}\n viewBox=\"0 0 24 24\"\n role=\"img\"\n >\n <g\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.4\"\n >\n {props.children}\n </g>\n </svg>\n );\n}\n\nexport function Footer({\n translations = {},\n isAskAiActive = false,\n}: FooterProps): JSX.Element {\n const {\n selectText = 'Select',\n selectKeyAriaLabel = 'Enter key',\n submitQuestionText = 'Submit question',\n navigateText = 'Navigate',\n navigateUpKeyAriaLabel = 'Arrow up',\n navigateDownKeyAriaLabel = 'Arrow down',\n closeText = 'Close',\n backToSearchText = 'Back to search',\n closeKeyAriaLabel = 'Escape key',\n poweredByText = 'Powered by',\n } = translations;\n\n return (\n <>\n <div className=\"DocSearch-Logo\">\n <AlgoliaLogo translations={{ poweredByText }} />\n </div>\n <ul className=\"DocSearch-Commands\">\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={navigateDownKeyAriaLabel}>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </CommandIcon>\n </kbd>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={navigateUpKeyAriaLabel}>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </CommandIcon>\n </kbd>\n <span className=\"DocSearch-Label\">{navigateText}</span>\n </li>\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <CommandIcon ariaLabel={selectKeyAriaLabel}>\n <polyline points=\"9 10 4 15 9 20\" />\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n </CommandIcon>\n </kbd>\n <span className=\"DocSearch-Label\">\n {isAskAiActive ? submitQuestionText : selectText}\n </span>\n </li>\n <li>\n <kbd className=\"DocSearch-Commands-Key\">\n <span className=\"DocSearch-Escape-Key\">ESC</span>\n </kbd>\n <span className=\"DocSearch-Label\" aria-label={closeKeyAriaLabel}>\n {isAskAiActive ? backToSearchText : closeText}\n </span>\n </li>\n </ul>\n </>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { InternalDocSearchHit, StoredDocSearchHit } from './types';\n\ninterface HitProps {\n hit: InternalDocSearchHit | StoredDocSearchHit;\n children: React.ReactNode;\n}\n\nexport function Hit({ hit, children }: HitProps): JSX.Element {\n return <a href={hit.url}>{children}</a>;\n}\n","import type { SearchResponse } from 'algoliasearch/lite';\nimport React from 'react';\n\nimport type { DocSearchFacet, DocSearchIndex } from './DocSearch';\nimport type { DocSearchHit } from './types';\nimport type { useSearchClient } from './useSearchClient';\n\nexport type FacetValues = Record<string, string[]>;\n\nexport function useFacetValues({\n facets,\n indexes,\n searchClient,\n}: {\n facets: DocSearchFacet[];\n indexes: DocSearchIndex[];\n searchClient: ReturnType<typeof useSearchClient>;\n}): FacetValues {\n const [facetValues, setFacetValues] = React.useState<FacetValues>({});\n\n // Derive stable string keys so the effect only re-runs when the actual\n // facet keys or index names/searchParameters change, not on every render (the `facets` and\n // `indexes` props are recreated on each render and would otherwise loop).\n const stableFacetKeys = facets.map((facet) => facet.key).join(',');\n const stableIndexes = JSON.stringify(\n indexes.map((index) => [index.name, index.searchParameters ?? null])\n );\n\n React.useEffect(() => {\n let isMounted = true;\n\n const facetKeys = stableFacetKeys ? stableFacetKeys.split(',') : [];\n\n if (facetKeys.length === 0 || indexes.length === 0) {\n 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 snippetLength,\n theme,\n}: {\n initialScrollY: number;\n modalRef: React.RefObject<HTMLDivElement | null>;\n snippetLength: React.MutableRefObject<number>;\n theme?: DocSearchTheme;\n}): void {\n useTheme({ theme });\n\n React.useEffect(() => {\n document.body.classList.add('DocSearch--active');\n\n return (): void => {\n document.body.classList.remove('DocSearch--active');\n window.scrollTo?.(0, initialScrollY);\n };\n }, [initialScrollY]);\n\n React.useEffect(() => {\n manageLocalStorageQuota();\n }, []);\n\n React.useLayoutEffect(() => {\n const scrollBarWidth = window.innerWidth - document.body.clientWidth;\n document.body.style.marginInlineEnd = `${scrollBarWidth}px`;\n\n return (): void => {\n document.body.style.marginInlineEnd = '0px';\n };\n }, []);\n\n React.useEffect(() => {\n if (window.matchMedia('(max-width: 768px)').matches) {\n snippetLength.current = 5;\n }\n }, [snippetLength]);\n\n React.useEffect(() => {\n function setFullViewportHeight(): void {\n if (modalRef.current) {\n const vh = window.innerHeight * 0.01;\n modalRef.current.style.setProperty('--docsearch-vh', `${vh}px`);\n }\n }\n\n setFullViewportHeight();\n window.addEventListener('resize', setFullViewportHeight);\n\n return (): void => {\n window.removeEventListener('resize', setFullViewportHeight);\n };\n }, [modalRef]);\n}\n","import type { AutocompleteApi } from '@algolia/autocomplete-core';\nimport type React from 'react';\n\nimport type { DocSearchTheme, InternalDocSearchHit } from '../types';\nimport { useTouchEvents } from '../useTouchEvents';\nimport { useTrapFocus } from '../useTrapFocus';\n\nimport { useDocSearchModalEffects } from './useDocSearchModalEffects';\n\nexport function useModalEnvironment({\n getEnvironmentProps,\n containerRef,\n dropdownRef,\n formElementRef,\n inputRef,\n initialScrollY,\n modalRef,\n snippetLength,\n theme,\n}: {\n getEnvironmentProps: AutocompleteApi<\n InternalDocSearchHit,\n React.FormEvent<HTMLFormElement>,\n React.MouseEvent,\n React.KeyboardEvent\n >['getEnvironmentProps'];\n containerRef: React.RefObject<HTMLDivElement | null>;\n dropdownRef: React.RefObject<HTMLDivElement | null>;\n formElementRef: React.RefObject<HTMLDivElement | null>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n initialScrollY: number;\n modalRef: React.RefObject<HTMLDivElement | null>;\n snippetLength: React.MutableRefObject<number>;\n theme?: DocSearchTheme;\n}): void {\n useTouchEvents({\n getEnvironmentProps,\n panelElement: dropdownRef.current,\n formElement: formElementRef.current,\n inputElement: inputRef.current,\n });\n useTrapFocus({ container: containerRef.current });\n useDocSearchModalEffects({ initialScrollY, modalRef, snippetLength, theme });\n}\n","import React from 'react';\n\nexport function useModalRefs(): {\n containerRef: React.RefObject<HTMLDivElement | null>;\n modalRef: React.RefObject<HTMLDivElement | null>;\n formElementRef: React.RefObject<HTMLDivElement | null>;\n dropdownRef: React.RefObject<HTMLDivElement | null>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n snippetLength: React.MutableRefObject<number>;\n} {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const modalRef = React.useRef<HTMLDivElement | null>(null);\n const formElementRef = React.useRef<HTMLDivElement | null>(null);\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const snippetLength = React.useRef<number>(15);\n\n return {\n containerRef,\n modalRef,\n formElementRef,\n dropdownRef,\n inputRef,\n snippetLength,\n };\n}\n","import React from 'react';\n\nexport function useRefreshOnInitialQuery({\n initialQuery,\n inputRef,\n refresh,\n}: {\n initialQuery: string;\n inputRef: React.RefObject<HTMLInputElement | null>;\n refresh: () => void;\n}): void {\n React.useEffect(() => {\n if (initialQuery.length > 0) {\n refresh();\n\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, [initialQuery, inputRef, refresh]);\n}\n","import React from 'react';\n\nimport type { StoredSearchPlugin } from '../stored-searches';\nimport type { InternalDocSearchHit, StoredDocSearchHit } from '../types';\n\nfunction createSyntheticParent(\n item: InternalDocSearchHit\n): InternalDocSearchHit {\n const hierarchy = item.hierarchy;\n const levels = [\n 'lvl6',\n 'lvl5',\n 'lvl4',\n 'lvl3',\n 'lvl2',\n 'lvl1',\n 'lvl0',\n ] as const;\n const deepestLevel = levels.find((level) => hierarchy[level]);\n\n return {\n ...item,\n type: deepestLevel || 'lvl0',\n content: null,\n };\n}\n\nexport function useSaveRecentSearch({\n favoriteSearches,\n recentSearches,\n disableUserPersonalization,\n}: {\n favoriteSearches: StoredSearchPlugin<StoredDocSearchHit>;\n recentSearches: StoredSearchPlugin<StoredDocSearchHit>;\n disableUserPersonalization: boolean;\n}): (item: InternalDocSearchHit) => void {\n return React.useCallback(\n function saveRecentSearch(item: InternalDocSearchHit): void {\n if (disableUserPersonalization) {\n return;\n }\n\n const search =\n item.type === 'content'\n ? item.__docsearch_parent || createSyntheticParent(item)\n : item;\n\n if (\n search &&\n favoriteSearches\n .getAll()\n .findIndex((x) => x.objectID === search.objectID) === -1\n ) {\n recentSearches.add(search);\n }\n },\n [favoriteSearches, recentSearches, disableUserPersonalization]\n );\n}\n","import React from 'react';\n\nimport { createStoredSearches } from '../stored-searches';\nimport type { StoredDocSearchHit } from '../types';\n\nexport function useStoredDocSearches({\n defaultIndexName,\n recentSearchesLimit,\n recentSearchesWithFavoritesLimit,\n}: {\n defaultIndexName: string;\n recentSearchesLimit: number;\n recentSearchesWithFavoritesLimit: number;\n}): {\n favoriteSearches: ReturnType<typeof createStoredSearches<StoredDocSearchHit>>;\n recentSearches: ReturnType<typeof createStoredSearches<StoredDocSearchHit>>;\n} {\n const favoriteSearches = React.useRef(\n createStoredSearches<StoredDocSearchHit>({\n key: `__DOCSEARCH_FAVORITE_SEARCHES__${defaultIndexName}`,\n limit: 10,\n })\n ).current;\n\n const recentSearches = React.useRef(\n createStoredSearches<StoredDocSearchHit>({\n key: `__DOCSEARCH_RECENT_SEARCHES__${defaultIndexName}`,\n limit:\n favoriteSearches.getAll().length === 0\n ? recentSearchesLimit\n : recentSearchesWithFavoritesLimit,\n })\n ).current;\n\n return { favoriteSearches, recentSearches };\n}\n","import type { JSX, ReactNode } from 'react';\nimport React from 'react';\n\ninterface HitContentProps {\n title: ReactNode;\n subText: ReactNode;\n}\n\nexport function HitContent({ title, subText }: HitContentProps): JSX.Element {\n return (\n <div className=\"DocSearch-Hit-content-wrapper\">\n <span className=\"DocSearch-Hit-title\">{title}</span>\n <span className=\"DocSearch-Hit-path\">{subText}</span>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\n\nconst MS_IN_SECOND = 1000;\nconst MS_IN_MINUTE = MS_IN_SECOND * 60;\nconst MS_IN_HOUR = MS_IN_MINUTE * 60;\nconst MS_IN_DAY = MS_IN_HOUR * 24;\n\nconst UNITS: Array<[number, Intl.RelativeTimeFormatUnit]> = [\n [MS_IN_DAY, 'day'],\n [MS_IN_HOUR, 'hour'],\n [MS_IN_MINUTE, 'minute'],\n [MS_IN_SECOND, 'second'],\n];\n\nexport function useRelativeFormattedDate(\n start: Date | null,\n end = Date.now()\n): string | null {\n const [diff] = useState<[number, Intl.RelativeTimeFormatUnit]>(() => {\n const elapsed = Math.abs(Number(end) - Number(start));\n const [ms, unit] =\n UNITS.find(([threshold]) => elapsed >= threshold) ??\n UNITS[UNITS.length - 1];\n\n return [Math.floor(elapsed / ms), unit];\n });\n\n const formattedDate = useMemo(() => {\n const locale =\n typeof navigator !== 'undefined' ? navigator.language : undefined;\n const [elapsedTime, elapsedUnit] = diff;\n\n return new Intl.RelativeTimeFormat(locale, {\n style: 'long',\n }).format(elapsedTime * -1, elapsedUnit);\n }, [diff]);\n\n return start ? formattedDate : null;\n}\n","import { type JSX, createElement } from 'react';\n\nimport type { StoredDocSearchHit } from './types';\n\nfunction getPropertyByPath(object: Record<string, any>, path: string): any {\n const parts = path.split('.');\n\n return parts.reduce((prev, current) => {\n if (prev?.[current]) return prev[current];\n return null;\n }, object);\n}\n\ninterface SnippetProps<TItem> {\n hit: TItem;\n attribute: string;\n tagName?: string;\n [prop: string]: unknown;\n}\n\nexport function Snippet<TItem extends StoredDocSearchHit>({\n hit,\n attribute,\n tagName = 'span',\n ...rest\n}: SnippetProps<TItem>): JSX.Element {\n return createElement(tagName, {\n ...rest,\n dangerouslySetInnerHTML: {\n __html:\n getPropertyByPath(hit, `_snippetResult.${attribute}.value`) ||\n getPropertyByPath(hit, attribute),\n },\n });\n}\n","import type {\n AutocompleteApi,\n AutocompleteState,\n BaseItem,\n} from '@algolia/autocomplete-core';\nimport React, { type JSX } from 'react';\n\nimport type { HitResultBadgeTranslations } from './components/HitResultBadge';\nimport { HitContent } from './components/ui/HitContent';\nimport type { DocSearchProps } from './DocSearch';\nimport { useRelativeFormattedDate } from './hooks/useRelativeFormattedDate';\nimport { SparklesIcon } from './icons/SparklesIcon';\nimport { Snippet } from './Snippet';\nimport type { InternalDocSearchHit, StoredDocSearchHit } from './types';\nimport { decodeHtmlEntities, getHitItemBreadcrumbs, SOURCE_IDS } from './utils';\n\nexport type ResultsTranslations = HitResultBadgeTranslations &\n Partial<{\n askAiPlaceholder: string;\n noResultsAskAiPlaceholder: string;\n recentConversationTimestampFallback: string;\n askAiResultsTitle: string;\n }>;\ninterface ResultsProps<TItem extends BaseItem> extends AutocompleteApi<\n TItem,\n React.FormEvent,\n React.MouseEvent,\n React.KeyboardEvent\n> {\n title?: string | null;\n translations?: ResultsTranslations;\n collection: AutocompleteState<TItem>['collections'][0];\n renderIcon: (props: { item: TItem; index: number }) => React.ReactNode;\n renderAction: (props: { item: TItem }) => React.ReactNode;\n renderResultBadge?: (props: { item: TItem }) => React.ReactNode;\n onItemClick: (item: TItem, event: KeyboardEvent | MouseEvent) => void;\n hitComponent: DocSearchProps['hitComponent'];\n state: AutocompleteState<TItem>;\n sourceIcon?: JSX.Element;\n}\n\nexport function Results<TItem extends StoredDocSearchHit>(\n props: ResultsProps<TItem>\n): JSX.Element | null {\n const { askAiResultsTitle = 'Ask AI Assistant' } = props.translations || {};\n\n const askAiResultsId = React.useId();\n // The collection title, decoded to handle encoded HTML entities\n // If there is not a title, return null to not render anything\n const decodedTitle = React.useMemo(() => {\n if (!props.title) {\n return null;\n }\n\n return decodeHtmlEntities(props.title);\n }, [props.title]);\n\n if (!props.collection || props.collection.items.length === 0) {\n return null;\n }\n\n if (props.collection.source.sourceId === SOURCE_IDS.askAI) {\n return (\n <section className=\"DocSearch-Hits\">\n <h2 id={askAiResultsId} className=\"DocSearch-Hit-source\">\n {askAiResultsTitle}\n </h2>\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n aria-labelledby={askAiResultsId}\n >\n {props.collection.items.map((item) => (\n <AskAiButton\n key={item.objectID}\n item={item}\n translations={props.translations}\n {...props}\n />\n ))}\n </ul>\n </section>\n );\n }\n\n if (props.collection.source.sourceId === SOURCE_IDS.recentConversations) {\n return (\n <section className=\"DocSearch-Hits\">\n <div className=\"DocSearch-Hit-source\">\n <SparklesIcon />\n {decodedTitle}\n </div>\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n >\n {props.collection.items.map((item, index) => {\n return (\n <Result\n key={[props.title, item.objectID].join(':')}\n item={item}\n index={index}\n {...props}\n />\n );\n })}\n </ul>\n </section>\n );\n }\n\n return (\n <section className=\"DocSearch-Hits\">\n <div className=\"DocSearch-Hit-source\">\n {props.sourceIcon ?? null}\n {decodedTitle}\n </div>\n\n <ul\n className=\"DocSearch-Hits-padded\"\n {...props.getListProps({ source: props.collection.source })}\n >\n {props.collection.items.map((item, index) => {\n return (\n <Result\n key={[props.title, item.objectID].join(':')}\n item={item}\n index={index}\n {...props}\n />\n );\n })}\n </ul>\n </section>\n );\n}\n\ninterface ResultProps<TItem extends BaseItem> extends ResultsProps<TItem> {\n item: TItem;\n index: number;\n}\n\nfunction Result<TItem extends StoredDocSearchHit>({\n item,\n index,\n renderIcon,\n renderAction,\n getItemProps,\n onItemClick,\n collection,\n hitComponent,\n translations = {},\n renderResultBadge,\n}: ResultProps<TItem>): JSX.Element {\n const Hit = hitComponent!;\n const { recentConversationTimestampFallback = 'A while ago' } = translations;\n const titleAttribute =\n item.type === 'content' ? 'content' : `hierarchy.${item.type}`;\n const breadcrumbs = getHitItemBreadcrumbs(item);\n\n return (\n <li\n className={[\n 'DocSearch-Hit',\n (item as unknown as InternalDocSearchHit).__docsearch_parent &&\n 'DocSearch-Hit--Child',\n ]\n .filter(Boolean)\n .join(' ')}\n {...getItemProps({\n item,\n source: collection.source,\n onClick(event) {\n onItemClick(item, event);\n },\n })}\n >\n <Hit hit={item}>\n <div className=\"DocSearch-Hit-Container\">\n {renderIcon({ item, index })}\n\n {/* lvl0 is special where there wouldn't be any \"parent\" to use for breadcrumbs */}\n {item.type === 'lvl0' && (\n <HitContent\n title={<Snippet hit={item} attribute=\"hierarchy.lvl0\" />}\n subText={<Snippet hit={item} attribute=\"content\" />}\n />\n )}\n\n {item.type === 'askAI' ? (\n <AskAIResultContent\n item={item}\n relativeDateFallbackText={recentConversationTimestampFallback}\n />\n ) : (\n <HitContent\n title={<Snippet hit={item} attribute={titleAttribute} />}\n subText={breadcrumbs}\n />\n )}\n\n {renderResultBadge?.({ item })}\n\n {renderAction({ item })}\n </div>\n </Hit>\n </li>\n );\n}\n\ninterface AskAIResultContentProps<TItem extends StoredDocSearchHit> {\n item: TItem;\n relativeDateFallbackText: string;\n}\n\nfunction AskAIResultContent<TItem extends StoredDocSearchHit>({\n item,\n relativeDateFallbackText,\n}: AskAIResultContentProps<TItem>) {\n const storedDate = item.hierarchy.lvl2 ? new Date(item.hierarchy.lvl2) : null;\n const relativeDate = useRelativeFormattedDate(storedDate);\n\n return (\n <HitContent\n title={decodeHtmlEntities(item.hierarchy.lvl1 || '')}\n subText={relativeDate || relativeDateFallbackText}\n />\n );\n}\n\ninterface AskAiButtonProps<TItem extends BaseItem> extends ResultsProps<TItem> {\n item: TItem;\n translations?: ResultsTranslations;\n state: AutocompleteState<TItem>;\n}\n\nfunction AskAiButton<TItem extends StoredDocSearchHit>({\n item,\n getItemProps,\n onItemClick,\n collection,\n}: AskAiButtonProps<TItem>): JSX.Element | null {\n if (!item.query) return null;\n\n return (\n <li\n className=\"DocSearch-Hit\"\n {...getItemProps({\n item,\n source: collection.source,\n onClick(event) {\n onItemClick(item, event);\n },\n })}\n >\n <div className=\"DocSearch-Hit--AskAI\">\n <div className=\"DocSearch-Hit-AskAIButton DocSearch-Hit-Container\">\n <div className=\" DocSearch-Hit-AskAIButton-icon DocSearch-Hit-icon\">\n <SparklesIcon />\n </div>\n <div className=\"DocSearch-Hit-AskAIButton-title\">\n <span className=\"DocSearch-Hit-AskAIButton-title-query\">\n {item.query}\n </span>\n </div>\n </div>\n </div>\n </li>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { CloseIcon, PinIcon, RecentIcon, SourceIcon } from '../../icons';\nimport { Results } from '../../Results';\nimport type { ScreenStateProps } from '../../ScreenState';\nimport type { InternalDocSearchHit } from '../../types';\nimport { getCollection } from '../../utils';\n\nexport type StoredSearchesSectionsTranslations = Partial<{\n recentSearchesTitle: string;\n noRecentSearchesText: string;\n saveRecentSearchButtonTitle: string;\n removeRecentSearchButtonTitle: string;\n favoriteSearchesTitle: string;\n removeFavoriteSearchButtonTitle: string;\n}>;\n\ntype StoredSearchesSectionsProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n translations?: StoredSearchesSectionsTranslations;\n};\n\nexport function StoredSearchesSections({\n translations = {},\n ...props\n}: StoredSearchesSectionsProps): JSX.Element {\n const {\n recentSearchesTitle = 'Recently viewed docs',\n saveRecentSearchButtonTitle = 'Pin this search',\n removeRecentSearchButtonTitle = 'Remove this search from history',\n favoriteSearchesTitle = 'Pinned',\n removeFavoriteSearchButtonTitle = 'Remove this saved search',\n } = translations;\n const favoriteSearches = getCollection(props.state, 'favoriteSearches');\n const recentSearchesCollection = getCollection(props.state, 'recentSearches');\n\n return (\n <>\n {favoriteSearches && (\n <Results\n {...props}\n title={favoriteSearchesTitle}\n collection={favoriteSearches}\n sourceIcon={<PinIcon />}\n renderIcon={({ item }) => (\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n )}\n renderAction={({ item }) => (\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button\"\n title={removeFavoriteSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.favoriteSearches.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n )}\n />\n )}\n\n {recentSearchesCollection && (\n <Results\n {...props}\n title={recentSearchesTitle}\n collection={recentSearchesCollection}\n sourceIcon={<RecentIcon />}\n renderIcon={({ item }) => (\n <div className=\"DocSearch-Hit-icon\">\n <SourceIcon type={item.type} />\n </div>\n )}\n renderAction={({ item }) => (\n <>\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button DocSearch-Hit-action-button--pin\"\n title={saveRecentSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.favoriteSearches.add(item);\n props.recentSearches.remove(item);\n props.refresh();\n }}\n >\n <PinIcon />\n </button>\n </div>\n <div className=\"DocSearch-Hit-action\">\n <button\n className=\"DocSearch-Hit-action-button\"\n title={removeRecentSearchButtonTitle}\n type=\"submit\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.recentSearches.remove(item);\n props.refresh();\n }}\n >\n <CloseIcon />\n </button>\n </div>\n </>\n )}\n />\n )}\n </>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { ErrorIcon } from './icons';\n\nexport type ErrorScreenTranslations = Partial<{\n titleText: string;\n helpText: string;\n}>;\n\ntype ErrorScreenProps = {\n translations?: ErrorScreenTranslations;\n};\n\nexport function ErrorScreen({\n translations = {},\n}: ErrorScreenProps): JSX.Element {\n const {\n titleText = 'Unable to fetch results',\n helpText = 'You might want to check your network connection.',\n } = translations;\n return (\n <div className=\"DocSearch-ErrorScreen\">\n <div className=\"DocSearch-Screen-Icon\">\n <ErrorIcon />\n </div>\n <p className=\"DocSearch-Title\">{titleText}</p>\n <p className=\"DocSearch-Help\">{helpText}</p>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { NoResultsIcon, SearchIcon } from './icons';\nimport type { ScreenStateProps } from './ScreenState';\nimport type { InternalDocSearchHit } from './types';\n\nexport type NoResultsScreenTranslations = Partial<{\n noResultsText: string;\n suggestedQueryText: string;\n reportMissingResultsText: string;\n reportMissingResultsLinkText: string;\n}>;\n\ntype NoResultsScreenProps = Omit<\n ScreenStateProps<InternalDocSearchHit>,\n 'translations'\n> & {\n canHandleAskAi?: boolean;\n translations?: NoResultsScreenTranslations;\n};\n\nexport function NoResultsScreen({\n translations = {},\n ...props\n}: NoResultsScreenProps): JSX.Element {\n const {\n noResultsText = 'No results found for',\n suggestedQueryText = 'Try searching for',\n reportMissingResultsText = 'Believe this query should return results?',\n reportMissingResultsLinkText = 'Let us know.',\n } = translations;\n const searchSuggestions: string[] | undefined = props.state.context\n .searchSuggestions as string[];\n\n return (\n <div\n className={`DocSearch-NoResults ${props.canHandleAskAi ? 'DocSearch-NoResults--withAskAi' : ''}`}\n >\n <div className=\"DocSearch-Screen-Icon\">\n <NoResultsIcon />\n </div>\n <p className=\"DocSearch-Title\">\n {noResultsText} \"<strong>{props.state.query}</strong>\"\n </p>\n\n {searchSuggestions && searchSuggestions.length > 0 && (\n <div className=\"DocSearch-NoResults-Prefill-List\">\n <p className=\"DocSearch-Help\">{suggestedQueryText}:</p>\n <div className=\"DocSearch-NoResults-Prefill-List-Items\">\n {searchSuggestions.slice(0, 3).reduce<React.ReactNode[]>(\n (acc, search) => [\n ...acc,\n <p key={search}>\n <SearchIcon size={16} />\n <button\n className=\"DocSearch-Prefill\"\n key={search}\n type=\"button\"\n onClick={() => {\n props.setQuery(search.toLowerCase() + ' ');\n props.refresh();\n props.inputRef.current!.focus();\n }}\n >\n {search}\n </button>\n </p>,\n ],\n []\n )}\n </div>\n </div>\n )}\n\n {props.getMissingResultsUrl && (\n <p className=\"DocSearch-Help\">\n {`${reportMissingResultsText} `}\n <a\n href={props.getMissingResultsUrl({ query: props.state.query })}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {reportMissingResultsLinkText}\n </a>\n </p>\n )}\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport type { InternalDocSearchHit } from '../types';\nimport { getNestedValue } from '../utils';\n\nexport type HitResultBadgeTranslations = Partial<{\n /**\n * Label text used for screen readers to announce the result badge. Should\n * reflect the key of `resultBadgeKey`.\n *\n * @default 'Category'\n */\n resultBadgeLabelText: string;\n}>;\n\nfunction isRenderablePrimitive(v: unknown): v is boolean | number | string {\n return (\n typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean'\n );\n}\n\ninterface HitResultBadgeProps {\n item: InternalDocSearchHit;\n resultBadgeKey?: string;\n translations?: HitResultBadgeTranslations;\n}\n\nexport function HitResultBadge({\n item,\n resultBadgeKey,\n translations = {},\n}: HitResultBadgeProps): JSX.Element | null {\n if (!resultBadgeKey) {\n return null;\n }\n\n const parsedValue = getNestedValue(item, resultBadgeKey);\n\n if (parsedValue === null || typeof parsedValue === 'undefined') {\n return null;\n }\n\n const { resultBadgeLabelText = 'Category' } = translations;\n\n let badgeValue: string | null = null;\n\n if (isRenderablePrimitive(parsedValue)) {\n badgeValue = String(parsedValue).trim();\n } else if (Array.isArray(parsedValue)) {\n const parts = parsedValue\n .filter(isRenderablePrimitive)\n .map((v) => String(v).trim());\n badgeValue = parts.length > 0 ? parts.join(', ') : null;\n }\n\n if (badgeValue === null || badgeValue.length === 0) {\n return null;\n }\n\n return (\n <div className=\"DocSearch-Hit-badge\">\n <span className=\"DocSearch-VisuallyHiddenForAccessibility\">{`${resultBadgeLabelText}: ${badgeValue}`}</span>\n <span aria-hidden=\"true\">{badgeValue}</span>\n </div>\n );\n}\n","import React, { type JSX } from 'react';\n\nimport { HitResultBadge } from './components/HitResultBadge';\nimport { SelectIcon, SourceIcon } from './icons';\nimport type { ResultsTranslations } from './Results';\nimport { Results } from './Results';\nimport type { ScreenStateProps } from './ScreenState';\nimport type { InternalDocSearchHit } from './types';\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 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 snippetLength,\n insights,\n appId,\n apiKey,\n maxResultsPerGroup,\n transformItems = identity,\n saveRecentSearch,\n onClose,\n facetSelections,\n}: {\n query: string;\n state: BuildQuerySourcesState;\n setContext: (\n context: Partial<DocSearchState<InternalDocSearchHit>['context']>\n ) => void;\n setStatus: (status: DocSearchState<InternalDocSearchHit>['status']) => void;\n searchClient: ReturnType<typeof useSearchClient>;\n indexes: DocSearchIndex[];\n snippetLength: React.MutableRefObject<number>;\n insights: boolean;\n appId?: string;\n apiKey?: string;\n maxResultsPerGroup?: number;\n transformItems?: DocSearchProps['transformItems'];\n saveRecentSearch: (item: InternalDocSearchHit) => void;\n onClose: () => void;\n facetSelections: React.MutableRefObject<FacetSelections>;\n}): Promise<Array<AutocompleteSource<InternalDocSearchHit>>> {\n const insightsActive = insights;\n\n try {\n const { results } = await searchClient.search<DocSearchHit>({\n requests: indexes.map((index) => {\n const indexName = index.name;\n const searchParams = index.searchParameters;\n const facetFilters = createFacetFilters(\n searchParams?.facetFilters,\n facetSelections.current\n );\n\n return {\n query,\n indexName,\n attributesToRetrieve: searchParams?.attributesToRetrieve ?? [\n 'hierarchy.lvl0',\n 'hierarchy.lvl1',\n 'hierarchy.lvl2',\n 'hierarchy.lvl3',\n 'hierarchy.lvl4',\n 'hierarchy.lvl5',\n 'hierarchy.lvl6',\n 'content',\n 'type',\n 'url',\n ],\n attributesToSnippet: searchParams?.attributesToSnippet ?? [\n `hierarchy.lvl1:${snippetLength.current}`,\n `hierarchy.lvl2:${snippetLength.current}`,\n `hierarchy.lvl3:${snippetLength.current}`,\n `hierarchy.lvl4:${snippetLength.current}`,\n `hierarchy.lvl5:${snippetLength.current}`,\n `hierarchy.lvl6:${snippetLength.current}`,\n `content:${snippetLength.current}`,\n ],\n snippetEllipsisText: searchParams?.snippetEllipsisText ?? '…',\n highlightPreTag: searchParams?.highlightPreTag ?? '<mark>',\n highlightPostTag: searchParams?.highlightPostTag ?? '</mark>',\n hitsPerPage: searchParams?.hitsPerPage ?? 20,\n clickAnalytics: searchParams?.clickAnalytics ?? insightsActive,\n ...searchParams,\n ...(facetFilters ? { facetFilters } : {}),\n };\n }),\n });\n\n return results.flatMap((res) => {\n const result = res as SearchResponse<DocSearchHit>;\n const { hits, nbHits } = result;\n const transformedHits = transformItems(hits);\n const sources = groupBy<DocSearchHit>(\n transformedHits,\n (hit) => removeHighlightTags(hit),\n maxResultsPerGroup\n );\n\n if (\n (sourcesState.context.searchSuggestions as unknown[]).length <\n Object.keys(sources).length\n ) {\n setContext({\n searchSuggestions: {\n ...(sourcesState.context.searchSuggestions ?? []),\n ...Object.keys(sources),\n },\n });\n }\n\n if (nbHits) {\n const currentNbHits = sourcesState.context.nbHits as number | undefined;\n setContext({\n nbHits: (currentNbHits ?? 0) + nbHits,\n });\n }\n\n let insightsParams = {};\n\n if (insightsActive) {\n insightsParams = {\n __autocomplete_indexName: result.index,\n __autocomplete_queryID: result.queryID,\n __autocomplete_algoliaCredentials: { appId, apiKey },\n };\n }\n\n 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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"}
@@ -1,7 +1,7 @@
1
1
  import { o as ToolCalls } from "./index-Bqqv4HmN.js";
2
- import "./DocSearch-HJsNvtZr.js";
2
+ import "./DocSearch-CVj6U-nI.js";
3
3
  import { AgentStudioIndices, AgentStudioSearchParameters, Memory } from "./docsearchAi.js";
4
- import { r as ToolCallTranslations } from "./AskAiScreenState-CRHicWbN.js";
4
+ import { r as ToolCallTranslations } from "./AskAiScreenState-Bw2WIgv_.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 sources. */
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: any;
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 assistant ID to use for the ask AI feature. */
297
- assistantId: string;
298
- /** Public api key with search permissions for the index. */
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 id used by the search client. */
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.
@@ -342,17 +339,12 @@ type DocSearchSidepanelProps = DocSearchCallbacks$1 & {
342
339
  indices?: AgentStudioIndices[];
343
340
  };
344
341
  declare const DocSearchSidepanel: React.ForwardRefExoticComponent<DocSearchCallbacks$1 & {
345
- /** The assistant ID to use for the ask AI feature. */
346
- assistantId: string;
347
- /** Public api key with search permissions for the index. */
342
+ /** The Agent Studio agent ID to use for Ask AI. */
343
+ agentId: string;
344
+ /** Search only API key. */
348
345
  apiKey: string;
349
- /** Algolia application id used by the search client. */
346
+ /** Algolia application ID that hosts the Agent Studio agent. */
350
347
  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
348
  /**
357
349
  * Configuration for keyboard shortcuts. Allows enabling/disabling specific
358
350
  * shortcuts.