{"version":3,"sources":["jsdelivr-header.js","/npm/@yext/search-ui-react@2.1.1/locales/ar/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/cs/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/da/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/de/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/el/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/en-GB/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/en/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/es/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/et/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/fi/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/fr/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/hi/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/hr/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/hu/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/it/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/ja/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/ko/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/lt/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/lv/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/nb/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/nl/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/pl/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/pt/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/ro/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/ru/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/sk/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/sv/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/tr/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/vi/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/zh-CN/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/locales/zh-TW/search-ui-react.json","/npm/@yext/search-ui-react@2.1.1/src/utils/supportedLocales.ts","/npm/@yext/search-ui-react@2.1.1/src/index.ts","/npm/@yext/search-ui-react@2.1.1/src/components/SearchBar.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useEntityPreviews.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useComponentMountStatus.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useDebouncedFunction.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useRecentSearches.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useSearchWithNearMeHandling.ts","/npm/@yext/search-ui-react@2.1.1/src/utils/search-operations.ts","/npm/@yext/search-ui-react@2.1.1/src/utils/location-operations.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useSynchronizedRequest.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/VerticalDividerIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/HistoryIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/CloseIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/MagnifyingGlassIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/Dropdown.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/DropdownContext.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/InputContext.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/FocusContext.ts","/npm/@yext/search-ui-react@2.1.1/src/components/ScreenReader.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/utils/recursivelyMapChildren.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/DropdownItem.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/generateDropdownId.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useComposedCssClasses.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useLayoutEffect.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useId.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/DropdownInput.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Dropdown/DropdownMenu.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/SearchButton.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/utils/renderHighlightedValue.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/utils/renderAutocompleteResult.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useAnalytics.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useSearchBarAnalytics.ts","/npm/@yext/search-ui-react@2.1.1/src/models/verticalLink.ts","/npm/@yext/search-ui-react@2.1.1/src/utils/filterutils.tsx","/npm/@yext/search-ui-react@2.1.1/src/models/NumberRangeFilter.ts","/npm/@yext/search-ui-react@2.1.1/src/components/SpellCheck.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useCardAnalyticsCallback.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useCardAnalytics.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useCardFeedbackCallback.tsx","/npm/@yext/search-ui-react@2.1.1/src/utils/i18n.ts","/npm/@yext/search-ui-react@2.1.1/src/components/DirectAnswer.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/ThumbsFeedback.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/ThumbIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FieldValueDirectAnswer.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FeaturedSnippetDirectAnswer.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FilterSearch.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Geolocation.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/LoadingIndicator.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/YextIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useGeolocationHandler.ts","/npm/@yext/search-ui-react@2.1.1/src/icons/CurrentLocationIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/LocationBias.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/AppliedFilters.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/AppliedFiltersDisplay.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useClearFiltersCallback.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/HierarchicalFacetDisplay.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useHierarchicalFacetTree.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/FiltersContext.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useNlpFilterDisplayNames.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useRemovableFilters.ts","/npm/@yext/search-ui-react@2.1.1/src/utils/isDescendantHierarchicalFacet.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/useStateUpdatedOnSearch.ts","/npm/@yext/search-ui-react@2.1.1/src/hooks/useRemovableStaticFilters.ts","/npm/@yext/search-ui-react@2.1.1/src/components/UniversalResults.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/VerticalResultsDisplay.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/cards/standard/StandardCardDisplay.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/cards/standard/StandardCard.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/sections/StandardSection.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/sections/SectionHeader.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/CollectionIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/VerticalResults.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Pagination.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/ChevronIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/hooks/usePaginationAnalytics.ts","/npm/@yext/search-ui-react@2.1.1/src/components/AlternativeVerticals.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/StarIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/ResultsCount.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FilterGroup.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/CheckboxOption.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/FilterGroupContext.ts","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/CollapsibleLabel.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/CollapsibleSection.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/FacetsProvider.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/FilterGroupProvider.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/SearchInput.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/StaticFiltersProvider.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Filters/RangeInput.tsx","/npm/@yext/search-ui-react@2.1.1/src/icons/InvalidIcon.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FacetTiltle.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/StaticFilters.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/StandardFacets.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/FilterDivider.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/HierarchicalFacets.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/NumericalFacets.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/StandardFacetContent.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Facets.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/NumericalFacetContent.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/HierarchicalFacetContent.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/ApplyFiltersButton.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/MapboxMap.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/AnalyticsProvider.tsx","/npm/@yext/search-ui-react@2.1.1/node_modules/@yext/search-core/src/models/core/Environment.ts","/npm/@yext/search-ui-react@2.1.1/node_modules/@yext/search-core/src/models/core/CloudRegion.ts","/npm/@yext/search-ui-react@2.1.1/src/models/SearchAnalyticsEventServiceImpl.ts","/npm/@yext/search-ui-react@2.1.1/src/components/GenerativeDirectAnswer.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/Markdown.tsx","/npm/@yext/search-ui-react@2.1.1/src/components/SearchI18nextProvider.tsx","/npm/@yext/search-ui-react@2.1.1/src/models/StandardCardData.ts"],"names":[],"mappings":"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","file":"/npm/@yext/search-ui-react@2.1.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@yext/search-ui-react@2.1.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","{\n  \"aiGeneratedAnswer\": \"إجابة تم إنشاؤها بواسطة الذكاء الاصطناعي\",\n  \"allCategories\": \"جميع الفئات \",\n  \"appliedFiltersToCurrentSearch\": \"تم تطبيق الفلاتر على البحث الحالي\",\n  \"apply\": \"تطبيق\",\n  \"applyFilters\": \"تطبيق الفلاتر\",\n  \"autocompleteOptionsFound_few\": \"تم العثور على {{count}} خيارات للإكمال التلقائي {{label}}.\",\n  \"autocompleteOptionsFound_many\": \"تم العثور على {{count}} خيارًا للإكمال التلقائي {{label}}.\",\n  \"autocompleteOptionsFound_one\": \"تم العثور على خيار واحد للإكمال التلقائي {{label}}.\",\n  \"autocompleteOptionsFound_other\": \"تم العثور على {{count}} خيار للإكمال التلقائي {{label}}.\",\n  \"autocompleteOptionsFound_two\": \"تم العثور على خيارين للإكمال التلقائي {{label}}.\",\n  \"autocompleteOptionsFound_zero\": \"لم يتم العثور على أي خيارات للإكمال التلقائي.\",\n  \"autocompleteSuggestion\": \"اقتراح الإكمال التلقائي: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"تم العثور على {{count}} اقتراحات.\",\n  \"autocompleteSuggestionsFound_many\": \"تم العثور على {{count}} اقتراحًا.\",\n  \"autocompleteSuggestionsFound_one\": \"تم العثور على اقتراح واحد.\",\n  \"autocompleteSuggestionsFound_other\": \"تم العثور على {{count}} اقتراح.\",\n  \"autocompleteSuggestionsFound_two\": \"تم العثور على اقتراحين.\",\n  \"autocompleteSuggestionsFound_zero\": \"لم يتم العثور على أي اقتراحات.\",\n  \"basedOnYourDevice\": \" (استنادًا إلى جهازك)\",\n  \"basedOnYourInternetAddress\": \" (استنادًا إلى عنوان الإنترنت الخاص بك)\",\n  \"categoriesText_one\": \"الفئة التالية تحتوي على نتائج لـ - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"الفئات التالية تحتوي على نتائج لـ - <strong>{{query}}</strong>\",\n  \"clearAll\": \"مسح الكل\",\n  \"clearMinAndMax\": \"مسح الحد الأدنى والأقصى\",\n  \"clearTheRangeToSelectOptions\": \"امسح النطاق لاختيار الخيارات.\",\n  \"clearTheSearchBar\": \"امسح شريط البحث\",\n  \"conductASearch\": \"إجراء بحث\",\n  \"currentLocation\": \"الموقع الحالي\",\n  \"didYouMean\": \"هل كنت تقصد <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"عند توفر نتائج الإكمال التلقائي، استخدم الأسهم للأعلى والأسفل للتنقل واضغط Enter للاختيار.\",\n  \"feedback\": \"ملاحظات\",\n  \"invalidRange\": \"نطاق غير صالح\",\n  \"max\": \"الحد الأقصى\",\n  \"min\": \"الحد الأدنى\",\n  \"navigateToTheNextResultsPage\": \"انتقل إلى صفحة النتائج التالية\",\n  \"navigateToThePreviousResultsPage\": \"انتقل إلى صفحة النتائج السابقة\",\n  \"noAutocompleteOptionsFound\": \"لم يتم العثور على خيارات للإكمال التلقائي.\",\n  \"noAutocompleteSuggestionsFound\": \"لم يتم العثور على اقتراحات.\",\n  \"noResultsFoundIn\": \"لم يتم العثور على نتائج في {{currentVerticalLabel}}.\",\n  \"pagination\": \"ترقيم الصفحات\",\n  \"readMoreAbout\": \"اقرأ المزيد عن <a>{{name}}</a>\",\n  \"recentSearch\": \"بحث حديث: {{query}}\",\n  \"recentSearchesFound_few\": \"تم العثور على {{count}} عمليات بحث.\",\n  \"recentSearchesFound_many\": \"تم العثور على {{count}} عملية بحث.\",\n  \"recentSearchesFound_one\": \"تم العثور على عملية بحث واحدة.\",\n  \"recentSearchesFound_other\": \"تم العثور على {{count}} عملية بحث.\",\n  \"recentSearchesFound_two\": \"تم العثور على عمليتي بحث.\",\n  \"recentSearchesFound_zero\": \"لم يتم العثور على عمليات بحث حديثة.\",\n  \"removeFilter\": \"إزالة الفلتر «{{displayName}}»\",\n  \"resultPreview\": \"معاينة النتيجة: {{value}}\",\n  \"resultPreviewsFound_few\": \"تم العثور على {{count}} معاينات.\",\n  \"resultPreviewsFound_many\": \"تم العثور على {{count}} معاينة.\",\n  \"resultPreviewsFound_one\": \"تم العثور على معاينة واحدة.\",\n  \"resultPreviewsFound_other\": \"تم العثور على {{count}} معاينة.\",\n  \"resultPreviewsFound_two\": \"تم العثور على معاينتين.\",\n  \"resultPreviewsFound_zero\": \"لم يتم العثور على أي معاينات.\",\n  \"resultsCountText_few\": \"{{count}} نتائج\",\n  \"resultsCountText_many\": \"{{count}} نتيجة\",\n  \"resultsCountText_one\": \"نتيجة واحدة\",\n  \"resultsCountText_other\": \"{{count}} نتيجة\",\n  \"resultsCountText_two\": \"نتيجتان\",\n  \"resultsCountText_zero\": \"لا توجد نتائج\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} من أصل {{resultsCount}} نتيجة\",\n  \"searchHere\": \"ابحث هنا…\",\n  \"showLess\": \"عرض أقل\",\n  \"showMore\": \"عرض المزيد\",\n  \"showingAllInstead\": \"يتم عرض جميع نتائج {{currentVerticalLabel}} بدلاً من ذلك.\",\n  \"sources_few\": \"مصادر ({{count}})\",\n  \"sources_many\": \"مصدر ({{count}})\",\n  \"sources_one\": \"مصدر\",\n  \"sources_other\": \"مصدر ({{count}})\",\n  \"sources_two\": \"مصدران\",\n  \"sources_zero\": \"لا توجد مصادر\",\n  \"submitSearch\": \"تنفيذ البحث\",\n  \"suggestionResultsCount_few\": \"{{label}} - {{count}} نتائج\",\n  \"suggestionResultsCount_many\": \"{{label}} - {{count}} نتيجة\",\n  \"suggestionResultsCount_one\": \"{{label}} - نتيجة واحدة\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} نتيجة\",\n  \"suggestionResultsCount_two\": \"{{label}} - نتيجتان\",\n  \"suggestionResultsCount_zero\": \"{{label}} - لا توجد نتائج\",\n  \"thankYouForYourFeedback\": \"شكرًا لملاحظاتك!\",\n  \"thisAnsweredMyQuestion\": \"نعم، هذا أجاب على سؤالي\",\n  \"thisDidNotAnswerMyQuestion\": \"لا، هذا لم يجب على سؤالي\",\n  \"unselectAnOptionToEnterInARange\": \"قم بإلغاء تحديد خيار لإدخال نطاق.\",\n  \"updateYourLocation\": \"تحديث موقعك\",\n  \"useCurrentLocation\": \"استخدام الموقع الحالي\",\n  \"useMyLocation\": \"استخدم موقعي\",\n  \"viewAll\": \"عرض الكل\",\n  \"viewDetails\": \"عرض التفاصيل\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI generovaná odpověď\",\n  \"allCategories\": \"Všechny kategorie\",\n  \"appliedFiltersToCurrentSearch\": \"Použité filtry pro aktuální hledání\",\n  \"apply\": \"Použít\",\n  \"applyFilters\": \"Použít filtry\",\n  \"autocompleteOptionsFound_few\": \"Nalezeny {{count}}{{label}} možnosti automatického dokončování.\",\n  \"autocompleteOptionsFound_one\": \"Nalezena {{count}}{{label}} možnost automatického dokončování.\",\n  \"autocompleteOptionsFound_other\": \"Nalezeno {{count}}{{label}} možností automatického dokončování.\",\n  \"autocompleteSuggestion\": \"návrh automatického doplňování: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Nalezeny {{count}} návrhy automatického dokončování.\",\n  \"autocompleteSuggestionsFound_one\": \"Nalezen {{count}} návrh automatického dokončování.\",\n  \"autocompleteSuggestionsFound_other\": \"Nalezeno {{count}} návrhů automatického dokončování.\",\n  \"basedOnYourDevice\": \" (na základě vašeho zařízení)\",\n  \"basedOnYourInternetAddress\": \" (na základě vaší IP adresy)\",\n  \"categoriesText_few\": \"Následující kategorie přinesla výsledky pro – <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Následující kategorie přinesly výsledky pro – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Následujících kategorií přineslo výsledky pro – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Vyčistit vše\",\n  \"clearMinAndMax\": \"Vymazat min a max\",\n  \"clearTheRangeToSelectOptions\": \"Vymažte rozsah pro výběr možností.\",\n  \"clearTheSearchBar\": \"Vymažte vyhledávací lištu\",\n  \"conductASearch\": \"Provést vyhledávání\",\n  \"currentLocation\": \"Aktuální poloha\",\n  \"didYouMean\": \"Mysleli jste <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Pokud jsou dostupné výsledky automatického doplnění, použijte šipky nahoru/dolů pro výběr a Enter pro potvrzení.\",\n  \"feedback\": \"Zpětná vazba\",\n  \"invalidRange\": \"Neplatný rozsah\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Přejděte na další stránku výsledků\",\n  \"navigateToThePreviousResultsPage\": \"Přejděte na stránku předchozích výsledků\",\n  \"noAutocompleteOptionsFound\": \"Nenalezeny žádné možností automatického doplňování.\",\n  \"noAutocompleteSuggestionsFound\": \"Nenalezeny žádné návrhy automatického doplňování.\",\n  \"noResultsFoundIn\": \"V {{currentVerticalLabel}} nebyly nalezeny žádné výsledky.\",\n  \"pagination\": \"Stránkování\",\n  \"readMoreAbout\": \"Přečíst si více o <a>{{name}}</a>\",\n  \"recentSearch\": \"nedávné vyhledávání: {{query}}\",\n  \"recentSearchesFound_few\": \"Nalezena {{count}} nedávná hledání.\",\n  \"recentSearchesFound_one\": \"Nalezeno {{count}} nedávné hledání.\",\n  \"recentSearchesFound_other\": \"Nalezeno {{count}} nedávných hledání.\",\n  \"removeFilter\": \"Odebrat filtr „{{displayName}}“\",\n  \"resultPreview\": \"náhled výsledků: {{value}}\",\n  \"resultPreviewsFound_few\": \"Nalezeny {{count}} náhledy výsledků.\",\n  \"resultPreviewsFound_one\": \"Nalezen {{count}} náhled výsledku.\",\n  \"resultPreviewsFound_other\": \"Nalezeno {{count}} náhledů výsledků.\",\n  \"resultsCountText_few\": \"{{count}} výsledky\",\n  \"resultsCountText_one\": \"{{count}} výsledek\",\n  \"resultsCountText_other\": \"{{count}} výsledků\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} – {{paginateEnd}} z {{resultsCount}} výsledků\",\n  \"searchHere\": \"Hledejte zde…\",\n  \"showLess\": \"Zobrazit méně\",\n  \"showMore\": \"Zobrazit více\",\n  \"showingAllInstead\": \"Místo toho zobrazujeme všechny {{currentVerticalLabel}}.\",\n  \"sources_few\": \"Zdroje ({{count}})\",\n  \"sources_one\": \"Zdroj\",\n  \"sources_other\": \"Zdroje ({{count}})\",\n  \"submitSearch\": \"Odeslat vyhledávání\",\n  \"suggestionResultsCount_few\": \"{{label}} – {{count}} výsledky\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} výsledek\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} výsledků\",\n  \"thankYouForYourFeedback\": \"Děkujeme za vaši zpětnou vazbu!\",\n  \"thisAnsweredMyQuestion\": \"Toto odpovědělo na mou otázku\",\n  \"thisDidNotAnswerMyQuestion\": \"Toto neodpovědělo na mou otázku\",\n  \"unselectAnOptionToEnterInARange\": \"Zrušte výběr možnosti, abyste mohli zadat rozsah.\",\n  \"updateYourLocation\": \"Aktualizujte svou polohu\",\n  \"useCurrentLocation\": \"Použít aktuální polohu\",\n  \"useMyLocation\": \"Použít mou polohu\",\n  \"viewAll\": \"Zobrazit vše\",\n  \"viewDetails\": \"Zobrazit podrobnosti\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI-genereret svar\",\n  \"allCategories\": \"Alle kategorier\",\n  \"appliedFiltersToCurrentSearch\": \"Anvendte filtre til den aktuelle søgning\",\n  \"apply\": \"Anvende\",\n  \"applyFilters\": \"Anvend filtre\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} autofuldførelsesmulighed fundet.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} autofuldførelsesmuligheder fundet.\",\n  \"autocompleteSuggestion\": \"autofuldførelsesforslag: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} autofuldførelsesforslag fundet.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} autofuldførelsesforslag fundet.\",\n  \"basedOnYourDevice\": \" (baseret på din enhed)\",\n  \"basedOnYourInternetAddress\": \" (baseret på din internetadresse)\",\n  \"categoriesText_one\": \"Følgende kategori gav resultater for - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Følgende kategorier gav resultater for - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Ryd alle\",\n  \"clearMinAndMax\": \"Ryd maks og min\",\n  \"clearTheRangeToSelectOptions\": \"Ryd rækkevidden for at vælge indstillinger.\",\n  \"clearTheSearchBar\": \"Ryd søgefeltet\",\n  \"conductASearch\": \"Foretage en søgning\",\n  \"currentLocation\": \"Nuværende placering\",\n  \"didYouMean\": \"Mente du <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Når autoudfyldningsresultater er tilgængelige, brug pil op/ned for at gennemgå og Enter for at vælge.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Ugyldigt rækkevidde\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Naviger til den næste resultatside\",\n  \"navigateToThePreviousResultsPage\": \"Naviger til den tidligere resultatside\",\n  \"noAutocompleteOptionsFound\": \"0 autofuldførelsesmuligheder fundet.\",\n  \"noAutocompleteSuggestionsFound\": \"0 forslag til autofuldførelse fundet.\",\n  \"noResultsFoundIn\": \"Ingen resultater fundet i {{currentVerticalLabel}}.\",\n  \"pagination\": \"Pagination\",\n  \"readMoreAbout\": \"Læs mere om <a>{{name}}</a>\",\n  \"recentSearch\": \"nylig søgning: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} seneste søgning fundet.\",\n  \"recentSearchesFound_other\": \"{{count}} seneste søgninger fundet.\",\n  \"removeFilter\": \"Fjern filteret »{{displayName}}«\",\n  \"resultPreview\": \"resultatvisninger: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} resultatvisning fundet.\",\n  \"resultPreviewsFound_other\": \"{{count}} resultatvisninger fundet.\",\n  \"resultsCountText_one\": \"{{count}} resultat\",\n  \"resultsCountText_other\": \"{{count}} resultater\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} af {{resultsCount}} resultater\",\n  \"searchHere\": \"Søg her…\",\n  \"showLess\": \"Vis mindre\",\n  \"showMore\": \"Vis mere\",\n  \"showingAllInstead\": \"Viser i stedet alle {{currentVerticalLabel}}.\",\n  \"sources_one\": \"Kilde\",\n  \"sources_other\": \"Kilder ({{count}})\",\n  \"submitSearch\": \"Indsend søgning\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} resultat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} resultater\",\n  \"thankYouForYourFeedback\": \"Tak for din feedback!\",\n  \"thisAnsweredMyQuestion\": \"Dette besvarede mit spørgsmål\",\n  \"thisDidNotAnswerMyQuestion\": \"Dette besvarede ikke mit spørgsmål\",\n  \"unselectAnOptionToEnterInARange\": \"Fravælg en mulighed for at indtaste et interval.\",\n  \"updateYourLocation\": \"Opdater din placering\",\n  \"useCurrentLocation\": \"Brug nuværende placering\",\n  \"useMyLocation\": \"Brug min placering\",\n  \"viewAll\": \"Se alle\",\n  \"viewDetails\": \"Se detaljer\"\n}\n","{\n  \"aiGeneratedAnswer\": \"KI-generierte Antwort\",\n  \"allCategories\": \"Alle Kategorien\",\n  \"appliedFiltersToCurrentSearch\": \"Angewandte Filter auf die aktuelle Suche\",\n  \"apply\": \"Anwenden\",\n  \"applyFilters\": \"Filter anwenden\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} Autovervollständigungsoption gefunden.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} Autovervollständigungsoptionen gefunden.\",\n  \"autocompleteSuggestion\": \"autovervollständigung Vorschlag: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} Autovervollständigungsvorschlag gefunden.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} Autovervollständigungsvorschläge gefunden.\",\n  \"basedOnYourDevice\": \" (basierend auf Ihrem Gerät)\",\n  \"basedOnYourInternetAddress\": \" (basierend auf Ihrer IP-Adresse)\",\n  \"categoriesText_one\": \"Die folgende Kategorie lieferte Ergebnisse für - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Die folgenden Kategorien lieferten Ergebnisse für - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Alle klar\",\n  \"clearMinAndMax\": \"Min und Max löschen\",\n  \"clearTheRangeToSelectOptions\": \"Löschen Sie den Bereich, um Optionen auszuwählen.\",\n  \"clearTheSearchBar\": \"Löschen Sie die Suchleiste\",\n  \"conductASearch\": \"Eine Suche durchführen\",\n  \"currentLocation\": \"Aktueller Standort\",\n  \"didYouMean\": \"Meinten Sie <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Wenn Autovervollständigungsergebnisse verfügbar sind, mit Pfeiltasten navigieren und mit Enter auswählen.\",\n  \"feedback\": \"Rückmeldung\",\n  \"invalidRange\": \"Ungültiger Bereich\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Navigieren Sie zur nächsten Ergebnisseite\",\n  \"navigateToThePreviousResultsPage\": \"Navigieren Sie zur vorherigen Ergebnisseite\",\n  \"noAutocompleteOptionsFound\": \"0 autovervollständigung Optionen gefunden.\",\n  \"noAutocompleteSuggestionsFound\": \"0 autovervollständigung Vorschläge gefunden.\",\n  \"noResultsFoundIn\": \"Keine Ergebnisse in {{currentVerticalLabel}} gefunden.\",\n  \"pagination\": \"Seitennavigation\",\n  \"readMoreAbout\": \"Mehr erfahren über <a>{{name}}</a>\",\n  \"recentSearch\": \"neuere Suche: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} letzter Suchbegriff gefunden.\",\n  \"recentSearchesFound_other\": \"{{count}} letzte Suchbegriffe gefunden.\",\n  \"removeFilter\": \"Filter „{{displayName}}“ entfernen\",\n  \"resultPreview\": \"Ergebnisvorschau: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} Ergebnisvorschau gefunden.\",\n  \"resultPreviewsFound_other\": \"{{count}} Ergebnisvorschauen gefunden.\",\n  \"resultsCountText_one\": \"{{count}} Ergebnis\",\n  \"resultsCountText_other\": \"{{count}} Ergebnisse\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} von {{resultsCount}} Ergebnissen\",\n  \"searchHere\": \"Suche hier…\",\n  \"showLess\": \"Weniger anzeigen\",\n  \"showMore\": \"Mehr anzeigen\",\n  \"showingAllInstead\": \"Zeige stattdessen alle {{currentVerticalLabel}} an.\",\n  \"sources_one\": \"Quelle\",\n  \"sources_other\": \"Quellen ({{count}})\",\n  \"submitSearch\": \"Suche einreichen\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} Ergebnis\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} Ergebnisse\",\n  \"thankYouForYourFeedback\": \"Vielen Dank für Ihr Feedback!\",\n  \"thisAnsweredMyQuestion\": \"Das hat meine Frage beantwortet\",\n  \"thisDidNotAnswerMyQuestion\": \"Das hat meine Frage nicht beantwortet\",\n  \"unselectAnOptionToEnterInARange\": \"Wählen Sie eine Option ab, um einen Bereich einzugeben.\",\n  \"updateYourLocation\": \"Aktualisieren Sie Ihren Standort\",\n  \"useCurrentLocation\": \"Aktuellen Standort verwenden\",\n  \"useMyLocation\": \"Meinen Standort verwenden\",\n  \"viewAll\": \"Alle anzeigen\",\n  \"viewDetails\": \"Details anzeigen\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Απάντηση που δημιουργήθηκε από ΤΝ\",\n  \"allCategories\": \"Όλες οι κατηγορίες\",\n  \"appliedFiltersToCurrentSearch\": \"Εφαρμοσμένα φίλτρα στην τρέχουσα αναζήτηση\",\n  \"apply\": \"Εφαρμογή\",\n  \"applyFilters\": \"Εφαρμογή φίλτρων\",\n  \"autocompleteOptionsFound_one\": \"Βρέθηκε {{count}}{{label}} επιλογή αυτόματης συμπλήρωσης.\",\n  \"autocompleteOptionsFound_other\": \"Βρέθηκαν {{count}}{{label}} επιλογές αυτόματης συμπλήρωσης.\",\n  \"autocompleteSuggestion\": \"Πρόταση αυτόματης συμπλήρωσης: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"Βρέθηκε {{count}} πρόταση αυτόματης συμπλήρωσης.\",\n  \"autocompleteSuggestionsFound_other\": \"Βρέθηκαν {{count}} προτάσεις αυτόματης συμπλήρωσης.\",\n  \"basedOnYourDevice\": \" (με βάση τη συσκευή σας)\",\n  \"basedOnYourInternetAddress\": \" (με βάση τη διεύθυνση IP σας)\",\n  \"categoriesText_one\": \"Η παρακάτω κατηγορία έδωσε αποτελέσματα για - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Οι παρακάτω κατηγορίες έδωσαν αποτελέσματα για - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Καθάρισμα όλων\",\n  \"clearMinAndMax\": \"Καθάρισμα ελάχιστου και μέγιστου\",\n  \"clearTheRangeToSelectOptions\": \"Καθάρισε το εύρος για επιλογή επιλογών.\",\n  \"clearTheSearchBar\": \"Καθάρισε τη γραμμή αναζήτησης\",\n  \"conductASearch\": \"Διεξαγωγή αναζήτησης\",\n  \"currentLocation\": \"Τρέχουσα τοποθεσία\",\n  \"didYouMean\": \"Μήπως εννοούσατε <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Όταν είναι διαθέσιμα αποτελέσματα αυτόματης συμπλήρωσης, χρησιμοποιήστε τα βελάκια πάνω/κάτω για προεπισκόπηση και Enter για επιλογή.\",\n  \"feedback\": \"Σχόλια\",\n  \"invalidRange\": \"Άκυρο εύρος\",\n  \"max\": \"Μέγ.\",\n  \"min\": \"Ελάχ.\",\n  \"navigateToTheNextResultsPage\": \"Μετάβαση στην επόμενη σελίδα αποτελεσμάτων\",\n  \"navigateToThePreviousResultsPage\": \"Επιστροφή στην προηγούμενη σελίδα αποτελεσμάτων\",\n  \"noAutocompleteOptionsFound\": \"Δεν βρέθηκε καμία επιλογή αυτόματης συμπλήρωσης.\",\n  \"noAutocompleteSuggestionsFound\": \"Δεν βρέθηκε καμία πρόταση αυτόματης συμπλήρωσης.\",\n  \"noResultsFoundIn\": \"Δεν βρέθηκαν αποτελέσματα στο/στη {{currentVerticalLabel}}.\",\n  \"pagination\": \"Σελιδοποίηση\",\n  \"readMoreAbout\": \"Διαβάστε περισσότερα για <a>{{name}}</a>\",\n  \"recentSearch\": \"πρόσφατη αναζήτηση: {{query}}\",\n  \"recentSearchesFound_one\": \"Βρέθηκε {{count}} πρόσφατη αναζήτηση.\",\n  \"recentSearchesFound_other\": \"Βρέθηκαν {{count}} πρόσφατες αναζητήσεις.\",\n  \"removeFilter\": \"Αφαίρεση φίλτρου «{{displayName}}»\",\n  \"resultPreview\": \"προεπισκόπηση αποτελέσματος: {{value}}\",\n  \"resultPreviewsFound_one\": \"Βρέθηκε {{count}} προεπισκόπηση αποτελέσματος.\",\n  \"resultPreviewsFound_other\": \"Βρέθηκαν {{count}} προεπισκοπήσεις αποτελεσμάτων.\",\n  \"resultsCountText_one\": \"{{count}} Αποτέλεσμα\",\n  \"resultsCountText_other\": \"{{count}} Αποτελέσματα\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} – {{paginateEnd}} από {{resultsCount}} Αποτελέσματα\",\n  \"searchHere\": \"Αναζήτησε εδώ…\",\n  \"showLess\": \"Εμφάνιση λιγότερων\",\n  \"showMore\": \"Εμφάνιση περισσότερων\",\n  \"showingAllInstead\": \"Δείχνωνται όλα τα/{{currentVerticalLabel}} αντ’ αυτού.\",\n  \"sources_one\": \"Πηγή\",\n  \"sources_other\": \"Πηγές ({{count}})\",\n  \"submitSearch\": \"Αναζήτηση\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} αποτέλεσμα\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} αποτελέσματα\",\n  \"thankYouForYourFeedback\": \"Ευχαριστούμε για τα σχόλιά σας!\",\n  \"thisAnsweredMyQuestion\": \"Αυτό απάντησε στην ερώτησή μου\",\n  \"thisDidNotAnswerMyQuestion\": \"Αυτό δεν απάντησε στην ερώτησή μου\",\n  \"unselectAnOptionToEnterInARange\": \"Αποεπιλογή μιας επιλογής για εισαγωγή σε εύρος.\",\n  \"updateYourLocation\": \"Ενημέρωσε την τοποθεσία σου\",\n  \"useCurrentLocation\": \"Χρήση τρέχουσας τοποθεσίας\",\n  \"useMyLocation\": \"Χρήση της τοποθεσίας μου\",\n  \"viewAll\": \"Δες όλα\",\n  \"viewDetails\": \"Δες λεπτομέρειες\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI Generated Answer\",\n  \"allCategories\": \"All Categories\",\n  \"appliedFiltersToCurrentSearch\": \"Applied filters to current search\",\n  \"apply\": \"Apply\",\n  \"applyFilters\": \"Apply Filters\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} autocomplete option found.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} autocomplete options found.\",\n  \"autocompleteSuggestion\": \"autocomplete suggestion: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} autocomplete suggestion found.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} autocomplete suggestions found.\",\n  \"basedOnYourDevice\": \" (based on your device)\",\n  \"basedOnYourInternetAddress\": \" (based on your internet address)\",\n  \"categoriesText_one\": \"The following category yielded results for - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"The following categories yielded results for - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Clear All\",\n  \"clearMinAndMax\": \"Clear min and max\",\n  \"clearTheRangeToSelectOptions\": \"Clear the range to select options.\",\n  \"clearTheSearchBar\": \"Clear the search bar\",\n  \"conductASearch\": \"Conduct a search\",\n  \"currentLocation\": \"Current Location\",\n  \"didYouMean\": \"Did you mean <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"When autocomplete results are available, use up and down arrows to review and enter to select.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Invalid range\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Navigate to the next results page\",\n  \"navigateToThePreviousResultsPage\": \"Navigate to the previous results page\",\n  \"noAutocompleteOptionsFound\": \"0 autocomplete options found.\",\n  \"noAutocompleteSuggestionsFound\": \"0 autocomplete suggestions found.\",\n  \"noResultsFoundIn\": \"No results found in {{currentVerticalLabel}}.\",\n  \"pagination\": \"Pagination\",\n  \"readMoreAbout\": \"Read more about <a>{{name}}</a>\",\n  \"recentSearch\": \"recent search: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} recent search found.\",\n  \"recentSearchesFound_other\": \"{{count}} recent searches found.\",\n  \"removeFilter\": \"Remove \\\"{{displayName}}\\\" filter\",\n  \"resultPreview\": \"result preview: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} result preview found.\",\n  \"resultPreviewsFound_other\": \"{{count}} recent previews found.\",\n  \"resultsCountText_one\": \"{{count}} Result\",\n  \"resultsCountText_other\": \"{{count}} Results\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} of {{resultsCount}} Results\",\n  \"searchHere\": \"Search here…\",\n  \"showLess\": \"Show Less\",\n  \"showMore\": \"Show More\",\n  \"showingAllInstead\": \"Showing all {{currentVerticalLabel}} instead.\",\n  \"sources_one\": \"Source\",\n  \"sources_other\": \"Sources ({{count}})\",\n  \"submitSearch\": \"Submit Search\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} result\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} results\",\n  \"thankYouForYourFeedback\": \"Thank you for your feedback!\",\n  \"thisAnsweredMyQuestion\": \"This answered my question\",\n  \"thisDidNotAnswerMyQuestion\": \"This did not answer my question\",\n  \"unselectAnOptionToEnterInARange\": \"Unselect an option to enter in a range.\",\n  \"updateYourLocation\": \"Update your location\",\n  \"useCurrentLocation\": \"Use Current Location\",\n  \"useMyLocation\": \"Use my location\",\n  \"viewAll\": \"View all\",\n  \"viewDetails\": \"View Details\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI Generated Answer\",\n  \"allCategories\": \"All Categories\",\n  \"appliedFiltersToCurrentSearch\": \"Applied filters to current search\",\n  \"apply\": \"Apply\",\n  \"applyFilters\": \"Apply Filters\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} autocomplete option found.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} autocomplete options found.\",\n  \"autocompleteSuggestion\": \"autocomplete suggestion: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} autocomplete suggestion found.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} autocomplete suggestions found.\",\n  \"basedOnYourDevice\": \" (based on your device)\",\n  \"basedOnYourInternetAddress\": \" (based on your internet address)\",\n  \"categoriesText_one\": \"The following category yielded results for - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"The following categories yielded results for - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Clear All\",\n  \"clearMinAndMax\": \"Clear min and max\",\n  \"clearTheRangeToSelectOptions\": \"Clear the range to select options.\",\n  \"clearTheSearchBar\": \"Clear the search bar\",\n  \"conductASearch\": \"Conduct a search\",\n  \"currentLocation\": \"Current Location\",\n  \"didYouMean\": \"Did you mean <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"When autocomplete results are available, use up and down arrows to review and enter to select.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Invalid range\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Navigate to the next results page\",\n  \"navigateToThePreviousResultsPage\": \"Navigate to the previous results page\",\n  \"noAutocompleteOptionsFound\": \"0 autocomplete options found.\",\n  \"noAutocompleteSuggestionsFound\": \"0 autocomplete suggestions found.\",\n  \"noResultsFoundIn\": \"No results found in {{currentVerticalLabel}}.\",\n  \"pagination\": \"Pagination\",\n  \"readMoreAbout\": \"Read more about <a>{{name}}</a>\",\n  \"recentSearch\": \"recent search: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} recent search found.\",\n  \"recentSearchesFound_other\": \"{{count}} recent searches found.\",\n  \"removeFilter\": \"Remove \\\"{{displayName}}\\\" filter\",\n  \"resultPreview\": \"result preview: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} result preview found.\",\n  \"resultPreviewsFound_other\": \"{{count}} recent previews found.\",\n  \"resultsCountText_one\": \"{{count}} Result\",\n  \"resultsCountText_other\": \"{{count}} Results\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} of {{resultsCount}} Results\",\n  \"searchHere\": \"Search here...\",\n  \"showLess\": \"Show Less\",\n  \"showMore\": \"Show More\",\n  \"showingAllInstead\": \"Showing all {{currentVerticalLabel}} instead.\",\n  \"sources_one\": \"Source\",\n  \"sources_other\": \"Sources ({{count}})\",\n  \"submitSearch\": \"Submit Search\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} result\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} results\",\n  \"thankYouForYourFeedback\": \"Thank you for your feedback!\",\n  \"thisAnsweredMyQuestion\": \"This answered my question\",\n  \"thisDidNotAnswerMyQuestion\": \"This did not answer my question\",\n  \"unselectAnOptionToEnterInARange\": \"Unselect an option to enter in a range.\",\n  \"updateYourLocation\": \"Update your location\",\n  \"useCurrentLocation\": \"Use Current Location\",\n  \"useMyLocation\": \"Use my location\",\n  \"viewAll\": \"View all\",\n  \"viewDetails\": \"View Details\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Respuesta generada por IA\",\n  \"allCategories\": \"Todas las categorías\",\n  \"appliedFiltersToCurrentSearch\": \"Filtros aplicados a la búsqueda actual\",\n  \"apply\": \"Aplicar\",\n  \"applyFilters\": \"Aplicar filtros\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} opción de autocompletado encontrada.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} opciones de autocompletado encontradas.\",\n  \"autocompleteSuggestion\": \"sugerencia de autocompleto: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} sugerencia de autocompletado encontrada.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} sugerencias de autocompletado encontradas.\",\n  \"basedOnYourDevice\": \" (basado en tu dispositivo)\",\n  \"basedOnYourInternetAddress\": \" (basado en tu dirección de internet)\",\n  \"categoriesText_one\": \"La siguiente categoría produjo resultados para - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Las siguientes categorías produjeron resultados para - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Borrar todo\",\n  \"clearMinAndMax\": \"Borrar mínimo y máximo\",\n  \"clearTheRangeToSelectOptions\": \"Borrar el rango para seleccionar opciones.\",\n  \"clearTheSearchBar\": \"Borrar la barra de búsqueda\",\n  \"conductASearch\": \"Realizar una búsqueda\",\n  \"currentLocation\": \"Ubicación Actual\",\n  \"didYouMean\": \"Quisiste decir <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Cuando haya resultados de autocompletar, usa las flechas arriba y abajo para revisar y entra para seleccionar.\",\n  \"feedback\": \"Comentarios\",\n  \"invalidRange\": \"Rango no válido\",\n  \"max\": \"Máx.\",\n  \"min\": \"Mín.\",\n  \"navigateToTheNextResultsPage\": \"Navegue a la página de resultados del siguiente\",\n  \"navigateToThePreviousResultsPage\": \"Navegue a la página de resultados anterior\",\n  \"noAutocompleteOptionsFound\": \"0 Opciones de autocompletar encontradas.\",\n  \"noAutocompleteSuggestionsFound\": \"0 Sugerencias de autocompletar encontradas.\",\n  \"noResultsFoundIn\": \"No se encontraron resultados en {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginación\",\n  \"readMoreAbout\": \"Leer más sobre <a>{{name}}</a>\",\n  \"recentSearch\": \"búsqueda reciente: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} búsqueda reciente encontrada.\",\n  \"recentSearchesFound_other\": \"{{count}} búsquedas recientes encontradas.\",\n  \"removeFilter\": \"Quitar el filtro «{{displayName}}»\",\n  \"resultPreview\": \"vista previa de resultados: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} vista previa de resultado encontrada.\",\n  \"resultPreviewsFound_other\": \"{{count}} vistas previas de resultados encontradas.\",\n  \"resultsCountText_one\": \"{{count}} resultado\",\n  \"resultsCountText_other\": \"{{count}} resultados\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} de {{resultsCount}} resultados\",\n  \"searchHere\": \"Buscar aquí…\",\n  \"showLess\": \"Mostrar Menos\",\n  \"showMore\": \"Mostrar Más\",\n  \"showingAllInstead\": \"Mostrando todos los {{currentVerticalLabel}} en su lugar.\",\n  \"sources_one\": \"Fuente\",\n  \"sources_other\": \"Fuentes ({{count}})\",\n  \"submitSearch\": \"Enviar búsqueda\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} resultado\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} resultados\",\n  \"thankYouForYourFeedback\": \"¡Gracias por tus comentarios!\",\n  \"thisAnsweredMyQuestion\": \"Esto respondió mi pregunta\",\n  \"thisDidNotAnswerMyQuestion\": \"Esto no respondió mi pregunta\",\n  \"unselectAnOptionToEnterInARange\": \"Deselecciona una opción para ingresar un rango.\",\n  \"updateYourLocation\": \"Actualiza tu ubicación\",\n  \"useCurrentLocation\": \"Usar Ubicación Actual\",\n  \"useMyLocation\": \"Usar mi ubicación\",\n  \"viewAll\": \"Ver todo\",\n  \"viewDetails\": \"Ver detalles\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Tehisintellekti loodud vastus\",\n  \"allCategories\": \"Kõik kategooriad\",\n  \"appliedFiltersToCurrentSearch\": \"Rakendatud filtrid praegusele otsingule\",\n  \"apply\": \"Rakendama\",\n  \"applyFilters\": \"Rakenda filtrid\",\n  \"autocompleteOptionsFound_one\": \"Leiti {{count}}{{label}} automaatse täitmise valik.\",\n  \"autocompleteOptionsFound_other\": \"Leiti {{count}}{{label}} automaatse täitmise valikut.\",\n  \"autocompleteSuggestion\": \"automaatse täitmise soovitus: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"Leiti {{count}} automaatse täitmise soovitus.\",\n  \"autocompleteSuggestionsFound_other\": \"Leiti {{count}} automaatse täitmise soovitust.\",\n  \"basedOnYourDevice\": \" (põhineb sinu seadmel)\",\n  \"basedOnYourInternetAddress\": \" (põhineb sinu internetiaadressil)\",\n  \"categoriesText_one\": \"Järgmine kategooria andis tulemusi päringu jaoks – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Järgmised kategooriad andsid tulemusi päringu jaoks – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Puhastama kõik\",\n  \"clearMinAndMax\": \"Tühjenda miinimum ja maksimum\",\n  \"clearTheRangeToSelectOptions\": \"Valikute valimiseks tühjendage vahemik.\",\n  \"clearTheSearchBar\": \"Tühjendage otsinguriba\",\n  \"conductASearch\": \"Otsingut tegema\",\n  \"currentLocation\": \"Praegune asukoht\",\n  \"didYouMean\": \"Kas mõtlesite <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Kui automaattäite tulemused on saadaval, kasuta üles-/allanooleid eelvaateks ja Enterit valimiseks.\",\n  \"feedback\": \"Tagasiside\",\n  \"invalidRange\": \"Kehtetu vahemik\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Liikuge järgmisele tulemuste lehele\",\n  \"navigateToThePreviousResultsPage\": \"Liikuge eelmise tulemuste lehele\",\n  \"noAutocompleteOptionsFound\": \"0 leitud automaatse täitmise valikud.\",\n  \"noAutocompleteSuggestionsFound\": \"0 leitud automaatse täitmise ettepanekuid.\",\n  \"noResultsFoundIn\": \"Tulemusi ei leitud kategoorias {{currentVerticalLabel}}.\",\n  \"pagination\": \"Lehekülgede navigeerimine\",\n  \"readMoreAbout\": \"Loe rohkem: <a>{{name}}</a>\",\n  \"recentSearch\": \"hiljutine otsing: {{query}}\",\n  \"recentSearchesFound_one\": \"Leiti {{count}} hiljutine otsing.\",\n  \"recentSearchesFound_other\": \"Leiti {{count}} hiljutist otsingut.\",\n  \"removeFilter\": \"Eemalda filter „{{displayName}}”\",\n  \"resultPreview\": \"tulemuse eelvaade: {{value}}\",\n  \"resultPreviewsFound_one\": \"Leiti {{count}} tulemuse eelvaade.\",\n  \"resultPreviewsFound_other\": \"Leiti {{count}} tulemuse eelvaateid.\",\n  \"resultsCountText_one\": \"{{count}} tulemust\",\n  \"resultsCountText_other\": \"{{count}} tulemust\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} – {{paginateEnd}} / {{resultsCount}} tulemust\",\n  \"searchHere\": \"Otsige siit…\",\n  \"showLess\": \"Näita vähem\",\n  \"showMore\": \"Näita rohkem\",\n  \"showingAllInstead\": \"Näidatakse hoopis kõiki kategooriaid {{currentVerticalLabel}}.\",\n  \"sources_one\": \"Allikas\",\n  \"sources_other\": \"Allikad ({{krahv}})\",\n  \"submitSearch\": \"Otsingut esitama\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} tulemus\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} tulemust\",\n  \"thankYouForYourFeedback\": \"Täname teie tagasiside eest!\",\n  \"thisAnsweredMyQuestion\": \"See vastas minu küsimusele\",\n  \"thisDidNotAnswerMyQuestion\": \"See ei vastanud minu küsimusele\",\n  \"unselectAnOptionToEnterInARange\": \"Valiku tühistamiseks sisestage vahemik.\",\n  \"updateYourLocation\": \"Värskendage oma asukohta\",\n  \"useCurrentLocation\": \"Kasuta praegust asukohta\",\n  \"useMyLocation\": \"Kasuta minu asukohta\",\n  \"viewAll\": \"Vaata kõiki\",\n  \"viewDetails\": \"Vaadake üksikasju\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Tekoälyn luoma vastaus\",\n  \"allCategories\": \"Kaikki kategoriat\",\n  \"appliedFiltersToCurrentSearch\": \"Käytetyt suodattimet nykyiseen hakuun\",\n  \"apply\": \"Käytä\",\n  \"applyFilters\": \"Käytä suodattimia\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} automaattista ehdotusta löytyi.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} automaattista ehdotusta löytyi.\",\n  \"autocompleteSuggestion\": \"automaattinen ehdotus: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} automaattinen ehdotus löytyi.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} automaattista ehdotusta löytyi.\",\n  \"basedOnYourDevice\": \" (perustuu laitteeseesi)\",\n  \"basedOnYourInternetAddress\": \" (perustuu internet-osoitteeseesi)\",\n  \"categoriesText_one\": \"Seuraava kategoria antoi tuloksia hakusanalle - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Seuraavat kategoriat antoivat tuloksia hakusanalle - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Tyhjennä kaikki\",\n  \"clearMinAndMax\": \"Tyhjennä minimi ja maksimi\",\n  \"clearTheRangeToSelectOptions\": \"Tyhjennä valintaväli.\",\n  \"clearTheSearchBar\": \"Tyhjennä hakupalkki\",\n  \"conductASearch\": \"Tee haku\",\n  \"currentLocation\": \"Nykyinen sijainti\",\n  \"didYouMean\": \"Tarkoititko <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Kun automaattiset tulokset ovat saatavilla, käytä nuolinäppäimiä selaamiseen ja Enteriä valitsemiseen.\",\n  \"feedback\": \"Palaute\",\n  \"invalidRange\": \"Virheellinen väli\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Siirry seuraavalle tulossivulle\",\n  \"navigateToThePreviousResultsPage\": \"Siirry edelliselle tulossivulle\",\n  \"noAutocompleteOptionsFound\": \"0 automaattista ehdotusta löytyi.\",\n  \"noAutocompleteSuggestionsFound\": \"0 automaattista ehdotusta löytyi.\",\n  \"noResultsFoundIn\": \"Tuloksia ei löytynyt kohdasta {{currentVerticalLabel}}.\",\n  \"pagination\": \"Sivutus\",\n  \"readMoreAbout\": \"Lue lisää aiheesta <a>{{name}}</a>\",\n  \"recentSearch\": \"viimeisin haku: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} viimeisin haku löytyi.\",\n  \"recentSearchesFound_other\": \"{{count}} viimeisintä hakua löytyi.\",\n  \"removeFilter\": \"Poista suodatin \\\"{{displayName}}\\\"\",\n  \"resultPreview\": \"tuloksen esikatselu: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} tuloksen esikatselu löytyi.\",\n  \"resultPreviewsFound_other\": \"{{count}} tuloksen esikatselua löytyi.\",\n  \"resultsCountText_one\": \"{{count}} tulos\",\n  \"resultsCountText_other\": \"{{count}} tulosta\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} / {{resultsCount}} tulosta\",\n  \"searchHere\": \"Hae tästä…\",\n  \"showLess\": \"Näytä vähemmän\",\n  \"showMore\": \"Näytä lisää\",\n  \"showingAllInstead\": \"Näytetään kaikki kohteessa {{currentVerticalLabel}} sen sijaan.\",\n  \"sources_one\": \"Lähde\",\n  \"sources_other\": \"Lähteet ({{count}})\",\n  \"submitSearch\": \"Lähetä haku\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} tulos\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} tulosta\",\n  \"thankYouForYourFeedback\": \"Kiitos palautteestasi!\",\n  \"thisAnsweredMyQuestion\": \"Tämä vastasi kysymykseeni\",\n  \"thisDidNotAnswerMyQuestion\": \"Tämä ei vastannut kysymykseeni\",\n  \"unselectAnOptionToEnterInARange\": \"Poista valinta päästäksesi syöttämään välin.\",\n  \"updateYourLocation\": \"Päivitä sijaintisi\",\n  \"useCurrentLocation\": \"Käytä nykyistä sijaintia\",\n  \"useMyLocation\": \"Käytä sijaintiani\",\n  \"viewAll\": \"Näytä kaikki\",\n  \"viewDetails\": \"Näytä tiedot\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Réponse générée par l'IA\",\n  \"allCategories\": \"Toutes les catégories\",\n  \"appliedFiltersToCurrentSearch\": \"Filtres appliqués à la recherche actuelle\",\n  \"apply\": \"Appliquer\",\n  \"applyFilters\": \"Appliquer les filtres\",\n  \"autocompleteOptionsFound_one\": \"{{count}} option d'autocomplétion{{label}} trouvée.\",\n  \"autocompleteOptionsFound_other\": \"{{count}} options d'autocomplétion{{label}} trouvées.\",\n  \"autocompleteSuggestion\": \"suggestion de saisie semi-automatique: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} suggestion d'autocomplétion trouvée.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} suggestions d'autocomplétion trouvées.\",\n  \"basedOnYourDevice\": \" (basé sur votre appareil)\",\n  \"basedOnYourInternetAddress\": \" (basé sur votre adresse Internet)\",\n  \"categoriesText_one\": \"La catégorie suivante a donné des résultats pour - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Les catégories suivantes ont donné des résultats pour - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Effacer tout\",\n  \"clearMinAndMax\": \"Effacer min et max\",\n  \"clearTheRangeToSelectOptions\": \"Effacer la plage pour sélectionner les options.\",\n  \"clearTheSearchBar\": \"Effacer la barre de recherche\",\n  \"conductASearch\": \"Effectuer une recherche\",\n  \"currentLocation\": \"Localisation actuelle\",\n  \"didYouMean\": \"Vouliez-vous dire <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Lorsque des résultats de saisie semi-automatique sont disponibles, utilisez les flèches haut et bas pour naviguer et appuyez sur Entrée pour sélectionner.\",\n  \"feedback\": \"Retour\",\n  \"invalidRange\": \"Gamme non valide\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Accédez à la page de résultats suivante\",\n  \"navigateToThePreviousResultsPage\": \"Accédez à la page de résultats précédents\",\n  \"noAutocompleteOptionsFound\": \"0 option de saisie semi-automatique trouvée.\",\n  \"noAutocompleteSuggestionsFound\": \"0 suggestion de saisie semi-automatique trouvées.\",\n  \"noResultsFoundIn\": \"Aucun résultat trouvé dans {{currentVerticalLabel}}.\",\n  \"pagination\": \"Pagination\",\n  \"readMoreAbout\": \"En savoir plus sur <a>{{name}}</a>\",\n  \"recentSearch\": \"recherche récente : {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} recherche récente trouvée.\",\n  \"recentSearchesFound_other\": \"{{count}} recherches récentes trouvées.\",\n  \"removeFilter\": \"Supprimer le filtre «{{displayName}}»\",\n  \"resultPreview\": \"aperçu du résultat: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} aperçu de résultat trouvé.\",\n  \"resultPreviewsFound_other\": \"{{count}} aperçus de résultats trouvés.\",\n  \"resultsCountText_one\": \"{{count}} résultat\",\n  \"resultsCountText_other\": \"{{count}} résultats\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} sur {{resultsCount}} résultats\",\n  \"searchHere\": \"Recherche ici…\",\n  \"showLess\": \"Afficher moins\",\n  \"showMore\": \"Afficher plus\",\n  \"showingAllInstead\": \"Affichage de tous les {{currentVerticalLabel}} à la place.\",\n  \"sources_one\": \"Source\",\n  \"sources_other\": \"Sources ({{count}})\",\n  \"submitSearch\": \"Soumettre la recherche\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} résultat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} résultats\",\n  \"thankYouForYourFeedback\": \"Merci pour votre retour !\",\n  \"thisAnsweredMyQuestion\": \"Cela a répondu à ma question\",\n  \"thisDidNotAnswerMyQuestion\": \"Cela n'a pas répondu à ma question\",\n  \"unselectAnOptionToEnterInARange\": \"Désélectionnez une option pour saisir une plage.\",\n  \"updateYourLocation\": \"Mettez à jour votre emplacement\",\n  \"useCurrentLocation\": \"Utiliser la localisation actuelle\",\n  \"useMyLocation\": \"Utiliser ma localisation\",\n  \"viewAll\": \"Afficher tous\",\n  \"viewDetails\": \"Afficher les détails\"\n}\n","{\n  \"aiGeneratedAnswer\": \"एआई द्वारा जनरेट किया गया उत्तर\",\n  \"allCategories\": \"सभी श्रेणियाँ\",\n  \"appliedFiltersToCurrentSearch\": \"वर्तमान खोज पर लागू फ़िल्टर\",\n  \"apply\": \"लागू करें\",\n  \"applyFilters\": \"फ़िल्टर लागू करें\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} स्वतः पूर्ति विकल्प मिला।\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} स्वतः पूर्ति विकल्प मिले।\",\n  \"autocompleteSuggestion\": \"स्वतः पूर्ति सुझाव: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} स्वतः पूर्ति सुझाव मिला।\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} स्वतः पूर्ति सुझाव मिले।\",\n  \"basedOnYourDevice\": \" (आपके डिवाइस के आधार पर)\",\n  \"basedOnYourInternetAddress\": \" (आपके इंटरनेट पते के आधार पर)\",\n  \"categoriesText_one\": \"निम्नलिखित श्रेणी में परिणाम मिले - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"निम्नलिखित श्रेणियों में परिणाम मिले - <strong>{{query}}</strong>\",\n  \"clearAll\": \"सभी साफ़ करें\",\n  \"clearMinAndMax\": \"न्यूनतम और अधिकतम साफ़ करें\",\n  \"clearTheRangeToSelectOptions\": \"विकल्प चुनने के लिए सीमा साफ़ करें।\",\n  \"clearTheSearchBar\": \"खोज बार साफ़ करें\",\n  \"conductASearch\": \"खोज करें\",\n  \"currentLocation\": \"वर्तमान स्थान\",\n  \"didYouMean\": \"क्या आपका मतलब <button>{{correctedQuery}}</button> था\",\n  \"dropDownScreenReaderInstructions\": \"जब स्वतः पूर्ण परिणाम उपलब्ध हों, तो समीक्षा के लिए ऊपर और नीचे के तीर कुंजी का उपयोग करें और चयन के लिए एंटर दबाएं।\",\n  \"feedback\": \"प्रतिक्रिया\",\n  \"invalidRange\": \"अमान्य सीमा\",\n  \"max\": \"अधिकतम\",\n  \"min\": \"न्यूनतम\",\n  \"navigateToTheNextResultsPage\": \"अगले परिणाम पृष्ठ पर जाएं\",\n  \"navigateToThePreviousResultsPage\": \"पिछले परिणाम पृष्ठ पर जाएं\",\n  \"noAutocompleteOptionsFound\": \"कोई स्वतः पूर्ति विकल्प नहीं मिला।\",\n  \"noAutocompleteSuggestionsFound\": \"कोई स्वतः पूर्ति सुझाव नहीं मिला।\",\n  \"noResultsFoundIn\": \"{{currentVerticalLabel}} में कोई परिणाम नहीं मिला।\",\n  \"pagination\": \"पृष्ठांकन\",\n  \"readMoreAbout\": \"<a>{{name}}</a> के बारे में और पढ़ें\",\n  \"recentSearch\": \"हाल की खोज: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} हाल की खोज मिली।\",\n  \"recentSearchesFound_other\": \"{{count}} हाल की खोज मिलीं।\",\n  \"removeFilter\": \"“{{displayName}}“ फ़िल्टर हटाएं\",\n  \"resultPreview\": \"परिणाम पूर्वावलोकन: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} परिणाम पूर्वावलोकन मिला।\",\n  \"resultPreviewsFound_other\": \"{{count}} परिणाम पूर्वावलोकन मिले।\",\n  \"resultsCountText_one\": \"{{count}} परिणाम\",\n  \"resultsCountText_other\": \"{{count}} परिणाम\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} में से कुल {{resultsCount}} परिणाम\",\n  \"searchHere\": \"यहाँ खोजें…\",\n  \"showLess\": \"कम दिखाएँ\",\n  \"showMore\": \"और दिखाएँ\",\n  \"showingAllInstead\": \"इसके बजाय सभी {{currentVerticalLabel}} दिखा रहे हैं।\",\n  \"sources_one\": \"स्रोत\",\n  \"sources_other\": \"स्रोत ({{count}})\",\n  \"submitSearch\": \"खोज जमा करें\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} परिणाम\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} परिणाम\",\n  \"thankYouForYourFeedback\": \"आपकी प्रतिक्रिया के लिए धन्यवाद!\",\n  \"thisAnsweredMyQuestion\": \"इससे मेरे प्रश्न का उत्तर मिला\",\n  \"thisDidNotAnswerMyQuestion\": \"इससे मेरे प्रश्न का उत्तर नहीं मिला\",\n  \"unselectAnOptionToEnterInARange\": \"सीमा दर्ज करने के लिए विकल्प अनचेक करें।\",\n  \"updateYourLocation\": \"अपना स्थान अपडेट करें\",\n  \"useCurrentLocation\": \"वर्तमान स्थान का उपयोग करें\",\n  \"useMyLocation\": \"मेरा स्थान उपयोग करें\",\n  \"viewAll\": \"सभी देखें\",\n  \"viewDetails\": \"विवरण देखें\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI generirani odgovor\",\n  \"allCategories\": \"Sve kategorije\",\n  \"appliedFiltersToCurrentSearch\": \"Primijenjeni filtri na trenutnu pretragu\",\n  \"apply\": \"Primijeni\",\n  \"applyFilters\": \"Primijeni filtere\",\n  \"autocompleteOptionsFound_few\": \"Pronađene su {{count}}{{label}} opcije za automatsko dovršavanje.\",\n  \"autocompleteOptionsFound_one\": \"Pronađena je {{count}}{{label}} opcija za automatsko dovršavanje.\",\n  \"autocompleteOptionsFound_other\": \"Pronađeno je {{count}}{{label}} opcija za automatsko dovršavanje.\",\n  \"autocompleteSuggestion\": \"prijedlog za automatsko dovršavanje: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Pronađena su {{count}} prijedloga za automatsko dovršavanje.\",\n  \"autocompleteSuggestionsFound_one\": \"Pronađen je {{count}} prijedlog za automatsko dovršavanje.\",\n  \"autocompleteSuggestionsFound_other\": \"Pronađeno je {{count}} prijedloga za automatsko dovršavanje.\",\n  \"basedOnYourDevice\": \" (na temelju vašeg uređaja)\",\n  \"basedOnYourInternetAddress\": \" (na temelju vaše internet adrese)\",\n  \"categoriesText_few\": \"Sljedeće kategorije dale su rezultate za - <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Sljedeća kategorija dala je rezultate za - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Sljedeće kategorije dale su rezultate za - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Očisti sve\",\n  \"clearMinAndMax\": \"Očisti min i max\",\n  \"clearTheRangeToSelectOptions\": \"Očistite raspon za odabir opcija.\",\n  \"clearTheSearchBar\": \"Očistite traku za pretraživanje\",\n  \"conductASearch\": \"Provesti pretragu\",\n  \"currentLocation\": \"Trenutna lokacija\",\n  \"didYouMean\": \"Jeste li mislili na <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Kad su dostupni rezultati automatskog dovršavanja, koristite strelice gore i dolje za pregled i Enter za odabir.\",\n  \"feedback\": \"Povratne informacije\",\n  \"invalidRange\": \"Nevažeći raspon\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Dođite do sljedeće stranice rezultata\",\n  \"navigateToThePreviousResultsPage\": \"Dođite do stranice s prethodnim rezultatima\",\n  \"noAutocompleteOptionsFound\": \"Nije pronađena 0 opcija automatskog dovršavanja.\",\n  \"noAutocompleteSuggestionsFound\": \"Nije pronađen 0 prijedloga za automatsko dovršavanje.\",\n  \"noResultsFoundIn\": \"Nema rezultata u {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginacija\",\n  \"readMoreAbout\": \"Pročitaj više o <a>{{name}}</a>\",\n  \"recentSearch\": \"nedavno pretraživanje: {{query}}\",\n  \"recentSearchesFound_few\": \"Pronađene su {{count}} nedavne pretrage.\",\n  \"recentSearchesFound_one\": \"Pronađena je {{count}} nedavna pretraga.\",\n  \"recentSearchesFound_other\": \"Pronađeno je {{count}} nedavnih pretraga.\",\n  \"removeFilter\": \"Ukloni filtar „{{displayName}}“\",\n  \"resultPreview\": \"pregled rezultata: {{value}}\",\n  \"resultPreviewsFound_few\": \"Pronađena su {{count}} pregleda rezultata.\",\n  \"resultPreviewsFound_one\": \"Pronađen je {{count}} pregled rezultata.\",\n  \"resultPreviewsFound_other\": \"Pronađeno je {{count}} pregleda rezultata.\",\n  \"resultsCountText_few\": \"{{count}} rezultata\",\n  \"resultsCountText_one\": \"{{count}} rezultat\",\n  \"resultsCountText_other\": \"{{count}} rezultata\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} od {{resultsCount}} rezultata\",\n  \"searchHere\": \"Pretražite ovdje…\",\n  \"showLess\": \"Prikaži manje\",\n  \"showMore\": \"Prikaži više\",\n  \"showingAllInstead\": \"Prikazuju se svi {{currentVerticalLabel}} umjesto toga.\",\n  \"sources_few\": \"Izvora ({{count}})\",\n  \"sources_one\": \"Izvor\",\n  \"sources_other\": \"Izvori ({{count}})\",\n  \"submitSearch\": \"Pošaljite pretragu\",\n  \"suggestionResultsCount_few\": \"{{label}} - {{count}} rezultata\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} rezultat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} rezultata\",\n  \"thankYouForYourFeedback\": \"Hvala na vašoj povratnoj informaciji!\",\n  \"thisAnsweredMyQuestion\": \"Ovo je odgovorilo na moje pitanje\",\n  \"thisDidNotAnswerMyQuestion\": \"Ovo nije odgovorilo na moje pitanje\",\n  \"unselectAnOptionToEnterInARange\": \"Poništite odabir opcije da biste unijeli raspon.\",\n  \"updateYourLocation\": \"Ažurirajte svoje mjesto\",\n  \"useCurrentLocation\": \"Koristi trenutnu lokaciju\",\n  \"useMyLocation\": \"Koristi moju lokaciju\",\n  \"viewAll\": \"Pogledajte sve\",\n  \"viewDetails\": \"Pogledajte detalje\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI generált válasz\",\n  \"allCategories\": \"Összes kategória\",\n  \"appliedFiltersToCurrentSearch\": \"Alkalmazott szűrők az aktuális keresésre\",\n  \"apply\": \"Alkalmaz\",\n  \"applyFilters\": \"Szűrők alkalmazása\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} automatikus kiegészítési opció található.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} automatikus kiegészítési opció található.\",\n  \"autocompleteSuggestion\": \"automatikus kiegészítési javaslat: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} automatikus javaslat található.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} automatikus javaslat található.\",\n  \"basedOnYourDevice\": \" (a készülék alapján)\",\n  \"basedOnYourInternetAddress\": \" (az internetes cím alapján)\",\n  \"categoriesText_one\": \"Az alábbi kategória adott találatot erre: - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Az alábbi kategóriák adtak találatot erre: - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Tisztítsa meg az összeset\",\n  \"clearMinAndMax\": \"Töröld a minimumot és maximumot\",\n  \"clearTheRangeToSelectOptions\": \"Törölje az Opciók kiválasztásához a tartományt.\",\n  \"clearTheSearchBar\": \"Törölje a keresősávot\",\n  \"conductASearch\": \"Kutatást végez\",\n  \"currentLocation\": \"Jelenlegi helyzet\",\n  \"didYouMean\": \"Ezt szerette volna: <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Ha automatikus kiegészítési eredmények érhetők el, használd a fel/le nyilakat a böngészéshez, és az Entert a kiválasztáshoz.\",\n  \"feedback\": \"Visszacsatolás\",\n  \"invalidRange\": \"Érvénytelen hatótávolság\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Keresse meg a következő eredményoldalt\",\n  \"navigateToThePreviousResultsPage\": \"Keresse meg az előző eredményoldalt\",\n  \"noAutocompleteOptionsFound\": \"0 automatikus kiegészítési lehetőség található.\",\n  \"noAutocompleteSuggestionsFound\": \"0 automatikus kiegészítési javaslat található.\",\n  \"noResultsFoundIn\": \"Nem találhatók találatok a(z) {{currentVerticalLabel}}-ben.\",\n  \"pagination\": \"Lapozás\",\n  \"readMoreAbout\": \"Olvass többet erről: <a>{{name}}</a>\",\n  \"recentSearch\": \"legutóbbi keresés: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} legutóbbi keresés található.\",\n  \"recentSearchesFound_other\": \"{{count}} legutóbbi keresés található.\",\n  \"removeFilter\": \"„{{displayName}}“ szűrő eltávolítása\",\n  \"resultPreview\": \"találati előnézete: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} találati előnézet található.\",\n  \"resultPreviewsFound_other\": \"{{count}} találati előnézet található.\",\n  \"resultsCountText_one\": \"{{count}} találat\",\n  \"resultsCountText_other\": \"{{count}} találat\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} / összesen {{resultsCount}} találat\",\n  \"searchHere\": \"Keressen itt…\",\n  \"showLess\": \"Kevesebb mutatása\",\n  \"showMore\": \"Több mutatása\",\n  \"showingAllInstead\": \"Helyette az összes {{currentVerticalLabel}} megjelenítése.\",\n  \"sources_one\": \"Forrás ({{count}})\",\n  \"sources_other\": \"Források ({{count}})\",\n  \"submitSearch\": \"Küldje el a keresést\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} találat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} találat\",\n  \"thankYouForYourFeedback\": \"Köszönjük a visszajelzését!\",\n  \"thisAnsweredMyQuestion\": \"Ez megválaszolta a kérdésemet\",\n  \"thisDidNotAnswerMyQuestion\": \"Ez nem válaszolta meg a kérdésemet\",\n  \"unselectAnOptionToEnterInARange\": \"Töröljön egy jelölést a tartomány megadásához.\",\n  \"updateYourLocation\": \"Frissítse a tartózkodási helyét\",\n  \"useCurrentLocation\": \"Használd a jelenlegi helyzetet\",\n  \"useMyLocation\": \"Használd a helyzetemet\",\n  \"viewAll\": \"Tekintse meg az összeset\",\n  \"viewDetails\": \"A részletek megtekintése\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Risposta generata dall'IA\",\n  \"allCategories\": \"Tutte le categorie\",\n  \"appliedFiltersToCurrentSearch\": \"Filtri applicati alla ricerca corrente\",\n  \"apply\": \"Applica\",\n  \"applyFilters\": \"Applica filtri\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} opzione di completamento automatico trovata.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} opzioni di completamento automatico trovate.\",\n  \"autocompleteSuggestion\": \"suggerimento di completamento automatico: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} suggerimento di completamento automatico trovato.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} suggerimenti di completamento automatico trovati.\",\n  \"basedOnYourDevice\": \" (basato sul tuo dispositivo)\",\n  \"basedOnYourInternetAddress\": \" (basato sul tuo indirizzo internet)\",\n  \"categoriesText_one\": \"La seguente categoria ha prodotto risultati per – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Le seguenti categorie hanno prodotto risultati per – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Cancella tutto\",\n  \"clearMinAndMax\": \"Cancella min e max\",\n  \"clearTheRangeToSelectOptions\": \"Cancella l'intervallo per selezionare le opzioni.\",\n  \"clearTheSearchBar\": \"Cancella la barra di ricerca\",\n  \"conductASearch\": \"Condurre una ricerca\",\n  \"currentLocation\": \"Posizione attuale\",\n  \"didYouMean\": \"Volevi dire <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Quando sono disponibili i risultati di completamento automatico, usa le frecce su e giù per rivedere e invio per selezionare.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Gamma non valida\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Passare alla pagina dei risultati successivi\",\n  \"navigateToThePreviousResultsPage\": \"Passare alla pagina dei risultati precedenti\",\n  \"noAutocompleteOptionsFound\": \"0 opzioni di completamento automatico trovate.\",\n  \"noAutocompleteSuggestionsFound\": \"0 suggerimenti di completamento automatico trovati.\",\n  \"noResultsFoundIn\": \"Nessun risultato trovato in {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginazione\",\n  \"readMoreAbout\": \"Leggi di più su <a>{{name}}</a>\",\n  \"recentSearch\": \"ricerca recente: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} ricerca recente trovata.\",\n  \"recentSearchesFound_other\": \"{{count}} ricerche recenti trovate.\",\n  \"removeFilter\": \"Rimuovi il filtro «{{displayName}}»\",\n  \"resultPreview\": \"anteprima dei risultati: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} anteprima del risultato trovata.\",\n  \"resultPreviewsFound_other\": \"{{count}} anteprime dei risultati trovate.\",\n  \"resultsCountText_one\": \"{{count}} risultato\",\n  \"resultsCountText_other\": \"{{count}} risultati\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} di {{resultsCount}} risultati\",\n  \"searchHere\": \"Cerca qui…\",\n  \"showLess\": \"Mostra meno\",\n  \"showMore\": \"Mostra di più\",\n  \"showingAllInstead\": \"Mostrando invece tutti i {{currentVerticalLabel}}.\",\n  \"sources_one\": \"Fonte\",\n  \"sources_other\": \"Fonti ({{count}})\",\n  \"submitSearch\": \"Invia la ricerca\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} risultato\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} risultati\",\n  \"thankYouForYourFeedback\": \"Grazie per il tuo feedback!\",\n  \"thisAnsweredMyQuestion\": \"Questa risposta ha risolto il mio dubbio\",\n  \"thisDidNotAnswerMyQuestion\": \"Questa risposta non ha risolto il mio dubbio\",\n  \"unselectAnOptionToEnterInARange\": \"Deseleziona un’opzione per inserire un intervallo.\",\n  \"updateYourLocation\": \"Aggiorna la tua posizione\",\n  \"useCurrentLocation\": \"Usa la posizione attuale\",\n  \"useMyLocation\": \"Usa la mia posizione\",\n  \"viewAll\": \"Visualizza tutto\",\n  \"viewDetails\": \"Visualizza i dettagli\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI生成された回答\",\n  \"allCategories\": \"すべてのカテゴリー\",\n  \"appliedFiltersToCurrentSearch\": \"現在の検索に適用されたフィルター\",\n  \"apply\": \"適用\",\n  \"applyFilters\": \"フィルターを適用\",\n  \"autocompleteOptionsFound_other\": \"{{label}}のオートコンプリート候補が{{count}}件見つかりました。\",\n  \"autocompleteSuggestion\": \"オートコンプリートの提案：{{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} 件のオートコンプリート候補が見つかりました。\",\n  \"basedOnYourDevice\": \"（デバイスに基づく）\",\n  \"basedOnYourInternetAddress\": \"（インターネットアドレスに基づく）\",\n  \"categoriesText_other\": \"次のカテゴリでは、 -  <strong> {{query}} </strong>の結果が得られました\",\n  \"clearAll\": \"すべてをクリアします\",\n  \"clearMinAndMax\": \"最小値と最大値をクリア\",\n  \"clearTheRangeToSelectOptions\": \"範囲をクリアしてオプションを選択します。\",\n  \"clearTheSearchBar\": \"検索バーをクリアします\",\n  \"conductASearch\": \"検索を実施します\",\n  \"currentLocation\": \"現在地\",\n  \"didYouMean\": \"<button>{{correctedQuery}}</button> と言いたかったですか\",\n  \"dropDownScreenReaderInstructions\": \"オートコンプリート結果が利用可能な場合、↑↓キーで選択し、Enter キーで選択。\",\n  \"feedback\": \"フィードバック\",\n  \"invalidRange\": \"無効な範囲\",\n  \"max\": \"最大\",\n  \"min\": \"最小\",\n  \"navigateToTheNextResultsPage\": \"次の結果ページに移動します\",\n  \"navigateToThePreviousResultsPage\": \"前の結果ページに移動します\",\n  \"noAutocompleteOptionsFound\": \"オートコンプリート オプションが 0 件見つかりました。\",\n  \"noAutocompleteSuggestionsFound\": \"オートコンプリート候補が 0 件見つかりました。\",\n  \"noResultsFoundIn\": \"{{currentVerticalLabel}}で結果が見つかりませんでした。\",\n  \"pagination\": \"ページネーション\",\n  \"readMoreAbout\": \"<a>{{name}}</a> について詳しく読む\",\n  \"recentSearch\": \"最近の検索：{{query}}\",\n  \"recentSearchesFound_other\": \"{{count}} 件の最近の検索が見つかりました。\",\n  \"removeFilter\": \"「{{displayName}}」 フィルターを削除\",\n  \"resultPreview\": \"結果プレビュー：{{value}}\",\n  \"resultPreviewsFound_other\": \"{{count}} 件の結果プレビューが見つかりました。\",\n  \"resultsCountText_other\": \"{{count}}件\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}〜{{paginateEnd}}／全{{resultsCount}}件\",\n  \"searchHere\": \"ここで検索…\",\n  \"showLess\": \"折りたたむ\",\n  \"showMore\": \"もっと見る\",\n  \"showingAllInstead\": \"代わりにすべての{{currentVerticalLabel}}を表示しています。\",\n  \"sources_other\": \"出典（{{count}}）\",\n  \"submitSearch\": \"検索を送信します\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} 件の結果\",\n  \"thankYouForYourFeedback\": \"ご意見ありがとうございます！\",\n  \"thisAnsweredMyQuestion\": \"この回答で疑問が解決しました\",\n  \"thisDidNotAnswerMyQuestion\": \"この回答では疑問が解決しませんでした\",\n  \"unselectAnOptionToEnterInARange\": \"範囲を入力するには、選択を解除してください。\",\n  \"updateYourLocation\": \"あなたの場所を更新します\",\n  \"useCurrentLocation\": \"現在地を使用\",\n  \"useMyLocation\": \"現在地を使用\",\n  \"viewAll\": \"すべてを表示します\",\n  \"viewDetails\": \"詳細を表示します\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI 생성 답변\",\n  \"allCategories\": \"전체 카테고리\",\n  \"appliedFiltersToCurrentSearch\": \"현재 검색에 적용된 필터\",\n  \"apply\": \"적용\",\n  \"applyFilters\": \"필터 적용\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}}개의 자동완성 옵션을 찾았습니다.\",\n  \"autocompleteSuggestion\": \"자동완성 제안: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}}개의 자동완성 제안을 찾았습니다.\",\n  \"basedOnYourDevice\": \" (기기 기준)\",\n  \"basedOnYourInternetAddress\": \" (인터넷 주소 기준)\",\n  \"categoriesText_other\": \"다음 카테고리에서 결과가 나타났습니다: <strong>{{query}}</strong>\",\n  \"clearAll\": \"모두 지우기\",\n  \"clearMinAndMax\": \"최소값 및 최대값 지우기\",\n  \"clearTheRangeToSelectOptions\": \"범위를 지워 옵션을 선택하세요.\",\n  \"clearTheSearchBar\": \"검색창 지우기\",\n  \"conductASearch\": \"검색 실행\",\n  \"currentLocation\": \"현재 위치\",\n  \"didYouMean\": \"다음을 찾으셨나요 <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"자동완성 결과가 있을 때 위/아래 화살표로 탐색하고 Enter 키로 선택하세요.\",\n  \"feedback\": \"피드백\",\n  \"invalidRange\": \"잘못된 범위입니다\",\n  \"max\": \"최대\",\n  \"min\": \"최소\",\n  \"navigateToTheNextResultsPage\": \"다음 결과 페이지로 이동\",\n  \"navigateToThePreviousResultsPage\": \"이전 결과 페이지로 이동\",\n  \"noAutocompleteOptionsFound\": \"자동완성 옵션이 없습니다.\",\n  \"noAutocompleteSuggestionsFound\": \"자동완성 제안이 없습니다.\",\n  \"noResultsFoundIn\": \"{{currentVerticalLabel}}에서 결과를 찾을 수 없습니다.\",\n  \"pagination\": \"페이지네이션\",\n  \"readMoreAbout\": \"<a>{{name}}</a>에 대해 더 읽기\",\n  \"recentSearch\": \"최근 검색: {{query}}\",\n  \"recentSearchesFound_other\": \"{{count}}개의 최근 검색어가 있습니다.\",\n  \"removeFilter\": \"「{{displayName}}」필터 제거\",\n  \"resultPreview\": \"결과 미리보기: {{value}}\",\n  \"resultPreviewsFound_other\": \"{{count}}개의 미리보기를 찾았습니다.\",\n  \"resultsCountText_other\": \"{{count}}개 결과\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} / 총 {{resultsCount}}개 결과\",\n  \"searchHere\": \"여기에 검색…\",\n  \"showLess\": \"간략히 보기\",\n  \"showMore\": \"더 보기\",\n  \"showingAllInstead\": \"{{currentVerticalLabel}} 전체를 표시하고 있습니다.\",\n  \"sources_other\": \"출처 ({{count}})\",\n  \"submitSearch\": \"검색\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}}개 결과\",\n  \"thankYouForYourFeedback\": \"피드백 감사합니다!\",\n  \"thisAnsweredMyQuestion\": \"질문에 대한 답변이 되었습니다\",\n  \"thisDidNotAnswerMyQuestion\": \"질문에 대한 답변이 아닙니다\",\n  \"unselectAnOptionToEnterInARange\": \"범위를 입력하려면 선택을 취소하세요.\",\n  \"updateYourLocation\": \"위치 업데이트\",\n  \"useCurrentLocation\": \"현재 위치 사용\",\n  \"useMyLocation\": \"내 위치 사용\",\n  \"viewAll\": \"전체 보기\",\n  \"viewDetails\": \"자세히 보기\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Dirbtinio intelekto sugeneruotas atsakymas\",\n  \"allCategories\": \"Visos kategorijos\",\n  \"appliedFiltersToCurrentSearch\": \"Taikyti filtrai dabartiniam paieškai\",\n  \"apply\": \"Taikyti\",\n  \"applyFilters\": \"Taikyti filtrus\",\n  \"autocompleteOptionsFound_few\": \"Rastos {{count}}{{label}} automatinio užbaigimo parinktys.\",\n  \"autocompleteOptionsFound_one\": \"Rasta {{count}}{{label}} automatinio užbaigimo parinktis.\",\n  \"autocompleteOptionsFound_other\": \"Rasta {{count}}{{label}} automatinio užbaigimo parinkčių.\",\n  \"autocompleteSuggestion\": \"automatinis užbaigimas pasiūlymas: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Rasti {{count}} automatinio užbaigimo pasiūlymai.\",\n  \"autocompleteSuggestionsFound_one\": \"Rastas {{count}} automatinio užbaigimo pasiūlymas.\",\n  \"autocompleteSuggestionsFound_other\": \"Rasta {{count}} automatinio užbaigimo pasiūlymų.\",\n  \"basedOnYourDevice\": \" (remiantis jūsų įrenginiu)\",\n  \"basedOnYourInternetAddress\": \" (remiantis jūsų interneto adresu)\",\n  \"categoriesText_few\": \"Šios kategorijos pateikė rezultatus – <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Ši kategorija pateikė rezultatus – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Šių kategorijų pateikta rezultatų – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Išvalyti viską\",\n  \"clearMinAndMax\": \"Išvalyti min ir max\",\n  \"clearTheRangeToSelectOptions\": \"Išvalykite diapazoną, kurį galite pasirinkti parinktys.\",\n  \"clearTheSearchBar\": \"Išvalykite paieškos juostą\",\n  \"conductASearch\": \"Atlikite paiešką\",\n  \"currentLocation\": \"Dabartinė vieta\",\n  \"didYouMean\": \"Ar turėjote omenyje <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Kai yra automatinio užbaigimo rezultatai, naudokite rodykles aukštyn ir žemyn naršymui ir Enter pasirinkimui.\",\n  \"feedback\": \"Atsiliepimai\",\n  \"invalidRange\": \"Neteisingas diapazonas\",\n  \"max\": \"Maks.\",\n  \"min\": \"Min.\",\n  \"navigateToTheNextResultsPage\": \"Eikite į kitą rezultatų puslapį\",\n  \"navigateToThePreviousResultsPage\": \"Eikite į ankstesnį rezultatų puslapį\",\n  \"noAutocompleteOptionsFound\": \"0 automaatse täitmise valikut ei leitud.\",\n  \"noAutocompleteSuggestionsFound\": \"0 automaatse täitmise soovitust ei leitud.\",\n  \"noResultsFoundIn\": \"Rezultatų nerasta {{currentVerticalLabel}}.\",\n  \"pagination\": \"Puslapiavimas\",\n  \"readMoreAbout\": \"Skaityti daugiau apie <a>{{name}}</a>\",\n  \"recentSearch\": \"Naujausia paieška: {{query}}\",\n  \"recentSearchesFound_few\": \"Rastos {{count}} neseniai atliktos paieškos.\",\n  \"recentSearchesFound_one\": \"Rasta {{count}} neseniai atlikta paieška.\",\n  \"recentSearchesFound_other\": \"Rasta {{count}} neseniai atliktų paieškų.\",\n  \"removeFilter\": \"Pašalinti filtrą: „{{displayName}}“\",\n  \"resultPreview\": \"rezultato peržiūra: {{value}}\",\n  \"resultPreviewsFound_few\": \"Rastos {{count}} rezultatų peržiūros.\",\n  \"resultPreviewsFound_one\": \"Rasta {{count}} rezultatų peržiūra.\",\n  \"resultPreviewsFound_other\": \"Rasta {{count}} rezultatų peržiūrų.\",\n  \"resultsCountText_few\": \"{{count}} rezultatai\",\n  \"resultsCountText_one\": \"{{count}} rezultatas\",\n  \"resultsCountText_other\": \"{{count}} rezultatų\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} iš {{resultsCount}} rezultatų\",\n  \"searchHere\": \"Ieškokite čia…\",\n  \"showLess\": \"Rodyti mažiau\",\n  \"showMore\": \"Rodyti daugiau\",\n  \"showingAllInstead\": \"Vietoje to rodomi visi {{currentVerticalLabel}}.\",\n  \"sources_few\": \"Šaltiniai ({{count}})\",\n  \"sources_one\": \"Šaltinis\",\n  \"sources_other\": \"Šaltinių ({{count}})\",\n  \"submitSearch\": \"Pateikti paiešką\",\n  \"suggestionResultsCount_few\": \"{{label}} – {{count}} rezultatai\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} rezultatas\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} rezultatų\",\n  \"thankYouForYourFeedback\": \"Ačiū už jūsų atsiliepimus!\",\n  \"thisAnsweredMyQuestion\": \"Tai atsakė į mano klausimą\",\n  \"thisDidNotAnswerMyQuestion\": \"Tai neatsakė į mano klausimą\",\n  \"unselectAnOptionToEnterInARange\": \"Atžymėkite parinktį, kad galėtumėte įvesti intervalą.\",\n  \"updateYourLocation\": \"Atnaujinkite savo vietą\",\n  \"useCurrentLocation\": \"Naudoti dabartinę vietą\",\n  \"useMyLocation\": \"Naudoti mano vietą\",\n  \"viewAll\": \"Peržiūrėti visus\",\n  \"viewDetails\": \"Peržiūrėti išsamią informaciją\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI ģenerēta atbilde\",\n  \"allCategories\": \"Visas kategorijas\",\n  \"appliedFiltersToCurrentSearch\": \"Pielietotie filtri pašreizējai meklēšanai\",\n  \"apply\": \"Pielietot\",\n  \"applyFilters\": \"Pielietot filtrus\",\n  \"autocompleteOptionsFound_one\": \"Atrasta {{count}}{{label}} automātiskās aizpildes iespēja.\",\n  \"autocompleteOptionsFound_other\": \"Atrastas {{count}}{{label}} automātiskās aizpildes iespējas.\",\n  \"autocompleteOptionsFound_zero\": \"Nav atrasta neviena{{label}} automātiskās aizpildes iespējas.\",\n  \"autocompleteSuggestion\": \"automātiskās pabeigšanas ieteikums: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"Atrasts {{count}} automātās aizpildes ieteikums.\",\n  \"autocompleteSuggestionsFound_other\": \"Atrasti {{count}} automātiskās aizpildes ieteikumi.\",\n  \"autocompleteSuggestionsFound_zero\": \"Atrasti {{count}} automātiskās aizpildes ieteikumi.\",\n  \"basedOnYourDevice\": \" (balstoties uz jūsu ierīci)\",\n  \"basedOnYourInternetAddress\": \" (balstoties uz jūsu interneta adresi)\",\n  \"categoriesText_one\": \"Nākamā kategorija deva rezultātus priekš – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Nākamo kategoriju skaits deva rezultātus priekš – <strong>{{query}}</strong>\",\n  \"categoriesText_zero\": \"Nav neviena rezultāta kategorijai – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Notīrīt visu\",\n  \"clearMinAndMax\": \"Notīrīt min un max\",\n  \"clearTheRangeToSelectOptions\": \"Notīriet diapazonu, lai izvēlētos opcijas.\",\n  \"clearTheSearchBar\": \"Notīriet meklēšanas joslu\",\n  \"conductASearch\": \"Veikt meklēšanu\",\n  \"currentLocation\": \"Pašreizējā atrašanās vieta\",\n  \"didYouMean\": \"Vai jūs domājāt <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Kad ir pieejami automātiskās pabeigšanas rezultāti, izmantojiet bultiņas uz augšu un leju, lai pārlūkotu, un Enter, lai izvēlētos.\",\n  \"feedback\": \"Atsauksmes\",\n  \"invalidRange\": \"Nederīgs diapazons\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Dodieties uz nākamo rezultātu lapu\",\n  \"navigateToThePreviousResultsPage\": \"Dodieties uz iepriekšējo rezultātu lapu\",\n  \"noAutocompleteOptionsFound\": \"Atrasta 0 automātiskās pabeigšanas opcija.\",\n  \"noAutocompleteSuggestionsFound\": \"Atrasti 0 automātiskās pabeigšanas ieteikumi.\",\n  \"noResultsFoundIn\": \"Rezultāti nav atrasti {{currentVerticalLabel}}.\",\n  \"pagination\": \"Lappuļošana\",\n  \"readMoreAbout\": \"Lasīt vairāk par <a>{{name}}</a>\",\n  \"recentSearch\": \"nesenā meklēšana: {{query}}\",\n  \"recentSearchesFound_one\": \"Atrasta {{count}} nesenā meklēšana.\",\n  \"recentSearchesFound_other\": \"Atrastas {{count}} nesenās meklēšanas.\",\n  \"recentSearchesFound_zero\": \"Atrastas {{count}} nesenās meklēšanas.\",\n  \"removeFilter\": \"Noņemt filtru: „{{displayName}}“\",\n  \"resultPreview\": \"rezultāta priekšskatījums: {{value}}\",\n  \"resultPreviewsFound_one\": \"Atrasts {{count}} rezultātu priekšskatījums.\",\n  \"resultPreviewsFound_other\": \"Atrastas {{count}} rezultātu priekšskatījumi.\",\n  \"resultPreviewsFound_zero\": \"Atrastas {{count}} rezultātu priekšskatījumi.\",\n  \"resultsCountText_one\": \"{{count}} rezultāts\",\n  \"resultsCountText_other\": \"{{count}} rezultāti\",\n  \"resultsCountText_zero\": \"{{count}} rezultātu\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} no {{resultsCount}} rezultātiem\",\n  \"searchHere\": \"Meklēt šeit…\",\n  \"showLess\": \"Rādīt mazāk\",\n  \"showMore\": \"Rādīt vairāk\",\n  \"showingAllInstead\": \"Tiek rādīti visi {{currentVerticalLabel}}.\",\n  \"sources_one\": \"Avots\",\n  \"sources_other\": \"Avoti ({{count}})\",\n  \"sources_zero\": \"Avoti nav pieejami\",\n  \"submitSearch\": \"Iesniegt meklēšanu\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} rezultāts\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} rezultātu\",\n  \"suggestionResultsCount_zero\": \"{{label}} – nav rezultātu\",\n  \"thankYouForYourFeedback\": \"Paldies par jūsu atsauksmēm!\",\n  \"thisAnsweredMyQuestion\": \"Šis atbildēja uz manu jautājumu\",\n  \"thisDidNotAnswerMyQuestion\": \"Šis neatbildēja uz manu jautājumu\",\n  \"unselectAnOptionToEnterInARange\": \"Atceļiet izvēli, lai ievadītu diapazonu.\",\n  \"updateYourLocation\": \"Atjauniniet savu atrašanās vietu\",\n  \"useCurrentLocation\": \"Izmantot pašreizējo atrašanās vietu\",\n  \"useMyLocation\": \"Izmantot manu atrašanās vietu\",\n  \"viewAll\": \"Skatīt visu\",\n  \"viewDetails\": \"Skatīt informāciju\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI-generert svar\",\n  \"allCategories\": \"Alle kategorier\",\n  \"appliedFiltersToCurrentSearch\": \"Brukte filtre for gjeldende søk\",\n  \"apply\": \"Bruk\",\n  \"applyFilters\": \"Bruk filtre\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} autofullføringsvalg funnet.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} autofullføringsvalg funnet.\",\n  \"autocompleteSuggestion\": \"autofullføringsforslag: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} autofullføringsforslag funnet.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} autofullføringsforslag funnet.\",\n  \"basedOnYourDevice\": \" (basert på enheten din)\",\n  \"basedOnYourInternetAddress\": \" (basert på din internettadresse)\",\n  \"categoriesText_one\": \"Følgende kategori ga resultater for – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Følgende kategorier ga resultater for – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Fjern alt\",\n  \"clearMinAndMax\": \"Fjern min og maks\",\n  \"clearTheRangeToSelectOptions\": \"Fjern området for å velge alternativer.\",\n  \"clearTheSearchBar\": \"Tøm søkefeltet\",\n  \"conductASearch\": \"Utfør et søk\",\n  \"currentLocation\": \"Nåværende posisjon\",\n  \"didYouMean\": \"Mente du <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Når autofullføringsresultater er tilgjengelige, bruk opp- og nedpiler for å bla gjennom og enter for å velge.\",\n  \"feedback\": \"Tilbakemelding\",\n  \"invalidRange\": \"Ugyldig område\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Gå til neste resultatside\",\n  \"navigateToThePreviousResultsPage\": \"Gå til forrige resultatside\",\n  \"noAutocompleteOptionsFound\": \"0 autofullføringsvalg funnet.\",\n  \"noAutocompleteSuggestionsFound\": \"0 autofullføringsforslag funnet.\",\n  \"noResultsFoundIn\": \"Ingen resultater funnet i {{currentVerticalLabel}}.\",\n  \"pagination\": \"Sideinndeling\",\n  \"readMoreAbout\": \"Les mer om <a>{{name}}</a>\",\n  \"recentSearch\": \"siste søk: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} siste søk funnet.\",\n  \"recentSearchesFound_other\": \"{{count}} siste søk funnet.\",\n  \"removeFilter\": \"Fjern filteret “{{displayName}}”\",\n  \"resultPreview\": \"resultatforhåndsvisning: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} resultatforhåndsvisning funnet.\",\n  \"resultPreviewsFound_other\": \"{{count}} resultatforhåndsvisninger funnet.\",\n  \"resultsCountText_one\": \"{{count}} resultat\",\n  \"resultsCountText_other\": \"{{count}} resultater\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} av {{resultsCount}} resultater\",\n  \"searchHere\": \"Søk her…\",\n  \"showLess\": \"Vis mindre\",\n  \"showMore\": \"Vis mer\",\n  \"showingAllInstead\": \"Viser alle {{currentVerticalLabel}} i stedet.\",\n  \"sources_one\": \"Kilde\",\n  \"sources_other\": \"Kilder ({{count}})\",\n  \"submitSearch\": \"Send søk\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} resultat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} resultater\",\n  \"thankYouForYourFeedback\": \"Takk for tilbakemeldingen!\",\n  \"thisAnsweredMyQuestion\": \"Dette besvarte spørsmålet mitt\",\n  \"thisDidNotAnswerMyQuestion\": \"Dette besvarte ikke spørsmålet mitt\",\n  \"unselectAnOptionToEnterInARange\": \"Fjern valg for å angi et område.\",\n  \"updateYourLocation\": \"Oppdater plasseringen din\",\n  \"useCurrentLocation\": \"Bruk nåværende posisjon\",\n  \"useMyLocation\": \"Bruk min posisjon\",\n  \"viewAll\": \"Se alle\",\n  \"viewDetails\": \"Se detaljer\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI gegenereerd antwoord\",\n  \"allCategories\": \"Alle categorieën\",\n  \"appliedFiltersToCurrentSearch\": \"Toegepaste filters op de huidige zoekopdracht\",\n  \"apply\": \"Toepassen\",\n  \"applyFilters\": \"Filters toepassen\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} automatisch aanvulsuggestie gevonden.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} automatisch aanvulsuggesties gevonden.\",\n  \"autocompleteSuggestion\": \"automatisch aanvultip: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} automatisch aanvultip gevonden.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} automatisch aanvultips gevonden.\",\n  \"basedOnYourDevice\": \" (gebaseerd op je apparaat)\",\n  \"basedOnYourInternetAddress\": \" (gebaseerd op je internetadres)\",\n  \"categoriesText_one\": \"De volgende categorie leverde resultaten op voor - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"De volgende categorieën leverden resultaten op voor - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Alles wissen\",\n  \"clearMinAndMax\": \"Min en max wissen\",\n  \"clearTheRangeToSelectOptions\": \"Wis het bereik om opties te selecteren.\",\n  \"clearTheSearchBar\": \"Zoekbalk wissen\",\n  \"conductASearch\": \"Een zoekopdracht uitvoeren\",\n  \"currentLocation\": \"Huidige locatie\",\n  \"didYouMean\": \"Bedoelde je <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Wanneer automatische aanvulresultaten beschikbaar zijn, gebruik de pijltjestoetsen omhoog en omlaag om te navigeren en Enter om te selecteren.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Ongeldig bereik\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Navigeer naar de volgende resultatenpagina\",\n  \"navigateToThePreviousResultsPage\": \"Navigeer naar de vorige resultatenpagina\",\n  \"noAutocompleteOptionsFound\": \"0 automatisch aanvulopties gevonden.\",\n  \"noAutocompleteSuggestionsFound\": \"0 automatisch aanvultips gevonden.\",\n  \"noResultsFoundIn\": \"Geen resultaten gevonden in {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginering\",\n  \"readMoreAbout\": \"Lees meer over <a>{{name}}</a>\",\n  \"recentSearch\": \"recente zoekopdracht: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} recente zoekopdracht gevonden.\",\n  \"recentSearchesFound_other\": \"{{count}} recente zoekopdrachten gevonden.\",\n  \"removeFilter\": \"Filter „{{displayName}}“ verwijderen\",\n  \"resultPreview\": \"resultaatvoorbeeld: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} resultaatvoorbeeld gevonden.\",\n  \"resultPreviewsFound_other\": \"{{count}} resultaatvoorbeelden gevonden.\",\n  \"resultsCountText_one\": \"{{count}} resultaat\",\n  \"resultsCountText_other\": \"{{count}} resultaten\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} van {{resultsCount}} resultaten\",\n  \"searchHere\": \"Hier zoeken…\",\n  \"showLess\": \"Minder weergeven\",\n  \"showMore\": \"Meer weergeven\",\n  \"showingAllInstead\": \"Toont in plaats daarvan alle {{currentVerticalLabel}}.\",\n  \"sources_one\": \"Bron\",\n  \"sources_other\": \"Bronnen ({{count}})\",\n  \"submitSearch\": \"Zoekopdracht versturen\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} resultaat\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} resultaten\",\n  \"thankYouForYourFeedback\": \"Bedankt voor je feedback!\",\n  \"thisAnsweredMyQuestion\": \"Dit beantwoordde mijn vraag\",\n  \"thisDidNotAnswerMyQuestion\": \"Dit beantwoordde mijn vraag niet\",\n  \"unselectAnOptionToEnterInARange\": \"Deselecteer een optie om een bereik in te voeren.\",\n  \"updateYourLocation\": \"Werk je locatie bij\",\n  \"useCurrentLocation\": \"Gebruik huidige locatie\",\n  \"useMyLocation\": \"Gebruik mijn locatie\",\n  \"viewAll\": \"Bekijk alles\",\n  \"viewDetails\": \"Bekijk details\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI wygenerowało odpowiedź\",\n  \"allCategories\": \"Wszystkie kategorie\",\n  \"appliedFiltersToCurrentSearch\": \"Zastosowane filtry do bieżącego wyszukiwania\",\n  \"apply\": \"Zastosuj\",\n  \"applyFilters\": \"Zastosuj filtry\",\n  \"autocompleteOptionsFound_few\": \"Znaleziono {{count}}{{label}} opcje autouzupełniania.\",\n  \"autocompleteOptionsFound_one\": \"Znaleziono {{count}}{{label}} opcję autouzupełniania.\",\n  \"autocompleteOptionsFound_other\": \"Znaleziono {{count}}{{label}} opcji autouzupełniania.\",\n  \"autocompleteSuggestion\": \"sugestia autouzupełniania: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Znaleziono {{count}} sugestie autouzupełniania.\",\n  \"autocompleteSuggestionsFound_one\": \"Znaleziono {{count}} sugestię autouzupełniania.\",\n  \"autocompleteSuggestionsFound_other\": \"Znaleziono {{count}} sugestii autouzupełniania.\",\n  \"basedOnYourDevice\": \" (na podstawie Twojego urządzenia)\",\n  \"basedOnYourInternetAddress\": \" (na podstawie Twojego adresu internetowego)\",\n  \"categoriesText_few\": \"Następujące kategorie zwróciły wyniki dla – <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Następująca kategoria zwróciła wyniki dla – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Następujących kategorii zwróciło wyniki dla – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Wyczyść wszystko\",\n  \"clearMinAndMax\": \"Wyczyść min i max\",\n  \"clearTheRangeToSelectOptions\": \"Wyczyść zakres, aby wybrać opcje.\",\n  \"clearTheSearchBar\": \"Wyczyść pasek wyszukiwania\",\n  \"conductASearch\": \"Przeprowadzić wyszukiwanie\",\n  \"currentLocation\": \"Aktualna lokalizacja\",\n  \"didYouMean\": \"Czy chodziło Ci o <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Gdy dostępne są wyniki autouzupełniania, użyj strzałek w górę i w dół, aby przejrzeć, a enter, aby wybrać.\",\n  \"feedback\": \"Informacja zwrotna\",\n  \"invalidRange\": \"Nieprawidłowy zasięg\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Przejdź do strony następnych wyników\",\n  \"navigateToThePreviousResultsPage\": \"Przejdź do strony poprzednich wyników\",\n  \"noAutocompleteOptionsFound\": \"Znaleziono 0 opcji autouzupełniania.\",\n  \"noAutocompleteSuggestionsFound\": \"Znaleziono 0 sugestii autouzupełniania.\",\n  \"noResultsFoundIn\": \"Nie znaleziono wyników w {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginacja\",\n  \"readMoreAbout\": \"Czytaj więcej o <a>{{name}}</a>\",\n  \"recentSearch\": \"najnowsze wyszukiwanie: {{query}}\",\n  \"recentSearchesFound_few\": \"Znaleziono {{count}} ostatnie wyszukiwania.\",\n  \"recentSearchesFound_one\": \"Znaleziono {{count}} ostatnie wyszukiwanie.\",\n  \"recentSearchesFound_other\": \"Znaleziono {{count}} ostatnich wyszukiwań.\",\n  \"removeFilter\": \"Usuń filtr „{{displayName}}“\",\n  \"resultPreview\": \"podgląd wyników: {{value}}\",\n  \"resultPreviewsFound_few\": \"Znaleziono {{count}} podglądy wyników.\",\n  \"resultPreviewsFound_one\": \"Znaleziono {{count}} podgląd wyniku.\",\n  \"resultPreviewsFound_other\": \"Znaleziono {{count}} podglądów wyników.\",\n  \"resultsCountText_few\": \"{{count}} wyniki\",\n  \"resultsCountText_one\": \"{{count}} wynik\",\n  \"resultsCountText_other\": \"{{count}} wyników\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} z {{resultsCount}} wyników\",\n  \"searchHere\": \"Wyszukaj tutaj…\",\n  \"showLess\": \"Pokaż mniej\",\n  \"showMore\": \"Pokaż więcej\",\n  \"showingAllInstead\": \"Wyświetlam wszystkie {{currentVerticalLabel}} zamiast tego.\",\n  \"sources_few\": \"Źródła ({{count}})\",\n  \"sources_one\": \"Źródło\",\n  \"sources_other\": \"Źródeł ({{count}})\",\n  \"submitSearch\": \"Prześlij wyszukiwanie\",\n  \"suggestionResultsCount_few\": \"{{label}} – {{count}} wyniki\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} wynik\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} wyników\",\n  \"thankYouForYourFeedback\": \"Dziękujemy za Twoją opinię!\",\n  \"thisAnsweredMyQuestion\": \"To odpowiedziało na moje pytanie\",\n  \"thisDidNotAnswerMyQuestion\": \"To nie odpowiedziało na moje pytanie\",\n  \"unselectAnOptionToEnterInARange\": \"Odznacz opcję, aby wpisać zakres.\",\n  \"updateYourLocation\": \"Zaktualizuj swoją lokalizację\",\n  \"useCurrentLocation\": \"Użyj aktualnej lokalizacji\",\n  \"useMyLocation\": \"Użyj mojej lokalizacji\",\n  \"viewAll\": \"Zobacz wszystkie\",\n  \"viewDetails\": \"Zobacz szczegóły\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Resposta Gerada por IA\",\n  \"allCategories\": \"Todas as Categorias\",\n  \"appliedFiltersToCurrentSearch\": \"Filtros aplicados à pesquisa atual\",\n  \"apply\": \"Aplicar\",\n  \"applyFilters\": \"Aplicar Filtros\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} opção de preenchimento automático encontrada.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} opções de preenchimento automático encontradas.\",\n  \"autocompleteSuggestion\": \"sugestão de preenchimento automático: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} sugestão de preenchimento automático encontrada.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} sugestões de preenchimento automático encontradas.\",\n  \"basedOnYourDevice\": \" (baseado no seu dispositivo)\",\n  \"basedOnYourInternetAddress\": \" (baseado no seu endereço de internet)\",\n  \"categoriesText_one\": \"A seguinte categoria apresentou resultados para - <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"As seguintes categorias apresentaram resultados para - <strong>{{query}}</strong>\",\n  \"clearAll\": \"Limpar Tudo\",\n  \"clearMinAndMax\": \"Limpar mín e máx\",\n  \"clearTheRangeToSelectOptions\": \"Limpar o intervalo para selecionar opções.\",\n  \"clearTheSearchBar\": \"Limpar a barra de pesquisa\",\n  \"conductASearch\": \"Realizar uma busca\",\n  \"currentLocation\": \"Localização Atual\",\n  \"didYouMean\": \"Você quis dizer <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Quando os resultados de preenchimento automático estiverem disponíveis, use as setas para cima e para baixo para revisar e Enter para selecionar.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Intervalo inválido\",\n  \"max\": \"Máx\",\n  \"min\": \"Mín\",\n  \"navigateToTheNextResultsPage\": \"Navegar para a próxima página de resultados\",\n  \"navigateToThePreviousResultsPage\": \"Navegar para a página de resultados anterior\",\n  \"noAutocompleteOptionsFound\": \"0 opções de preenchimento automático encontradas.\",\n  \"noAutocompleteSuggestionsFound\": \"0 sugestões de preenchimento automático encontradas.\",\n  \"noResultsFoundIn\": \"Nenhum resultado encontrado em {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginação\",\n  \"readMoreAbout\": \"Leia mais sobre <a>{{name}}</a>\",\n  \"recentSearch\": \"busca recente: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} busca recente encontrada.\",\n  \"recentSearchesFound_other\": \"{{count}} buscas recentes encontradas.\",\n  \"removeFilter\": \"Remover filtro «{{displayName}}»\",\n  \"resultPreview\": \"pré-visualização do resultado: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} pré-visualização do resultado encontrada.\",\n  \"resultPreviewsFound_other\": \"{{count}} pré-visualizações recentes encontradas.\",\n  \"resultsCountText_one\": \"{{count}} Resultado\",\n  \"resultsCountText_other\": \"{{count}} Resultados\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} de {{resultsCount}} Resultados\",\n  \"searchHere\": \"Pesquise aqui…\",\n  \"showLess\": \"Mostrar Menos\",\n  \"showMore\": \"Mostrar Mais\",\n  \"showingAllInstead\": \"Mostrando todos os {{currentVerticalLabel}} em vez disso.\",\n  \"sources_one\": \"Fonte\",\n  \"sources_other\": \"Fontes ({{count}})\",\n  \"submitSearch\": \"Enviar pesquisa\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} resultado\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} resultados\",\n  \"thankYouForYourFeedback\": \"Obrigado pelo seu feedback!\",\n  \"thisAnsweredMyQuestion\": \"Isso respondeu à minha pergunta\",\n  \"thisDidNotAnswerMyQuestion\": \"Isso não respondeu à minha pergunta\",\n  \"unselectAnOptionToEnterInARange\": \"Desmarque uma opção para inserir um intervalo.\",\n  \"updateYourLocation\": \"Atualize sua localização\",\n  \"useCurrentLocation\": \"Usar Localização Atual\",\n  \"useMyLocation\": \"Usar minha localização\",\n  \"viewAll\": \"Ver tudo\",\n  \"viewDetails\": \"Ver Detalhes\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Răspuns generat de AI\",\n  \"allCategories\": \"Toate categoriile\",\n  \"appliedFiltersToCurrentSearch\": \"Filtre aplicate la căutarea curentă\",\n  \"apply\": \"Aplică\",\n  \"applyFilters\": \"Aplică filtre\",\n  \"autocompleteOptionsFound_few\": \"{{count}}{{label}} opțiuni de completare automată găsite.\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} opțiune de completare automată găsită.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} opțiuni de completare automată găsite.\",\n  \"autocompleteSuggestion\": \"sugestie completă automată: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"{{count}} sugestii de completare automată găsite.\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} sugestie de completare automată găsită.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} sugestii de completare automată găsite.\",\n  \"basedOnYourDevice\": \" (bazat pe dispozitivul tău)\",\n  \"basedOnYourInternetAddress\": \" (bazat pe adresa ta de internet)\",\n  \"categoriesText_few\": \"Următoarele categorii au generat rezultate pentru – <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Următoarea categorie a generat rezultate pentru – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Următoarele categorii au generat rezultate pentru – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Ștergeți toate\",\n  \"clearMinAndMax\": \"Șterge min și max\",\n  \"clearTheRangeToSelectOptions\": \"Ștergeți intervalul pentru a selecta opțiuni.\",\n  \"clearTheSearchBar\": \"Ștergeți bara de căutare\",\n  \"conductASearch\": \"Efectuați o căutare\",\n  \"currentLocation\": \"Locația curentă\",\n  \"didYouMean\": \"Ai vrut să spui <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Când sunt disponibile rezultate de completare automată, folosește săgețile sus și jos pentru a naviga și Enter pentru a selecta.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Interval nevalid\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Navigați la pagina de rezultate următoare\",\n  \"navigateToThePreviousResultsPage\": \"Navigați la pagina de rezultate anterioare\",\n  \"noAutocompleteOptionsFound\": \"Nu a fost găsită nicio opțiune de completare automată.\",\n  \"noAutocompleteSuggestionsFound\": \"Nu a fost găsită nicio sugestie de completare automată.\",\n  \"noResultsFoundIn\": \"Niciun rezultat găsit în {{currentVerticalLabel}}.\",\n  \"pagination\": \"Paginare\",\n  \"readMoreAbout\": \"Citește mai mult despre <a>{{name}}</a>\",\n  \"recentSearch\": \"căutare recentă: {{query}}\",\n  \"recentSearchesFound_few\": \"{{count}} căutări recente găsite.\",\n  \"recentSearchesFound_one\": \"{{count}} căutare recentă găsită.\",\n  \"recentSearchesFound_other\": \"{{count}} căutări recente găsite.\",\n  \"removeFilter\": \"Elimină filtrul „{{displayName}}“\",\n  \"resultPreview\": \"rezultat previzualizare: {{value}}\",\n  \"resultPreviewsFound_few\": \"{{count}} previzualizări ale rezultatelor găsite.\",\n  \"resultPreviewsFound_one\": \"{{count}} previzualizare a rezultatului găsită.\",\n  \"resultPreviewsFound_other\": \"{{count}} previzualizări ale rezultatelor găsite.\",\n  \"resultsCountText_few\": \"{{count}} rezultate\",\n  \"resultsCountText_one\": \"{{count}} rezultat\",\n  \"resultsCountText_other\": \"{{count}} de rezultate\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} din {{resultsCount}} rezultate\",\n  \"searchHere\": \"Căutați aici…\",\n  \"showLess\": \"Arată mai puțin\",\n  \"showMore\": \"Arată mai mult\",\n  \"showingAllInstead\": \"Se afișează toate {{currentVerticalLabel}} în schimb.\",\n  \"sources_few\": \"Surse ({{count}})\",\n  \"sources_one\": \"Sursă\",\n  \"sources_other\": \"Surse ({{count}})\",\n  \"submitSearch\": \"Trimiteți căutarea\",\n  \"suggestionResultsCount_few\": \"{{label}} – {{count}} rezultate\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} rezultat\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} rezultate\",\n  \"thankYouForYourFeedback\": \"Mulțumim pentru feedback!\",\n  \"thisAnsweredMyQuestion\": \"Aceasta a răspuns la întrebarea mea\",\n  \"thisDidNotAnswerMyQuestion\": \"Aceasta nu a răspuns la întrebarea mea\",\n  \"unselectAnOptionToEnterInARange\": \"Deselectează o opțiune pentru a introduce un interval.\",\n  \"updateYourLocation\": \"Actualizați -vă locația\",\n  \"useCurrentLocation\": \"Folosește locația curentă\",\n  \"useMyLocation\": \"Folosește locația mea\",\n  \"viewAll\": \"Vizualizați toate\",\n  \"viewDetails\": \"Vizualizați detalii\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Ответ, сгенерированный ИИ\",\n  \"allCategories\": \"Все категории\",\n  \"appliedFiltersToCurrentSearch\": \"Применённые фильтры к текущему поиску\",\n  \"apply\": \"Применить\",\n  \"applyFilters\": \"Применить фильтры\",\n  \"autocompleteOptionsFound_few\": \"Найдены {{count}} автозаполняющие опции {{label}}.\",\n  \"autocompleteOptionsFound_many\": \"Найдено {{count}} автозаполняющих опций {{label}}.\",\n  \"autocompleteOptionsFound_one\": \"Найдена {{count}} автозаполняющая опция {{label}}.\",\n  \"autocompleteOptionsFound_other\": \"Найдено {{count}} автозаполняющих опций {{label}}.\",\n  \"autocompleteSuggestion\": \"Подсказка автозаполнения: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Найдены {{count}} подсказки автозаполнения.\",\n  \"autocompleteSuggestionsFound_many\": \"Найдено {{count}} подсказок автозаполнения.\",\n  \"autocompleteSuggestionsFound_one\": \"Найдена {{count}} подсказка автозаполнения.\",\n  \"autocompleteSuggestionsFound_other\": \"Найдено {{count}} подсказок автозаполнения.\",\n  \"basedOnYourDevice\": \" (на основе вашего устройства)\",\n  \"basedOnYourInternetAddress\": \" (на основе вашего интернет-адреса)\",\n  \"categoriesText_few\": \"В категориях — <strong>{{query}}</strong> найдены результаты\",\n  \"categoriesText_many\": \"В категориях — <strong>{{query}}</strong> найдено результатов\",\n  \"categoriesText_one\": \"В категории — <strong>{{query}}</strong> найден результат\",\n  \"categoriesText_other\": \"В категориях — <strong>{{query}}</strong> найдено результатов\",\n  \"clearAll\": \"Очистить всё\",\n  \"clearMinAndMax\": \"Очистить минимальное и максимальное значения\",\n  \"clearTheRangeToSelectOptions\": \"Очистите диапазон для выбора опций.\",\n  \"clearTheSearchBar\": \"Очистить строку поиска\",\n  \"conductASearch\": \"Выполнить поиск\",\n  \"currentLocation\": \"Текущее местоположение\",\n  \"didYouMean\": \"Вы имели в виду <button>{{correctedQuery}}</button>?\",\n  \"dropDownScreenReaderInstructions\": \"Когда доступны результаты автозаполнения, используйте стрелки вверх и вниз для просмотра и Enter для выбора.\",\n  \"feedback\": \"Обратная связь\",\n  \"invalidRange\": \"Недопустимый диапазон\",\n  \"max\": \"Макс\",\n  \"min\": \"Мин\",\n  \"navigateToTheNextResultsPage\": \"Перейти к следующей странице результатов\",\n  \"navigateToThePreviousResultsPage\": \"Перейти к предыдущей странице результатов\",\n  \"noAutocompleteOptionsFound\": \"Автозаполняющих опций не найдено.\",\n  \"noAutocompleteSuggestionsFound\": \"Подсказок автозаполнения не найдено.\",\n  \"noResultsFoundIn\": \"Результатов не найдено в {{currentVerticalLabel}}.\",\n  \"pagination\": \"Пагинация\",\n  \"readMoreAbout\": \"Подробнее о <a>{{name}}</a>\",\n  \"recentSearch\": \"недавний поиск: {{query}}\",\n  \"recentSearchesFound_few\": \"Найдены {{count}} недавних поиска.\",\n  \"recentSearchesFound_many\": \"Найдено {{count}} недавних поисков.\",\n  \"recentSearchesFound_one\": \"Найдён {{count}} недавний поиск.\",\n  \"recentSearchesFound_other\": \"Найдено {{count}} недавних поисков.\",\n  \"removeFilter\": \"Удалить фильтр «{{displayName}}»\",\n  \"resultPreview\": \"Превью результата: {{value}}\",\n  \"resultPreviewsFound_few\": \"Найдены {{count}} предварительных просмотра.\",\n  \"resultPreviewsFound_many\": \"Найдено {{count}} предварительных просмотров.\",\n  \"resultPreviewsFound_one\": \"Найдён {{count}} предварительный просмотр.\",\n  \"resultPreviewsFound_other\": \"Найдено {{count}} предварительных просмотров.\",\n  \"resultsCountText_few\": \"{{count}} результата\",\n  \"resultsCountText_many\": \"{{count}} результатов\",\n  \"resultsCountText_one\": \"{{count}} результат\",\n  \"resultsCountText_other\": \"{{count}} результата\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} из {{resultsCount}} результатов\",\n  \"searchHere\": \"Искать здесь…\",\n  \"showLess\": \"Показать меньше\",\n  \"showMore\": \"Показать больше\",\n  \"showingAllInstead\": \"Показаны все {{currentVerticalLabel}} вместо этого.\",\n  \"sources_few\": \"Источника ({{count}})\",\n  \"sources_many\": \"Источников ({{count}})\",\n  \"sources_one\": \"Источник\",\n  \"sources_other\": \"Источника ({{count}})\",\n  \"submitSearch\": \"Отправить поиск\",\n  \"suggestionResultsCount_few\": \"{{label}} - {{count}} результата\",\n  \"suggestionResultsCount_many\": \"{{label}} - {{count}} результатов\",\n  \"suggestionResultsCount_one\": \"{{label}} - {{count}} результат\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} результата\",\n  \"thankYouForYourFeedback\": \"Спасибо за ваш отзыв!\",\n  \"thisAnsweredMyQuestion\": \"Это ответило на мой вопрос\",\n  \"thisDidNotAnswerMyQuestion\": \"Это не ответило на мой вопрос\",\n  \"unselectAnOptionToEnterInARange\": \"Снимите выбор опции, чтобы ввести диапазон.\",\n  \"updateYourLocation\": \"Обновить ваше местоположение\",\n  \"useCurrentLocation\": \"Использовать текущее местоположение\",\n  \"useMyLocation\": \"Использовать моё местоположение\",\n  \"viewAll\": \"Показать все\",\n  \"viewDetails\": \"Просмотреть детали\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Odpoveď generovaná AI\",\n  \"allCategories\": \"Všetky kategórie\",\n  \"appliedFiltersToCurrentSearch\": \"Použité filtre na aktuálne vyhľadávanie\",\n  \"apply\": \"Použiť\",\n  \"applyFilters\": \"Použiť filtre\",\n  \"autocompleteOptionsFound_few\": \"Nájdené {{count}}{{label}} možnosti automatického dopĺňania.\",\n  \"autocompleteOptionsFound_one\": \"Nájdená {{count}}{{label}} možnosť automatického dopĺňania.\",\n  \"autocompleteOptionsFound_other\": \"Nájdených {{count}}{{label}} možností automatického dopĺňania.\",\n  \"autocompleteSuggestion\": \"návrh automatického dopĺňania: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_few\": \"Nájdené {{count}} návrhy automatického dopĺňania.\",\n  \"autocompleteSuggestionsFound_one\": \"Nájdený {{count}} návrh automatického dopĺňania.\",\n  \"autocompleteSuggestionsFound_other\": \"Nájdených {{count}} návrhov automatického dopĺňania.\",\n  \"basedOnYourDevice\": \" (na základe vášho zariadenia)\",\n  \"basedOnYourInternetAddress\": \" (na základe vašej internetovej adresy)\",\n  \"categoriesText_few\": \"Nasledujúce kategórie priniesli výsledky pre – <strong>{{query}}</strong>\",\n  \"categoriesText_one\": \"Nasledujúca kategória priniesla výsledky pre – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Nasledujúcych kategórií prinieslo výsledky pre – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Vymazať všetko\",\n  \"clearMinAndMax\": \"Vymazať min a max\",\n  \"clearTheRangeToSelectOptions\": \"Vymazať rozsah na výber možností.\",\n  \"clearTheSearchBar\": \"Vymazať vyhľadávací panel\",\n  \"conductASearch\": \"Vykonať vyhľadávanie\",\n  \"currentLocation\": \"Aktuálna poloha\",\n  \"didYouMean\": \"Mali ste na mysli <button>{{correctedQuery}}</button>?\",\n  \"dropDownScreenReaderInstructions\": \"Keď sú k dispozícii výsledky automatického dokončenia, použite šípky nahor a nadol na preskúmanie a enter na výber.\",\n  \"feedback\": \"Spätná väzba\",\n  \"invalidRange\": \"Neplatný rozsah\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Prejsť na ďalšiu stránku výsledkov\",\n  \"navigateToThePreviousResultsPage\": \"Prejsť na predchádzajúcu stránku výsledkov\",\n  \"noAutocompleteOptionsFound\": \"0 nájdených možností automatického dokončenia.\",\n  \"noAutocompleteSuggestionsFound\": \"0 nájdených návrhov automatického dokončenia.\",\n  \"noResultsFoundIn\": \"Nenašli sa žiadne výsledky v {{currentVerticalLabel}}.\",\n  \"pagination\": \"Stránkovanie\",\n  \"readMoreAbout\": \"Čítať viac o <a>{{name}}</a>\",\n  \"recentSearch\": \"nedávne vyhľadávanie: {{query}}\",\n  \"recentSearchesFound_few\": \"Nájdené {{count}} nedávne vyhľadávania.\",\n  \"recentSearchesFound_one\": \"Nájdené {{count}} nedávne vyhľadávanie.\",\n  \"recentSearchesFound_other\": \"Nájdených {{count}} nedávnych vyhľadávaní.\",\n  \"removeFilter\": \"Odstrániť filter „{{displayName}}“\",\n  \"resultPreview\": \"výsledkový náhľad: {{value}}\",\n  \"resultPreviewsFound_few\": \"Nájdené {{count}} náhľady výsledkov.\",\n  \"resultPreviewsFound_one\": \"Nájdený {{count}} náhľad výsledku.\",\n  \"resultPreviewsFound_other\": \"Nájdených {{count}} náhľadov výsledkov.\",\n  \"resultsCountText_few\": \"{{count}} výsledky\",\n  \"resultsCountText_one\": \"{{count}} výsledok\",\n  \"resultsCountText_other\": \"{{count}} výsledkov\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} z {{resultsCount}} výsledkov\",\n  \"searchHere\": \"Vyhľadajte tu…\",\n  \"showLess\": \"Zobraziť menej\",\n  \"showMore\": \"Zobraziť viac\",\n  \"showingAllInstead\": \"Zobrazujú sa všetky položky v {{currentVerticalLabel}}.\",\n  \"sources_few\": \"Zdroje ({{count}})\",\n  \"sources_one\": \"Zdroj\",\n  \"sources_other\": \"Zdroje ({{count}})\",\n  \"submitSearch\": \"Odovzdať\",\n  \"suggestionResultsCount_few\": \"{{label}} – {{count}} výsledky\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} výsledok\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} výsledkov\",\n  \"thankYouForYourFeedback\": \"Ďakujeme za vašu spätnú väzbu!\",\n  \"thisAnsweredMyQuestion\": \"Toto odpovedalo na moju otázku\",\n  \"thisDidNotAnswerMyQuestion\": \"Toto neodpovedalo na moju otázku\",\n  \"unselectAnOptionToEnterInARange\": \"Zrušte výber možnosti, aby ste mohli zadať rozsah.\",\n  \"updateYourLocation\": \"Aktualizujte svoju polohu\",\n  \"useCurrentLocation\": \"Použiť aktuálnu polohu\",\n  \"useMyLocation\": \"Použiť moju polohu\",\n  \"viewAll\": \"Zobraziť všetko\",\n  \"viewDetails\": \"Zobraziť podrobnosti\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI-genererat svar\",\n  \"allCategories\": \"Alla kategorier\",\n  \"appliedFiltersToCurrentSearch\": \"Tillämpade filter för aktuell sökning\",\n  \"apply\": \"Tillämpa\",\n  \"applyFilters\": \"Tillämpa filter\",\n  \"autocompleteOptionsFound_one\": \"{{count}}{{label}} autofyllningsval hittades.\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} autofyllningsval hittades.\",\n  \"autocompleteSuggestion\": \"autofyllningsförslag: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_one\": \"{{count}} autofyllningsförslag hittades.\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} autofyllningsförslag hittades.\",\n  \"basedOnYourDevice\": \" (baserat på din enhet)\",\n  \"basedOnYourInternetAddress\": \" (baserat på din internetadress)\",\n  \"categoriesText_one\": \"Följande kategori gav resultat för – <strong>{{query}}</strong>\",\n  \"categoriesText_other\": \"Följande kategorier gav resultat för – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Rensa allt\",\n  \"clearMinAndMax\": \"Rensa min och max\",\n  \"clearTheRangeToSelectOptions\": \"Rensa intervallet för att välja alternativ.\",\n  \"clearTheSearchBar\": \"Rensa sökfältet\",\n  \"conductASearch\": \"Utför en sökning\",\n  \"currentLocation\": \"Aktuell plats\",\n  \"didYouMean\": \"Menade du <button>{{correctedQuery}}</button>?\",\n  \"dropDownScreenReaderInstructions\": \"När autofyllningsresultat är tillgängliga, använd upp- och nedpilar för att bläddra och enter för att välja.\",\n  \"feedback\": \"Feedback\",\n  \"invalidRange\": \"Ogiltigt intervall\",\n  \"max\": \"Max\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Gå till nästa resultatsida\",\n  \"navigateToThePreviousResultsPage\": \"Gå till föregående resultatsida\",\n  \"noAutocompleteOptionsFound\": \"0 autofyllningsval hittades.\",\n  \"noAutocompleteSuggestionsFound\": \"0 autofyllningsförslag hittades.\",\n  \"noResultsFoundIn\": \"Inga resultat hittades i {{currentVerticalLabel}}.\",\n  \"pagination\": \"Pagination\",\n  \"readMoreAbout\": \"Läs mer om <a>{{name}}</a>\",\n  \"recentSearch\": \"senaste sökningen: {{query}}\",\n  \"recentSearchesFound_one\": \"{{count}} senaste sökning hittades.\",\n  \"recentSearchesFound_other\": \"{{count}} senaste sökningar hittades.\",\n  \"removeFilter\": \"Ta bort filtret \\\"{{displayName}}\\\"\",\n  \"resultPreview\": \"resultatförhandsgranskning: {{value}}\",\n  \"resultPreviewsFound_one\": \"{{count}} förhandsgranskning hittades.\",\n  \"resultPreviewsFound_other\": \"{{count}} förhandsgranskningar hittades.\",\n  \"resultsCountText_one\": \"{{count}} resultat\",\n  \"resultsCountText_other\": \"{{count}} resultat\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} av {{resultsCount}} resultat\",\n  \"searchHere\": \"Sök här…\",\n  \"showLess\": \"Visa mindre\",\n  \"showMore\": \"Visa mer\",\n  \"showingAllInstead\": \"Visar alla {{currentVerticalLabel}} i stället.\",\n  \"sources_one\": \"Källa\",\n  \"sources_other\": \"Källor ({{count}})\",\n  \"submitSearch\": \"Skicka sökning\",\n  \"suggestionResultsCount_one\": \"{{label}} – {{count}} resultat\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} resultat\",\n  \"thankYouForYourFeedback\": \"Tack för din feedback!\",\n  \"thisAnsweredMyQuestion\": \"Detta besvarade min fråga\",\n  \"thisDidNotAnswerMyQuestion\": \"Detta besvarade inte min fråga\",\n  \"unselectAnOptionToEnterInARange\": \"Avmarkera ett alternativ för att ange ett intervall.\",\n  \"updateYourLocation\": \"Uppdatera din plats\",\n  \"useCurrentLocation\": \"Använd aktuell plats\",\n  \"useMyLocation\": \"Använd min plats\",\n  \"viewAll\": \"Visa alla\",\n  \"viewDetails\": \"Visa detaljer\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Yapay Zekâ Tarafından Oluşturulan Yanıt\",\n  \"allCategories\": \"Tüm Kategoriler\",\n  \"appliedFiltersToCurrentSearch\": \"Mevcut aramaya uygulanan filtreler\",\n  \"apply\": \"Uygula\",\n  \"applyFilters\": \"Filtreleri Uygula\",\n  \"autocompleteOptionsFound_other\": \"{{count}}{{label}} tamamlayıcı seçenekler bulundu.\",\n  \"autocompleteSuggestion\": \"tamamlayıcı öneri: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"{{count}} tamamlayıcı öneri bulundu.\",\n  \"basedOnYourDevice\": \" (cihazınıza göre)\",\n  \"basedOnYourInternetAddress\": \" (internet adresinize göre)\",\n  \"categoriesText_other\": \"Aşağıdaki kategoriler için sonuçlar bulundu – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Tümünü Temizle\",\n  \"clearMinAndMax\": \"Min ve maks değerleri temizle\",\n  \"clearTheRangeToSelectOptions\": \"Seçenekleri seçmek için aralığı temizle.\",\n  \"clearTheSearchBar\": \"Arama çubuğunu temizle\",\n  \"conductASearch\": \"Arama yap\",\n  \"currentLocation\": \"Mevcut Konum\",\n  \"didYouMean\": \"Demek istediniz mi <button>{{correctedQuery}}</button>\",\n  \"dropDownScreenReaderInstructions\": \"Tamamlayıcı sonuçlar mevcut olduğunda, yukarı/aşağı okları kullanarak gezinip enter ile seçin.\",\n  \"feedback\": \"Geri bildirim\",\n  \"invalidRange\": \"Geçersiz aralık\",\n  \"max\": \"Maks\",\n  \"min\": \"Min\",\n  \"navigateToTheNextResultsPage\": \"Sonraki sonuç sayfasına git\",\n  \"navigateToThePreviousResultsPage\": \"Önceki sonuç sayfasına git\",\n  \"noAutocompleteOptionsFound\": \"0 tamamlayıcı seçenek bulundu.\",\n  \"noAutocompleteSuggestionsFound\": \"0 tamamlayıcı öneri bulundu.\",\n  \"noResultsFoundIn\": \"{{currentVerticalLabel}} içinde sonuç bulunamadı.\",\n  \"pagination\": \"Sayfalandırma\",\n  \"readMoreAbout\": \"<a>{{name}}</a> hakkında daha fazla oku\",\n  \"recentSearch\": \"son arama: {{query}}\",\n  \"recentSearchesFound_other\": \"{{count}} son arama bulundu.\",\n  \"removeFilter\": \"“{{displayName}}” filtresini kaldır\",\n  \"resultPreview\": \"sonuç önizlemesi: {{value}}\",\n  \"resultPreviewsFound_other\": \"{{count}} yakın zamanda önizleme bulundu.\",\n  \"resultsCountText_other\": \"{{count}} Sonuç\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} toplam {{resultsCount}} sonuç\",\n  \"searchHere\": \"Burada ara…\",\n  \"showLess\": \"Daha az göster\",\n  \"showMore\": \"Daha fazla göster\",\n  \"showingAllInstead\": \"Bunun yerine tüm {{currentVerticalLabel}} gösteriliyor.\",\n  \"sources_other\": \"Kaynaklar ({{count}})\",\n  \"submitSearch\": \"Aramayı Gönder\",\n  \"suggestionResultsCount_other\": \"{{label}} - {{count}} sonuç\",\n  \"thankYouForYourFeedback\": \"Geri bildiriminiz için teşekkürler!\",\n  \"thisAnsweredMyQuestion\": \"Bu sorumu yanıtladı\",\n  \"thisDidNotAnswerMyQuestion\": \"Bu sorumu yanıtlamadı\",\n  \"unselectAnOptionToEnterInARange\": \"Aralık girmek için bir seçeneğin seçimini kaldırın.\",\n  \"updateYourLocation\": \"Konumunuzu güncelleyin\",\n  \"useCurrentLocation\": \"Mevcut Konumu Kullan\",\n  \"useMyLocation\": \"Konumumu kullan\",\n  \"viewAll\": \"Tümünü Gör\",\n  \"viewDetails\": \"Detayları Görüntüle\"\n}\n","{\n  \"aiGeneratedAnswer\": \"Trả lời do AI tạo\",\n  \"allCategories\": \"Tất cả danh mục\",\n  \"appliedFiltersToCurrentSearch\": \"Bộ lọc được áp dụng cho tìm kiếm hiện tại\",\n  \"apply\": \"Áp dụng\",\n  \"applyFilters\": \"Áp dụng bộ lọc\",\n  \"autocompleteOptionsFound_other\": \"Đã tìm thấy {{count}} tùy chọn tự động hoàn thành{{label}}.\",\n  \"autocompleteSuggestion\": \"đề xuất tự động hoàn thành: {{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"Đã tìm thấy {{count}} đề xuất tự động hoàn thành.\",\n  \"basedOnYourDevice\": \" (dựa trên thiết bị của bạn)\",\n  \"basedOnYourInternetAddress\": \" (dựa trên địa chỉ internet của bạn)\",\n  \"categoriesText_other\": \"Các danh mục sau có kết quả cho – <strong>{{query}}</strong>\",\n  \"clearAll\": \"Xóa tất cả\",\n  \"clearMinAndMax\": \"Xóa giá trị tối thiểu và tối đa\",\n  \"clearTheRangeToSelectOptions\": \"Xóa phạm vi để chọn các tùy chọn.\",\n  \"clearTheSearchBar\": \"Xóa thanh tìm kiếm\",\n  \"conductASearch\": \"Tiến hành tìm kiếm\",\n  \"currentLocation\": \"Vị trí hiện tại\",\n  \"didYouMean\": \"Ý bạn là <button>{{correctedQuery}}</button> phải không\",\n  \"dropDownScreenReaderInstructions\": \"Khi có kết quả tự động hoàn thành, dùng phím mũi lên/xuống để duyệt và Enter để chọn.\",\n  \"feedback\": \"Phản hồi\",\n  \"invalidRange\": \"Phạm vi không hợp lệ\",\n  \"max\": \"Tối đa\",\n  \"min\": \"Tối thiểu\",\n  \"navigateToTheNextResultsPage\": \"Điều hướng đến trang kết quả tiếp theo\",\n  \"navigateToThePreviousResultsPage\": \"Điều hướng đến trang kết quả trước đó\",\n  \"noAutocompleteOptionsFound\": \"0 tùy chọn tự động hoàn thành được tìm thấy.\",\n  \"noAutocompleteSuggestionsFound\": \"0 đề xuất tự động hoàn thành được tìm thấy.\",\n  \"noResultsFoundIn\": \"Không tìm thấy kết quả trong {{currentVerticalLabel}}.\",\n  \"pagination\": \"Phân trang\",\n  \"readMoreAbout\": \"Tìm hiểu thêm về <a>{{name}}</a>\",\n  \"recentSearch\": \"Tìm kiếm gần đây: {{query}}\",\n  \"recentSearchesFound_other\": \"Đã tìm thấy {{count}} lượt tìm kiếm gần đây.\",\n  \"removeFilter\": \"Xóa bộ lọc “{{displayName}}”\",\n  \"resultPreview\": \"Xem trước kết quả: {{value}}\",\n  \"resultPreviewsFound_other\": \"Đã tìm thấy {{count}} bản xem trước kết quả.\",\n  \"resultsCountText_other\": \"{{count}} kết quả\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}}–{{paginateEnd}} trên tổng {{resultsCount}} kết quả\",\n  \"searchHere\": \"Tìm kiếm ở đây…\",\n  \"showLess\": \"Ẩn bớt\",\n  \"showMore\": \"Xem thêm\",\n  \"showingAllInstead\": \"Hiển thị tất cả {{currentVerticalLabel}} thay vào đó.\",\n  \"sources_other\": \"Nguồn ({{count}})\",\n  \"submitSearch\": \"Gửi tìm kiếm\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} kết quả\",\n  \"thankYouForYourFeedback\": \"Cảm ơn bạn đã phản hồi!\",\n  \"thisAnsweredMyQuestion\": \"Điều này đã trả lời câu hỏi của tôi\",\n  \"thisDidNotAnswerMyQuestion\": \"Điều này không trả lời câu hỏi của tôi\",\n  \"unselectAnOptionToEnterInARange\": \"Bỏ chọn một tùy chọn để nhập khoảng giá trị.\",\n  \"updateYourLocation\": \"Cập nhật vị trí của bạn\",\n  \"useCurrentLocation\": \"Dùng vị trí hiện tại\",\n  \"useMyLocation\": \"Dùng vị trí của tôi\",\n  \"viewAll\": \"Xem tất cả\",\n  \"viewDetails\": \"Xem chi tiết\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI 生成的答案\",\n  \"allCategories\": \"所有类别\",\n  \"appliedFiltersToCurrentSearch\": \"已应用于当前搜索的筛选条件\",\n  \"apply\": \"应用\",\n  \"applyFilters\": \"应用筛选条件\",\n  \"autocompleteOptionsFound_other\": \"找到 {{count}} 个{{label}}自动完成选项。\",\n  \"autocompleteSuggestion\": \"自动完成建议：{{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"找到 {{count}} 个自动完成建议。\",\n  \"basedOnYourDevice\": \"（基于您的设备）\",\n  \"basedOnYourInternetAddress\": \"（基于您的 IP 地址）\",\n  \"categoriesText_other\": \"以下分类包含与<strong>{{query}}</strong>相关的结果\",\n  \"clearAll\": \"清除全部\",\n  \"clearMinAndMax\": \"清除最小值和最大值\",\n  \"clearTheRangeToSelectOptions\": \"清除以选择选项的范围。\",\n  \"clearTheSearchBar\": \"清除搜索栏\",\n  \"conductASearch\": \"进行搜索\",\n  \"currentLocation\": \"当前位置\",\n  \"didYouMean\": \"您的意思是 <button>{{correctedQuery}}</button> 吗\",\n  \"dropDownScreenReaderInstructions\": \"当有自动完成结果时，使用上下箭头浏览，按回车键选择。\",\n  \"feedback\": \"反馈\",\n  \"invalidRange\": \"无效范围\",\n  \"max\": \"最大\",\n  \"min\": \"最小\",\n  \"navigateToTheNextResultsPage\": \"导航到下一个结果页面\",\n  \"navigateToThePreviousResultsPage\": \"导航到上一个结果页面\",\n  \"noAutocompleteOptionsFound\": \"0已找到自动完成选项。\",\n  \"noAutocompleteSuggestionsFound\": \"0发现自动完成建议。\",\n  \"noResultsFoundIn\": \"在{{currentVerticalLabel}}中未找到结果。\",\n  \"pagination\": \"分页\",\n  \"readMoreAbout\": \"阅读关于<a>{{name}}</a>的更多内容\",\n  \"recentSearch\": \"最近的搜索：{{query}}\",\n  \"recentSearchesFound_other\": \"找到 {{count}} 个最近的搜索记录。\",\n  \"removeFilter\": \"移除“{{displayName}}”筛选器\",\n  \"resultPreview\": \"结果预览：{{value}}\",\n  \"resultPreviewsFound_other\": \"找到 {{count}} 个结果预览。\",\n  \"resultsCountText_other\": \"{{count}} 条结果\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} / 共 {{resultsCount}} 个结果\",\n  \"searchHere\": \"在此搜索…\",\n  \"showLess\": \"收起\",\n  \"showMore\": \"查看更多\",\n  \"showingAllInstead\": \"正在显示所有{{currentVerticalLabel}}。\",\n  \"sources_other\": \"来源（{{count}}）\",\n  \"submitSearch\": \"提交搜索\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} 个结果\",\n  \"thankYouForYourFeedback\": \"感谢您的反馈！\",\n  \"thisAnsweredMyQuestion\": \"这个回答了我的问题\",\n  \"thisDidNotAnswerMyQuestion\": \"这个没有回答我的问题\",\n  \"unselectAnOptionToEnterInARange\": \"取消选择某个选项以输入范围。\",\n  \"updateYourLocation\": \"更新您的位置\",\n  \"useCurrentLocation\": \"使用当前位置\",\n  \"useMyLocation\": \"使用我的位置\",\n  \"viewAll\": \"查看全部\",\n  \"viewDetails\": \"查看详细信息\"\n}\n","{\n  \"aiGeneratedAnswer\": \"AI 產生的答案\",\n  \"allCategories\": \"所有分類\",\n  \"appliedFiltersToCurrentSearch\": \"已套用至目前搜尋的篩選器\",\n  \"apply\": \"套用\",\n  \"applyFilters\": \"套用篩選器\",\n  \"autocompleteOptionsFound_other\": \"找到 {{count}} 個{{label}}自動完成選項。\",\n  \"autocompleteSuggestion\": \"自動完成建議：{{suggestion}}\",\n  \"autocompleteSuggestionsFound_other\": \"找到 {{count}} 個自動完成建議。\",\n  \"basedOnYourDevice\": \"（依據您的裝置）\",\n  \"basedOnYourInternetAddress\": \"（依據您的網際網路位址）\",\n  \"categoriesText_other\": \"以下分類包含與<strong>{{query}}</strong>相關的結果\",\n  \"clearAll\": \"清除全部\",\n  \"clearMinAndMax\": \"清除最小值與最大值\",\n  \"clearTheRangeToSelectOptions\": \"清除範圍以選擇選項。\",\n  \"clearTheSearchBar\": \"清除搜尋欄\",\n  \"conductASearch\": \"進行搜尋\",\n  \"currentLocation\": \"目前位置\",\n  \"didYouMean\": \"您的意思是 <button>{{correctedQuery}}</button> 嗎\",\n  \"dropDownScreenReaderInstructions\": \"有自動完成結果時，請使用上下鍵瀏覽並按 Enter 鍵選取。\",\n  \"feedback\": \"回饋\",\n  \"invalidRange\": \"無效範圍\",\n  \"max\": \"最大\",\n  \"min\": \"最小\",\n  \"navigateToTheNextResultsPage\": \"前往下一頁結果\",\n  \"navigateToThePreviousResultsPage\": \"前往上一頁結果\",\n  \"noAutocompleteOptionsFound\": \"未找到自動完成選項。\",\n  \"noAutocompleteSuggestionsFound\": \"未找到自動完成建議。\",\n  \"noResultsFoundIn\": \"在{{currentVerticalLabel}}中找不到結果。\",\n  \"pagination\": \"分頁\",\n  \"readMoreAbout\": \"閱讀更多關於<a>{{name}}</a>的資訊\",\n  \"recentSearch\": \"最近搜尋：{{query}}\",\n  \"recentSearchesFound_other\": \"找到 {{count}} 筆最近搜尋。\",\n  \"removeFilter\": \"移除「{{displayName}}」篩選器\",\n  \"resultPreview\": \"結果預覽：{{value}}\",\n  \"resultPreviewsFound_other\": \"找到 {{count}} 筆結果預覽。\",\n  \"resultsCountText_other\": \"{{count}} 筆結果\",\n  \"resultsCountWithPaginationText\": \"{{paginateStart}} - {{paginateEnd}} / 共 {{resultsCount}} 筆結果\",\n  \"searchHere\": \"請在此搜尋…\",\n  \"showLess\": \"顯示較少\",\n  \"showMore\": \"顯示更多\",\n  \"showingAllInstead\": \"顯示所有 {{currentVerticalLabel}}。\",\n  \"sources_other\": \"來源（{{count}}）\",\n  \"submitSearch\": \"提交搜尋\",\n  \"suggestionResultsCount_other\": \"{{label}} – {{count}} 筆結果\",\n  \"thankYouForYourFeedback\": \"感謝您的意見回饋！\",\n  \"thisAnsweredMyQuestion\": \"這有回答到我的問題\",\n  \"thisDidNotAnswerMyQuestion\": \"這沒有回答到我的問題\",\n  \"unselectAnOptionToEnterInARange\": \"取消選擇一個選項以輸入範圍。\",\n  \"updateYourLocation\": \"更新您的位置\",\n  \"useCurrentLocation\": \"使用目前位置\",\n  \"useMyLocation\": \"使用我的位置\",\n  \"viewAll\": \"查看全部\",\n  \"viewDetails\": \"查看詳細資料\"\n}\n","/**\n * The locales that have default translation support.\n *\n * @internal\n */\nconst supportedLocales =\n[\n  'ar',\n  'cs',\n  'da',\n  'de',\n  'el',\n  'en-GB',\n  'en',\n  'es',\n  'et',\n  'fi',\n  'fr',\n  'hi',\n  'hr',\n  'hu',\n  'it',\n  'ja',\n  'ko',\n  'lt',\n  'lv',\n  'nb',\n  'nl',\n  'pl',\n  'pt',\n  'ro',\n  'ru',\n  'sk',\n  'sv',\n  'tr',\n  'vi',\n  'zh-CN',\n  'zh-TW',\n];\n\nmodule.exports = { supportedLocales };","export * from './components/index';\nexport * from './hooks/index';\nexport * from './models/index';\nexport * from './utils/index';\n\n/**\n * Content path to the source files in component library that utilizes Tailwind class names.\n * This is intended to be used in user's custom tailwind config.\n *\n * @public\n *\n * @remarks\n * This assumes that the node_modules folder containing the component library\n * is in adjacent level with the user's tailwind.config.js file.\n *\n * @example\n * In user's tailwind.config.js file:\n *\n * ```js\n * const { ComponentsContentPath } = require('@yext/search-ui-react');\n *\n * module.exports = {\n *  content: [ ComponentsContentPath ],\n *  // ... the rest of your tailwind config\n * };\n * ```\n */\nexport const ComponentsContentPath = 'node_modules/@yext/search-ui-react/lib/**/*.{js,jsx}';\n","import { useTranslation } from 'react-i18next';\nimport {\n  SearchHeadless,\n  QuerySource,\n  SearchTypeEnum,\n  UniversalLimit,\n  useSearchActions,\n  useSearchState,\n  useSearchUtilities,\n  VerticalResults as VerticalResultsData\n} from '@yext/search-headless-react';\nimport classNames from 'classnames';\nimport React, { Fragment, isValidElement, PropsWithChildren, ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport { useEntityPreviews } from '../hooks/useEntityPreviews';\nimport { useRecentSearches } from '../hooks/useRecentSearches';\nimport { useSearchWithNearMeHandling } from '../hooks/useSearchWithNearMeHandling';\nimport { useSynchronizedRequest } from '../hooks/useSynchronizedRequest';\nimport { useDebouncedFunction } from '../hooks/useDebouncedFunction';\nimport { VerticalDividerIcon } from '../icons/VerticalDividerIcon';\nimport { HistoryIcon as RecentSearchIcon } from '../icons/HistoryIcon';\nimport { CloseIcon } from '../icons/CloseIcon';\nimport { MagnifyingGlassIcon } from '../icons/MagnifyingGlassIcon';\nimport { Dropdown } from './Dropdown/Dropdown';\nimport { useDropdownContext } from './Dropdown/DropdownContext';\nimport { DropdownInput } from './Dropdown/DropdownInput';\nimport { DropdownItem } from './Dropdown/DropdownItem';\nimport { DropdownMenu } from './Dropdown/DropdownMenu';\nimport { FocusedItemData } from './Dropdown/FocusContext';\nimport { useComposedCssClasses, twMerge } from '../hooks/useComposedCssClasses';\nimport { SearchButton } from './SearchButton';\nimport {\n  renderAutocompleteResult,\n  AutocompleteResultCssClasses,\n  builtInCssClasses as AutocompleteResultBuiltInCssClasses\n} from './utils/renderAutocompleteResult';\nimport { useSearchBarAnalytics } from '../hooks/useSearchBarAnalytics';\nimport { isVerticalLink, VerticalLink } from '../models/verticalLink';\nimport { executeAutocomplete as executeAutocompleteSearch } from '../utils/search-operations';\nimport { clearStaticRangeFilters } from '../utils/filterutils';\nimport { recursivelyMapChildren } from './utils/recursivelyMapChildren';\n\nconst builtInCssClasses: Readonly<SearchBarCssClasses> = {\n  searchBarContainer: 'h-12 mb-6',\n  inputDivider: 'border-t border-gray-200 mx-2.5',\n  inputElement: 'outline-none flex-grow border-none h-11 pl-5 pr-2 text-neutral-dark text-base placeholder:text-neutral-light',\n  searchButtonContainer: ' w-8 h-full mx-2 flex flex-col justify-center items-center',\n  searchButton: 'h-7 w-7',\n  focusedOption: 'bg-gray-100',\n  clearButton: 'h-3 w-3 mr-3.5',\n  verticalDivider: 'mr-0.5',\n  recentSearchesIcon: 'w-5 mr-1 flex-shrink-0 h-full text-gray-400',\n  recentSearchesOption: 'whitespace-no-wrap max-w-full px-3 text-neutral-dark truncate',\n  recentSearchesNonHighlighted: 'font-normal', // Swap this to semibold once we apply highlighting to recent searches\n  verticalLink: 'ml-12 pl-1 text-neutral italic',\n  entityPreviewsDivider: 'h-px bg-gray-200 mt-1 mb-4 mx-3.5',\n  ...AutocompleteResultBuiltInCssClasses\n};\n\n/**\n * The CSS class interface for the {@link SearchBar}.\n *\n * @public\n */\nexport interface SearchBarCssClasses extends AutocompleteResultCssClasses {\n  searchBarContainer?: string,\n  inputElement?: string,\n  inputDivider?: string,\n  clearButton?: string,\n  searchButton?: string,\n  searchButtonContainer?: string,\n  focusedOption?: string,\n  recentSearchesIcon?: string,\n  recentSearchesOption?: string,\n  recentSearchesNonHighlighted?: string,\n  verticalLink?: string,\n  verticalDivider?: string,\n  entityPreviewsDivider?: string\n}\n\n/**\n * The type of a functional React component which renders entity previews using\n * a map of vertical key to the corresponding VerticalResults data.\n *\n * @remarks\n * The autocomplete loading state is passed in as an optional param.\n *\n * Default props for rendering corresponding DropdownItems are passed in:\n * an onClick function to allow an entity preview to be submitted, and\n * an ariaLabel function that returns text for the screenreader\n *\n * For the entity previews to be navigable in the search bar's dropdown section,\n * wrap each entity preview in a {@link DropdownItem} component.\n *\n * @public\n */\nexport type RenderEntityPreviews = (\n  autocompleteLoading: boolean,\n  verticalKeyToResults: Record<string, VerticalResultsData>,\n  dropdownItemProps: {\n    onClick: (value: string, _index: number, itemData?: FocusedItemData) => void,\n    ariaLabel: (value: string) => string\n  }\n) => React.JSX.Element | null;\n\n/**\n * The configuration options for Visual Autocomplete.\n *\n * @public\n */\nexport interface VisualAutocompleteConfig {\n  /** The Search Headless instance used to perform visual autocomplete searches. */\n  entityPreviewSearcher: SearchHeadless,\n  /** Renders entity previews based on the autocomplete loading state and results. */\n  renderEntityPreviews: RenderEntityPreviews,\n  /** Specify which verticals to include for VisualAutocomplete. */\n  includedVerticals: string[],\n  /** Specify the number of entities to return per vertical. **/\n  universalLimit?: UniversalLimit,\n  /** The debouncing time, in milliseconds, for making API requests for entity previews. */\n  entityPreviewsDebouncingTime?: number\n}\n\n/**\n * The interface of a function which is called on a search.\n *\n * @public\n */\nexport type onSearchFunc = (searchEventData: { verticalKey?: string, query?: string }) => void;\n\n/**\n * The props for the {@link SearchBar} component.\n *\n * @public\n */\nexport interface SearchBarProps {\n  /** The search bar's placeholder text. */\n  placeholder?: string,\n  /** {@inheritDoc LocationBiasProps.geolocationOptions} */\n  geolocationOptions?: PositionOptions,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: SearchBarCssClasses,\n  /** {@inheritDoc VisualAutocompleteConfig} */\n  visualAutocompleteConfig?: VisualAutocompleteConfig,\n  /** Shows vertical links if true, set to false on default. */\n  showVerticalLinks?: boolean,\n  /** A function which is called when a vertical link is selected. */\n  onSelectVerticalLink?: (data: { verticalLink: VerticalLink, querySource: QuerySource }) => void,\n  /** A function which returns a display label for the given verticalKey. */\n  verticalKeyToLabel?: (verticalKey: string) => string,\n  /** Hides recent searches if true. */\n  hideRecentSearches?: boolean,\n  /** Limits the number of recent searches shown. */\n  recentSearchesLimit?: number,\n  /** Limits the number of universal query suggestions returned by autocomplete. */\n  universalAutocompleteLimit?: number,\n  /**\n   * Limits the number of query suggestions returned by autocomplete for verticals.\n   * The keys of the record correspond to the vertical keys, and the values correspond\n   * to the maximum number of suggestions to return for that vertical.\n   * If a limit for the current vertical is not specified, the default limit will be used.\n   */\n  verticalAutocompleteLimits?: Record<string, number>,\n  /** A callback which is called when a search is ran. */\n  onSearch?: onSearchFunc,\n  /** Disable autocomplete if true, set to false on default. */\n  autocompleteDisabled?: boolean\n}\n\n/**\n * Renders a SearchBar that is hooked up with an InputDropdown component.\n *\n * @public\n */\nexport function SearchBar({\n  placeholder,\n  geolocationOptions,\n  hideRecentSearches,\n  visualAutocompleteConfig,\n  showVerticalLinks = false,\n  onSelectVerticalLink,\n  verticalKeyToLabel,\n  recentSearchesLimit = 5,\n  universalAutocompleteLimit,\n  verticalAutocompleteLimits,\n  customCssClasses,\n  onSearch,\n  autocompleteDisabled = false\n}: SearchBarProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const {\n    entityPreviewSearcher,\n    renderEntityPreviews,\n    includedVerticals,\n    universalLimit,\n    entityPreviewsDebouncingTime = 500\n  } = visualAutocompleteConfig ?? {};\n  const searchActions = useSearchActions();\n  const searchUtilities = useSearchUtilities();\n  const reportAnalyticsEvent = useSearchBarAnalytics();\n\n  const query = useSearchState(state => state.query.input) ?? '';\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const isVertical = useSearchState(state => state.meta.searchType) === SearchTypeEnum.Vertical;\n  const verticalKey = useSearchState(state => state.vertical.verticalKey);\n  const debouncedExecuteAutocompleteSearch = useDebouncedFunction(\n    () => executeAutocompleteSearch(searchActions),\n    200\n  );\n  const [autocompleteResponse, executeAutocomplete, clearAutocompleteData] = useSynchronizedRequest(\n    async () => {\n      return !autocompleteDisabled && debouncedExecuteAutocompleteSearch ?\n        debouncedExecuteAutocompleteSearch() :\n        undefined;\n    }\n  );\n  const [\n    executeQueryWithNearMeHandling,\n    autocompletePromiseRef,\n  ] = useSearchWithNearMeHandling(geolocationOptions, onSearch);\n  const [\n    recentSearches,\n    setRecentSearch,\n    clearRecentSearches,\n  ] = useRecentSearches(recentSearchesLimit, verticalKey);\n  const filteredRecentSearches = recentSearches?.filter(search =>\n    searchUtilities.isCloseMatch(search.query, query)\n  );\n\n  useEffect(() => {\n    if (hideRecentSearches) {\n      clearRecentSearches();\n    }\n  }, [clearRecentSearches, hideRecentSearches]);\n\n  useEffect(() => {\n    if (universalAutocompleteLimit) {\n      searchActions.setUniversalAutocompleteLimit(universalAutocompleteLimit);\n    } else {\n      searchActions.setUniversalAutocompleteLimit(undefined);\n    }\n    if (verticalKey && verticalAutocompleteLimits?.[verticalKey]) {\n      searchActions.setVerticalAutocompleteLimit(verticalAutocompleteLimits[verticalKey]);\n    } else {\n      searchActions.setVerticalAutocompleteLimit(undefined);\n    }\n  }, [searchActions, universalAutocompleteLimit, verticalAutocompleteLimits, verticalKey]);\n\n  const clearAutocomplete = useCallback(() => {\n    clearAutocompleteData();\n    autocompletePromiseRef.current = undefined;\n  }, [autocompletePromiseRef, clearAutocompleteData]);\n\n  const executeQuery = useCallback(() => {\n    if (!hideRecentSearches) {\n      const input = searchActions.state.query.input;\n      input && setRecentSearch(input);\n    }\n    executeQueryWithNearMeHandling();\n  }, [\n    searchActions.state.query.input,\n    executeQueryWithNearMeHandling,\n    hideRecentSearches,\n    setRecentSearch\n  ]);\n\n  const handleSubmit = useCallback((value?: string, index?: number, itemData?: FocusedItemData) => {\n    value !== undefined && searchActions.setQuery(value);\n    searchActions.setOffset(0);\n    searchActions.setFacets([]);\n    clearStaticRangeFilters(searchActions);\n    if (itemData && isVerticalLink(itemData.verticalLink) && onSelectVerticalLink) {\n      onSelectVerticalLink({ verticalLink: itemData.verticalLink, querySource: QuerySource.Autocomplete });\n    } else {\n      executeQuery();\n    }\n    if (typeof index === 'number' && index >= 0 && !itemData?.isEntityPreview) {\n      reportAnalyticsEvent('AUTO_COMPLETE_SELECTION');\n    }\n  }, [searchActions, executeQuery, onSelectVerticalLink, reportAnalyticsEvent]);\n\n  const [\n    entityPreviewsState,\n    executeEntityPreviewsQuery\n  ] = useEntityPreviews(entityPreviewSearcher, entityPreviewsDebouncingTime);\n  const { verticalKeyToResults, isLoading: entityPreviewsLoading } = entityPreviewsState;\n  const getAriaLabelText = useCallback((value: string) => {\n    return t('resultPreview', { value });\n  }, [t]);\n  const entityPreviews = renderEntityPreviews?.(\n    entityPreviewsLoading,\n    verticalKeyToResults,\n    { onClick: handleSubmit, ariaLabel: getAriaLabelText }\n  );\n  const updateEntityPreviews = useCallback((query: string) => {\n    if (!renderEntityPreviews || !includedVerticals) {\n      return;\n    }\n    executeEntityPreviewsQuery(query, universalLimit ?? {}, includedVerticals);\n  }, [executeEntityPreviewsQuery, renderEntityPreviews, includedVerticals, universalLimit]);\n\n  const handleInputFocus = useCallback((value = '') => {\n    searchActions.setQuery(value);\n    updateEntityPreviews(value);\n    autocompletePromiseRef.current = executeAutocomplete();\n  }, [searchActions, autocompletePromiseRef, executeAutocomplete, updateEntityPreviews]);\n\n  const handleInputChange = useCallback((value = '') => {\n    searchActions.setQuery(value);\n    updateEntityPreviews(value);\n    autocompletePromiseRef.current = executeAutocomplete();\n  }, [searchActions, autocompletePromiseRef, executeAutocomplete, updateEntityPreviews]);\n\n  const handleClickClearButton = useCallback(() => {\n    updateEntityPreviews('');\n    searchActions.setQuery('');\n    reportAnalyticsEvent('SEARCH_CLEAR_BUTTON');\n  }, [reportAnalyticsEvent, searchActions, updateEntityPreviews]);\n\n  function renderInput() {\n    return (\n      <DropdownInput\n        className={cssClasses.inputElement}\n        placeholder={placeholder}\n        onSubmit={handleSubmit}\n        onFocus={handleInputFocus}\n        onChange={handleInputChange}\n        ariaLabel={t('conductASearch')}\n      />\n    );\n  }\n\n  function renderRecentSearches() {\n    const recentSearchesCssClasses = {\n      icon: cssClasses.recentSearchesIcon,\n      option: cssClasses.recentSearchesOption,\n      nonHighlighted: cssClasses.recentSearchesNonHighlighted\n    };\n\n    return filteredRecentSearches?.map((result, i) => (\n      <DropdownItem\n        className='flex items-center h-6.5 px-3.5 py-1.5 cursor-pointer hover:bg-gray-100'\n        focusedClassName={twMerge('flex items-center h-6.5 px-3.5 py-1.5 cursor-pointer hover:bg-gray-100', cssClasses.focusedOption)}\n        key={i}\n        value={result.query}\n        onClick={handleSubmit}\n        ariaLabel={t('recentSearch', {\n          query: result.query\n        })}\n      >\n        {renderAutocompleteResult(\n          { value: result.query, inputIntents: [] },\n          recentSearchesCssClasses,\n          RecentSearchIcon\n        )}\n      </DropdownItem>\n    ));\n  }\n\n  const itemDataMatrix = useMemo(() => {\n    return autocompleteResponse?.results.map(result => {\n      return result.verticalKeys?.map(verticalKey => ({\n        verticalLink: { verticalKey, query: result.value }\n      })) ?? [];\n    }) ?? [];\n  }, [autocompleteResponse?.results]);\n\n  function renderQuerySuggestions() {\n    return autocompleteResponse?.results.map((result, i) => (\n      <Fragment key={i}>\n        <DropdownItem\n          className='flex items-stretch py-1.5 px-3.5 cursor-pointer hover:bg-gray-100'\n          focusedClassName={twMerge('flex items-stretch py-1.5 px-3.5 cursor-pointer hover:bg-gray-100', cssClasses.focusedOption)}\n          value={result.value}\n          onClick={handleSubmit}\n          ariaLabel={t('autocompleteSuggestion', { suggestion: result.value })}\n        >\n          {renderAutocompleteResult(\n            result,\n            cssClasses,\n            MagnifyingGlassIcon\n          )}\n        </DropdownItem>\n        {showVerticalLinks && !isVertical && result.verticalKeys?.map((verticalKey, j) => (\n          <DropdownItem\n            key={j}\n            className='flex items-stretch py-1.5 px-3.5 cursor-pointer hover:bg-gray-100'\n            focusedClassName={twMerge('flex items-stretch py-1.5 px-3.5 cursor-pointer hover:bg-gray-100', cssClasses.focusedOption)}\n            value={result.value}\n            itemData={itemDataMatrix[i][j]}\n            onClick={handleSubmit}\n          >\n            {renderAutocompleteResult(\n              {\n                value: `in ${verticalKeyToLabel ? verticalKeyToLabel(verticalKey) : verticalKey}`,\n                inputIntents: []\n              },\n              { ...cssClasses, option: cssClasses.verticalLink }\n            )}\n          </DropdownItem>\n        ))}\n      </Fragment>\n    ));\n  }\n\n  function renderClearButton() {\n    return (\n      <>\n        <button\n          aria-label={t('clearTheSearchBar')}\n          className={cssClasses.clearButton}\n          onClick={handleClickClearButton}\n        >\n          <CloseIcon />\n        </button>\n        <VerticalDividerIcon className={cssClasses.verticalDivider} />\n      </>\n    );\n  }\n\n  const entityPreviewsCount = calculateEntityPreviewsCount(entityPreviews);\n  const showEntityPreviewsDivider = entityPreviews\n    && !!(autocompleteResponse?.results.length || filteredRecentSearches?.length);\n  const hasItems = !!(autocompleteResponse?.results.length\n    || filteredRecentSearches?.length || entityPreviews);\n  const screenReaderText = getScreenReaderText(\n    autocompleteResponse?.results.length,\n    filteredRecentSearches?.length,\n    entityPreviewsCount,\n    t\n  );\n  const activeClassName = classNames('relative z-10 bg-white border rounded-3xl border-gray-200 w-full overflow-hidden', {\n    'shadow-lg': hasItems\n  });\n\n  const handleToggleDropdown = useCallback((isActive: boolean) => {\n    if (!isActive) {\n      clearAutocomplete();\n    }\n  }, [clearAutocomplete]);\n\n  return (\n    <div className={cssClasses.searchBarContainer}>\n      <Dropdown\n        className='relative bg-white border rounded-3xl border-gray-200 w-full overflow-hidden'\n        activeClassName={activeClassName}\n        screenReaderText={screenReaderText}\n        parentQuery={query}\n        onToggle={handleToggleDropdown}\n      >\n        <div className='inline-flex items-center justify-between w-full'>\n          {renderInput()}\n          {query && renderClearButton()}\n          <DropdownSearchButton\n            handleSubmit={handleSubmit}\n            cssClasses={cssClasses}\n          />\n        </div>\n        {hasItems &&\n          <StyledDropdownMenu cssClasses={cssClasses}>\n            {renderRecentSearches()}\n            {renderQuerySuggestions()}\n            {showEntityPreviewsDivider && <div className={cssClasses.entityPreviewsDivider}></div>}\n            {entityPreviews}\n          </StyledDropdownMenu>\n        }\n      </Dropdown>\n    </div>\n  );\n}\n\nfunction StyledDropdownMenu({ cssClasses, children }: PropsWithChildren<{\n  cssClasses: {\n    inputDivider?: string\n  }\n}>) {\n  return (\n    <DropdownMenu>\n      <div className={cssClasses.inputDivider} />\n      <div className='bg-white py-4'>\n        {children}\n      </div>\n    </DropdownMenu>\n  );\n}\n\nfunction getScreenReaderText(\n  autocompleteOptions = 0,\n  recentSearchesOptions = 0,\n  entityPreviewsCount = 0,\n  t: ReturnType<typeof useTranslation>['t']\n): string {\n  const texts: string[] = [];\n  recentSearchesOptions > 0 && texts.push(t('recentSearchesFound', {\n    count: recentSearchesOptions\n  }));\n  entityPreviewsCount > 0 && texts.push(t('resultPreviewsFound', {\n    count: entityPreviewsCount\n  }));\n  autocompleteOptions > 0 && texts.push(t('autocompleteSuggestionsFound', {\n    count: autocompleteOptions\n  }));\n\n  const text = texts.join(' ');\n  if (text === '') {\n    return t('noAutocompleteSuggestionsFound');\n  }\n  return text.trim();\n}\n\nfunction DropdownSearchButton({ handleSubmit, cssClasses }: {\n  handleSubmit: () => void,\n  cssClasses: {\n    searchButtonContainer?: string,\n    searchButton?: string\n  }\n}) {\n  const { toggleDropdown } = useDropdownContext();\n  const handleClick = useCallback(() => {\n    handleSubmit();\n    toggleDropdown(false);\n  }, [handleSubmit, toggleDropdown]);\n  return (\n    <div className={cssClasses.searchButtonContainer}>\n      <SearchButton\n        className={cssClasses.searchButton}\n        handleClick={handleClick}\n      />\n    </div>\n  );\n}\n\n/**\n * Calculates the number of navigable entity previews from a ReactNode containing DropdownItems.\n */\nexport function calculateEntityPreviewsCount(children: ReactNode): number {\n  let count = 0;\n  recursivelyMapChildren(children, c => {\n    if (isValidElement(c) && c.type === DropdownItem) {\n      count++;\n    }\n    return c;\n  });\n  return count;\n}\n","import { SearchHeadless, UniversalLimit, VerticalResults as VerticalResultsData } from '@yext/search-headless-react';\nimport { useState } from 'react';\nimport { useComponentMountStatus } from './useComponentMountStatus';\nimport { useDebouncedFunction } from './useDebouncedFunction';\n\ninterface EntityPreviewsState {\n  verticalKeyToResults: Record<string, VerticalResultsData>,\n  isLoading: boolean\n}\n\ntype ExecuteEntityPreviewsQuery = (\n  query: string,\n  universalLimit: UniversalLimit,\n  restrictVerticals: string[]\n) => void;\n\n/**\n * useEntityPreviews provides state surrounding the visual entities portion of visual autocomplete,\n * which performs debounced universal searches.\n *\n * @param entityPreviewSearcher - the headless instance use as searcher for entity preview related queries\n * @param debounceTime - the time in milliseconds to debounce the universal search request\n */\nexport function useEntityPreviews(\n  entityPreviewSearcher: SearchHeadless | undefined,\n  debounceTime: number\n): [EntityPreviewsState, ExecuteEntityPreviewsQuery] {\n  const isMountedRef = useComponentMountStatus();\n  const [\n    verticalKeyToResults,\n    setVerticalKeyToResults\n  ] = useState<Record<string, VerticalResultsData>>({});\n  const debouncedUniversalSearch = useDebouncedFunction(async () => {\n    if (!entityPreviewSearcher) {\n      return;\n    }\n    await entityPreviewSearcher.executeUniversalQuery();\n    /**\n     * Avoid performing a React state update on an unmounted component\n     * (e.g unmounted during async await)\n     */\n    if (!isMountedRef.current) {\n      return;\n    }\n    const results = entityPreviewSearcher.state.universal.verticals || [];\n    setVerticalKeyToResults(getVerticalKeyToResults(results));\n    setLoadingState(false);\n  }, debounceTime);\n  const [isLoading, setLoadingState] = useState<boolean>(false);\n\n  function executeEntityPreviewsQuery(\n    query: string,\n    universalLimit: UniversalLimit,\n    restrictVerticals: string[]\n  ) {\n    if (!entityPreviewSearcher) {\n      return;\n    }\n    if (query === entityPreviewSearcher.state.query.input) {\n      return;\n    }\n    setLoadingState(true);\n    entityPreviewSearcher.setQuery(query);\n    entityPreviewSearcher.setRestrictVerticals(restrictVerticals);\n    entityPreviewSearcher.setUniversalLimit(universalLimit);\n    debouncedUniversalSearch?.();\n  }\n  return [{ verticalKeyToResults, isLoading }, executeEntityPreviewsQuery];\n}\n\n/**\n * @returns a mapping of vertical key to VerticalResults\n */\nfunction getVerticalKeyToResults(\n  verticalResultsArray: VerticalResultsData[]\n): Record<string, VerticalResultsData> {\n  return verticalResultsArray.reduce<Record<string, VerticalResultsData>>((prev, current) => {\n    prev[current.verticalKey] = current;\n    return prev;\n  }, {});\n}","import { useEffect, useRef } from 'react';\n\n/**\n * This is use to prevent react errors due to performing state update on unmounted component.\n * This error does not need to be suppressed as it will be remove in the next version of React.\n *\n * React PR regarding the issue: https://github.com/facebook/react/pull/22114\n */\nexport function useComponentMountStatus(): React.MutableRefObject<boolean> {\n  const isMountedRef = useRef<boolean>(false);\n  useEffect(() => {\n    isMountedRef.current = true;\n    return () => { isMountedRef.current = false; };\n  }, []);\n\n  return isMountedRef;\n}","import { useRef } from 'react';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Func = (...args: any[]) => any;\ntype DebouncedFunction<F extends Func> = (...args: Parameters<F>) => Promise<undefined | ReturnType<F>>;\n\nexport function useDebouncedFunction<F extends Func>(\n  func: F | undefined,\n  milliseconds: number\n): DebouncedFunction<F> | undefined {\n  const timeoutIdRef = useRef<number | undefined>(undefined);\n  if (!func) {\n    return undefined;\n  }\n  const debounced: DebouncedFunction<F> = (...args: Parameters<F>) => {\n    return new Promise(resolve => {\n      if (timeoutIdRef.current !== undefined) {\n        clearTimeout(timeoutIdRef.current);\n      }\n      timeoutIdRef.current = window.setTimeout(() => {\n        resolve(func(...args));\n        timeoutIdRef.current = undefined;\n      }, milliseconds);\n    });\n  };\n  return debounced;\n}","import { useCallback, useEffect, useState } from 'react';\nimport { RecentSearches, ISearch } from 'recent-searches';\n\nexport function useRecentSearches(\n  recentSearchesLimit: number,\n  verticalKey: string | undefined\n): [ISearch[] | undefined, (input: string) => void, () => void] {\n  const recentSearchesKey = getRecentSearchesKey(verticalKey);\n  const [recentSearches, setRecentSeaches] = useState<RecentSearches>(\n    new RecentSearches({\n      limit: recentSearchesLimit,\n      namespace: recentSearchesKey\n    })\n  );\n\n  const clearRecentSearches = useCallback(() => {\n    localStorage.removeItem(recentSearchesKey);\n    setRecentSeaches(new RecentSearches({\n      limit: recentSearchesLimit,\n      namespace: recentSearchesKey\n    }));\n    localStorage.removeItem(recentSearchesKey);\n  }, [recentSearchesKey, recentSearchesLimit]);\n\n  const setRecentSearch = useCallback((input: string) => {\n    recentSearches.setRecentSearch(input);\n  }, [recentSearches]);\n\n  useEffect(() => {\n    setRecentSeaches(new RecentSearches({\n      limit: recentSearchesLimit,\n      namespace: recentSearchesKey\n    }));\n  }, [recentSearchesKey, recentSearchesLimit]);\n\n  return [recentSearches?.getRecentSearches(), setRecentSearch, clearRecentSearches];\n}\n\nfunction getRecentSearchesKey(verticalKey: string | undefined): string {\n  if (verticalKey) {\n    return `__yxt_recent_searches_${verticalKey}__`;\n  } else {\n    return '__yxt_recent_searches_universal__';\n  }\n}","import { useSearchActions, AutocompleteResponse, SearchIntent } from '@yext/search-headless-react';\nimport { executeSearch, executeAutocomplete } from '../utils/search-operations';\nimport { updateLocationIfNeeded } from '../utils/location-operations';\nimport { MutableRefObject, useRef } from 'react';\nimport { onSearchFunc } from '../components/SearchBar';\n\n/** The type of a function for executing a query and returning a promise. @public */\nexport type QueryFunc = () => Promise<void>;\n/**\n * A ref which contains a promise of the latest autocomplete response in order get the\n * latest search intents.\n */\nexport type AutocompleteRef = MutableRefObject<Promise<AutocompleteResponse | undefined> | undefined>;\n\n/**\n * Returns a search action that will handle near me searches, by first checking\n * for near me intents using an autocomplete request.\n *\n * @remarks\n * You can optionally use the provided ref to store autocomplete responses, to avoid\n * making unnecessary autocomplete requests.\n */\nexport function useSearchWithNearMeHandling(\n  geolocationOptions?: PositionOptions,\n  onSearch?: onSearchFunc\n): [QueryFunc, AutocompleteRef] {\n  /**\n   * Allow a query search to wait on the response to the autocomplete request right\n   * before the search execution in order to retrieve the search intents.\n   */\n  const autocompletePromiseRef = useRef<Promise<AutocompleteResponse | undefined>>(undefined);\n  const searchActions = useSearchActions();\n\n  async function executeQuery() {\n    try {\n      let intents: SearchIntent[] = [];\n      if (!searchActions.state.location.userLocation) {\n        if (!autocompletePromiseRef.current) {\n          autocompletePromiseRef.current = executeAutocomplete(searchActions);\n        }\n        const autocompleteResponseBeforeSearch = await autocompletePromiseRef.current;\n        intents = autocompleteResponseBeforeSearch?.inputIntents || [];\n        await updateLocationIfNeeded(searchActions, intents, geolocationOptions);\n      }\n    } catch (e) {\n      console.error('Error executing autocomplete before search:', e);\n      await updateLocationIfNeeded(searchActions, [], geolocationOptions);\n    }\n    const verticalKey = searchActions.state.vertical.verticalKey ?? '';\n    const query = searchActions.state.query.input ?? '';\n    onSearch\n      ? onSearch({ verticalKey, query })\n      : executeSearch(searchActions);\n  }\n  return [executeQuery, autocompletePromiseRef];\n}","import {\n  SearchActions,\n  AutocompleteResponse,\n  GenerativeDirectAnswerResponse,\n  SearchIntent,\n  SearchTypeEnum\n} from '@yext/search-headless-react';\n\n/**\n * Executes a universal/vertical search.\n *\n * @public\n */\nexport async function executeSearch(searchActions: SearchActions): Promise<void> {\n  const isVertical = searchActions.state.meta.searchType === SearchTypeEnum.Vertical;\n  try {\n    isVertical\n      ? searchActions.executeVerticalQuery()\n      : searchActions.executeUniversalQuery();\n  } catch (e) {\n    console.error(`Error occured executing a ${isVertical ? 'vertical' : 'universal'} search.\\n`, e);\n  }\n}\n\n/**\n * Executes a universal/vertical autocomplete search and return the corresponding response.\n *\n * @public\n */\nexport async function executeAutocomplete(\n  searchActions: SearchActions\n): Promise<AutocompleteResponse | undefined> {\n  const isVertical = searchActions.state.meta.searchType === SearchTypeEnum.Vertical;\n  try {\n    return isVertical\n      ? searchActions.executeVerticalAutocomplete()\n      : searchActions.executeUniversalAutocomplete();\n  } catch (e) {\n    console.error(`Error occured executing a ${isVertical ? 'vertical' : 'universal'} autocomplete search.\\n`, e);\n  }\n}\n\n/**\n * Get search intents of the current query stored in headless using autocomplete request.\n *\n * @public\n */\nexport async function getSearchIntents(\n  searchActions: SearchActions\n): Promise<SearchIntent[] | undefined> {\n  const results = await executeAutocomplete(searchActions);\n  return results?.inputIntents;\n}\n\n/**\n * Executes a generative direct answer and return the corresponding response.\n *\n * @public\n */\nexport async function executeGenerativeDirectAnswer(\n  searchActions: SearchActions\n): Promise<GenerativeDirectAnswerResponse | undefined> {\n  try {\n    return await searchActions.executeGenerativeDirectAnswer();\n  } catch (e) {\n    console.error('Error occured executing generative direct answer.\\n', e);\n  }\n}\n","import {\n  SearchActions,\n  SearchIntent,\n} from '@yext/search-headless-react';\n\nconst defaultGeolocationOptions: PositionOptions = {\n  enableHighAccuracy: false,\n  timeout: 6000,\n  maximumAge: 300000,\n};\n\n/**\n * If the provided search intents include a 'NEAR_ME' intent and there's no existing\n * user's location in state, retrieve and store user's location in headless state.\n *\n * @public\n */\nexport async function updateLocationIfNeeded(\n  searchActions: SearchActions,\n  intents: SearchIntent[],\n  geolocationOptions?: PositionOptions\n): Promise<void> {\n  if (intents.includes(SearchIntent.NearMe) && !searchActions.state.location.userLocation) {\n    try {\n      const position = await getUserLocation(geolocationOptions);\n      searchActions.setUserLocation({\n        latitude: position.coords.latitude,\n        longitude: position.coords.longitude,\n      });\n    } catch (e) {\n      console.error(e);\n    }\n  }\n}\n\n/**\n * Retrieves user's location using navigator.geolocation API.\n *\n * @public\n */\nexport async function getUserLocation(geolocationOptions?: PositionOptions): Promise<GeolocationPosition> {\n  return new Promise((resolve, reject) => {\n    if ('geolocation' in navigator) {\n      navigator.geolocation.getCurrentPosition(\n        position => resolve(position),\n        err => {\n          console.error('Error occured using geolocation API. Unable to determine user\\'s location.');\n          reject(err);\n        },\n        { ...defaultGeolocationOptions, ...geolocationOptions }\n      );\n    } else {\n      reject('No access to geolocation API. Unable to determine user\\'s location.');\n    }\n  });\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { useComponentMountStatus } from './useComponentMountStatus';\n\n/**\n * Handles the network request race condition by synchronizing requests with their responses. If multiple\n * requests are sent before getting a response, only the response corresponding to the latest request will\n * be returned.\n *\n * @param executeRequest - Function that executes the network request\n * @param handleRejectedPromise - Function that executes when a rejected promise is received from the request\n *\n * @returns Reponse to the latest request and a function to execute the request in a synchronized manner\n */\nexport function useSynchronizedRequest<RequestDataType, ResponseType>(\n  executeRequest: (data?: RequestDataType) => Promise<ResponseType | undefined>,\n  handleRejectedPromise?: (error: unknown) => void\n): [\n    ResponseType | undefined,\n    (data?: RequestDataType) => Promise<ResponseType | undefined>,\n    () => void\n  ]\n{\n  const executeRequestRef = useRef(executeRequest);\n  const handleRejectedPromiseRef = useRef(handleRejectedPromise);\n  const isMountedRef = useComponentMountStatus();\n  const networkIds = useRef({ latestRequest: 0, responseInState: 0 });\n  const [synchronizedResponse, setSynchronizedResponse] = useState<ResponseType>();\n\n  const executeSynchronizedRequest = useCallback(async (data?: RequestDataType):\n  Promise<ResponseType | undefined> => {\n    const requestId = ++networkIds.current.latestRequest;\n    return new Promise(async (resolve) => {\n      let response: ResponseType | undefined = undefined;\n      try {\n        response = await executeRequestRef.current(data);\n      } catch (e) {\n        handleRejectedPromiseRef.current ? handleRejectedPromiseRef.current(e) : console.error(e);\n      }\n      if (requestId >= networkIds.current.responseInState) {\n        /**\n         * Avoid performing a React state update on an unmounted component\n         * (e.g unmounted during async await)\n         */\n        if (!isMountedRef.current) {\n          return;\n        }\n        setSynchronizedResponse(response);\n        networkIds.current.responseInState = requestId;\n      }\n      resolve(response);\n    });\n  }, [isMountedRef]);\n\n  const clearResponseData = useCallback(() => {\n    setSynchronizedResponse(undefined);\n  }, [setSynchronizedResponse]);\n\n  useEffect(() => {\n    executeRequestRef.current = executeRequest;\n    handleRejectedPromiseRef.current = handleRejectedPromise;\n  });\n\n  return [synchronizedResponse, executeSynchronizedRequest, clearResponseData];\n}","import React from 'react';\n\nexport function VerticalDividerIcon({ className }: { className?: string }): React.JSX.Element {\n  return (\n    <svg className={className}\n      width=\"1\" height=\"24\" viewBox=\"0 0 1 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <rect width=\"1\" height=\"24\" rx=\"0.5\" fill=\"#E1E5E8\" />\n    </svg>\n  );\n}","import React from 'react';\n\nexport function HistoryIcon(): React.JSX.Element {\n  return (\n    <svg viewBox=\"0 0 14 15\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <path d=\"M13.7813 7.75C13.7539 4.00391 10.7188 0.96875 7 0.96875C5.11328 0.96875 3.39063 1.76172 2.16016 2.99219L0.929688 1.76172C0.738281 1.57031 0.382813 1.70703 0.382813 2.00781L0.382813 5.45312C0.382813 5.64453 0.519531 5.78125 0.710938 5.78125L4.21094 5.78125C4.51172 5.78125 4.64844 5.42578 4.45703 5.23437L3.11719 3.92188C4.10156 2.91016 5.46875 2.28125 7 2.28125C10.0078 2.28125 12.4688 4.74219 12.4688 7.75C12.4688 10.7852 10.0078 13.2187 7 13.2188C5.57813 13.2188 4.32031 12.6992 3.33594 11.8516C3.22656 11.7422 3.00781 11.7422 2.89844 11.8516L2.43359 12.3164C2.29688 12.4531 2.29688 12.6719 2.43359 12.8086C3.63672 13.875 5.25 14.5586 7 14.5312C10.7188 14.5312 13.7813 11.4961 13.7813 7.75ZM9.1875 10.2109L9.59766 9.69141C9.67969 9.52734 9.65234 9.33594 9.51563 9.22656L7.65625 7.85937V3.92187C7.65625 3.75781 7.49219 3.59375 7.32813 3.59375H6.67188C6.48047 3.59375 6.34375 3.75781 6.34375 3.92187V8.54297L8.75 10.293C8.88672 10.4023 9.10547 10.375 9.1875 10.2109Z\"/>\n    </svg>\n  );\n}","import React from 'react';\n\nexport function CloseIcon(): React.JSX.Element {\n  return (\n    <svg viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\" fill='currentColor' aria-hidden=\"true\">\n      <path d=\"M10.9095 9.00028L16.6786 3.2311L17.8684 2.04138C18.0439 1.86587 18.0439 1.58067 17.8684 1.40517L16.5954 0.132192C16.4199 -0.0433137 16.1347 -0.0433137 15.9592 0.132192L9.00028 7.0911L2.04138 0.131629C1.86587 -0.0438764 1.58067 -0.0438764 1.40517 0.131629L0.131629 1.40461C-0.0438764 1.58011 -0.0438764 1.86531 0.131629 2.04081L7.0911 9.00028L0.131629 15.9592C-0.0438764 16.1347 -0.0438764 16.4199 0.131629 16.5954L1.40461 17.8684C1.58011 18.0439 1.86531 18.0439 2.04081 17.8684L9.00028 10.9095L14.7695 16.6786L15.9592 17.8684C16.1347 18.0439 16.4199 18.0439 16.5954 17.8684L17.8684 16.5954C18.0439 16.4199 18.0439 16.1347 17.8684 15.9592L10.9095 9.00028Z\" fill=\"#6b7280\"/>\n    </svg>\n  );\n}","import React from 'react';\n\nexport function MagnifyingGlassIcon(): React.JSX.Element {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n      <path\n        d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n    </svg>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport React, {\n  createElement,\n  isValidElement,\n  KeyboardEvent,\n  PropsWithChildren,\n  ReactNode,\n  useEffect,\n  useMemo,\n  useRef,\n  useState\n} from 'react';\nimport { DropdownContext, DropdownContextType } from './DropdownContext';\nimport { InputContext, InputContextType } from './InputContext';\nimport useRootClosePkg from '@restart/ui/useRootClose';\nimport { FocusContext, FocusContextType } from './FocusContext';\nimport { ScreenReader } from '../ScreenReader';\nimport { recursivelyMapChildren } from '../utils/recursivelyMapChildren';\nimport { DropdownItem, DropdownItemProps, DropdownItemWithIndex } from './DropdownItem';\nimport { useLayoutEffect } from '../../hooks/useLayoutEffect';\nimport { useId } from '../../hooks/useId';\n\nconst useRootClose = typeof useRootClosePkg === 'function' ? useRootClosePkg : useRootClosePkg['default'];\n\ninterface DropdownItemData {\n  value: string,\n  itemData?: Record<string, unknown>\n}\n\nexport interface DropdownProps {\n  screenReaderText: string,\n  screenReaderInstructions?: string,\n  parentQuery?: string,\n  onSelect?: (value: string, index: number, focusedItemData: Record<string, unknown> | undefined) => void,\n  onToggle?: (\n    isActive: boolean,\n    prevValue: string,\n    value: string,\n    index: number,\n    focusedItemData: Record<string, unknown> | undefined\n  ) => void,\n  className?: string,\n  activeClassName?: string,\n  alwaysSelectOption?: boolean\n}\n\n/**\n * Dropdown is the parent component for a set of Dropdown-related components.\n *\n * @remarks\n * It provides multiple shared contexts, which are consumed by its child components,\n * and also registers some global event listeners.\n */\nexport function Dropdown(props: PropsWithChildren<DropdownProps>): React.JSX.Element {\n  const { t } = useTranslation();\n  const {\n    children,\n    screenReaderText,\n    screenReaderInstructions,\n    onSelect,\n    onToggle,\n    className,\n    activeClassName,\n    parentQuery,\n    alwaysSelectOption = false\n  } = props;\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const screenReaderUUID = useId('dropdown');\n  const dropdownListUUID = useId('dropdown-list');\n  const [screenReaderKey, setScreenReaderKey] = useState<number>(0);\n  const [hasTyped, setHasTyped] = useState<boolean>(false);\n  const [childrenWithDropdownItemsTransformed, items] = useMemo(() => {\n    return getTransformedChildrenAndItemData(children);\n  }, [children]);\n\n  const inputContext = useInputContextInstance();\n  const { value, setValue, lastTypedOrSubmittedValue, setLastTypedOrSubmittedValue } = inputContext;\n\n  const focusContext = useFocusContextInstance(\n    items,\n    lastTypedOrSubmittedValue,\n    setValue,\n    screenReaderKey,\n    setScreenReaderKey,\n    alwaysSelectOption\n  );\n  const { focusedIndex, focusedItemData, updateFocusedItem } = focusContext;\n\n  const dropdownContext = useDropdownContextInstance(\n    lastTypedOrSubmittedValue,\n    value,\n    focusedIndex,\n    focusedItemData,\n    screenReaderUUID,\n    dropdownListUUID,\n    setHasTyped,\n    onToggle,\n    onSelect\n  );\n  const { toggleDropdown, isActive } = dropdownContext;\n\n  useLayoutEffect(() => {\n    if (parentQuery !== undefined && parentQuery !== lastTypedOrSubmittedValue) {\n      setLastTypedOrSubmittedValue(parentQuery);\n      updateFocusedItem(-1, parentQuery);\n    }\n  }, [\n    parentQuery,\n    lastTypedOrSubmittedValue,\n    updateFocusedItem,\n    setLastTypedOrSubmittedValue\n  ]);\n\n  useRootClose(containerRef as React.RefObject<Element>, () => {\n    toggleDropdown(false);\n  }, { disabled: !isActive });\n\n  function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n    if (!isActive) {\n      return;\n    }\n\n    if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n      e.preventDefault();\n    }\n\n    if (e.key === 'ArrowDown') {\n      if (alwaysSelectOption && focusedIndex === items.length - 1) {\n        updateFocusedItem(0);\n      } else {\n        updateFocusedItem(focusedIndex + 1);\n      }\n    } else if (e.key === 'ArrowUp') {\n      if (alwaysSelectOption && focusedIndex === 0) {\n        updateFocusedItem(items.length - 1);\n      } else {\n        updateFocusedItem(focusedIndex - 1);\n      }\n    } else if (e.key === 'Tab' && !e.shiftKey) {\n      updateFocusedItem(-1);\n      toggleDropdown(false);\n    } else if (!hasTyped) {\n      setHasTyped(true);\n    }\n  }\n\n  return (\n    <div ref={containerRef} className={isActive ? activeClassName : className} onKeyDown={handleKeyDown}>\n      <DropdownContext.Provider value={dropdownContext}>\n        <InputContext.Provider value={inputContext}>\n          <FocusContext.Provider value={focusContext}>\n            {childrenWithDropdownItemsTransformed}\n          </FocusContext.Provider>\n        </InputContext.Provider>\n      </DropdownContext.Provider>\n\n      <ScreenReader\n        announcementKey={screenReaderKey}\n        announcementText={isActive && (hasTyped || items.length || value) ? screenReaderText : ''}\n        instructionsId={screenReaderUUID}\n        instructions={screenReaderInstructions ?? t('dropDownScreenReaderInstructions')}\n      />\n    </div>\n  );\n}\n\nfunction useInputContextInstance(): InputContextType {\n  const [value, setValue] = useState('');\n  const [lastTypedOrSubmittedValue, setLastTypedOrSubmittedValue] = useState('');\n  return {\n    value,\n    setValue,\n    lastTypedOrSubmittedValue,\n    setLastTypedOrSubmittedValue\n  };\n}\n\nfunction useFocusContextInstance(\n  items: DropdownItemData[],\n  lastTypedOrSubmittedValue: string,\n  setValue: (newValue: string) => void,\n  screenReaderKey: number,\n  setScreenReaderKey: (newKey: number) => void,\n  alwaysSelectOption: boolean\n): FocusContextType {\n  const [focusedIndex, setFocusedIndex] = useState(-1);\n  const [focusedValue, setFocusedValue] = useState<string | null>(null);\n  const [focusedItemData, setFocusedItemData] = useState<Record<string, unknown> | undefined>(undefined);\n  useEffect(() => {\n    if (alwaysSelectOption) {\n      if (items.length > 0) {\n        const index = focusedIndex === -1 || focusedIndex >= items.length ? 0 : focusedIndex;\n        setFocusedIndex(index);\n        setFocusedValue(items[index].value);\n        setFocusedItemData(items[index].itemData);\n      } else {\n        setFocusedIndex(-1);\n        setFocusedValue(null);\n        setFocusedItemData(undefined);\n      }\n    }\n  }, [alwaysSelectOption, focusedIndex, items]);\n\n  function updateFocusedItem(updatedFocusedIndex: number, value?: string) {\n    const numItems = items.length;\n    let updatedValue;\n    if (updatedFocusedIndex === -1 || updatedFocusedIndex >= numItems || numItems === 0) {\n      updatedValue = value ?? lastTypedOrSubmittedValue;\n      if (alwaysSelectOption && numItems !== 0) {\n        setFocusedIndex(0);\n        setFocusedItemData(items[0].itemData);\n        setScreenReaderKey(screenReaderKey + 1);\n      } else {\n        setFocusedIndex(-1);\n        setFocusedItemData(undefined);\n        setScreenReaderKey(screenReaderKey + 1);\n      }\n    } else if (updatedFocusedIndex < -1) {\n      const loopedAroundIndex = (numItems + updatedFocusedIndex + 1) % numItems;\n      updatedValue = value ?? items[loopedAroundIndex].value;\n      setFocusedIndex(loopedAroundIndex);\n      setFocusedItemData(items[loopedAroundIndex].itemData);\n    } else {\n      updatedValue = value ?? items[updatedFocusedIndex].value;\n      setFocusedIndex(updatedFocusedIndex);\n      setFocusedItemData(items[updatedFocusedIndex].itemData);\n    }\n    setFocusedValue(updatedValue);\n    setValue(alwaysSelectOption ? (value ?? lastTypedOrSubmittedValue) : updatedValue);\n  }\n\n  return {\n    focusedIndex,\n    focusedValue,\n    focusedItemData,\n    updateFocusedItem\n  };\n}\n\nfunction useDropdownContextInstance(\n  prevValue: string,\n  value: string,\n  index: number,\n  focusedItemData: Record<string, unknown> | undefined,\n  screenReaderUUID: string | undefined,\n  dropdownListUUID: string | undefined,\n  setHasTyped: (hasTyped: boolean) => void,\n  onToggle?: (\n    isActive: boolean,\n    prevValue: string,\n    value: string,\n    index: number,\n    focusedItemData: Record<string, unknown> | undefined\n  ) => void,\n  onSelect?: (value: string, index: number, focusedItemData: Record<string, unknown> | undefined) => void\n): DropdownContextType {\n  const [isActive, _toggleDropdown] = useState(false);\n  const toggleDropdown = (willBeOpen: boolean) => {\n    if (!willBeOpen) {\n      setHasTyped(false);\n    }\n    _toggleDropdown(willBeOpen);\n    onToggle?.(willBeOpen, prevValue, value, index, focusedItemData);\n  };\n  return {\n    isActive,\n    toggleDropdown,\n    onSelect,\n    screenReaderUUID,\n    dropdownListUUID\n  };\n}\n\nfunction getTransformedChildrenAndItemData(children: ReactNode): [ReactNode, DropdownItemData[]] {\n  const items: DropdownItemData [] = [];\n  const childrenWithDropdownItemsTransformed = recursivelyMapChildren(children, (child => {\n    if (!(isValidElement(child) && child.type === DropdownItem)) {\n      return child;\n    }\n    const props = child.props as DropdownItemProps;\n    items.push({\n      value: props.value,\n      itemData: props.itemData\n    });\n    return createElement(DropdownItemWithIndex, { ...props, index: items.length - 1 });\n  }));\n  return [childrenWithDropdownItemsTransformed, items];\n}\n","import { createContext, useContext } from 'react';\n\n/**\n * The Context responsible for the Dropdown state.\n */\nexport type DropdownContextType = {\n  isActive: boolean,\n  screenReaderUUID?: string,\n  dropdownListUUID?: string,\n  toggleDropdown: (visible: boolean) => void,\n  onSelect?: (value: string, index: number, focusedItemData: Record<string, unknown> | undefined) => void\n};\n\nexport const DropdownContext = createContext<DropdownContextType | null>(null);\n\nexport function useDropdownContext(): DropdownContextType {\n  const dropdownContextInstance = useContext(DropdownContext);\n  if (dropdownContextInstance === null) {\n    throw new Error('Tried to use DropdownContext when none exists.');\n  }\n  return dropdownContextInstance;\n}","import { useContext, createContext } from 'react';\n\n/**\n * A Context for a string state value.\n */\nexport type InputContextType = {\n  value: string,\n  setValue: (newValue: string) => void,\n  lastTypedOrSubmittedValue: string,\n  setLastTypedOrSubmittedValue: (newValue: string) => void\n};\n\nexport const InputContext = createContext<InputContextType | null>(null);\n\nexport function useInputContext(): InputContextType {\n  const inputContextInstance = useContext(InputContext);\n  if (inputContextInstance === null) {\n    throw new Error('Tried to use InputContext when none exists.');\n  }\n  return inputContextInstance;\n}","import { createContext, useContext } from 'react';\n\n/**\n * The data associated with the currently focused item.\n *\n * @public\n */\nexport type FocusedItemData = Record<string, unknown>;\n\n/**\n * The Context responsible for the currently focused item in a Dropdown.\n */\nexport type FocusContextType = {\n  focusedIndex: number,\n  focusedValue: string | null,\n  focusedItemData: FocusedItemData | undefined,\n  updateFocusedItem: (index: number, value?: string) => void\n};\n\nexport const FocusContext = createContext<FocusContextType | null>(null);\n\nexport function useFocusContext(): FocusContextType {\n  const focusContextInstance = useContext(FocusContext);\n  if (focusContextInstance === null) {\n    throw new Error('Tried to use FocusContext when none exists.');\n  }\n  return focusContextInstance;\n}\n","import React from 'react';\n\ninterface Props {\n  instructionsId?: string,\n  instructions: string,\n  announcementKey: number,\n  announcementText: string\n}\n\nexport function ScreenReader({\n  instructionsId,\n  instructions,\n  announcementKey,\n  announcementText,\n}: Props): React.JSX.Element | null {\n\n  return (\n    <>\n      <div\n        id={instructionsId}\n        className='sr-only'\n      >\n        {instructions}\n      </div>\n      <div\n        className='sr-only'\n        key={announcementKey}\n        aria-live='polite'\n        aria-atomic='true'\n      >\n        {announcementText}\n      </div>\n    </>\n  );\n}\n","import { Children, cloneElement, isValidElement, ReactElement, ReactNode, ReactPortal } from 'react';\n\n/**\n * Recursively performs React.Children.map on a given ReactNode.\n */\nexport function recursivelyMapChildren(\n  children: ReactNode,\n  elementReplacer: (c: ReactElement | ReactPortal, index: number) => ReactNode | null\n): ReactNode {\n  return Children.map<ReactNode, ReactNode>(children, (c, index) => {\n    if (!isValidElement(c)) {\n      return c;\n    }\n    const replacedElement = elementReplacer(c, index);\n    if (!replacedElement || !isValidElement(replacedElement)) {\n      return replacedElement;\n    }\n    if (!('props' in replacedElement)) {\n      return replacedElement;\n    }\n    const grandchildren = (replacedElement as ReactElement<{ children?: ReactNode }>).props.children;\n    if (!grandchildren) {\n      return replacedElement;\n    }\n    const replacedGrandchildren = recursivelyMapChildren(grandchildren, elementReplacer);\n    return cloneElement(replacedElement, {}, [replacedGrandchildren]);\n  });\n}","import React, { PropsWithChildren, useCallback } from 'react';\nimport { useDropdownContext } from './DropdownContext';\nimport { FocusedItemData, useFocusContext } from './FocusContext';\nimport { generateDropdownId } from './generateDropdownId';\nimport { useInputContext } from './InputContext';\nimport { twMerge } from '../../hooks/useComposedCssClasses';\n\n/**\n * Props for the {@link DropdownItem}.\n *\n * @public\n */\nexport type DropdownItemProps = PropsWithChildren<{\n  /** The value associated with the dropdown item. */\n  value: string,\n  /** The CSS classes which put on the dropdown item. */\n  className?: string,\n  /** The CSS classes put on the dropdown item when it is focused. */\n  focusedClassName?: string,\n  /** Data associated with the dropdown item which is passed to the onClick and the onSelect handlers. */\n  itemData?: Record<string, unknown> | undefined,\n  /** A function which is fired when the item is clicked. */\n  onClick?: (value: string, index: number, focusedItemData: FocusedItemData | undefined) => void,\n  /** Screenreader text. */\n  ariaLabel?: string | ((value: string) => string)\n}>;\n\n/**\n * A wrapper component for specifying a DropdownItemWithIndex.\n * The index will be automatically provided by the Dropdown component instance.\n *\n * @public\n */\nexport function DropdownItem(_props: DropdownItemProps): React.JSX.Element | null { return null; }\n\nexport function DropdownItemWithIndex(props: DropdownItemProps & { index: number }): React.JSX.Element {\n  const {\n    children,\n    value,\n    index,\n    className,\n    focusedClassName,\n    itemData,\n    onClick,\n    ariaLabel\n  } = props;\n\n  const { toggleDropdown, onSelect, screenReaderUUID } = useDropdownContext();\n  const { focusedIndex, updateFocusedItem } = useFocusContext();\n  const { setValue, setLastTypedOrSubmittedValue } = useInputContext();\n\n  const isFocused = focusedIndex === index;\n\n  const handleClick = useCallback(() => {\n    toggleDropdown(false);\n    updateFocusedItem(-1);\n    setLastTypedOrSubmittedValue(value);\n    setValue(value);\n    onSelect?.(value, index, itemData);\n    onClick?.(value, index, itemData);\n  }, [\n    index,\n    itemData,\n    onClick,\n    onSelect,\n    setLastTypedOrSubmittedValue,\n    setValue,\n    toggleDropdown,\n    updateFocusedItem,\n    value\n  ]);\n\n  const baseButtonClasses = 'bg-transparent border-0 p-0 m-0 font-inherit text-inherit text-left '\n    + 'cursor-pointer w-full self-stretch box-border';\n  const combinedClassName = twMerge(\n    baseButtonClasses,\n    isFocused ? focusedClassName ?? '' : className ?? ''\n  );\n\n  return (\n    <button\n      id={generateDropdownId(screenReaderUUID, index)}\n      type=\"button\"\n      tabIndex={-1}\n      className={combinedClassName}\n      onClick={handleClick}\n      aria-label={typeof ariaLabel === 'function' ? ariaLabel(value) : ariaLabel}\n      role=\"option\"\n      aria-selected={isFocused}\n    >\n      {children}\n    </button>\n  );\n}\n","/**\n * Generates an id for a {@link DropdownItem}, for use with aria\n * attributes like aria-activedescendant.\n *\n * @param screenReaderUUID - the shared UUID for the {@link Dropdown} instance\n * @param index - the index of the dropdown item in question\n */\nexport function generateDropdownId(screenReaderUUID: string | undefined, index: number): string {\n  if (!screenReaderUUID) return '';\n  return screenReaderUUID + '_' + index;\n}","import { useMemo } from 'react';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * We extend the base tailwind-merge so that conflicts between custom classes can be\n * handled correctly.\n *\n * When new tailwind classes are introduced they should be added to the `classGroups` object below.\n *\n * @example\n * tailwindcss/forms adds the form-input, form-checkbox, etc. classes,\n * so we need to add the 'form' class group here for twMerge to recognize form-input\n * and form-checkbox as conflicting classes.\n */\nexport const twMerge = extendTailwindMerge({\n  classGroups: {\n    form: ['input', 'checkbox', 'textarea', 'select', 'multiselect', 'radio'].map(v => 'form-' + v)\n  }\n});\n\n/**\n * useComposedCssClasses merges a component's built-in tailwind classes with custom tailwind classes.\n *\n * @remarks\n * Tailwind classes will be merged without conflict, with custom classes having higher priority\n * than built-in ones.\n *\n * @example\n * Suppose a component has built-in classes of `{ container: 'px-4 text-slate-700' }`.\n *\n * Passing in the custom classes:\n *\n * ```ts\n * { container: 'text-red-200 mb-3' }\n * ```\n *\n * results in the merged classes of:\n *\n * ```ts\n * { container: 'px-4 text-red-200 mb-3' }\n * ```\n *\n * @public\n *\n * @param builtInClasses - The component's built-in tailwind classes\n * @param customClasses - The custom tailwind classes to merge with the built-in ones\n * @param disableBuiltInClasses - If set to true, the customClasses with replace\n * (not merge with) the builtInClasses\n * @returns The composed CSS classes\n */\nexport function useComposedCssClasses<\n  ClassInterface extends Partial<Record<keyof ClassInterface & string, string>>\n>(\n  builtInClasses: Readonly<ClassInterface>,\n  customClasses?: Partial<ClassInterface>,\n  disableBuiltInClasses = false\n): ClassInterface {\n  return useMemo(() => {\n    if (disableBuiltInClasses && customClasses) {\n      return customClasses as Readonly<ClassInterface>;\n    }\n    const mergedCssClasses = { ...builtInClasses };\n    if (!customClasses) {\n      return mergedCssClasses;\n    }\n    Object.keys(customClasses).forEach(key => {\n      const builtIn = (builtInClasses as any)[key];\n      const custom = (customClasses as any)[key];\n      if (!builtIn || !custom) {\n        (mergedCssClasses as any)[key] = custom || builtIn;\n      } else {\n        (mergedCssClasses as any)[key] = twMerge(builtIn, custom);\n      }\n    });\n    return mergedCssClasses;\n  }, [builtInClasses, customClasses, disableBuiltInClasses]);\n}\n","import useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\n\nexport const useLayoutEffect = typeof useIsomorphicLayoutEffect === 'function'\n  ? useIsomorphicLayoutEffect\n  : useIsomorphicLayoutEffect['default'];\n","// Copied with minor modifications from\n// https://github.com/reach/reach-ui/blob/dev/packages/auto-id/src/reach-auto-id.ts\n\nimport React, { useEffect, useState } from 'react';\nimport { useLayoutEffect } from './useLayoutEffect';\n\nlet serverHandoffComplete = false;\nlet id = 0;\nfunction genId(baseName: string): string {\n  ++id;\n  return baseName + '-' + id.toString();\n}\n\n// Workaround for https://github.com/webpack/webpack/issues/14814\n// https://github.com/eps1lon/material-ui/blob/8d5f135b4d7a58253a99ab56dce4ac8de61f5dc1/packages/mui-utils/src/useId.ts#L21\nconst maybeReactUseId: undefined | (() => string) = (React as any)[\n  'useId'.toString()\n];\n\n/**\n * useId\n *\n * Autogenerate IDs to facilitate WAI-ARIA and server rendering.\n *\n * Note: The returned ID will initially be empty string and will update after a\n * component mounts.\n *\n * @see Docs https://reach.tech/auto-id\n */\n\nexport function useId(baseName: string): string {\n  const reactId = maybeReactUseId?.();\n\n  // If this instance isn't part of the initial render, we don't have to do the\n  // double render/patch-up dance. We can just generate the ID and return it.\n  const initialId = (serverHandoffComplete ? genId(baseName) : '');\n  const [id, setId] = useState(initialId);\n\n  useLayoutEffect(() => {\n    if (id === '') {\n      // Patch the ID after render. We do this in `useLayoutEffect` to avoid any\n      // rendering flicker, though it'll make the first render slower (unlikely\n      // to matter, but you're welcome to measure your app and let us know if\n      // it's a problem).\n      setId(genId(baseName));\n    }\n  }, [baseName, id]);\n\n  useEffect(() => {\n    if (serverHandoffComplete === false) {\n      // Flag all future uses of `useId` to skip the update dance. This is in\n      // `useEffect` because it goes after `useLayoutEffect`, ensuring we don't\n      // accidentally bail out of the patch-up dance prematurely.\n      serverHandoffComplete = true;\n    }\n  }, []);\n\n  return reactId ?? id;\n}\n","import React, { ChangeEvent, KeyboardEvent, useCallback, useRef, useState } from 'react';\nimport { useDropdownContext } from './DropdownContext';\nimport { useFocusContext, FocusedItemData } from './FocusContext';\nimport { generateDropdownId } from './generateDropdownId';\nimport { useInputContext } from './InputContext';\n\n/**\n * An input component for use within a Dropdown.\n */\nexport function DropdownInput(props: {\n  className?: string,\n  placeholder?: string,\n  inputId?: string,\n  ariaLabel?: string,\n  ariaLabelledBy?: string,\n  ariaDescribedBy?: string,\n  onSubmit?: (value: string, index: number, focusedItemData: FocusedItemData | undefined ) => void,\n  onFocus?: (value: string) => void,\n  onChange?: (value: string) => void,\n  submitCriteria?: (index: number) => boolean\n}): React.JSX.Element {\n  const {\n    className,\n    placeholder,\n    inputId,\n    ariaLabel,\n    ariaLabelledBy,\n    ariaDescribedBy,\n    onSubmit,\n    onFocus,\n    onChange,\n    submitCriteria\n  } = props;\n\n  const inputRef = useRef<HTMLInputElement>(null);\n  const { toggleDropdown, onSelect, screenReaderUUID, dropdownListUUID, isActive } = useDropdownContext();\n  const { value = '', setLastTypedOrSubmittedValue } = useInputContext();\n  const {\n    focusedIndex = -1,\n    focusedItemData,\n    focusedValue,\n    updateFocusedItem\n  } = useFocusContext();\n  const [isTyping, setIsTyping] = useState<boolean>(true);\n  const describedBy = [screenReaderUUID, ariaDescribedBy].filter(Boolean).join(' ') || undefined;\n  const resolvedAriaLabel = ariaLabelledBy ? undefined : ariaLabel;\n\n  const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n    setIsTyping(true);\n    toggleDropdown(true);\n    onChange?.(e.target.value);\n    updateFocusedItem(-1, e.target.value);\n    setLastTypedOrSubmittedValue(e.target.value);\n  }, [onChange, setLastTypedOrSubmittedValue, toggleDropdown, updateFocusedItem]);\n\n  const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n    if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Tab') {\n      setIsTyping(false);\n    }\n    if (e.key === 'Enter' && (!submitCriteria || submitCriteria(focusedIndex))) {\n      updateFocusedItem(focusedIndex);\n      toggleDropdown(false);\n      inputRef.current?.blur();\n      onSubmit?.(value, focusedIndex, focusedItemData);\n      if (focusedIndex >= 0) {\n        onSelect?.(value, focusedIndex, focusedItemData);\n      }\n      updateFocusedItem(-1, focusedValue ?? undefined);\n    }\n  }, [\n    focusedIndex,\n    focusedValue,\n    focusedItemData,\n    onSelect,\n    onSubmit,\n    submitCriteria,\n    toggleDropdown,\n    updateFocusedItem,\n    value\n  ]);\n\n  const handleFocus = useCallback(() => {\n    toggleDropdown(true);\n    updateFocusedItem(-1);\n    onFocus?.(value);\n  }, [onFocus, toggleDropdown, updateFocusedItem, value]);\n\n  return (\n    <input\n      ref={inputRef}\n      className={className}\n      placeholder={placeholder}\n      value={value}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      onFocus={handleFocus}\n      id={inputId ?? generateDropdownId(screenReaderUUID, -1)}\n      autoComplete='off'\n      aria-describedby={describedBy}\n      aria-activedescendant={\n        !isTyping ? generateDropdownId(screenReaderUUID, focusedIndex) : undefined\n      }\n      aria-label={resolvedAriaLabel}\n      aria-labelledby={ariaLabelledBy}\n      aria-autocomplete=\"list\"\n      role=\"combobox\"\n      aria-controls={dropdownListUUID}\n      aria-expanded={isActive ? 'true' : 'false'}\n      aria-haspopup=\"listbox\"\n    />\n  );\n}","import React, { PropsWithChildren } from 'react';\nimport { useDropdownContext } from './DropdownContext';\n\n/**\n * DropdownMenu is a container for the overlay portion of a Dropdown.\n */\nexport function DropdownMenu(\n  { children }: PropsWithChildren<unknown>\n): React.JSX.Element | null {\n  const { isActive, dropdownListUUID } = useDropdownContext();\n  if (!isActive) {\n    return null;\n  }\n\n  return <div id={dropdownListUUID} role=\"listbox\">{children}</div>;\n}\n","import { useTranslation } from 'react-i18next';\nimport { MagnifyingGlassIcon } from '../icons/MagnifyingGlassIcon';\nimport React from 'react';\n\ninterface Props {\n  handleClick: () => void,\n  className?: string\n}\n\nexport function SearchButton({ handleClick, className }: Props): React.JSX.Element {\n  const { t } = useTranslation();\n  return (\n    <button\n      className={className}\n      onClick={handleClick}\n      aria-label={t('submitSearch')}\n    >\n      <MagnifyingGlassIcon />\n    </button>\n  );\n}","import { HighlightedValue } from '@yext/search-headless-react';\nimport React from 'react';\n\nconst defaultCssClasses: HighlightedValueCssClasses = {\n  highlighted: 'font-normal',\n  nonHighlighted: 'font-semibold'\n};\n\n/**\n * The CSS class interface for {@link renderHighlightedValue}.\n *\n * @public\n */\nexport interface HighlightedValueCssClasses {\n  highlighted?: string,\n  nonHighlighted?: string\n}\n\n/**\n * Renders a HighlightedValue with highlighting based on its matchedSubstrings.\n * @returns React.JSX.Element\n *\n * @public\n *\n * @param highlightedValueOrString - the text to add highlight to.\n * @param customCssClasses - css classes use for the non-highlighted and highlighted text.\n */\nexport function renderHighlightedValue(\n  highlightedValueOrString: Partial<HighlightedValue> | string,\n  customCssClasses?: HighlightedValueCssClasses\n): React.JSX.Element {\n  const { value = '', matchedSubstrings } =\n    typeof highlightedValueOrString === 'string'\n      ? { value: highlightedValueOrString, matchedSubstrings: [] }\n      : highlightedValueOrString;\n\n  const cssClasses = { ...defaultCssClasses, ...customCssClasses };\n  if (!matchedSubstrings || matchedSubstrings.length === 0) {\n    return <span>{value}</span>;\n  }\n  const substrings = [...matchedSubstrings];\n  substrings.sort((a, b) => a.offset - b.offset);\n  const highlightedJSX: React.JSX.Element[] = [];\n  let curr = 0;\n  for (const { offset, length } of substrings) {\n    if (offset > curr) {\n      highlightedJSX.push(\n        <span key={curr} className={cssClasses.nonHighlighted} >{value.substring(curr, offset)}</span>\n      );\n    }\n    highlightedJSX.push(\n      <span key={offset} className={cssClasses.highlighted}>{value.substring(offset, offset + length)}</span>\n    );\n    curr = offset + length;\n  }\n  if (curr < value.length) {\n    highlightedJSX.push(\n      <span key={curr} className={cssClasses.nonHighlighted} >{value.substring(curr)}</span>\n    );\n  }\n  return <>{highlightedJSX}</>;\n}","import { AutocompleteResult } from '@yext/search-headless-react';\nimport { renderHighlightedValue } from './renderHighlightedValue';\nimport React from 'react';\n\n/**\n * The CSS class interface for the Autocomplete Result.\n *\n * @public\n */\nexport interface AutocompleteResultCssClasses {\n  option?: string,\n  icon?: string,\n  highlighted?: string,\n  nonHighlighted?: string\n}\n\nexport const builtInCssClasses: Readonly<AutocompleteResultCssClasses> = {\n  option: 'whitespace-no-wrap max-w-full px-3 text-neutral-dark truncate',\n  icon: 'w-6 h-full flex-shrink-0 text-gray-400'\n};\n\n/**\n * Renders an autocomplete result, including an icon to the left if provided.\n * @param result - The result to render\n * @returns React.JSX.Element\n */\nexport function renderAutocompleteResult(\n  result: AutocompleteResult,\n  cssClasses: AutocompleteResultCssClasses = {},\n  Icon?: React.FunctionComponent<React.SVGProps<SVGSVGElement>>\n): React.JSX.Element {\n  return (<>\n    {Icon && <div className={cssClasses.icon}>\n      <Icon />\n    </div>}\n    <div className={cssClasses.option}>\n      {renderHighlightedValue(result, cssClasses)}\n    </div>\n  </>);\n}\n","import { createContext, useContext } from 'react';\nimport { SearchAnalyticsEventService } from '../models/SearchAnalyticsEventService';\n\nexport const AnalyticsContext = createContext<SearchAnalyticsEventService | null>(null);\n\n/**\n * Returns a service that can be used to report analytics events.\n *\n * @public\n */\nexport function useAnalytics(): SearchAnalyticsEventService | null {\n  return useContext(AnalyticsContext);\n}\n","import { useAnalytics } from './useAnalytics';\nimport { useSearchState } from '@yext/search-headless-react';\n\ntype SearchBarAnalyticsType = 'AUTO_COMPLETE_SELECTION' | 'SEARCH_CLEAR_BUTTON';\n\nexport function useSearchBarAnalytics(): (\n  analyticsEventType: SearchBarAnalyticsType\n) => void {\n  const analytics = useAnalytics();\n  const verticalKey = useSearchState(state => state.vertical.verticalKey);\n  const queryId = useSearchState(state => state.query.queryId);\n  const searchId = useSearchState(state => state.meta.uuid);\n  const locale = useSearchState(state => state.meta.locale);\n  const experienceKey = useSearchState(state => state.meta.experienceKey);\n  const searchTerm = useSearchState(state => state.query.mostRecentSearch);\n\n  const reportAutocompleteEvent = () => {\n    if (!experienceKey) {\n      console.error('Unable to report an autocomplete event. Missing field: experienceKey.');\n      return;\n    }\n    analytics?.report({\n      action: 'AUTO_COMPLETE_SELECTION',\n      locale,\n      searchId,\n      queryId,\n      verticalKey,\n      experienceKey,\n      searchTerm,\n    });\n  };\n  const reportSearchClearEvent = () => {\n    if (!experienceKey) {\n      console.error('Unable to report a search clear event. Missing field: experienceKey.');\n      return;\n    }\n    analytics?.report({\n      action: 'SEARCH_CLEAR_BUTTON',\n      locale,\n      searchId,\n      queryId,\n      verticalKey,\n      experienceKey,\n      searchTerm,\n    });\n  };\n  return (\n    analyticsEventType: SearchBarAnalyticsType\n  ) => {\n    if (!analytics) {\n      return;\n    }\n    analyticsEventType === 'AUTO_COMPLETE_SELECTION'\n      ? reportAutocompleteEvent()\n      : reportSearchClearEvent();\n  };\n}\n","/**\n * Data needed to create a URL to a vertical search page.\n *\n * @public\n */\nexport interface VerticalLink {\n  /** The vertical key associated with the vertical link. */\n  verticalKey: string,\n  /** The query used when the vertical link is selected. */\n  query?: string\n}\n\nexport const isVerticalLink = (obj: unknown): obj is VerticalLink => {\n  return typeof obj === 'object' && !!obj && 'verticalKey' in obj;\n};","import { NearFilterValue, FieldValueFilter, NumberRangeValue, Matcher, SearchActions, DisplayableFacet, SelectableStaticFilter, StaticFilter } from '@yext/search-headless-react';\nimport isEqual from 'lodash/isEqual.js';\nimport { isNumberRangeFilter } from '../models/NumberRangeFilter';\nimport { SelectableFieldValueFilter } from '../models/SelectableFieldValueFilter';\n\n/**\n * Check if the object follows NearFilterValue interface.\n */\nexport function isNearFilterValue(obj: unknown): obj is NearFilterValue {\n  return typeof obj === 'object' && !!obj && 'radius' in obj && 'lat' in obj && 'long' in obj;\n}\n\n/**\n * Checks if the object follows the NumberRangeValue interface.\n */\nexport function isNumberRangeValue(obj: unknown): obj is NumberRangeValue {\n  return typeof obj === 'object' && !!obj && ('start' in obj || 'end' in obj);\n}\n\n/**\n * Checks if the facet is a string facet with string options.\n */\nexport function isStringFacet(facet: DisplayableFacet): boolean {\n  return facet.options.length > 0 && typeof facet.options[0].value === 'string';\n}\n\n/**\n * Checks if the facet is a numerical facet with number range filter options.\n */\nexport function isNumericalFacet(facet: DisplayableFacet): boolean {\n  return facet.options.length > 0 &&\n    facet.options.some(option => isNumberRangeFilter(option));\n}\n\n/**\n * Returns true if the two given field value filters are the same.\n */\nexport function isDuplicateFieldValueFilter(\n  thisFilter: FieldValueFilter,\n  otherFilter: FieldValueFilter\n): boolean {\n  if (thisFilter.fieldId !== otherFilter.fieldId) {\n    return false;\n  }\n  if (thisFilter.matcher !== otherFilter.matcher) {\n    return false;\n  }\n  return isEqual(thisFilter.value, otherFilter.value);\n}\n\n/**\n * Returns true if the two given static filters are the same.\n */\nexport function isDuplicateStaticFilter(thisFilter: StaticFilter, otherFilter: StaticFilter): boolean {\n  if (thisFilter.kind === 'fieldValue') {\n    return otherFilter.kind === 'fieldValue'\n      ? isDuplicateFieldValueFilter(thisFilter, otherFilter)\n      : false;\n  }\n\n  if (otherFilter.kind === 'fieldValue') {\n    return false;\n  }\n\n  return thisFilter.combinator === otherFilter.combinator\n    && thisFilter.filters.length === otherFilter.filters.length\n    && thisFilter.filters.every(t => otherFilter.filters.some(o => isDuplicateStaticFilter(t, o)))\n    && otherFilter.filters.every(o => thisFilter.filters.some(t => isDuplicateStaticFilter(o, t)));\n}\n\n/**\n * Finds the {@link SelectableFieldValueFilter} from the list provided that matches\n * the given {@link FieldValueFilter}. If no matching {@link SelectableFieldValueFilter}\n * can be found, undefined is returned.\n *\n * @param filter - The filter to match against\n * @param selectableFilters - The list of {@link SelectableFieldValueFilter}s to search against\n */\nexport function findSelectableFieldValueFilter(\n  filter: FieldValueFilter,\n  selectableFilters: SelectableFieldValueFilter[]\n): SelectableFieldValueFilter | undefined {\n  return selectableFilters.find(selectableFilter => {\n    const { displayName: _, ...storedFilter } = selectableFilter;\n    return isDuplicateFieldValueFilter(storedFilter, filter);\n  });\n}\n\n/**\n * Creates a number range value based on a min and max from user input.\n */\nexport function parseNumberRangeInput(minRangeInput: string, maxRangeInput: string): NumberRangeValue {\n  const minRange = parseNumber(minRangeInput);\n  const maxRange = parseNumber(maxRangeInput);\n\n  return {\n    ...(minRange !== undefined && {\n      start: {\n        matcher: Matcher.GreaterThanOrEqualTo,\n        value: minRange\n      }\n    }),\n    ...(maxRange !== undefined && {\n      end: {\n        matcher: Matcher.LessThanOrEqualTo,\n        value: maxRange\n      }\n    })\n  };\n}\n\n/**\n * Given a string, returns the corresponding number, or undefined if it is NaN.\n */\nfunction parseNumber(num: string) {\n  const parsedNum = parseFloat(num);\n  if (isNaN(parsedNum)) {\n    return undefined;\n  }\n  return parsedNum;\n}\n\n/**\n * Deselects the selected static number range filters in state. If fieldIds are\n * provided, only filters corresponding to one of those fieldIds are deselected.\n * Otherwise, all selected filters are deselected.\n */\nexport function clearStaticRangeFilters(searchActions: SearchActions, fieldIds?: Set<string>) {\n  const selectedStaticRangeFilters = searchActions.state?.filters?.static?.filter(filter =>\n    isNumberRangeFilter(filter)\n    && filter.selected === true\n    && (!fieldIds || fieldIds.has(filter.fieldId))\n  );\n  selectedStaticRangeFilters?.forEach(filter => {\n    searchActions.setFilterOption({\n      ...filter,\n      selected: false\n    });\n  });\n}\n\n/**\n * Returns a set of fieldIds of the numerical facets in state that have at\n * least one option selected.\n */\nexport function getSelectedNumericalFacetFields(searchActions: SearchActions): Set<string> {\n  const selectedNumericalFacets = searchActions.state.filters.facets?.filter(\n    f => isNumericalFacet(f) && f.options.some(o => o.selected)\n  ) ?? [];\n  return new Set(selectedNumericalFacets.map(f => f.fieldId));\n}\n\n/**\n * Goes through the provided static filters and returns all that are field value\n * filters.\n *\n * @param staticFilters - The list of {@link SelectableStaticFilter}s to search through\n * @returns All filters that are {@link SelectableFieldValueFilter}s\n */\nexport function getSelectableFieldValueFilters(\n  staticFilters: SelectableStaticFilter[]\n): SelectableFieldValueFilter[] {\n  return staticFilters.map(s => {\n    const { filter: { kind, ...filterFields }, ...displayFields } = s;\n    if (kind === 'fieldValue') {\n      return {\n        ...displayFields,\n        ...filterFields\n      };\n    }\n    return undefined;\n  }).filter((s): s is SelectableFieldValueFilter => !!s);\n}\n\n/**\n * Creates the filter's display name based on the number range.\n */\nexport function getDefaultFilterDisplayName(numberRange: NumberRangeValue) {\n  const start = numberRange.start;\n  const end = numberRange.end;\n\n  if (start && end) {\n    return `${start.value} - ${end.value}`;\n  } else if (start && !end) {\n    return `Over ${start.value}`;\n  } else if (end && !start) {\n    return `Up to ${end.value}`;\n  }\n  return '';\n}\n","import { FieldValueFilter, Matcher, NumberRangeValue } from '@yext/search-headless-react';\nimport { isNumberRangeValue } from '../utils/filterutils';\n\nexport interface NumberRangeFilter extends FieldValueFilter {\n  value: NumberRangeValue,\n  matcher: Matcher.Between\n}\n\nexport function isNumberRangeFilter(unknownFilter: unknown = {}): unknownFilter is NumberRangeFilter {\n  const filter = unknownFilter as NumberRangeFilter;\n  return (filter.matcher === Matcher.Between) && isNumberRangeValue(filter.value);\n}","import { Trans } from 'react-i18next';\nimport { useSearchState, useSearchActions } from '@yext/search-headless-react';\nimport classNames from 'classnames';\nimport React, { useCallback, useMemo } from 'react';\nimport { useComposedCssClasses } from '../hooks';\nimport { executeSearch } from '../utils';\n\n/**\n * The CSS Class interface for SpellCheck.\n *\n * @public\n */\nexport interface SpellCheckCssClasses {\n  spellCheckLoading?: string,\n  spellCheckContainer?: string,\n  helpText?: string,\n  link?: string\n}\n\nconst builtInCssClasses: Readonly<SpellCheckCssClasses> = {\n  spellCheckLoading: 'opacity-50',\n  spellCheckContainer: 'text-lg pb-3',\n  helpText: 'text-neutral',\n  link: 'text-primary font-bold hover:underline focus:underline'\n};\n\n/**\n * The props for the {@link SpellCheck} component.\n *\n * @public\n */\nexport interface SpellCheckProps {\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: SpellCheckCssClasses,\n  /** A function which is called when a spell check suggestion is clicked. */\n  onClick?: (data: { correctedQuery: string, verticalKey: string }) => void\n}\n\n/**\n * Renders a suggested query if the Search API provides one.\n *\n * @public\n *\n * @param props - {@link SpellCheckProps}\n * @returns A react component for spell check, or null if none exists\n */\nexport function SpellCheck({\n  customCssClasses,\n  onClick\n}: SpellCheckProps): React.JSX.Element | null {\n  const verticalKey = useSearchState(state => state.vertical.verticalKey) ?? '';\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const correctedQuery = useSearchState(state => state.spellCheck.correctedQuery) ?? '';\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n  const containerClassNames = classNames(cssClasses.spellCheckContainer, {\n    [cssClasses.spellCheckLoading ?? '']: isLoading\n  });\n  const searchActions = useSearchActions();\n  const handleClickSuggestion = useCallback(() => {\n    searchActions.setQuery(correctedQuery);\n    onClick\n      ? onClick({ correctedQuery, verticalKey })\n      : executeSearch(searchActions);\n  }, [searchActions, correctedQuery, onClick, verticalKey]);\n\n  const suggestionComponents = useMemo(() => ({\n    button: (\n      <button\n        className={cssClasses.link}\n        onClick={handleClickSuggestion}\n      />\n    )\n  }), [cssClasses.link, handleClickSuggestion]);\n  const suggestionValues = useMemo(() => ({ correctedQuery }), [correctedQuery]);\n\n  if (!correctedQuery) {\n    return null;\n  }\n\n  return (\n    <div className={containerClassNames}>\n      <span className={cssClasses.helpText}>\n        <Trans\n          i18nKey='didYouMean'\n          components={suggestionComponents}\n          values={suggestionValues}\n        />\n      </span>\n    </div>\n  );\n}\n","import { useCallback } from 'react';\nimport { DefaultRawDataType } from '../models/index';\nimport {\n  CardAnalyticsDataType,\n  CardAnalyticsType,\n  useCardAnalytics\n} from './useCardAnalytics';\n\n/**\n * Creates a memoized function for reporting card analytics.\n *\n * @public\n *\n * @param result - result that contains data use in the card analytics event.\n * @param analyticsType - the card analytics event type to report.\n */\nexport function useCardAnalyticsCallback<T = DefaultRawDataType>(\n  result: CardAnalyticsDataType<T>,\n  analyticsType: CardAnalyticsType\n): () => void {\n  const reportAnalyticsEvent = useCardAnalytics<T>();\n  return useCallback(() => {\n    reportAnalyticsEvent(result, analyticsType);\n  }, [analyticsType, reportAnalyticsEvent, result]);\n}\n\n","import { DirectAnswer as DirectAnswerData, DirectAnswerType, Result, useSearchState } from '@yext/search-headless-react';\nimport { useCallback } from 'react';\nimport { FeedbackType } from '../components/ThumbsFeedback';\nimport { DefaultRawDataType } from '../models/index';\nimport { useAnalytics } from './useAnalytics';\nimport { GdaClickEventData } from '../components/GenerativeDirectAnswer';\nimport { SearchAction } from '../models/SearchEventPayload';\n\n/**\n * Analytics event types for cta click, title click, and citation click.\n *\n * @public\n */\nexport type CardCtaEventType = 'CTA_CLICK' | 'TITLE_CLICK' | 'CITATION_CLICK' | 'DRIVING_DIRECTIONS' | 'VIEW_WEBSITE' | 'TAP_TO_CALL';\n\n/**\n * The data types use to construct the payload in the analytics event.\n *\n * @public\n */\nexport type CardAnalyticsDataType<T = DefaultRawDataType> = DirectAnswerData | Result<T> | GdaClickEventData;\n\n/**\n * Analytics event types for interactions on a card.\n *\n * @public\n */\nexport type CardAnalyticsType = CardCtaEventType | FeedbackType;\n\nfunction isDirectAnswer(data: unknown): data is DirectAnswerData {\n  return (data as DirectAnswerData)?.type === DirectAnswerType.FeaturedSnippet ||\n      (data as DirectAnswerData)?.type === DirectAnswerType.FieldValue;\n}\n\nfunction isGenerativeDirectAnswer(data: unknown): data is GdaClickEventData {\n  return !!(data as GdaClickEventData)?.destinationUrl;\n}\n\nexport function useCardAnalytics<T>(): (\n  cardResult: CardAnalyticsDataType<T>, analyticsEventType: CardAnalyticsType\n) => void {\n  const analytics = useAnalytics();\n  const verticalKey = useSearchState(state => state.vertical?.verticalKey);\n  const queryId = useSearchState(state => state.query.queryId);\n  const searchId = useSearchState(state => state.meta.uuid);\n  const locale = useSearchState(state => state.meta.locale);\n  const experienceKey = useSearchState(state => state.meta.experienceKey);\n  const searchTerm = useSearchState(state => state.query.mostRecentSearch);\n\n  const reportCtaEvent = useCallback((\n    result: CardAnalyticsDataType<T>,\n    eventType: CardCtaEventType\n  ) => {\n    let url: string | undefined, entityId: string | undefined;\n    let directAnswer = false;\n    let generativeDirectAnswer = false;\n    if (isDirectAnswer(result)) {\n      url = result.relatedResult.link;\n      entityId = result.relatedResult.id;\n      directAnswer = true;\n    } else if (isGenerativeDirectAnswer(result)) {\n      url = result.destinationUrl;\n      entityId = result.searchResult?.id;\n      directAnswer = true;\n      generativeDirectAnswer = true;\n    } else {\n      url = result.link;\n      entityId = result.id;\n    }\n\n    if (!queryId) {\n      console.error('Unable to report a CTA event. Missing field: queryId.');\n      return;\n    }\n    if (!searchId) {\n      console.error('Unable to report a CTA event. Missing field: searchId.');\n      return;\n    }\n    if (!experienceKey) {\n      console.error('Unable to report a CTA event. Missing field: experienceKey.');\n      return;\n    }\n    // convert the legacy card event type to the format the current reporter expects.\n    const action: SearchAction = eventType === 'TITLE_CLICK'\n      ? 'TITLE'\n      : eventType === 'VIEW_WEBSITE'\n        ? 'WEBSITE'\n        : eventType;\n    analytics?.report({\n      action: action,\n      destinationUrl: url,\n      entity: entityId,\n      locale,\n      searchId,\n      queryId,\n      verticalKey: verticalKey || '',\n      isDirectAnswer: directAnswer,\n      isGenerativeDirectAnswer: generativeDirectAnswer,\n      experienceKey,\n      searchTerm,\n    });\n  }, [analytics, experienceKey, locale, queryId, searchId, searchTerm, verticalKey]);\n\n  const reportFeedbackEvent = useCallback((\n    result: CardAnalyticsDataType<T>,\n    feedbackType: FeedbackType\n  ) => {\n    if (!queryId) {\n      console.error('Unable to report a result feedback event. Missing field: queryId.');\n      return;\n    }\n    if (!searchId) {\n      console.error('Unable to report a result feedback event. Missing field: searchId.');\n      return;\n    }\n    if (!experienceKey) {\n      console.error('Unable to report a result feedback event. Missing field: experienceKey.');\n      return;\n    }\n    let directAnswer = false;\n    let generativeDirectAnswer = false;\n    let entityId: string | undefined;\n    if (isDirectAnswer(result)) {\n      directAnswer = true;\n      entityId = result.relatedResult.id;\n    } else if (isGenerativeDirectAnswer(result)) {\n      directAnswer = true;\n      generativeDirectAnswer = true;\n      entityId = result.searchResult?.id;\n    } else {\n      entityId = result.id;\n    }\n    analytics?.report({\n      action: feedbackType,\n      entity: entityId,\n      locale,\n      searchId,\n      queryId,\n      verticalKey: verticalKey || '',\n      isDirectAnswer: directAnswer,\n      isGenerativeDirectAnswer: generativeDirectAnswer,\n      experienceKey,\n      searchTerm\n    });\n  }, [analytics, experienceKey, locale, queryId, searchId, searchTerm, verticalKey]);\n\n  return useCallback((\n    cardResult: CardAnalyticsDataType<T>,\n    analyticsEventType: CardAnalyticsType\n  ) => {\n    if (!analytics) {\n      return;\n    }\n    if (analyticsEventType === 'TITLE_CLICK' || analyticsEventType === 'CTA_CLICK' || analyticsEventType === 'CITATION_CLICK' || analyticsEventType === 'DRIVING_DIRECTIONS' || analyticsEventType === 'VIEW_WEBSITE' || analyticsEventType === 'TAP_TO_CALL') {\n      reportCtaEvent(cardResult, analyticsEventType);\n    }\n    if (analyticsEventType === 'THUMBS_DOWN' || analyticsEventType === 'THUMBS_UP') {\n      reportFeedbackEvent(cardResult, analyticsEventType);\n    }\n  }, [analytics, reportCtaEvent, reportFeedbackEvent]);\n}\n","import { useCallback } from 'react';\nimport { FeedbackType } from '../components/ThumbsFeedback';\nimport { DefaultRawDataType } from '../models/index';\nimport { CardAnalyticsDataType, useCardAnalytics } from './useCardAnalytics';\n\n/**\n * Creates a memoized function for reporting card feedback analytics.\n *\n * @public\n *\n * @param result - card result that contains data use in the feedback analytics event.\n */\nexport function useCardFeedbackCallback<T = DefaultRawDataType>(\n  result: CardAnalyticsDataType<T>,\n): (analyticsType: FeedbackType) => void {\n  const reportAnalyticsEvent = useCardAnalytics<T>();\n  return useCallback((analyticsType: FeedbackType) => {\n    reportAnalyticsEvent(result, analyticsType);\n  }, [reportAnalyticsEvent, result]);\n}\n\n","import i18next from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nconst { supportedLocales } = require('./supportedLocales.ts');\n\nconst NAMESPACE = 'search-ui-react';\nconst resources: Record<string, any> = {};\n\nsupportedLocales.forEach((locale: string) => {\n  resources[locale] = {\n    [NAMESPACE]: require(`../../locales/${locale}/search-ui-react.json`),\n  };\n});\n\n/**\n * A custom i18next instance with React integration for search-ui-react.\n *\n * @internal\n */\nconst i18nInstance = i18next.createInstance();\ni18nInstance.use(initReactI18next).init({\n  fallbackLng: 'en',\n  ns: [NAMESPACE],\n  defaultNS: NAMESPACE,\n  interpolation: { escapeValue: false },\n  resources\n});\n\nexport { i18nInstance };\n","import {\n  useSearchState,\n  DirectAnswerType,\n  DirectAnswer as DirectAnswerData,\n  UnknownFieldValueDirectAnswer,\n} from '@yext/search-headless-react';\nimport {\n  ThumbsFeedbackCssClasses,\n  ThumbsFeedback,\n  builtInCssClasses as thumbsFeedbackCssClasses\n} from './ThumbsFeedback';\nimport { twMerge, useComposedCssClasses } from '../hooks/useComposedCssClasses';\nimport { useCardAnalyticsCallback } from '../hooks';\nimport { useCardFeedbackCallback } from '../hooks';\nimport { FieldValueDirectAnswer } from './FieldValueDirectAnswer';\nimport { FeaturedSnippetDirectAnswer } from './FeaturedSnippetDirectAnswer';\nimport React from 'react';\n\n/**\n * Props for {@link UnknownFieldTypeDisplayComponent}.\n *\n * @public\n */\nexport interface UnknownFieldTypeDisplayProps {\n  result: UnknownFieldValueDirectAnswer\n}\n\n/**\n * A React component interface to render results with \"unknown\" field type in field value direct answer.\n *\n * @public\n */\nexport type UnknownFieldTypeDisplayComponent = (\n  props: UnknownFieldTypeDisplayProps\n) => React.JSX.Element;\n\n/**\n * Props for {@link DirectAnswer}.\n *\n * @public\n */\nexport interface DirectAnswerProps {\n  /** A component to handle rendering results with \"unknown\" field type in field value direct answer. */\n  UnknownFieldTypeDisplay?: UnknownFieldTypeDisplayComponent,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: DirectAnswerCssClasses\n}\n\n/**\n *  The CSS class interface for {@link DirectAnswer}.\n *\n * @public\n */\nexport interface DirectAnswerCssClasses extends ThumbsFeedbackCssClasses {\n  directAnswerContainer?: string,\n  directAnswerLoading?: string,\n  answer?: string,\n  description?: string,\n  content?: string,\n  highlighted?: string,\n  answerContainer?: string\n}\n\nconst builtInCssClasses: Readonly<DirectAnswerCssClasses> = {\n  directAnswerContainer: '',\n  directAnswerLoading: 'opacity-50',\n  answer: 'font-bold text-xl text-neutral-dark',\n  description: 'text-neutral',\n  content: 'mt-4',\n  highlighted: 'bg-primary-light',\n  answerContainer: 'p-4 border border-gray-200 rounded-lg shadow-sm',\n  thumbsFeedbackContainer: thumbsFeedbackCssClasses.thumbsFeedbackContainer,\n  thumbsUpIcon: thumbsFeedbackCssClasses.thumbsUpIcon,\n  thumbsDownIcon: thumbsFeedbackCssClasses.thumbsDownIcon\n};\n\n/**\n * Renders Direct Answers provided by the Search API.\n *\n * @public\n *\n * @param props - {@link DirectAnswerProps}\n * @returns A react element for DirectAnswer\n */\nexport function DirectAnswer({\n  customCssClasses,\n  UnknownFieldTypeDisplay\n}: DirectAnswerProps): React.JSX.Element | null {\n  const directAnswerResult = useSearchState(state => state.directAnswer.result);\n  const isLoading = useSearchState(state => state.searchStatus.isLoading || false);\n  const composedCssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  const handleClickViewDetails = useCardAnalyticsCallback(directAnswerResult as DirectAnswerData, 'CTA_CLICK');\n  const handleClickFeedbackButton = useCardFeedbackCallback(directAnswerResult as DirectAnswerData);\n\n  if (!directAnswerResult) {\n    return null;\n  }\n\n  const cssClasses = getCssClassesForAnswerType(composedCssClasses, directAnswerResult.type);\n  const containerCssClasses = twMerge(\n    cssClasses.directAnswerContainer,\n    isLoading && cssClasses.directAnswerLoading\n  );\n\n  return (\n    <div className={containerCssClasses}>\n      {directAnswerResult.type === DirectAnswerType.FieldValue\n        ? <FieldValueDirectAnswer\n          result={directAnswerResult}\n          cssClasses={cssClasses}\n          viewDetailsClickHandler={handleClickViewDetails}\n          UnknownFieldTypeDisplay={UnknownFieldTypeDisplay}\n        />\n        : <FeaturedSnippetDirectAnswer\n          result={directAnswerResult}\n          readMoreClickHandler={handleClickViewDetails}\n          cssClasses={cssClasses}\n        />\n      }\n      <ThumbsFeedback\n        onClick={handleClickFeedbackButton}\n        customCssClasses={composedCssClasses}\n      />\n    </div>\n  );\n}\n\nfunction getCssClassesForAnswerType(cssClasses: DirectAnswerCssClasses, type: DirectAnswerType) {\n  const isSnippet = type === DirectAnswerType.FeaturedSnippet;\n  return {\n    ...cssClasses,\n    header: isSnippet ? cssClasses.answer : cssClasses.description,\n    body: isSnippet ? cssClasses.description : cssClasses.answer\n  };\n}\n","import { useTranslation } from 'react-i18next';\nimport { useSearchState } from '@yext/search-headless-react';\nimport React, { useCallback, useState } from 'react';\nimport { ThumbIcon } from '../icons/ThumbIcon';\nimport { useComposedCssClasses } from '../hooks';\nimport { useLayoutEffect } from '../hooks/useLayoutEffect';\n\n/**\n * Analytics event types for quality feedback.\n *\n * @public\n */\nexport type FeedbackType = 'THUMBS_UP' | 'THUMBS_DOWN';\n\n/**\n * The CSS class interface used for {@link ThumbsFeedback}.\n *\n * @public\n */\nexport interface ThumbsFeedbackCssClasses {\n  thumbsFeedbackContainer?: string,\n  thumbsUpIcon?: string,\n  thumbsDownIcon?: string\n}\n\n/**\n * Props for {@link ThumbsFeedback}.\n *\n * @public\n */\nexport interface ThumbsFeedbackProps {\n  /** A function which is called when a quality feedback button is clicked. */\n  onClick: (feedbackType: FeedbackType) => void,\n  /** Text to display alongside the quality feedback buttons. */\n  feedbackText?: string,\n  /** Text to display after a quality feedback button is clicked. */\n  feedbackTextOnSubmission?: string,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: ThumbsFeedbackCssClasses\n}\n\nexport const builtInCssClasses: Readonly<ThumbsFeedbackCssClasses> = {\n  thumbsFeedbackContainer: 'flex justify-end mt-2 text-sm text-gray-500 font-medium',\n  thumbsUpIcon: 'ml-3 w-5',\n  thumbsDownIcon: 'w-5 ml-1 transform rotate-180'\n};\n\n/**\n * Renders a quality feedback widget composed of thumbs up and thumbs down buttons.\n *\n * @public\n *\n * @param props - The configuration for the the feedback component.\n * @returns A React element for quality feedback widget.\n */\nexport function ThumbsFeedback(props: ThumbsFeedbackProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const {\n    onClick,\n    feedbackText,\n    feedbackTextOnSubmission,\n  } = props;\n  const cssClasses = useComposedCssClasses(builtInCssClasses, props.customCssClasses);\n  const query = useSearchState(state => state.query.mostRecentSearch);\n  const [isFeedbackProvided, setIsFeedbackProvided] = useState(false);\n\n  const handleClickThumbsUp = useCallback(() => {\n    onClick('THUMBS_UP');\n    setIsFeedbackProvided(true);\n  }, [onClick]);\n\n  const handleClickThumbsDown = useCallback(() => {\n    onClick('THUMBS_DOWN');\n    setIsFeedbackProvided(true);\n  }, [onClick]);\n\n  // Changes to most recent search query will trigger re-render to reset quality feedback submission.\n  useLayoutEffect(() => {\n    setIsFeedbackProvided(false);\n  }, [query]);\n\n  return (\n    <div className={cssClasses.thumbsFeedbackContainer}>\n      {isFeedbackProvided\n        ? feedbackTextOnSubmission ?? t('thankYouForYourFeedback')\n        : <>\n          {feedbackText ?? t('feedback', 'Feedback')}\n          <button\n            className={cssClasses.thumbsUpIcon}\n            onClick={handleClickThumbsUp}\n            aria-label={t('thisAnsweredMyQuestion')}\n          >\n            <ThumbIcon/>\n          </button>\n          <button\n            className={cssClasses.thumbsDownIcon}\n            onClick={handleClickThumbsDown}\n            aria-label={t('thisDidNotAnswerMyQuestion')}\n          >\n            <ThumbIcon/>\n          </button>\n        </>\n      }\n    </div>\n  );\n}","import React from 'react';\n\nexport function ThumbIcon({ className }: { className?: string }): React.JSX.Element {\n  return (\n    <svg className={className} viewBox=\"0 0 18 18\" fill=\"none\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <path d=\"M10.6667 7.33333H14.6366C15.8756 7.33333 16.6814 8.63719 16.1273 9.74536L13.2107 15.5787C12.9283 16.1433 12.3512 16.5 11.7199 16.5H8.37184C8.23557 16.5 8.09982 16.4833 7.96762 16.4502L4.83333 15.6667M10.6667 7.33333V3.16667C10.6667 2.24619 9.92047 1.5 9 1.5H8.92044C8.50414 1.5 8.16667 1.83748 8.16667 2.25377C8.16667 2.84903 7.99047 3.43096 7.66028 3.92624L4.83333 8.16667V15.6667M10.6667 7.33333H9M4.83333 15.6667H3.16667C2.24619 15.6667 1.5 14.9205 1.5 14V9C1.5 8.07953 2.24619 7.33333 3.16667 7.33333H5.25\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n    </svg>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport {\n  FieldValueDirectAnswer as FieldValueDirectAnswerType,\n  BuiltInFieldType,\n  Address,\n  UnknownFieldValueDirectAnswer\n} from '@yext/search-headless-react';\nimport React, { useMemo } from 'react';\nimport { UnknownFieldTypeDisplayComponent } from './DirectAnswer';\n\n/**\n * Props for FieldValueDirectAnswer.\n */\ninterface FieldValueDirectAnswerProps {\n  /** A field value direct answer result. */\n  result: FieldValueDirectAnswerType,\n  /** Handle onClick event for \"View Details\" link. */\n  viewDetailsClickHandler?: () => void,\n  /** {@inheritDoc DirectAnswerProps.UnknownFieldTypeDisplay} */\n  UnknownFieldTypeDisplay?: UnknownFieldTypeDisplayComponent,\n  /** CSS classes for customizing the component styling. */\n  cssClasses?: FieldValueDirectAnswerCssClasses\n}\n\n/**\n * The CSS class interface for FieldValueDirectAnswer.\n */\ninterface FieldValueDirectAnswerCssClasses {\n  header?: string,\n  body?: string,\n  content?: string,\n  answerContainer?: string\n}\n\n/**\n * Renders a field value direct answer provided by the Search API.\n *\n * @internal\n */\nexport function FieldValueDirectAnswer({\n  result,\n  viewDetailsClickHandler,\n  UnknownFieldTypeDisplay,\n  cssClasses = {}\n}: FieldValueDirectAnswerProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const title = `${result.entityName} / ${result.fieldName}`;\n  const link = result.relatedResult.link ?? result.relatedResult.rawData.landingPageUrl as string;\n  const resultContent = useMemo(() => {\n    return getResultContent(result, UnknownFieldTypeDisplay);\n  }, [result, UnknownFieldTypeDisplay]);\n\n  return (\n    <div className={cssClasses.answerContainer}>\n      {title &&\n      <div className={cssClasses.header}>{title}</div>}\n      <div className={cssClasses.content}>\n        <div className={cssClasses.body}>{resultContent}</div>\n        {link && <div className='mt-4'>\n          <a href={link} className='text-primary' onClick={viewDetailsClickHandler}>{t('viewDetails')}</a>\n        </div>\n        }\n      </div>\n    </div>\n  );\n}\n\nfunction DefaultUnknownFieldTypeDisplay(\n  { result }: { result: UnknownFieldValueDirectAnswer }\n): React.JSX.Element {\n  let val: string | number;\n  if (typeof result.value !== 'string' && typeof result.value !== 'number') {\n    console.warn(`Unknown field type for direct answer with \"${result.fieldApiName}\" fieldApiName. Rendering result's value as a string.`\n      + '\\nConsider using prop \"UnknownFieldTypeDisplay\" in DirectAnswer component to properly render result of unknown field type.');\n    val = JSON.stringify(result.value);\n  } else {\n    val = result.value;\n  }\n  return getTextJsxElement(val);\n}\n\nfunction getResultContent(\n  result: FieldValueDirectAnswerType,\n  UnknownFieldTypeDisplay: UnknownFieldTypeDisplayComponent = DefaultUnknownFieldTypeDisplay\n): React.JSX.Element {\n  switch (result.fieldType) {\n    case BuiltInFieldType.InstagramHandle:\n      return getAnchorTagJsxElement(`https://www.instagram.com/${result.value}`, result.value);\n    case BuiltInFieldType.TwitterHandle:\n      return getAnchorTagJsxElement(`https://twitter.com/${result.value}`, `@${result.value}`);\n    case BuiltInFieldType.FacebookURL:\n    case BuiltInFieldType.AndroidAppURL:\n    case BuiltInFieldType.IOSAppURL:\n      return getAnchorTagJsxElement(result.value);\n    case BuiltInFieldType.ComplexURL:\n      const url = result.value.url;\n      const displayUrl = result.value.preferDisplayUrl ? result.value.displayUrl : url;\n      return getAnchorTagJsxElement(url, displayUrl);\n    case BuiltInFieldType.URL:\n      return Array.isArray(result.value)\n        ? getListJsxElement(result.value, url => getAnchorTagJsxElement(url))\n        : getAnchorTagJsxElement(result.value);\n    case BuiltInFieldType.Phone:\n      return getAnchorTagJsxElement(`tel:${result.value}`, result.value);\n    case BuiltInFieldType.Email:\n      return getListJsxElement(result.value, e => getAnchorTagJsxElement(`mailto:${e}`, e));\n    case BuiltInFieldType.Address:\n      return getAddressJsxElement(result.value);\n    case BuiltInFieldType.RichText:\n      //TODO: SLAP-2340\n      console.warn('Rendering markdown for rich text direct answer is currently not supported. Displaying the unrendered markdown string(s) as is.');\n      return Array.isArray(result.value)\n        ? getListJsxElement(result.value, val => getTextJsxElement(val))\n        : getTextJsxElement(result.value);\n    case BuiltInFieldType.Hours:\n      return <div>{JSON.stringify(result.value)}</div>;\n    case 'unknown':\n      return <UnknownFieldTypeDisplay result={result}/>;\n    default:\n      return Array.isArray(result.value)\n        ? getListJsxElement(result.value as (string | number)[], val => getTextJsxElement(val))\n        : getTextJsxElement(result.value as string | number);\n  }\n}\n\nfunction getListJsxElement<T>(\n  list: T[],\n  getItemJsxElement: (el: T) => React.JSX.Element\n): React.JSX.Element {\n  return (<ul className='list-disc list-inside'>\n    {list.map((el, i) =>\n      <li key={i}>\n        {getItemJsxElement(el)}\n      </li>)}\n  </ul>);\n}\n\nfunction getTextJsxElement(text: string | number): React.JSX.Element {\n  return <p className='whitespace-pre-wrap'>{text}</p>;\n}\n\nfunction getAnchorTagJsxElement(href: string, displayText?: string): React.JSX.Element {\n  return <a href={href} className='text-primary'>{displayText ?? href}</a>;\n}\n\nfunction getAddressJsxElement(address: Address): React.JSX.Element {\n  // user specified display Address in KM\n  if (address.extraDescription) {\n    return <div>{address.extraDescription}</div>;\n  }\n  const formattedCity = address.city ? address.city + ',' : '';\n  const formattedCityRegionPostalCode = [formattedCity, address.region, address.postalCode].join(' ').trim();\n\n  return <div>\n    {address.line1 && <p>{address.line1}</p>}\n    {address.line2 && <p>{address.line2}</p>}\n    {address.line3 && <p>{address.line3}</p>}\n    {formattedCityRegionPostalCode && <p>{formattedCityRegionPostalCode}</p>}\n    <p>{address.countryCode}</p>\n  </div>;\n}\n","import { Trans } from 'react-i18next';\nimport { FeaturedSnippetDirectAnswer as FeaturedSnippetDirectAnswerType } from '@yext/search-headless-react';\nimport { renderHighlightedValue } from './utils/renderHighlightedValue';\nimport React, { useMemo } from 'react';\n\n/**\n * Props for {@link FeaturedSnippetDirectAnswer}.\n */\ninterface FeaturedSnippetDirectAnswerProps {\n  /** A featured snippet direct answer result. */\n  result: FeaturedSnippetDirectAnswerType,\n  /** Handle onClick event for \"Read more about\" link. */\n  readMoreClickHandler?: () => void,\n  /** CSS classes for customizing the component styling. */\n  cssClasses?: FeaturedSnippetDirectAnswerCssClasses\n}\n\n/**\n *  The CSS class interface for {@link FeaturedSnippetDirectAnswer}.\n */\ninterface FeaturedSnippetDirectAnswerCssClasses {\n  header?: string,\n  body?: string,\n  content?: string,\n  answerContainer?: string,\n  highlighted?: string\n}\n\n/**\n * Renders a featured snippet direct answer provided by the Search API.\n *\n * @internal\n */\n\nconst unsupportedTextFormats: string[] = ['rich_text', 'rich_text_v2', 'markdown'];\n\nexport function FeaturedSnippetDirectAnswer({\n  result,\n  readMoreClickHandler,\n  cssClasses = {}\n}: FeaturedSnippetDirectAnswerProps): React.JSX.Element {\n  const answer = result.fieldType === 'multi_line_text' && result.value;\n  if (unsupportedTextFormats.includes(result.fieldType)) {\n    console.warn('Rendering ' + result.fieldType + ' direct answer is currently not supported. ' +\n        'You can modify your search configuration to convert ' + result.fieldType + ' to HTML to be rendered '\n        + 'on the page.');\n  }\n  let snippet: React.JSX.Element;\n  const snippetValue = useMemo(() =>\n  { return { __html: result.snippet?.value }; }, [result.snippet?.value]);\n\n  if (result.fieldType === 'html') {\n    snippet = (\n      <div dangerouslySetInnerHTML={snippetValue}></div>\n    );\n  }\n  else {\n    snippet = renderHighlightedValue(result.snippet, { highlighted: cssClasses.highlighted });\n  }\n  const link = result.relatedResult.link || result.relatedResult.rawData.landingPageUrl as string;\n  const name = result.relatedResult.name;\n\n  const readMoreComponents = useMemo(() => ({\n    a: (\n      <a\n        className=\"text-primary\"\n        href={link}\n        onClick={readMoreClickHandler}\n        aria-label={name}\n      />\n    )\n  }), [link, name, readMoreClickHandler]);\n  const readMoreValues = useMemo(() => ({ name }), [name]);\n\n  return (\n    <div className={cssClasses.answerContainer}>\n      {answer &&\n        <div className={cssClasses.header}>{answer}</div>}\n      <div className={cssClasses.content}>\n        <div className={cssClasses.body}>{snippet}</div>\n        {link && name && <div className='pt-4 text-neutral'>\n          <Trans\n            i18nKey='readMoreAbout'\n            components={readMoreComponents}\n            values={readMoreValues}\n          />\n        </div>}\n      </div>\n    </div>\n  );\n}\n","import { useTranslation } from 'react-i18next';\nimport { AutocompleteResult, FieldValueStaticFilter, FilterSearchResponse, SearchParameterField, SelectableStaticFilter, StaticFilter, useSearchActions, useSearchState } from '@yext/search-headless-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useComposedCssClasses } from '../hooks';\nimport { useSynchronizedRequest } from '../hooks/useSynchronizedRequest';\nimport { useDebouncedFunction } from '../hooks/useDebouncedFunction';\nimport { executeSearch } from '../utils';\nimport { isDuplicateStaticFilter } from '../utils/filterutils';\nimport { useId } from '../hooks/useId';\nimport { Dropdown } from './Dropdown/Dropdown';\nimport { DropdownInput } from './Dropdown/DropdownInput';\nimport { DropdownItem } from './Dropdown/DropdownItem';\nimport { DropdownMenu } from './Dropdown/DropdownMenu';\nimport { Geolocation, GeolocationProps } from './Geolocation';\nimport { CurrentLocationIcon } from '../icons/CurrentLocationIcon';\nimport { renderAutocompleteResult, AutocompleteResultCssClasses } from './utils/renderAutocompleteResult';\n\n/**\n * The CSS class interface for {@link FilterSearch}.\n *\n * @public\n */\nexport interface FilterSearchCssClasses extends AutocompleteResultCssClasses {\n  filterSearchContainer?: string,\n  label?: string,\n  inputElement?: string,\n  sectionLabel?: string,\n  focusedOption?: string,\n  optionsContainer?: string,\n  currentLocationButton?: string,\n  currentLocationAndInputContainer?: string\n}\n\nconst builtInCssClasses: Readonly<FilterSearchCssClasses> = {\n  filterSearchContainer: 'relative mb-2',\n  label: 'mb-4 text-sm font-medium text-neutral-dark',\n  inputElement: 'text-sm bg-white outline-none h-9 w-full p-2 rounded-md border border-gray-300 focus:border-primary text-neutral-dark placeholder:text-neutral',\n  sectionLabel: 'text-sm text-neutral-dark font-semibold py-2 px-4',\n  focusedOption: 'bg-gray-100',\n  option: 'text-sm text-neutral-dark py-1 cursor-pointer hover:bg-gray-100 px-4',\n  currentLocationButton: 'h-5 w-5',\n  currentLocationAndInputContainer: 'w-full flex items-center justify-start gap-2'\n};\n\n/**\n * The parameters that are passed into {@link FilterSearchProps.onSelect}.\n *\n * @public\n */\nexport interface OnSelectParams {\n  /** The newly selected filter. */\n  newFilter: FieldValueStaticFilter,\n  /** The display name of the newly selected filter. */\n  newDisplayName: string,\n  /** The previously selected filter. */\n  currentFilter: StaticFilter | undefined,\n  /** A function that sets which filter the component is currently associated with. */\n  setCurrentFilter: (filter: StaticFilter) => void,\n  /**\n   * A function that executes a filter search and updates the input and dropdown options\n   * with the response.\n   */\n  executeFilterSearch: (query?: string) => Promise<FilterSearchResponse | undefined>\n}\n\n/**\n * The parameters that are passed into {@link FilterSearchProps.onDropdownInputChange}.\n *\n * @public\n */\nexport interface OnDropdownInputChangeProps {\n  /** The input element's new value after the change */\n  value: string,\n  /**\n   * A function that executes a filter search and updates the input and dropdown options\n   * with the response.\n   */\n  executeFilterSearch: (query?: string) => Promise<FilterSearchResponse | undefined>\n}\n\n/**\n * The parameters that are passed into {@link FilterSearchProps.afterDropdownInputFocus}.\n *\n * @public\n */\nexport interface AfterDropdownInputFocusProps {\n  /** The input element's value. */\n  value: string\n}\n\n/**\n * The props for the {@link FilterSearch} component.\n *\n * @public\n */\nexport interface FilterSearchProps {\n  /** An array of fieldApiName and entityType which indicates what to perform the filter search against. */\n  searchFields: Omit<SearchParameterField, 'fetchEntities'>[],\n  /** The display label for the component. */\n  label?: string,\n  /**\n   * The search input's placeholder text when no text has been entered by the user.\n   * Defaults to \"Search here...\".\n   */\n  placeholder?: string,\n  /**\n   * Whether to trigger a search when an option is selected. Defaults to false.\n   *\n   * @deprecated Use the `onSelect` prop instead.\n   */\n  searchOnSelect?: boolean,\n  /** A function which is called when a filter is selected. */\n  onSelect?: (params: OnSelectParams) => void,\n  /** A function which is called when the input element's value changes. Replaces the default behavior. */\n  onDropdownInputChange?: (params: OnDropdownInputChangeProps) => void,\n  /**\n   * A function which is called immediately after the input gains focus.\n   * It does not replace the default focus behavior.\n   */\n  afterDropdownInputFocus?: (params: AfterDropdownInputFocusProps) => void,\n  /** Determines whether or not the results of the filter search are separated by field. Defaults to false. */\n  sectioned?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: FilterSearchCssClasses,\n  /** Whether to disable the default CSS classes entirely  */\n  disableBuiltInClasses?: boolean,\n  /** The accessible label for the dropdown input. */\n  ariaLabel?: string,\n  /** Whether to include a button to search on the user's location. Defaults to false. */\n  showCurrentLocationButton?: boolean,\n  /** The props for the geolocation component, if the current location button is enabled. */\n  geolocationProps?: GeolocationProps\n}\n\n/**\n * A component which allows a user to search for filters associated with specific entities and fields.\n *\n * @public\n *\n * @param props - {@link FilterSearchProps}\n * @returns A react component for Filter Search\n */\nexport function FilterSearch({\n  searchFields,\n  label,\n  placeholder,\n  searchOnSelect,\n  onSelect,\n  onDropdownInputChange,\n  afterDropdownInputFocus,\n  sectioned = false,\n  customCssClasses,\n  disableBuiltInClasses = false,\n  ariaLabel,\n  showCurrentLocationButton = false,\n  geolocationProps = {}\n}: FilterSearchProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const searchActions = useSearchActions();\n  const inputId = useId('filter-search-input');\n  const labelId = useId('filter-search-label');\n  const searchParamFields = searchFields.map((searchField) => {\n    return { ...searchField, fetchEntities: false };\n  });\n  const matchingFieldIds: Set<string> = useMemo(() => {\n    const fieldIds = new Set(searchFields.map(s => s.fieldApiName));\n    if (fieldIds.has('builtin.location')) {\n      ['builtin.region', 'address.countryCode'].forEach(s => fieldIds.add(s));\n    }\n    return fieldIds;\n  }, [searchFields]);\n\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses, disableBuiltInClasses);\n  const [currentFilter, setCurrentFilter] = useState<StaticFilter>();\n  const [filterQuery, setFilterQuery] = useState<string>();\n  const staticFilters = useSearchState(state => state.filters.static);\n  const matchingFilters: SelectableStaticFilter[] = useMemo(() => {\n    return staticFilters?.filter(({ filter, selected }) =>\n      selected\n      && filter.kind === 'fieldValue'\n      && matchingFieldIds.has(filter.fieldId)\n    ) ?? [];\n  }, [staticFilters, matchingFieldIds]);\n\n  const debouncedExecuteFilterSearch = useDebouncedFunction(\n    (query: string) => searchActions.executeFilterSearch(query, sectioned, searchParamFields),\n    200\n  );\n\n  const [\n    filterSearchResponse,\n    executeFilterSearch,\n    clearFilterSearchResponse\n  ] = useSynchronizedRequest<string, FilterSearchResponse>(\n    async (inputValue) => {\n      setFilterQuery(inputValue);\n      return debouncedExecuteFilterSearch\n        ? debouncedExecuteFilterSearch(inputValue ?? '')\n        : undefined;\n    },\n    (e) => console.error('Error occurred executing a filter search request.\\n', e)\n  );\n\n  useEffect(() => {\n    if (matchingFilters.length > 1 && !onSelect) {\n      console.warn('More than one selected static filter found that matches the filter search fields: ['\n        + [...matchingFieldIds].join(', ')\n        + ']. Please update the state to remove the extra filters.'\n        + ' Picking one filter to display in the input.');\n    }\n\n    if (currentFilter && staticFilters?.find(f =>\n      isDuplicateStaticFilter(f.filter, currentFilter) && f.selected\n    )) {\n      return;\n    }\n\n    if (matchingFilters.length === 0) {\n      clearFilterSearchResponse();\n      setCurrentFilter(undefined);\n      setFilterQuery('');\n    } else {\n      setCurrentFilter(matchingFilters[0].filter);\n      executeFilterSearch(matchingFilters[0].displayName);\n    }\n  }, [\n    clearFilterSearchResponse,\n    currentFilter,\n    staticFilters,\n    executeFilterSearch,\n    onSelect,\n    matchingFilters,\n    matchingFieldIds\n  ]);\n\n  const currentLocationCssClasses = useMemo(() => ({\n    button: cssClasses.currentLocationButton,\n    iconContainer: 'w-full h-full ml-0'\n  }), [cssClasses.currentLocationButton]);\n\n  const sections = useMemo(() => {\n    return filterSearchResponse?.sections.filter(section => section.results.length > 0) ?? [];\n  }, [filterSearchResponse?.sections]);\n\n  const hasResults = sections.flatMap(s => s.results).length > 0;\n\n  const handleSelectDropdown = useCallback(async (\n    _value: string,\n    _index: number,\n    itemData: Record<string, unknown> | undefined\n  ) => {\n    const newFilter = itemData?.filter as FieldValueStaticFilter;\n    const newDisplayName = itemData?.displayName as string;\n    if (!newFilter || !newDisplayName) {\n      return;\n    }\n\n    if (onSelect) {\n      if (searchOnSelect) {\n        console.warn('Both searchOnSelect and onSelect props were passed to the component.'\n          + ' Using onSelect instead of searchOnSelect as the latter is deprecated.');\n      }\n      return onSelect({\n        newFilter,\n        newDisplayName,\n        currentFilter,\n        setCurrentFilter,\n        executeFilterSearch\n      });\n    }\n\n    if (matchingFilters.length > 1) {\n      console.warn('More than one selected static filter found that matches the filter search fields: ['\n        + [...matchingFieldIds].join(', ')\n        + ']. Unselecting all existing matching filters and selecting the new filter.');\n    }\n    matchingFilters.forEach(f => searchActions.setFilterOption({ filter: f.filter, selected: false }));\n    if (currentFilter) {\n      searchActions.setFilterOption({ filter: currentFilter, selected: false });\n    }\n    searchActions.setFilterOption({ filter: newFilter, displayName: newDisplayName, selected: true });\n    setCurrentFilter(newFilter);\n    executeFilterSearch(newDisplayName);\n\n    if (searchOnSelect) {\n      searchActions.setOffset(0);\n      searchActions.resetFacets();\n      executeSearch(searchActions);\n    }\n  }, [\n    currentFilter,\n    searchActions,\n    executeFilterSearch,\n    onSelect,\n    searchOnSelect,\n    matchingFilters,\n    matchingFieldIds\n  ]);\n\n  const handleInputChange = useCallback((value: string) => {\n    onDropdownInputChange ? onDropdownInputChange({\n      value,\n      executeFilterSearch\n    }) : executeFilterSearch(value);\n  }, [\n    onDropdownInputChange,\n    executeFilterSearch\n  ]);\n\n  const meetsSubmitCritera = useCallback((index: number) => index >= 0, []);\n\n  const itemDataMatrix = useMemo(() => {\n    return sections.map(section => {\n      return section.results.map(result => ({\n        filter: { ...result.filter, kind: 'fieldValue' },\n        displayName: result.value\n      }));\n    });\n  }, [sections]);\n\n  function renderDropdownItems() {\n    return sections.map((section, sectionIndex) => {\n      return (\n        <div className='pb-2' key={sectionIndex}>\n          {section.label &&\n            <div className={cssClasses.sectionLabel}>\n              {section.label}\n            </div>\n          }\n          <div className={cssClasses.optionsContainer}>\n            {section.results.map((result, index) => (\n              <DropdownItem\n                key={index}\n                focusedClassName={cssClasses.focusedOption}\n                value={result.value}\n                itemData={itemDataMatrix[sectionIndex][index]}\n              >\n                {renderAutocompleteResult(result, cssClasses)}\n              </DropdownItem>\n            ))}\n          </div>\n        </div>\n      );\n    });\n  }\n\n  const handleInputFocus = useCallback((value = '') => {\n    if (value) {\n      executeFilterSearch(value);\n    }\n\n    afterDropdownInputFocus?.({ value });\n  }, [afterDropdownInputFocus, executeFilterSearch]);\n\n  const dropdownInput = (\n    <DropdownInput\n      className={cssClasses.inputElement}\n      placeholder={placeholder ?? t('searchHere')}\n      onChange={handleInputChange}\n      onFocus={handleInputFocus}\n      submitCriteria={meetsSubmitCritera}\n      inputId={inputId}\n      ariaLabel={ariaLabel}\n      ariaLabelledBy={label ? labelId : undefined}\n    />\n  );\n\n  const dropdownMenu = (\n    <DropdownMenu>\n      {hasResults &&\n        <div className='absolute z-10 w-full shadow-lg rounded-md border border-gray-300 bg-white pt-3 pb-1 mt-1'>\n          {renderDropdownItems()}\n        </div>\n      }\n    </DropdownMenu>\n  );\n\n  return (\n    <div className={cssClasses.filterSearchContainer}>\n      {label && (\n        <label id={labelId} htmlFor={inputId} className={cssClasses.label}>\n          {label}\n        </label>\n      )}\n      <Dropdown\n        screenReaderText={getScreenReaderText(sections, t)}\n        onSelect={handleSelectDropdown}\n        alwaysSelectOption={true}\n        parentQuery={filterQuery}\n      >\n        {showCurrentLocationButton ? (\n          <div className={cssClasses.currentLocationAndInputContainer}>\n            <div className='relative flex-1'>\n              {dropdownInput}\n              {dropdownMenu}\n            </div>\n            <Geolocation\n              GeolocationIcon={CurrentLocationIcon}\n              customCssClasses={currentLocationCssClasses}\n              useIconAsButton={true}\n              {...geolocationProps}\n            />\n          </div>\n        ) : (\n          <>\n            {dropdownInput}\n            {dropdownMenu}\n          </>\n        )}\n      </Dropdown>\n    </div>\n  );\n}\n\nfunction getScreenReaderText(\n  sections: {\n    results: AutocompleteResult[],\n    label?: string\n  }[],\n  t: ReturnType<typeof useTranslation>['t']\n) {\n  if (sections.length === 0) {\n    return t('noAutocompleteOptionsFound');\n  }\n  const screenReaderPhrases = sections.map(section => {\n    const label = section.label ? ` ${section.label}` : '';\n    const count = section.results.length;\n    return t('autocompleteOptionsFound', {\n      count,\n      label,\n    });\n  });\n  return screenReaderPhrases.join(' ');\n}\n","import { useTranslation } from 'react-i18next';\nimport { useComposedCssClasses } from '../hooks';\nimport LoadingIndicator from '../icons/LoadingIndicator';\nimport { YextIcon } from '../icons/YextIcon';\nimport { useGeolocationHandler } from '../hooks/useGeolocationHandler';\nimport React from 'react';\n\n/**\n * The CSS class interface for the Geolocation component.\n *\n * @public\n */\nexport interface GeolocationCssClasses {\n  geolocationContainer?: string,\n  button?: string,\n  iconContainer?: string\n}\n\nconst builtInCssClasses: Readonly<GeolocationCssClasses> = {\n  geolocationContainer: 'text-sm text-neutral text-center justify-center items-center flex flex-row',\n  button: 'text-primary font-semibold hover:underline focus:underline',\n  iconContainer: 'w-4 ml-2'\n};\n\n/**\n * The props for the Geolocation component.\n *\n * @public\n */\nexport interface GeolocationProps {\n  /**\n   * Configuration used when collecting the user's location.\n   * Definition: {@link https://w3c.github.io/geolocation-api/#position_options_interface}.\n   */\n  geolocationOptions?: PositionOptions,\n  /**\n   * The radius, in miles, around the user's location to find results. Defaults to 50.\n   * If location accuracy is low, a larger radius may be used automatically.\n   */\n  radius?: number,\n  /** The label for the button. Defaults to 'Use my location'. */\n  label?: string,\n  /** Custom icon component to display along with the button. */\n  GeolocationIcon?: React.FunctionComponent,\n  /**\n   * A function which is called when the geolocation button is clicked,\n   * after user's position is successfully determined.\n   */\n  handleClick?: (position: GeolocationPosition) => void,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: GeolocationCssClasses,\n  /** Whether to use the icon as a button, rather than the label. */\n  useIconAsButton?: boolean,\n  /** Whether to disable built-in classes and use only custom classes. */\n  disableBuiltInClasses?: boolean\n}\n\n/**\n * A React Component which collects location information to create a\n * location filter and perform a new search.\n *\n * @public\n *\n * @param props - {@link GeolocationProps}\n * @returns A react component for geolocation\n */\nexport function Geolocation({\n  geolocationOptions,\n  radius = 50,\n  label,\n  //TODO: replace default icon with SVG create from design team\n  GeolocationIcon = YextIcon,\n  handleClick,\n  customCssClasses,\n  useIconAsButton = false,\n  disableBuiltInClasses = false\n}: GeolocationProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses, disableBuiltInClasses);\n  const [handleGeolocationClick, isFetchingUserLocation] = useGeolocationHandler({\n    geolocationOptions,\n    radius,\n    handleUserPosition: handleClick\n  });\n\n  const iconContainer = (\n    <div className={cssClasses.iconContainer}>\n      {isFetchingUserLocation ? <LoadingIndicator /> : <GeolocationIcon />}\n    </div>\n  );\n\n  if (useIconAsButton) {\n    return (\n      <button\n        className={cssClasses.button}\n        onClick={handleGeolocationClick}\n        aria-label={t('useCurrentLocation')}\n      >\n        {iconContainer}\n      </button>\n    );\n  } else {\n    return (\n      <div className={cssClasses.geolocationContainer}>\n        <button className={cssClasses.button} onClick={handleGeolocationClick}>\n          {label ?? t('useMyLocation')}\n        </button>\n        {iconContainer}\n      </div>\n    );\n  }\n}\n","import React from 'react';\n\nexport default function LoadingIndicator() {\n  return (\n    <div className=\"animate-[rotate_1.4s_linear_infinite]\">\n      <svg className=\"[stroke-dasharray:208] origin-[50%_50%] animate-[dash_1.4s_ease-in-out_infinite]\" viewBox=\"0 0 72 72\">\n        <circle className=\"\" cx=\"36\" cy=\"36\" r=\"33\" stroke=\"black\" strokeWidth=\"3\" fill=\"none\"/>\n      </svg>\n    </div>\n  );\n}","import React from 'react';\n\nexport function YextIcon(): React.JSX.Element {\n  return (\n    <svg viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <path d=\"M25.517 28.142v.095h-.204v.905h-.066v-.905h-.197v-.095h.467zm.667 0h.066v1h-.066v-.825l-.24.595h-.013l-.24-.595v.825h-.066v-1h.066l.247.61.246-.61zM15 28.8c7.622 0 13.8-6.178 13.8-13.8 0-7.622-6.178-13.8-13.8-13.8C7.378 1.2 1.2 7.378 1.2 15c0 7.622 6.178 13.8 13.8 13.8zM15 0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-8.284 0-15-6.716-15-15C0 6.716 6.716 0 15 0zm.45 16.65v-1.2h6.6v1.2h-2.7v5.4h-1.2v-5.4h-2.7zm-1.599-1.35l.849.849-2.601 2.601 2.601 2.601-.849.849-2.601-2.601L8.649 22.2l-.849-.849 2.601-2.601L7.8 16.149l.849-.849 2.601 2.601 2.601-2.601zM18.675 9a2.175 2.175 0 00-1.847 3.323l2.995-2.995A2.163 2.163 0 0018.675 9zm0 5.55a3.375 3.375 0 112.833-5.209l-3.789 3.788a2.175 2.175 0 003.13-1.954h1.201a3.375 3.375 0 01-3.375 3.375zm-7.425-3.734L13.78 7.8l.92.771-2.85 3.397v2.582h-1.2v-2.582L7.8 8.57l.92-.771 2.53 3.016z\"></path>\n    </svg>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport { Matcher, SelectableStaticFilter, useSearchActions, useSearchState } from '@yext/search-headless-react';\nimport { executeSearch } from '../utils/search-operations';\nimport { getUserLocation } from '../utils/location-operations';\nimport { useCallback, useState } from 'react';\n\nconst GEOLOCATION_FIELD_ID = 'builtin.location';\nconst LOCATION_FIELD_IDS = [GEOLOCATION_FIELD_ID, 'builtin.region', 'address.countryCode'];\nconst METERS_PER_MILE = 1609.344;\n\n/**\n * The props for {@link useGeolocationHandler} hook.\n *\n * @internal\n */\ninterface GeolocationHandlerArgs {\n  /** Configuration used when collecting the user's location. */\n  geolocationOptions?: PositionOptions,\n  /**\n   * The radius, in miles, around the user's location to find results. Defaults to 50.\n   * If location accuracy is low, a larger radius may be used automatically.\n   */\n  radius?: number,\n  /** Custom handler function to call after user's position is successfully determined. */\n  handleUserPosition?: (position: GeolocationPosition) => void\n}\n\n/**\n * Creates a function to collect user's geolocation and, by default, will set\n * a built-in location filter and execute a search.\n *\n * @internal\n *\n * @param props - {@link GeolocationHandlerArgs}\n * @returns - A function to collect and process user's geolocation\n *          - A boolean to indicate if user's geolocation is being fetch\n */\nexport function useGeolocationHandler({\n  geolocationOptions,\n  radius = 50,\n  handleUserPosition\n}: GeolocationHandlerArgs): [() => Promise<void>, boolean] {\n  const { t } = useTranslation();\n  const [isFetchingUserLocation, setIsFetchingUserLocation] = useState<boolean>(false);\n  const searchActions = useSearchActions();\n  const staticFilters = useSearchState(s => s.filters.static || []);\n\n  const defaultHandleUserPosition = useCallback((position: GeolocationPosition) => {\n    const { latitude, longitude, accuracy } = position.coords;\n    const locationFilter: SelectableStaticFilter = {\n      displayName: t('currentLocation'),\n      selected: true,\n      filter: {\n        kind: 'fieldValue',\n        fieldId: GEOLOCATION_FIELD_ID,\n        matcher: Matcher.Near,\n        value: {\n          lat: latitude,\n          lng: longitude,\n          radius: Math.max(accuracy, radius * METERS_PER_MILE)\n        },\n      }\n    };\n    const nonLocationFilters = staticFilters.filter(filter => {\n      return !(filter.filter.kind === 'fieldValue'\n        && LOCATION_FIELD_IDS.includes(filter.filter.fieldId));\n    });\n    searchActions.setStaticFilters([...nonLocationFilters, locationFilter]);\n    executeSearch(searchActions);\n  }, [radius, searchActions, staticFilters, t]);\n\n  const geolocationHandler = useCallback(async () => {\n    setIsFetchingUserLocation(true);\n    try {\n      const position = await getUserLocation(geolocationOptions);\n      (handleUserPosition ?? defaultHandleUserPosition)(position);\n    } catch (e) {\n      console.warn(e);\n    } finally {\n      setIsFetchingUserLocation(false);\n    }\n  }, [setIsFetchingUserLocation, geolocationOptions, handleUserPosition, defaultHandleUserPosition]);\n  return [geolocationHandler, isFetchingUserLocation];\n}\n","import React from 'react';\n\nexport function CurrentLocationIcon(): React.JSX.Element {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-full h-full\">\n      <line x1=\"2\" x2=\"5\" y1=\"12\" y2=\"12\"/>\n      <line x1=\"19\" x2=\"22\" y1=\"12\" y2=\"12\"/>\n      <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"5\"/>\n      <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/>\n      <circle cx=\"12\" cy=\"12\" r=\"7\"/>\n      <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n    </svg>\n  );\n}\n\n","import { useTranslation } from 'react-i18next';\nimport { useSearchActions, useSearchState, LocationBiasMethod } from '@yext/search-headless-react';\nimport { executeSearch } from '../utils';\nimport { getUserLocation } from '../utils';\nimport { twMerge, useComposedCssClasses } from '../hooks/useComposedCssClasses';\nimport React, { useState } from 'react';\nimport LoadingIndicator from '../icons/LoadingIndicator';\n\n/**\n * The CSS class interface for the {@link LocationBias} component.\n *\n * @public\n *\n * @deprecated LocationBias component has been superseded by Geolocation component.\n */\nexport interface LocationBiasCssClasses {\n  locationBiasContainer?: string,\n  location?: string,\n  source?: string,\n  button?: string,\n  loadingIndicatorContainer?: string\n}\n\nconst builtInCssClasses: Readonly<LocationBiasCssClasses> = {\n  locationBiasContainer: 'text-sm text-neutral text-center justify-center items-center flex flex-col lg:flex-row',\n  location: 'font-semibold lg:ml-7',\n  source: 'ml-3 lg:ml-0 whitespace-pre',\n  button: 'text-primary hover:underline focus:underline ml-7 lg:ml-0',\n  loadingIndicatorContainer: 'w-4 h-4 ml-3 shrink-0'\n};\n\n/**\n * The props for the {@link LocationBias} component.\n *\n * @public\n *\n * @deprecated LocationBias component has been superseded by Geolocation component.\n */\nexport interface LocationBiasProps {\n  /** Configuration used when collecting the user's location.\n   * Definition: {@link https://w3c.github.io/geolocation-api/#position_options_interface}.\n   */\n  geolocationOptions?: PositionOptions,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: LocationBiasCssClasses\n}\n\n/**\n * A React Component which displays and collects location information in order to bias searches.\n *\n * @public\n *\n * @deprecated LocationBias component has been superseded by Geolocation component.\n *\n * @param props - {@link LocationBiasProps}\n * @returns A react component for Location Bias\n */\nexport function LocationBias({\n  geolocationOptions,\n  customCssClasses\n}: LocationBiasProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const searchActions = useSearchActions();\n  const locationBias = useSearchState(s => s.location.locationBias);\n  const [isFetchingLocation, setIsFetchingLocation] = useState<boolean>(false);\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const loadingIndicatorCss = twMerge(cssClasses.loadingIndicatorContainer, (!isFetchingLocation && 'invisible'));\n\n  if (!locationBias?.displayName) return null;\n\n  const attributionMessage =\n      locationBias?.method === LocationBiasMethod.Ip ? t('basedOnYourInternetAddress')\n        : locationBias?.method === LocationBiasMethod.Device ? t('basedOnYourDevice')\n          : '';\n\n  async function handleGeolocationClick() {\n    setIsFetchingLocation(true);\n    try {\n      const position = await getUserLocation(geolocationOptions);\n      searchActions.setUserLocation({\n        latitude: position.coords.latitude,\n        longitude: position.coords.longitude,\n      });\n    } catch (e) {\n      console.error(e);\n    } finally {\n      setIsFetchingLocation(false);\n    }\n    executeSearch(searchActions);\n  }\n\n  return (\n    <div className={cssClasses.locationBiasContainer}>\n      <span className={cssClasses.location}>\n        {locationBias.displayName}\n      </span>\n      <span className={cssClasses.source}>\n        {attributionMessage}\n        <span className='invisible lg:visible'> - </span>\n      </span>\n      <div className='flex flex-row items-center'>\n        <button\n          className={cssClasses.button}\n          onClick={handleGeolocationClick}\n        >\n          {t('updateYourLocation')}\n        </button>\n        <div className={loadingIndicatorCss}>\n          <LoadingIndicator />\n        </div>\n      </div>\n    </div>\n  );\n}","import { useSearchState } from '@yext/search-headless-react';\nimport { useComposedCssClasses } from '../hooks';\nimport classNames from 'classnames';\nimport { AppliedFiltersDisplay } from './AppliedFiltersDisplay';\nimport { DEFAULT_HIERARCHICAL_DELIMITER } from './Filters/HierarchicalFacetDisplay';\nimport { useNlpFilterDisplayNames } from '../hooks/useNlpFilterDisplayNames';\nimport { useRemovableFilters } from '../hooks/useRemovableFilters';\nimport React from 'react';\n\n/**\n * The CSS class interface used for {@link AppliedFilters}.\n *\n * @public\n */\nexport interface AppliedFiltersCssClasses {\n  appliedFiltersContainer?: string,\n  appliedFiltersLoading?: string,\n  nlpFilter?: string,\n  removableFilter?: string,\n  filterLabel?: string,\n  clearAllButton?: string\n}\n\nexport const builtInCssClasses: Readonly<AppliedFiltersCssClasses> = {\n  // Use negative margin to remove space above the filters on mobile\n  appliedFiltersContainer: 'flex flex-wrap -mt-3 md:mt-0 mb-2',\n  appliedFiltersLoading: 'opacity-50',\n  nlpFilter: 'border border-gray-200 rounded-3xl px-3 py-1.5 text-sm font-medium text-neutral-dark mr-2 mb-2',\n  removableFilter: 'flex items-center border border-gray-200 rounded-3xl px-3 py-1.5 text-sm font-medium text-neutral-dark mr-2 mb-2',\n  clearAllButton: 'text-sm font-medium text-primary hover:underline focus:underline mb-2'\n};\n\n/**\n * Properties for {@link AppliedFilters}.\n *\n * @public\n */\nexport interface AppliedFiltersProps {\n  /** List of filters that should not be displayed. By default, builtin.entityType will be hidden. */\n  hiddenFields?: string[],\n  /** A set of facet fieldIds that should be interpreted as \"hierarchical\". */\n  hierarchicalFacetsFieldIds?: string[],\n  /** {@inheritDoc HierarchicalFacetsProps.delimiter} */\n  hierarchicalFacetsDelimiter?: string,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: AppliedFiltersCssClasses\n}\n\nconst DEFAULT_HIDDEN_FIELDS = ['builtin.entityType'];\n\n/**\n * A component that displays a list of filters applied to the current vertical\n * search, which may include any selected options from facets, NLP filters, and\n * field value static filters.\n *\n * @public\n *\n * @param props - {@link AppliedFiltersProps}\n * @returns A React element for the applied filters\n */\nexport function AppliedFilters(props: AppliedFiltersProps): React.JSX.Element {\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n\n  const {\n    hiddenFields = DEFAULT_HIDDEN_FIELDS,\n    customCssClasses = {},\n    hierarchicalFacetsDelimiter = DEFAULT_HIERARCHICAL_DELIMITER,\n    hierarchicalFacetsFieldIds\n  } = props;\n\n  const removableFilters = useRemovableFilters(\n    hierarchicalFacetsFieldIds, hierarchicalFacetsDelimiter, hiddenFields);\n  const nlpFilterDisplayNames = useNlpFilterDisplayNames(removableFilters.map(f => f.filter), hiddenFields);\n\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  cssClasses.appliedFiltersContainer = classNames(cssClasses.appliedFiltersContainer, {\n    [cssClasses.appliedFiltersLoading ?? '']: isLoading\n  });\n\n  return (\n    <AppliedFiltersDisplay\n      removableFilters={removableFilters}\n      nlpFilterDisplayNames={nlpFilterDisplayNames}\n      cssClasses={cssClasses}\n    />\n  );\n}","import { useTranslation } from 'react-i18next';\nimport { CloseIcon } from '../icons/CloseIcon';\nimport { AppliedFiltersCssClasses } from './AppliedFilters';\nimport { useClearFiltersCallback } from '../hooks/useClearFiltersCallback';\nimport { FieldValueFilter, useSearchActions } from '@yext/search-headless-react';\nimport { isDuplicateFieldValueFilter } from '../utils/filterutils';\nimport { executeSearch } from '../utils';\nimport React, { useCallback, useMemo } from 'react';\n\n/**\n * A representation of a filter that can be removed from the AppliedFilters component.\n *\n * @internal\n */\nexport interface RemovableFilter {\n  displayName: string,\n  handleRemove: () => void,\n  filter: FieldValueFilter\n}\n\n/**\n * Properties for {@link AppliedFilters}.\n *\n * @internal\n */\nexport interface AppliedFiltersDisplayProps {\n  removableFilters?: RemovableFilter[],\n  /**\n   * The display values of filters that are applied to the search results\n   * from the backend's natural language processing.\n   */\n  nlpFilterDisplayNames?: string[],\n  /** CSS classes for customizing the component styling. */\n  cssClasses?: AppliedFiltersCssClasses\n}\n\n/**\n * A component that renders applied filters based on the provided GroupedFilters.\n *\n * @param props - {@link AppliedFiltersDisplayProps}\n * @returns A React element for the applied filters\n */\nexport function AppliedFiltersDisplay(props: AppliedFiltersDisplayProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const {\n    nlpFilterDisplayNames = [],\n    removableFilters = [],\n    cssClasses = {}\n  } = props;\n  const handleClickClearAllButton = useClearFiltersCallback();\n  const searchActions = useSearchActions();\n\n  const dedupedNlpFilterDisplayNames = nlpFilterDisplayNames.filter(displayName => {\n    return !removableFilters.some(f => f.displayName === displayName);\n  });\n\n  const dedupedRemovableFilters = getDedupedRemovableFilters(removableFilters);\n  const handleRemoveDedupedFilter = useCallback((dedupedFilter: DedupedRemovableFilter) => {\n    dedupedFilter.handleRemove();\n    for (const f of dedupedFilter.duplicates ?? []) {\n      f.handleRemove();\n    }\n    searchActions.setOffset(0);\n    executeSearch(searchActions);\n  }, [searchActions]);\n  const removableFiltersWithHandlers = useMemo(() => {\n    return dedupedRemovableFilters.map(filter => ({\n      filter,\n      handleRemove: () => handleRemoveDedupedFilter(filter)\n    }));\n  }, [dedupedRemovableFilters, handleRemoveDedupedFilter]);\n\n  if (removableFilters.length + nlpFilterDisplayNames.length === 0) {\n    return null;\n  }\n\n  return (\n    <div className={cssClasses.appliedFiltersContainer} aria-label={t('appliedFiltersToCurrentSearch')}>\n      {dedupedNlpFilterDisplayNames.map((displayName, i) => renderNlpFilter(displayName, i, cssClasses))}\n      {removableFiltersWithHandlers.map(({ filter, handleRemove }, i) => {\n        return (\n          <RemovableFilter\n            displayName={filter.displayName}\n            handleRemove={handleRemove}\n            index={i}\n            cssClasses={cssClasses}\n          />\n        );\n      })}\n      {removableFilters.length > 0 &&\n        <button onClick={handleClickClearAllButton} className={cssClasses.clearAllButton}>\n          {t('clearAll')}</button>\n      }\n    </div>\n  );\n}\n\ninterface DedupedRemovableFilter extends RemovableFilter {\n  duplicates?: RemovableFilter[]\n}\n\nfunction getDedupedRemovableFilters(filters: RemovableFilter[]) {\n  const dedupedFilters: DedupedRemovableFilter[] = [];\n  for (const f of filters) {\n    const preexistingDupe = dedupedFilters.find(d => isDuplicateFieldValueFilter(d.filter, f.filter));\n    if (!preexistingDupe) {\n      dedupedFilters.push(f);\n    } else {\n      if (!preexistingDupe.duplicates) {\n        preexistingDupe.duplicates = [f];\n      } else {\n        preexistingDupe.duplicates.push(f);\n      }\n    }\n  }\n  return dedupedFilters;\n}\n\nfunction RemovableFilter({\n  displayName,\n  handleRemove,\n  index,\n  cssClasses\n}: {\n  displayName: string | undefined,\n  handleRemove: () => void,\n  index: number,\n  cssClasses: AppliedFiltersCssClasses\n}): React.JSX.Element {\n  const { t } = useTranslation();\n  return (\n    <div className={cssClasses.removableFilter} key={`${displayName}-${index}`}>\n      <div className={cssClasses.filterLabel}>{displayName}</div>\n      <button\n        className='w-2 h-2 text-neutral m-1.5'\n        onClick={handleRemove}\n        aria-label={t('removeFilter', { displayName })}\n      >\n        <CloseIcon />\n      </button>\n    </div>\n  );\n}\n\nfunction renderNlpFilter(\n  displayName: string | undefined,\n  index: number,\n  cssClasses: AppliedFiltersCssClasses\n): React.JSX.Element {\n  return (\n    <div className={cssClasses.nlpFilter} key={`${displayName}-${index}`}>\n      <span className={cssClasses.filterLabel}>{displayName}</span>\n    </div>\n  );\n}\n","import { useSearchActions, useSearchState } from '@yext/search-headless-react';\nimport { useCallback } from 'react';\nimport { executeSearch } from '../utils/search-operations';\n\n/**\n * Clears static filters and facets, resets the search offset to 0, and runs a search.\n *\n * @internal\n */\nexport function useClearFiltersCallback() {\n  const searchActions = useSearchActions();\n  const staticFilters = useSearchState(state => state.filters.static);\n\n  return useCallback(() => {\n    searchActions.setOffset(0);\n    searchActions.resetFacets();\n    staticFilters && searchActions.setStaticFilters(staticFilters.map(f => {\n      return {\n        ...f,\n        selected: false\n      };\n    }));\n    executeSearch(searchActions);\n  }, [searchActions, staticFilters]);\n}","import { useTranslation } from 'react-i18next';\nimport { DisplayableFacet } from '@yext/search-headless-react';\nimport React, { ReactNode, useCallback, useState } from 'react';\nimport { useComposedCssClasses } from '../../hooks';\nimport { HierarchicalFacetNode, HierarchicalFacetTree, useHierarchicalFacetTree } from '../../hooks/useHierarchicalFacetTree';\nimport { useFiltersContext } from './FiltersContext';\n\nexport const DEFAULT_HIERARCHICAL_DELIMITER = '>';\n\n/**\n * Props for HierarchicalFacetDisplay\n *\n * @public\n */\nexport interface HierarchicalFacetDisplayProps {\n  /** The `DisplayableFacet` to render as a HierarchicalFacetDisplay. */\n  facet: DisplayableFacet,\n  /** {@inheritDoc HierarchicalFacetsProps.delimiter} */\n  delimiter?: string,\n  /** {@inheritDoc HierarchicalFacetsProps.showMoreLimit} */\n  showMoreLimit?: number,\n  /**\n   * CSS classes for customizing the component styling\n   * of HierarchicalFacetDisplayCssClasses.\n   */\n  customCssClasses?: HierarchicalFacetDisplayCssClasses\n}\n\n/**\n * The CSS class interface for HierarchicalFacetDisplay.\n *\n * @public\n */\nexport interface HierarchicalFacetDisplayCssClasses {\n  treeContainer?: string,\n  allCategoriesOption___active?: string,\n  allCategoriesOption___inactive?: string,\n  availableOption__active?: string,\n  availableOption__inactive?: string,\n  parentCategory?: string,\n  currentCategory?: string,\n  showMoreButton?: string\n}\n\nconst builtInCssClasses: Readonly<HierarchicalFacetDisplayCssClasses> = {\n  treeContainer: 'flex flex-col items-start',\n  allCategoriesOption___active: 'font-semibold mb-2 text-sm',\n  allCategoriesOption___inactive: 'mb-2 text-sm',\n  availableOption__active: 'font-semibold ml-4 mb-2 text-sm',\n  availableOption__inactive: 'ml-4 mb-2 text-sm',\n  parentCategory: 'mb-2 text-sm',\n  currentCategory: 'font-semibold mb-2 text-sm',\n  showMoreButton: 'ml-4 text-sm font-medium text-primary'\n};\n\n/**\n * A HierarchicalFacetDisplay takes a `DisplayableFacet` and renders the facet in a way\n * to represent multiple levels of \"hierarchies\".\n *\n * The hierarchies are determined by the provided delimiter, which defaults to \"\\>\".\n *\n * @public\n */\nexport function HierarchicalFacetDisplay({\n  facet,\n  delimiter = DEFAULT_HIERARCHICAL_DELIMITER,\n  showMoreLimit = 4,\n  customCssClasses\n}: HierarchicalFacetDisplayProps): React.JSX.Element {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const tree = useHierarchicalFacetTree(facet, delimiter);\n  const [isShowingMore, setIsShowingMore] = useState(false);\n  const resetShowMore = useCallback(() => setIsShowingMore(false), []);\n  const toggleShowMore = useCallback(() => {\n    setIsShowingMore(!isShowingMore);\n  }, [isShowingMore]);\n\n  /** Iteratively parses the `HierarchicalFacetTree` into an array of ReactNodes */\n  function renderTree(): ReactNode[] {\n    let treePointer: HierarchicalFacetTree = tree;\n    const renderedNodesAndShowMoreButton: ReactNode[] = [renderAllCategoriesButton()];\n\n    while (treePointer) {\n      const currentNodes = Object.values(treePointer);\n      const selectedChildNode = currentNodes.find(n => n.selected);\n      const selectedHasNoChildren =\n        selectedChildNode && Object.values(selectedChildNode.childTree).length === 0;\n      const activeParentNode = currentNodes.find(n => n.hasSelectedChild);\n\n      if ((!selectedChildNode && !activeParentNode) || selectedHasNoChildren) {\n        renderedNodesAndShowMoreButton.push(...renderAvailableOptions(currentNodes));\n        if (currentNodes.length > showMoreLimit) {\n          renderedNodesAndShowMoreButton.push(renderShowMoreButton());\n        }\n        break;\n      }\n\n      const activeNode = selectedChildNode ?? activeParentNode;\n      if (!activeNode) {\n        break;\n      }\n      renderedNodesAndShowMoreButton.push(\n        renderCategory(activeNode, facet.fieldId));\n      treePointer = activeNode.childTree;\n    }\n\n    return renderedNodesAndShowMoreButton;\n  }\n\n  function renderAllCategoriesButton() {\n    return (\n      <AllCategories\n        key='_AllCategories'\n        activeClassName={cssClasses.allCategoriesOption___active}\n        inactiveClassName={cssClasses.allCategoriesOption___inactive}\n        facet={facet}\n        resetShowMore={resetShowMore}\n      />\n    );\n  }\n\n  function renderAvailableOptions(nodes: HierarchicalFacetNode[]) {\n    const nodesToRender = isShowingMore ? nodes : nodes.slice(0, showMoreLimit);\n    return nodesToRender.map(n =>\n      <AvailableOption\n        key={n.lastDisplayNameToken}\n        activeClassName={cssClasses.availableOption__active}\n        inactiveClassName={cssClasses.availableOption__inactive}\n        fieldId={facet.fieldId}\n        currentNode={n}\n        resetShowMore={resetShowMore}\n        siblingNodes={nodes.filter(siblingNode => siblingNode !== n)}\n      />\n    );\n  }\n\n  function renderShowMoreButton() {\n    return <ShowMoreButton\n      key='_ShowMoreButton'\n      className={cssClasses.showMoreButton}\n      isShowingMore={isShowingMore}\n      toggleShowMore={toggleShowMore}\n    />;\n  }\n\n  function renderCategory(selectedNode: HierarchicalFacetNode, fieldId: string) {\n    const sharedProps = {\n      key: selectedNode.lastDisplayNameToken,\n      resetShowMore,\n      selectedNode,\n      fieldId\n    };\n\n    if (selectedNode.hasSelectedChild) {\n      return <ParentCategory className={cssClasses.parentCategory} {...sharedProps}/>;\n    } else {\n      return <CurrentCategory className={cssClasses.currentCategory} {...sharedProps}/>;\n    }\n  }\n\n  return (\n    <div className={cssClasses.treeContainer}>\n      {renderTree()}\n    </div>\n  );\n}\n\n/**\n * A hard-coded \"All Categories\" button that can be used to reset the HierarchicalFacetDisplay\n * to its initial state, i.e. with no options selected.\n */\nfunction AllCategories({ facet, inactiveClassName, activeClassName, resetShowMore }: {\n  facet: DisplayableFacet,\n  activeClassName?: string,\n  inactiveClassName?: string,\n  resetShowMore: () => void\n}) {\n  const { t } = useTranslation();\n  const { applyFilters, selectFilter } = useFiltersContext();\n  const handleClickAllCategories = useCallback(() => {\n    facet.options\n      .filter(o => o.selected)\n      .forEach(o => selectFilter({ ...o, fieldId: facet.fieldId, selected: false }));\n    applyFilters();\n    resetShowMore();\n  }, [applyFilters, facet.fieldId, facet.options, resetShowMore, selectFilter]);\n  const allCategoriesText = t('allCategories');\n\n  if (facet.options.find(o => o.selected)) {\n    return (\n      <button\n        className={inactiveClassName}\n        onClick={handleClickAllCategories}\n      >\n        {`${allCategoriesText} + /`}</button>\n    );\n  }\n\n  return (\n    <div className={activeClassName}>{allCategoriesText}</div>\n  );\n}\n\n/** An option currently available for selection or deselection. */\nfunction AvailableOption(props: {\n  fieldId: string,\n  activeClassName?: string,\n  inactiveClassName?: string,\n  resetShowMore: () => void,\n  currentNode: HierarchicalFacetNode,\n  siblingNodes: HierarchicalFacetNode[]\n}) {\n  const { fieldId, currentNode, activeClassName, inactiveClassName, resetShowMore, siblingNodes } = props;\n  const { applyFilters, selectFilter } = useFiltersContext();\n  const { selected, lastDisplayNameToken, facetOption } = currentNode;\n  const handleClickAvailableOptions = useCallback(() => {\n    siblingNodes.filter(n => n.selected).forEach(n => selectFilter({\n      ...n.facetOption,\n      selected: false,\n      fieldId\n    }));\n    selectFilter({\n      ...facetOption,\n      selected: !selected,\n      fieldId\n    });\n    const parentFacetOption = currentNode.parentNode?.facetOption;\n    parentFacetOption && selectFilter({\n      ...parentFacetOption,\n      selected,\n      fieldId\n    });\n    applyFilters();\n    resetShowMore();\n  }, [\n    applyFilters,\n    currentNode.parentNode?.facetOption,\n    facetOption,\n    fieldId,\n    resetShowMore,\n    selectFilter,\n    selected,\n    siblingNodes\n  ]);\n\n  return (\n    <button\n      className={selected ? activeClassName : inactiveClassName}\n      onClick={handleClickAvailableOptions}\n    >\n      {lastDisplayNameToken}\n    </button>\n  );\n}\n\n/** A parent category that is not the most immediate one. */\nfunction ParentCategory({ fieldId, selectedNode, className, resetShowMore }: {\n  fieldId: string,\n  selectedNode: HierarchicalFacetNode,\n  className?: string,\n  resetShowMore: () => void\n}) {\n  const { applyFilters, selectFilter } = useFiltersContext();\n\n  const deselectChildOptions = useCallback((node: HierarchicalFacetNode) => {\n    const tree = node.childTree;\n    Object.values(tree).forEach(n => {\n      selectFilter({\n        ...n.facetOption,\n        selected: false,\n        fieldId\n      });\n      deselectChildOptions(n);\n    });\n  }, [fieldId, selectFilter]);\n\n  const handleClickParentCategory = useCallback(() => {\n    selectFilter({\n      ...selectedNode.facetOption,\n      selected: true,\n      fieldId\n    });\n    deselectChildOptions(selectedNode);\n    applyFilters();\n    resetShowMore();\n  }, [applyFilters, deselectChildOptions, fieldId, resetShowMore, selectFilter, selectedNode]);\n\n  return (\n    <button className={className} onClick={handleClickParentCategory}>\n      {selectedNode.lastDisplayNameToken + ' /'}\n    </button>\n  );\n}\n\n/** The currently selected category, i.e. the most immediate category. */\nfunction CurrentCategory({ fieldId, selectedNode, className, resetShowMore }: {\n  fieldId: string,\n  selectedNode: HierarchicalFacetNode,\n  className?: string,\n  resetShowMore: () => void\n}) {\n  const { applyFilters, selectFilter } = useFiltersContext();\n  const handleClickCurrentCategory = useCallback(() => {\n    selectFilter({\n      ...selectedNode.facetOption,\n      selected: false,\n      fieldId\n    });\n    const parentFacetOption = selectedNode.parentNode?.facetOption;\n    parentFacetOption && selectFilter({\n      ...parentFacetOption,\n      selected: true,\n      fieldId\n    });\n    applyFilters();\n    resetShowMore();\n  }, [\n    applyFilters,\n    fieldId,\n    resetShowMore,\n    selectFilter,\n    selectedNode.facetOption,\n    selectedNode.parentNode?.facetOption\n  ]);\n\n  return (\n    <button\n      className={className}\n      onClick={handleClickCurrentCategory}\n    >\n      {selectedNode.lastDisplayNameToken}\n    </button>\n  );\n}\n\n/** The \"Show more/less\" button for hiding/showing additional `AvailableOption`s */\nfunction ShowMoreButton({ className, isShowingMore, toggleShowMore }: {\n  className?: string,\n  isShowingMore: boolean,\n  toggleShowMore: () => void\n}) {\n  const { t } = useTranslation();\n  return (\n    <button className={className} onClick={toggleShowMore}>\n      {isShowingMore ? t('showLess') : t('showMore')}\n    </button>\n  );\n}","import { DisplayableFacet, FacetOption } from '@yext/search-headless-react';\nimport { useMemo } from 'react';\n\n/**\n * A tree of `HierarchicalFacetNode`s\n */\nexport type HierarchicalFacetTree = {\n  [key: string]: HierarchicalFacetNode\n};\n\n/**\n * A single node of a `HierarchicalFacetTree`\n */\nexport type HierarchicalFacetNode = {\n  selected: boolean,\n  hasSelectedChild: boolean,\n  facetOption: FacetOption,\n  childTree: HierarchicalFacetTree,\n  parentNode?: HierarchicalFacetNode,\n  displayNameTokens: string[],\n  lastDisplayNameToken: string\n};\n\n/**\n * Parses a `DisplayableFacet` into a `HierarchicalFacetTree`, then memoizes it.\n */\nexport function useHierarchicalFacetTree(\n  hierarchicalFacet: DisplayableFacet,\n  delimiter: string\n): HierarchicalFacetTree {\n  return useMemo(() => {\n    return parseHierarchicalFacetTree(hierarchicalFacet, delimiter);\n  }, [delimiter, hierarchicalFacet]);\n}\n\n/**\n * Parses a `DisplayableFacet` into a `HierarchicalFacetTree`.\n */\nexport function parseHierarchicalFacetTree(\n  hierarchicalFacet: DisplayableFacet,\n  delimiter: string\n): HierarchicalFacetTree {\n  const optionsInAscendingLength = hierarchicalFacet?.options.map(o => {\n    const displayNameTokens = o.displayName.split(delimiter).map(s => s.trim());\n    return {\n      ...o,\n      displayNameTokens\n    };\n  }).sort((a, b) => a.displayNameTokens.length - b.displayNameTokens.length) || [];\n\n  const tree: HierarchicalFacetTree = {};\n\n  optionsInAscendingLength.forEach(o => {\n    const {\n      displayNameTokens,\n      displayName\n    } = o;\n\n    let currentTree: HierarchicalFacetTree = tree;\n    let parentNode: HierarchicalFacetNode | undefined = undefined;\n\n    for (const token of displayNameTokens.slice(0, -1)) {\n      if (!(token in currentTree)) {\n        console.error(\n          `Error parsing hierarchical facet option \"${displayName}\" at token \"${token}\". Current tree:`,\n          JSON.stringify(tree));\n        return;\n      }\n      if (o.selected) {\n        currentTree[token].hasSelectedChild = true;\n      }\n      parentNode = currentTree[token];\n      currentTree = currentTree[token].childTree;\n    }\n\n    const lastDisplayNameToken = displayNameTokens[displayNameTokens.length - 1];\n    currentTree[lastDisplayNameToken] = {\n      selected: o.selected,\n      displayNameTokens,\n      lastDisplayNameToken,\n      facetOption: {\n        value: o.value,\n        matcher: o.matcher\n      },\n      hasSelectedChild: false,\n      childTree: {},\n      parentNode: parentNode\n    };\n  });\n\n  return tree;\n}","import { createContext, useContext } from 'react';\nimport { SelectableFieldValueFilter } from '../../models/SelectableFieldValueFilter';\n\n/**\n * FiltersContext is responsible for handling filter selection.\n *\n * @public\n */\nexport interface FiltersContextType {\n  /** A function called when a filter is selected. */\n  selectFilter: (filter: SelectableFieldValueFilter) => void,\n  /** A function called when filters should be applied. */\n  applyFilters: () => void,\n  /** The list of SelectableFieldValueFilters provided by the context. */\n  filters: SelectableFieldValueFilter[]\n}\n\n/**\n * Filters context which provides the filters to render and a handler for selecting a filter.\n *\n * @public\n */\nexport const FiltersContext = createContext<FiltersContextType | null>(null);\n\n/**\n * A hook used to access the {@link Filters.FiltersContextType}.\n *\n * @public\n */\nexport function useFiltersContext(): FiltersContextType {\n  const filtersContextInstance = useContext(FiltersContext);\n  if (filtersContextInstance === null) {\n    throw new Error('Tried to use FiltersContext when none exists.');\n  }\n  return filtersContextInstance;\n}\n","import { FieldValueFilter, useSearchState } from '@yext/search-headless-react';\nimport { useMemo } from 'react';\nimport { isDuplicateFieldValueFilter } from '../utils/filterutils';\n\n/**\n * Returns a memoized array of nlp filter display values, with hiddenFields and duplicate filters removed.\n *\n * @internal\n */\nexport function useNlpFilterDisplayNames(\n  removableFilters: FieldValueFilter[],\n  hiddenFields: string[]\n) {\n  const nlpFilters = useSearchState(state => state.vertical.appliedQueryFilters);\n\n  return useMemo(() => {\n    return nlpFilters?.filter(({ filter }) => {\n      if (hiddenFields.includes(filter.fieldId)) {\n        return false;\n      }\n      const duplicateFilter = removableFilters.find(f => isDuplicateFieldValueFilter(f, filter));\n      return !duplicateFilter;\n    }).map(f => f.displayValue) ?? [];\n  }, [hiddenFields, nlpFilters, removableFilters]);\n}\n","import { FieldValueFilter, useSearchState, useSearchActions, DisplayableFacet, DisplayableFacetOption, SearchActions, Matcher } from '@yext/search-headless-react';\nimport isEqual from 'lodash/isEqual.js';\nimport { useMemo } from 'react';\nimport { isNearFilterValue } from '../utils/filterutils';\nimport { isDescendantHierarchicalFacet } from '../utils/isDescendantHierarchicalFacet';\nimport { useStateUpdatedOnSearch } from './useStateUpdatedOnSearch';\nimport { useRemovableStaticFilters } from './useRemovableStaticFilters';\nimport { RemovableFilter } from '../components/AppliedFiltersDisplay';\n\n/**\n * Returns a memoized RemovableFilter[], with handling for static filters,\n * hierarchical facets, and non-hierarchical facets.\n *\n * Duplicates are kept.\n *\n * @internal\n */\nexport function useRemovableFilters(\n  hierarchicalFieldIds: string[] | undefined,\n  hierarchicalDelimiter: string,\n  hiddenFields: string[]\n): RemovableFilter[] {\n  const facets = useStateUpdatedOnSearch(state => state.filters.facets);\n  const hasResults = !!useSearchState(state => state.vertical.results);\n  const searchActions = useSearchActions();\n  const removableStaticFilters = useRemovableStaticFilters(hiddenFields);\n\n  return useMemo(() => {\n    if (!hasResults) {\n      return [];\n    }\n\n    const removableFacets = facets\n      ?.filter(f => !hiddenFields.includes(f.fieldId))\n      .flatMap((f: DisplayableFacet) => {\n        if (hierarchicalFieldIds?.includes(f.fieldId)) {\n          return processHierarchicalFacet(f, hierarchicalDelimiter, searchActions, facets);\n        }\n        return processRegularFacet(f, searchActions);\n      }) ?? [];\n\n    return [...removableStaticFilters, ...removableFacets];\n  }, [\n    facets,\n    hasResults,\n    hiddenFields,\n    hierarchicalDelimiter,\n    hierarchicalFieldIds,\n    searchActions,\n    removableStaticFilters\n  ]);\n}\n\nfunction processRegularFacet(f: DisplayableFacet, searchActions: SearchActions) {\n  return f.options.filter(o => o.selected).map(option => {\n\n    const filter: FieldValueFilter = {\n      value: option.value,\n      matcher: option.matcher,\n      fieldId: f.fieldId\n    };\n\n    return {\n      displayName: option.displayName,\n      handleRemove: () => handleRemoveFacetOption(filter, searchActions),\n      filter\n    };\n  });\n}\n\nfunction processHierarchicalFacet(\n  f: DisplayableFacet,\n  delimiter: string,\n  searchActions: SearchActions,\n  facets: DisplayableFacet[] | undefined\n): RemovableFilter[] {\n  function createAppliedFilter(o: DisplayableFacetOption, tokens: string[]) {\n    const filter = {\n      matcher: o.matcher,\n      value: o.value,\n      fieldId: f.fieldId\n    };\n\n    const handleRemove =\n      () => handleRemoveHierarchicalFacetOption(filter, tokens, delimiter, searchActions, facets);\n\n    return {\n      displayName: tokens[tokens.length - 1],\n      handleRemove,\n      filter,\n      tokens\n    };\n  }\n\n  return f.options.filter(o => o.selected).flatMap(selectedOption => {\n    const displayNameTokens = splitDisplayName(selectedOption.displayName, delimiter);\n    const appliedFacets: {\n      displayName: string,\n      handleRemove: () => void,\n      filter: FieldValueFilter,\n      tokens: string[]\n    }[] = [createAppliedFilter(selectedOption, displayNameTokens)];\n\n    // Create an object for each facet that is a parent of the currently selected option,\n    // despite them not being explicitly selected\n    f.options.forEach(option => {\n      const tokens = splitDisplayName(option.displayName, delimiter);\n      const isDescendant = isDescendantHierarchicalFacet(\n        displayNameTokens,\n        tokens\n      );\n      if (!isDescendant) {\n        return;\n      }\n      appliedFacets.push(createAppliedFilter(option, tokens));\n    });\n    appliedFacets.sort((a, b) => a.tokens.length - b.tokens.length);\n    return appliedFacets;\n  });\n}\n\nfunction handleRemoveHierarchicalFacetOption(\n  filter: {\n    value: DisplayableFacetOption['value'],\n    fieldId: string,\n    matcher: Matcher\n  },\n  displayNameTokens: string[],\n  delimiter: string,\n  searchActions: SearchActions,\n  facets: DisplayableFacet[] | undefined\n) {\n  searchActions.setFacetOption(filter.fieldId, {\n    matcher: filter.matcher,\n    value: filter.value\n  }, false);\n\n  // Uncheck all descendant options in the hierarchy\n  facets\n    ?.filter(f => f.fieldId === filter.fieldId)\n    .flatMap(f => f.options)\n    .forEach(o => {\n      if (!o.selected) {\n        return;\n      }\n      const tokensToCheck = splitDisplayName(o.displayName, delimiter);\n      if (isDescendantHierarchicalFacet(tokensToCheck, displayNameTokens)) {\n        searchActions.setFacetOption(filter.fieldId, {\n          matcher: o.matcher,\n          value: o.value\n        }, false);\n      }\n    });\n  const parentTokens = displayNameTokens.slice(0, -1);\n  const parentOption = facets\n    ?.filter(f => f.fieldId === filter.fieldId)\n    .flatMap(f => f.options)\n    .find(o => {\n      const tokens = splitDisplayName(o.displayName, delimiter);\n      return isEqual(tokens, parentTokens);\n    });\n\n  parentOption && searchActions.setFacetOption(filter.fieldId, {\n    matcher: parentOption.matcher,\n    value: parentOption.value\n  }, true);\n}\n\nfunction handleRemoveFacetOption(\n  { fieldId, matcher, value }: FieldValueFilter,\n  searchActions: SearchActions\n) {\n  if (isNearFilterValue(value)) {\n    console.error('A FieldValueFilter with a NearFilterValue is not a supported RemovableFilter.');\n    return;\n  }\n  searchActions.setFacetOption(fieldId, { matcher, value }, false);\n}\n\nfunction splitDisplayName(displayName: string, delimiter: string): string[] {\n  return displayName.split(delimiter).map(s => s.trim());\n}\n","/**\n * Given a parent displayName and corresponding tokens, and a child displayName and corresponding\n * tokens that we want to check, return whether the \"child\" is actually a descendant of the \"parent\"\n *\n * @internal\n */\nexport function isDescendantHierarchicalFacet(\n  descendantTokens: string[],\n  parentTokens: string[]\n): boolean {\n  if (descendantTokens.length <= parentTokens.length) {\n    return false;\n  }\n\n  for (let i = 0; i < parentTokens.length; i++) {\n    if (descendantTokens[i] !== parentTokens[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n","import { StateSelector, useSearchState } from '@yext/search-headless-react';\nimport { useRef } from 'react';\n\n/**\n * Selects a portion Answers State, snapshotted to the last time a search was completed.\n */\nexport function useStateUpdatedOnSearch<T>(\n  stateSelector: StateSelector<T>\n): T | undefined {\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n  const wasLoading = useRef<boolean | undefined>(isLoading);\n  const currentState = useSearchState(stateSelector);\n  const snapshottedState = useRef<T>(currentState);\n  if (!isLoading && wasLoading.current) {\n    snapshottedState.current = currentState;\n  }\n  wasLoading.current = isLoading;\n\n  return snapshottedState.current;\n}","import { useSearchState, useSearchActions } from '@yext/search-headless-react';\nimport { useMemo } from 'react';\nimport { RemovableFilter } from '../components/AppliedFiltersDisplay';\nimport { SelectableFieldValueFilter } from '../models/SelectableFieldValueFilter';\nimport { getSelectableFieldValueFilters } from '../utils/filterutils';\nimport { useStateUpdatedOnSearch } from './useStateUpdatedOnSearch';\n\n/**\n * Returns a RemovableFilter[] sourced from the static filters state.\n *\n * @internal\n */\nexport function useRemovableStaticFilters(hiddenFields: string[]): RemovableFilter[] {\n  const staticFilters = useStateUpdatedOnSearch(state => state.filters.static);\n  const hasResults = !!useSearchState(state => state.vertical.results);\n  const searchActions = useSearchActions();\n\n  return useMemo(() => {\n    if (!hasResults || !staticFilters) {\n      return [];\n    }\n\n    function handleRemoveStaticFilterOption(filter: SelectableFieldValueFilter) {\n      searchActions.setFilterOption({\n        filter: { ...filter, kind: 'fieldValue' },\n        selected: false\n      });\n    }\n\n    return getSelectableFieldValueFilters(staticFilters)\n      .filter(f => f.selected && !hiddenFields.includes(f.fieldId))\n      .map(f => ({\n        displayName: f.displayName ?? '',\n        handleRemove: () => handleRemoveStaticFilterOption(f),\n        filter: f\n      }));\n  }, [hasResults, hiddenFields, searchActions, staticFilters]);\n}\n","import { useSearchState, VerticalResults as VerticalResultsData } from '@yext/search-headless-react';\nimport { StandardSection } from './sections';\nimport {\n  SectionHeader,\n  SectionHeaderCssClasses,\n  builtInCssClasses as sectionHeaderCssClasses\n} from './sections/SectionHeader';\nimport { useComposedCssClasses } from '../hooks';\nimport classNames from 'classnames';\nimport { VerticalConfigMap } from '../models';\nimport React from 'react';\n\n/**\n * The CSS class interface used for {@link UniversalResults}.\n *\n * @public\n */\nexport interface UniversalResultsCssClasses extends SectionHeaderCssClasses {\n  universalResultsContainer?: string,\n  universalResultsLoading?: string\n}\n\nconst builtInCssClasses: Readonly<UniversalResultsCssClasses> = {\n  universalResultsContainer: 'space-y-8',\n  universalResultsLoading: 'opacity-50',\n  ...sectionHeaderCssClasses\n};\n\n/**\n * Props for {@link UniversalResults}.\n *\n * @public\n */\nexport interface UniversalResultsProps<T> {\n  /** Whether or not to show the applied filters. */\n  showAppliedFilters?: boolean,\n  /** A mapping of verticalKey to the configuration for each vertical. */\n  verticalConfigMap: VerticalConfigMap<T>,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: UniversalResultsCssClasses\n}\n\n/**\n * Displays the results of a universal search with the results for each vertical separated\n * into sections.\n *\n * @public\n *\n * @param props - {@link UniversalResultsProps}\n * @returns A React element for the universal results, or null if there are none\n */\nexport function UniversalResults<T>({\n  verticalConfigMap,\n  showAppliedFilters,\n  customCssClasses\n}: UniversalResultsProps<T>): React.JSX.Element | null {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const resultsFromAllVerticals = useSearchState(state => state?.universal?.verticals) || [];\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n\n  if (resultsFromAllVerticals.length === 0) {\n    return null;\n  }\n\n  const resultsClassNames = classNames(cssClasses.universalResultsContainer, {\n    [cssClasses.universalResultsLoading ?? '']: isLoading\n  });\n\n  return (\n    <div className={resultsClassNames}>\n      {renderVerticalSections({ resultsFromAllVerticals, showAppliedFilters, verticalConfigMap, cssClasses })}\n    </div>\n  );\n}\n\ninterface VerticalSectionsProps<T> extends UniversalResultsProps<T> {\n  resultsFromAllVerticals: VerticalResultsData[],\n  cssClasses: UniversalResultsCssClasses\n}\n\n/**\n * Renders a list of {@link SectionComponent}s based on the given list of vertical results and\n * corresponding configs, including specifying which section template to use.\n */\nfunction renderVerticalSections<T>(props: VerticalSectionsProps<T>): React.JSX.Element {\n  const { resultsFromAllVerticals, verticalConfigMap, cssClasses } = props;\n  return <>\n    {resultsFromAllVerticals\n      .filter(verticalResults => verticalResults.results)\n      .map(verticalResults => {\n        const verticalKey = verticalResults.verticalKey;\n        const verticalConfig = (verticalConfigMap as any)[verticalKey] || {};\n\n        const label = verticalConfig.label ?? verticalKey;\n        const results = verticalResults.results;\n\n        const SectionComponent = verticalConfig.SectionComponent || StandardSection;\n\n        const appliedQueryFilters = props.showAppliedFilters\n          ? verticalResults.appliedQueryFilters\n          : undefined;\n\n        return (\n          <SectionComponent\n            results={results}\n            verticalKey={verticalKey}\n            header={<SectionHeader {...{\n              label,\n              appliedQueryFilters,\n              verticalKey,\n              viewAllButton: verticalConfig.viewAllButton,\n              getViewAllUrl: verticalConfig.getViewAllUrl,\n              cssClasses\n            }}/>}\n            CardComponent={verticalConfig.CardComponent}\n            key={verticalKey}\n          />\n        );\n      })\n    }\n  </>;\n}\n","import { VerticalResultsCssClasses } from './VerticalResults';\nimport { CardComponent } from '../models';\nimport { Result } from '@yext/search-headless-react';\nimport { useComposedCssClasses } from '../hooks';\nimport classNames from 'classnames';\nimport React from 'react';\n\nconst builtInCssClasses: Readonly<VerticalResultsCssClasses> = {\n  verticalResultsLoading: 'opacity-50'\n};\n\ninterface VerticalResultsDisplayProps<T> {\n  CardComponent: CardComponent<T>,\n  isLoading?: boolean,\n  results: Result<T>[],\n  customCssClasses?: VerticalResultsCssClasses,\n  setResultsRef?: (index: number) => ((result: HTMLDivElement) => void) | null\n}\n\n/**\n * A Component that displays all the search results for a given vertical.\n *\n * @param props - The props for the Component, including the results and the card type\n *                to be used.\n */\nexport function VerticalResultsDisplay<T>(props: VerticalResultsDisplayProps<T>): React.JSX.Element | null {\n  const {\n    CardComponent,\n    results,\n    isLoading = false,\n    customCssClasses,\n    setResultsRef\n  } = props;\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  if (results.length === 0) {\n    return null;\n  }\n\n  const resultsClassNames = classNames(cssClasses.verticalResultsContainer, {\n    [cssClasses.verticalResultsLoading ?? '']: isLoading\n  });\n\n  return (\n    <div className={resultsClassNames}>\n      {results?.map(result => renderResult(CardComponent, result, setResultsRef))}\n    </div>\n  );\n}\n\n/**\n * Renders a single result using the specified card and configuration.\n *\n * @param CardComponent - The card for the vertical.\n * @param result - The result to render.\n */\nfunction renderResult<T>(\n  CardComponent: CardComponent<T>,\n  result: Result<T>,\n  setResultsRef?: (index: number) => ((result: HTMLDivElement) => void) | null\n): React.JSX.Element {\n  const key = result.id && result.index ? `${result.id}-${result.index}` : result.id || result.index;\n  return (\n    <div key={result.id} ref={result.index ? setResultsRef?.(result.index) : null}>\n      <CardComponent result={result} key={key}/>\n    </div>\n  );\n}","import { useComposedCssClasses } from '../../../hooks';\nimport {\n  ThumbsFeedback,\n  builtInCssClasses as thumbsFeedbackCssClasses,\n  FeedbackType,\n  ThumbsFeedbackCssClasses\n} from '../../ThumbsFeedback';\nimport { renderHighlightedValue } from '../../utils/renderHighlightedValue';\nimport { CtaData } from '../../../models';\n\nimport { HighlightedValue } from '@yext/search-headless-react';\nimport React, { MouseEventHandler } from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * The CSS class interface used for the StandardCardDisplay.\n *\n * @public\n */\ninterface StandardCardCssClasses extends ThumbsFeedbackCssClasses {\n  container?: string,\n  header?: string,\n  body?: string,\n  cta1?: string,\n  cta2?: string,\n  title?: string\n}\n\n/**\n * Default Tailwind styles for the StandardCardDisplay.\n */\nconst builtInCssClasses: Readonly<StandardCardCssClasses> = {\n  container: 'flex flex-col justify-between border border-gray-200 rounded-lg mb-4 p-4 shadow-sm',\n  header: 'flex text-neutral-dark',\n  body: 'flex justify-end pt-2.5 text-base',\n  cta1: 'whitespace-nowrap bg-primary text-white font-medium rounded-lg py-2 px-5 shadow',\n  cta2: 'whitespace-nowrap bg-white text-primary font-medium rounded-lg py-2 px-5 mt-2 shadow',\n  title: 'text-lg font-medium',\n  thumbsFeedbackContainer: 'flex justify-end mt-4 text-sm text-gray-500 font-medium',\n  thumbsUpIcon: thumbsFeedbackCssClasses.thumbsUpIcon,\n  thumbsDownIcon: thumbsFeedbackCssClasses.thumbsDownIcon\n};\n\n/**\n * Click handlers for the various buttons and links that can appear in the StandardCardDisplay.\n */\ninterface ClickHandlers {\n  handleTitleClick: MouseEventHandler<HTMLAnchorElement>,\n  handleCtaClick: MouseEventHandler<HTMLButtonElement>,\n  handleFeedbackClick: (feedback: FeedbackType) => void\n}\n\n/**\n * Props for displaying the basic, Standard card.\n */\ninterface StandardCardDisplayProps {\n  title: string | HighlightedValue,\n  link?: string,\n  description?: string,\n  showFeedbackButtons?: boolean,\n  cta1?: CtaData,\n  cta2?: CtaData,\n  clickHandlers: ClickHandlers,\n  customCssClasses?: StandardCardCssClasses\n}\n\n/**\n * The display portion of the {@link StandardCard}.\n *\n * @param props - Contains a title, an optional description, and up to two CTAs. Click handlers for\n *                the various buttons and links are also supplied. The props can also include custom\n *                styling.\n * @returns - The rendered Result card.\n */\nfunction StandardCardDisplay(props: StandardCardDisplayProps) {\n  const {\n    title,\n    link,\n    description,\n    customCssClasses,\n    clickHandlers,\n    showFeedbackButtons,\n    cta1,\n    cta2\n  } = props;\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  function renderTitle(title: string | HighlightedValue, link?: string) {\n    const titleJsx = renderHighlightedValue(title, { highlighted: 'font-bold', nonHighlighted: 'font-medium' });\n\n    return (\n      link\n        ? <a href={link} className='text-lg font-medium text-primary hover:underline focus:underline' onClick={clickHandlers.handleTitleClick}>\n          {titleJsx}\n        </a>\n        : <div className={cssClasses.title}>{titleJsx}</div>\n    );\n  }\n\n  function renderCTAs(cta1?: CtaData | undefined, cta2?: CtaData | undefined) {\n    if (cta1 || cta2) {\n      return (\n        <div className='flex flex-col justify-end ml-4'>\n          {cta1 &&\n            <button className={cssClasses.cta1} onClick={clickHandlers.handleCtaClick}>{cta1.label}</button>}\n          {cta2 &&\n            <button className={cssClasses.cta2} onClick={clickHandlers.handleCtaClick}>{cta2.label}</button>}\n        </div>\n      );\n    }\n\n    return null;\n  }\n\n  function renderDescription(text: string | undefined) {\n    if (text) {\n      return (\n        <div className='w-full'>\n          {renderHighlightedValue(text, { highlighted: 'font-semibold', nonHighlighted: 'font-normal' })}\n        </div>\n      );\n    }\n\n    return null;\n  }\n\n  function renderFeedbackIcons() {\n    if (showFeedbackButtons) {\n      return (\n        <ThumbsFeedback\n          feedbackText=''\n          onClick={clickHandlers.handleFeedbackClick}\n          customCssClasses={cssClasses}\n        />\n      );\n    }\n\n    return null;\n  }\n\n  return (\n    <div className={cssClasses.container}>\n      <div className={cssClasses.header}>\n        {renderTitle(title, link)}\n      </div>\n      {(description ?? cta1 ?? cta2) &&\n        <div className={cssClasses.body}>\n          {renderDescription(description)}\n          {renderCTAs(cta1, cta2)}\n        </div>\n      }\n      {renderFeedbackIcons()}\n    </div>\n  );\n}\n\n/**\n * The PropTypes for the StandardCardDisplay component. Note that props known at compile-time\n * are not included here. Type-checking of these props is taken care of by TypeScript.\n */\nStandardCardDisplay.propTypes = {\n  title: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.shape({\n      value: PropTypes.string.isRequired,\n      matchedSubstrings: PropTypes.arrayOf(PropTypes.shape({\n        length: PropTypes.number.isRequired,\n        offset: PropTypes.number.isRequired\n      })).isRequired\n    })\n  ]).isRequired,\n  link: PropTypes.string,\n  description: PropTypes.string,\n  cta1: PropTypes.shape({\n    label: PropTypes.string.isRequired,\n    link: PropTypes.string.isRequired,\n    linkType: PropTypes.string.isRequired\n  }),\n  cta2: PropTypes.shape({\n    label: PropTypes.string.isRequired,\n    link: PropTypes.string.isRequired,\n    linkType: PropTypes.string.isRequired\n  })\n};\n\nexport { StandardCardDisplay };\nexport type { StandardCardCssClasses };\n","import { useCardAnalyticsCallback } from '../../../hooks';\nimport { CardProps } from '../../../models';\nimport { useCardFeedbackCallback } from '../../../hooks';\nimport { StandardCardDisplay, StandardCardCssClasses } from './StandardCardDisplay';\nimport { DefaultRawDataType } from '../../../models';\nimport React from 'react';\n\n/**\n * Props for a StandardCard.\n *\n * @public\n */\nexport interface StandardCardProps<T = DefaultRawDataType> extends CardProps<T> {\n  /** Whether to show thumbs up/down buttons to provide feedback on the result card */\n  showFeedbackButtons?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: StandardCardCssClasses\n}\n\n/**\n * This Component renders the base result card.\n *\n * @public\n *\n * @param props - An object containing the result itself and any additional information needed\n *                to render the card\n * @returns A React element for the result card\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function StandardCard(props: StandardCardProps<any>): React.JSX.Element {\n  const {\n    result,\n    customCssClasses,\n    showFeedbackButtons\n  } = props;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const data: any = {\n    title: result.highlightedFields?.name ?? result.name ?? result.rawData.name,\n    description: result.highlightedFields?.description ?? result.rawData.description,\n    cta1: result.rawData.c_primaryCTA,\n    cta2: result.rawData.c_secondaryCTA,\n  };\n\n  // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop\n  const clickHandlers = {\n    handleCtaClick: useCardAnalyticsCallback(result, 'CTA_CLICK'),\n    handleTitleClick: useCardAnalyticsCallback(result, 'TITLE_CLICK'),\n    handleFeedbackClick: useCardFeedbackCallback(result)\n  };\n\n  /*\n    Note the title, link, description, and CTA props are sourced from LiveAPI data. This data\n    must be type-checked at run-time. This is accomplished by using the StandardCardDisplay's PropTypes.\n  */\n  return (\n    <StandardCardDisplay\n      customCssClasses={customCssClasses}\n      showFeedbackButtons={showFeedbackButtons}\n      clickHandlers={clickHandlers}\n      title={data.title}\n      link={result.link}\n      description={data.description}\n      cta1={data.cta1}\n      cta2={data.cta2}\n    />\n  );\n}\n\nexport type { StandardCardCssClasses };\n","import { VerticalResultsDisplay } from '../VerticalResultsDisplay';\nimport { SectionProps } from '../../models';\nimport { StandardCard } from '../cards/standard/StandardCard';\nimport { useComposedCssClasses } from '../../hooks';\nimport { VerticalResultsCssClasses } from '../VerticalResults';\nimport { DefaultRawDataType } from '../../models';\nimport React from 'react';\n\n/**\n * The CSS class interface used for {@link StandardSection}.\n *\n * @public\n */\nexport interface StandardSectionCssClasses extends VerticalResultsCssClasses {\n  section?: string\n}\n\nconst builtInCssClasses: Readonly<StandardSectionCssClasses> = {\n  section: ''\n};\n\n/**\n * The configuration for a StandardSection.\n *\n * @public\n */\nexport interface StandardSectionProps<T = DefaultRawDataType> extends SectionProps<T> {\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: StandardSectionCssClasses\n}\n\n/**\n * A component that displays all the results for a vertical using a standard section template.\n *\n * @public\n *\n * @param props - {@link StandardSectionProps}\n * @returns A React element for a standard section, or null if there are no results to display\n */\nexport function StandardSection<T>(props: StandardSectionProps<T>): React.JSX.Element | null {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, props.customCssClasses);\n  const { results, CardComponent = StandardCard, header } = props;\n\n  if (results.length === 0) {\n    return null;\n  }\n\n  return (\n    <section className={cssClasses.section}>\n      {header}\n      <VerticalResultsDisplay\n        results={results}\n        CardComponent={CardComponent}\n        customCssClasses={cssClasses}\n      />\n    </section>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport { AppliedFiltersCssClasses } from '../AppliedFilters';\nimport { AppliedFiltersDisplay } from '../AppliedFiltersDisplay';\nimport { CollectionIcon } from '../../icons/CollectionIcon';\nimport { AppliedQueryFilter, useSearchState } from '@yext/search-headless-react';\nimport classNames from 'classnames';\nimport { useAnalytics } from '../../hooks';\nimport { VerticalLink } from '../../models';\nimport React, { useCallback } from 'react';\n\nconst FALLBACK_CSS_CLASSES: SectionHeaderCssClasses = {};\n\n/**\n * The CSS class interface used for the SectionHeader component.\n *\n * @public\n */\nexport interface SectionHeaderCssClasses extends AppliedFiltersCssClasses {\n  sectionHeaderContainer?: string,\n  sectionHeaderIconContainer?: string,\n  sectionHeaderLabel?: string,\n  viewMoreContainer?: string,\n  viewMoreLink?: string\n}\n\nexport const builtInCssClasses: Readonly<SectionHeaderCssClasses> = {\n  sectionHeaderContainer: 'flex items-center w-full pl-1 mb-4',\n  sectionHeaderIconContainer: 'w-5 h-5',\n  sectionHeaderLabel: 'font-bold text-neutral-dark text-base pl-3',\n  viewMoreContainer: 'flex justify-end flex-grow ml-auto font-medium text-neutral-dark',\n  viewMoreLink: 'text-primary pr-1 pl-3',\n  appliedFiltersContainer: 'ml-3 flex flex-wrap',\n  nlpFilter: 'border border-gray-200 rounded-3xl px-3 py-1.5 text-sm font-medium text-neutral-dark mr-2',\n  removableFilter: 'flex items-center border border-gray-200 rounded-3xl px-3 py-1.5 text-sm font-medium text-neutral-dark mr-2'\n};\n\n/**\n * The props for a {@link SectionHeader}.\n */\nexport interface SectionHeaderProps {\n  /** The display label for the section header. */\n  label: string,\n  /** An array of AppliedQueryFilters which are displayed in the section header. */\n  appliedQueryFilters?: AppliedQueryFilter[],\n  /** CSS classes for customizing the component styling. */\n  cssClasses?: SectionHeaderCssClasses,\n  /** The verticalKey associated with the section. */\n  verticalKey: string,\n  /** Display a button to view all results for that section, if true. */\n  viewAllButton?: boolean,\n  /** A function which returns the viewAll link based on the vertical and query. */\n  getViewAllUrl?: (data: VerticalLink) => string\n}\n\n/**\n * The header of a section which includes an icon, the section title, applied query filters, and optionally\n * a view all button.\n *\n * @param props - {@link SectionHeaderProps}\n * @returns A React element for a Section Header\n */\nexport function SectionHeader(props: SectionHeaderProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const {\n    label,\n    verticalKey,\n    viewAllButton = false,\n    appliedQueryFilters,\n    cssClasses = FALLBACK_CSS_CLASSES,\n    getViewAllUrl\n  } = props;\n  const latestQuery = useSearchState(state => state.query.mostRecentSearch);\n  const nlpFilterDisplayNames = appliedQueryFilters?.map(f => f.displayValue);\n\n  const analytics = useAnalytics();\n  const queryId = useSearchState(state => state.query.queryId);\n  const searchId = useSearchState(state => state.meta.uuid);\n  const locale = useSearchState(state => state.meta.locale);\n  const experienceKey = useSearchState(state => state.meta.experienceKey);\n  const searchTerm = useSearchState(state => state.query.mostRecentSearch);\n\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n  cssClasses.appliedFiltersContainer = classNames(cssClasses.appliedFiltersContainer, {\n    [cssClasses.appliedFiltersLoading ?? '']: isLoading\n  });\n\n  const href = getViewAllUrl\n    ? getViewAllUrl({ verticalKey, query: latestQuery })\n    : `/${verticalKey}?query=${latestQuery}`;\n\n  const handleClickViewAllButton = useCallback(() => {\n    if (!analytics) {\n      return;\n    }\n    if (!queryId) {\n      console.error('Unable to report a vertical view all event. Missing field: queryId.');\n      return;\n    }\n    if (!searchId) {\n      console.error('Unable to report a vertical view all event. Missing field: searchId.');\n      return;\n    }\n    if (!experienceKey) {\n      console.error('Unable to report a vertical view all event. Missing field: experienceKey.');\n      return;\n    }\n    analytics?.report({\n      action: 'VERTICAL_VIEW_ALL',\n      locale,\n      searchId,\n      queryId,\n      verticalKey,\n      experienceKey,\n      searchTerm,\n    });\n  }, [analytics, experienceKey, locale, queryId, searchId, searchTerm, verticalKey]);\n\n  return (\n    <div className={cssClasses.sectionHeaderContainer}>\n      <div className={cssClasses.sectionHeaderIconContainer}>\n        <CollectionIcon></CollectionIcon>\n      </div>\n      <h2 className={cssClasses.sectionHeaderLabel}>{label}</h2>\n      {appliedQueryFilters &&\n        <AppliedFiltersDisplay nlpFilterDisplayNames={nlpFilterDisplayNames} cssClasses={cssClasses} />\n      }\n      {viewAllButton &&\n        <div className={cssClasses.viewMoreContainer}>\n          <a className={cssClasses.viewMoreLink} href={href} onClick={handleClickViewAllButton}>\n            {t('viewAll')}\n          </a>\n        </div>}\n    </div>\n  );\n}\n","import React from 'react';\n\nexport function CollectionIcon(): React.JSX.Element {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <path d=\"M19 11H5M19 11C20.1046 11 21 11.8954 21 13V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V13C3 11.8954 3.89543 11 5 11M19 11V9C19 7.89543 18.1046 7 17 7M5 11V9C5 7.89543 5.89543 7 7 7M7 7V5C7 3.89543 7.89543 3 9 3H15C16.1046 3 17 3.89543 17 5V7M7 7H17\" stroke=\"#1f2937\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n    </svg>\n  );\n}","import { CardComponent } from '../models';\nimport { useSearchState } from '@yext/search-headless-react';\nimport { VerticalResultsDisplay } from './VerticalResultsDisplay';\nimport React from 'react';\n\n/**\n * The CSS class interface used for {@link VerticalResults}.\n *\n * @public\n */\nexport interface VerticalResultsCssClasses {\n  verticalResultsContainer?: string,\n  verticalResultsLoading?: string\n}\n\n/**\n * Props for the VerticalResults component.\n *\n * @public\n */\nexport interface VerticalResultsProps<T> {\n  /** {@inheritDoc CardComponent} */\n  CardComponent: CardComponent<T>,\n  /**\n   * Whether or not all results should be displayed when there are none returned from the search.\n   * Defaults to true.\n   */\n  displayAllOnNoResults?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: VerticalResultsCssClasses,\n  /** set individual result refs. */\n  setResultsRef?: (index: number) => ((result: HTMLDivElement) => void) | null\n}\n\n/**\n * A component that renders search results for a vertical page.\n *\n * @public\n *\n * @param props - {@link VerticalResultsProps}\n * @returns A React element for the results, or null if no results should be displayed\n */\nexport function VerticalResults<T>(props: VerticalResultsProps<T>): React.JSX.Element | null {\n  const { displayAllOnNoResults = true, ...otherProps } = props;\n  const verticalResults = useSearchState(state => state.vertical.results) || [];\n  const allResultsForVertical =\n    useSearchState(state => state.vertical?.noResults?.allResultsForVertical.results) || [];\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let results = verticalResults as any;\n  if (verticalResults.length === 0 && displayAllOnNoResults) {\n    results = allResultsForVertical;\n  }\n\n  return (\n    <VerticalResultsDisplay results={results} isLoading={isLoading} {...otherProps} />\n  );\n}\n","import { useTranslation } from 'react-i18next';\nimport { useSearchState, useSearchActions } from '@yext/search-headless-react';\nimport { useComposedCssClasses } from '../hooks';\nimport { ChevronIcon as PageNavigationIcon } from '../icons/ChevronIcon';\nimport { usePaginationAnalytics } from '../hooks/usePaginationAnalytics';\nimport { executeSearch } from '../utils';\nimport React, { PropsWithChildren, useCallback } from 'react';\nimport classNames from 'classnames';\n\n/**\n * Props for {@link Pagination} component\n *\n * @public\n */\nexport interface PaginationProps {\n  /**\n   * Whether or not to paginate based on the total results count of\n   * the vertical when there are none returned from the search.\n   * Defaults to false.\n   */\n  paginateAllOnNoResults?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: PaginationCssClasses\n}\n\n/**\n * The CSS classes used for pagination.\n *\n * @public\n */\nexport interface PaginationCssClasses {\n  paginationContainer?: string,\n  paginationLoading?: string,\n  label?: string,\n  selectedLabel?: string,\n  leftIconContainer?: string,\n  rightIconContainer?: string,\n  icon?: string\n}\n\nconst builtInPaginationCssClasses: Readonly<PaginationCssClasses> = {\n  paginationContainer: 'flex justify-center mb-4',\n  paginationLoading: 'opacity-50',\n  label: 'z-0 inline-flex items-center px-4 py-2 text-sm font-semibold border border-gray-300 text-neutral',\n  selectedLabel: 'z-10 inline-flex items-center px-4 py-2 text-sm font-semibold border border-primary text-primary bg-primary-light',\n  leftIconContainer: 'inline-flex items-center px-3.5 py-2 border border-gray-300 rounded-l-md',\n  rightIconContainer: 'inline-flex items-center px-3.5 py-2 border border-gray-300 rounded-r-md',\n  icon: 'w-3 text-gray-600'\n};\n\n/**\n * Renders a component that divide a series of vertical results into chunks\n * across multiple pages and enable user to navigate between those pages.\n *\n * @public\n */\nexport function Pagination(props: PaginationProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const { customCssClasses = {}, paginateAllOnNoResults = false } = props;\n  const cssClasses = useComposedCssClasses(builtInPaginationCssClasses, customCssClasses);\n  const searchActions = useSearchActions();\n  const verticalResultsCount = useSearchState(state => state.vertical.resultsCount) || 0;\n  const allResultsCountForVertical =\n    useSearchState(state => state.vertical?.noResults?.allResultsForVertical.resultsCount) || 0;\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n\n  let resultsCount = verticalResultsCount;\n  if (verticalResultsCount === 0 && paginateAllOnNoResults) {\n    resultsCount = allResultsCountForVertical;\n  }\n\n  const offset = useSearchState(state => state.vertical.offset) || 0;\n  const limit = useSearchState(state => state.vertical.limit) || 20;\n  const currentPageNumber = (offset / limit) + 1;\n  const maxPageCount = Math.ceil(resultsCount / limit);\n\n  const reportAnalyticsEvent = usePaginationAnalytics();\n  const navigateToPage = useCallback((newPageNumber: number) => {\n    const newOffset = limit * (newPageNumber - 1);\n    searchActions.setOffset(newOffset);\n    searchActions.setIsPagination(true);\n    executeSearch(searchActions);\n    reportAnalyticsEvent();\n  }, [searchActions, limit, reportAnalyticsEvent]);\n\n  if (maxPageCount <= 1) {\n    return null;\n  }\n\n  const paginationLabels: string[] = generatePaginationLabels(currentPageNumber, maxPageCount);\n  const paginationContainerClassNames = classNames(cssClasses.paginationContainer, {\n    [cssClasses.paginationLoading ?? '']: isLoading\n  });\n\n  return (\n    <div className={paginationContainerClassNames}>\n      <nav className='inline-flex shadow-sm -space-x-px' aria-label={t('pagination')}>\n        <PaginationButton\n          ariaLabel={t('navigateToThePreviousResultsPage')}\n          className={cssClasses.leftIconContainer}\n          navigateToPage={navigateToPage}\n          newPageNumber={currentPageNumber - 1}\n          disabled={currentPageNumber === 1}\n        >\n          <PageNavigationIcon className={cssClasses.icon + ' transform -rotate-90'} />\n        </PaginationButton>\n        {paginationLabels.map((label, index) => {\n          switch (label) {\n            case '...':\n              return (\n                <div\n                  key={index}\n                  className={cssClasses.label}\n                >\n                  {label}\n                </div>\n              );\n            case `${currentPageNumber}`:\n              return (\n                <PaginationButton\n                  key={index}\n                  className={cssClasses.selectedLabel}\n                  navigateToPage={navigateToPage}\n                  newPageNumber={currentPageNumber}\n                >\n                  {label}\n                </PaginationButton>\n              );\n            default:\n              return (\n                <PaginationButton\n                  key={index}\n                  className={cssClasses.label}\n                  navigateToPage={navigateToPage}\n                  newPageNumber={Number(label)}\n                >\n                  {label}\n                </PaginationButton>\n              );\n          }\n        })}\n        <PaginationButton\n          ariaLabel={t('navigateToTheNextResultsPage')}\n          className={cssClasses.rightIconContainer}\n          navigateToPage={navigateToPage}\n          newPageNumber={currentPageNumber + 1}\n          disabled={currentPageNumber === maxPageCount}\n        >\n          <PageNavigationIcon className={cssClasses.icon + ' transform rotate-90'} />\n        </PaginationButton>\n      </nav>\n    </div>\n  );\n}\n\ninterface PaginationButtonProps {\n  className?: string,\n  navigateToPage: (newPageNumber: number) => void,\n  newPageNumber: number,\n  ariaLabel?: string,\n  disabled?: boolean\n}\n\nfunction PaginationButton(props: PropsWithChildren<PaginationButtonProps>): React.JSX.Element | null {\n  const { navigateToPage, newPageNumber } = props;\n  const handleClick = useCallback(() => {\n    navigateToPage(newPageNumber);\n  }, [navigateToPage, newPageNumber]);\n\n  return (\n    <button\n      aria-label={props.ariaLabel}\n      className={props.className}\n      onClick={handleClick}\n      disabled={props.disabled}\n    >\n      {props.children}\n    </button>\n  );\n}\n\nfunction generatePaginationLabels(currentPageNumber: number, maxPageCount: number): string[] {\n  const paginationLabels: string[] = [];\n  const previousPageNumber = currentPageNumber - 1;\n  const nextPageNumber = currentPageNumber + 1;\n\n  if (previousPageNumber > 3) {\n    paginationLabels.push('1', '...', `${previousPageNumber}`);\n  } else if (previousPageNumber !== 0) {\n    [...Array(previousPageNumber)].forEach((_, index) => paginationLabels.push(`${index + 1}`));\n  }\n  paginationLabels.push(`${currentPageNumber}`);\n  if (maxPageCount - nextPageNumber > 2) {\n    paginationLabels.push(`${nextPageNumber}`, '...', `${maxPageCount}`);\n  } else if (nextPageNumber <= maxPageCount) {\n    [...Array(maxPageCount - nextPageNumber + 1)]\n      .forEach((_, index) => paginationLabels.push(`${nextPageNumber + index}`));\n  }\n  return paginationLabels;\n}\n","import React from 'react';\n\nexport function ChevronIcon({ className }: { className?: string }): React.JSX.Element {\n  return (\n    <svg\n      viewBox=\"0 0 12 8\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      aria-hidden=\"true\"\n    >\n      <path d=\"M1.33341 6.5L6.00008 1.83333L10.6667 6.5\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n    </svg>\n  );\n}","import { useAnalytics } from './useAnalytics';\nimport { useSearchState } from '@yext/search-headless-react';\n\nexport function usePaginationAnalytics(): () => void {\n  const analytics = useAnalytics();\n  const verticalKey = useSearchState(state => state.vertical.verticalKey);\n  const queryId = useSearchState(state => state.query.queryId);\n  const searchId = useSearchState(state => state.meta.uuid);\n  const locale = useSearchState(state => state.meta.locale);\n  const experienceKey = useSearchState(state => state.meta.experienceKey);\n  const searchTerm = useSearchState(state => state.query.mostRecentSearch);\n\n  return () => {\n    if (!analytics) {\n      return;\n    }\n    if (!queryId) {\n      console.error('Unable to report a pagination event. Missing field: queryId.');\n      return;\n    }\n    if (!searchId) {\n      console.error('Unable to report a pagination event. Missing field: searchId.');\n      return;\n    }\n    if (!verticalKey) {\n      console.error('Unable to report a pagination event. Missing field: verticalKey.');\n      return;\n    }\n    if (!experienceKey) {\n      console.error('Unable to report a pagination event. Missing field: experienceKey.');\n      return;\n    }\n    analytics?.report({\n      action: 'PAGINATE',\n      locale,\n      searchId,\n      queryId,\n      verticalKey: verticalKey,\n      experienceKey,\n      searchTerm,\n    });\n  };\n}\n\n","import { useTranslation, Trans } from 'react-i18next';\nimport { StarIcon } from '../icons/StarIcon';\nimport { useSearchState, VerticalResults as VerticalResultsData } from '@yext/search-headless-react';\nimport { useComposedCssClasses } from '../hooks';\nimport classNames from 'classnames';\nimport { VerticalConfig } from '../models';\nimport React, { useMemo } from 'react';\n\n/**\n * The CSS class interface used for {@link AlternativeVerticals}.\n *\n * @public\n */\nexport interface AlternativeVerticalsCssClasses {\n  alternativeVerticalsContainer?: string,\n  alternativeVerticalsLoading?: string,\n  noResultsText?: string,\n  categoriesText?: string,\n  suggestion?: string,\n  verticalIcon?: string\n}\n\nconst builtInCssClasses: Readonly<AlternativeVerticalsCssClasses> = {\n  alternativeVerticalsContainer: 'flex flex-col justify-between border border-gray-200 rounded-lg mb-4 p-4 shadow-sm',\n  alternativeVerticalsLoading: 'opacity-50',\n  noResultsText: 'text-lg text-neutral-dark pb-2',\n  categoriesText: 'text-neutral',\n  suggestion: 'pb-4 flex items-center',\n  verticalIcon: 'w-4 mr-2'\n};\n\ninterface VerticalSuggestion {\n  resultsCount: number,\n  label?: string,\n  verticalKey: string\n}\n\nfunction isVerticalSuggestion(suggestion: unknown): suggestion is VerticalSuggestion {\n  return (suggestion as VerticalSuggestion)?.resultsCount !== undefined &&\n    (suggestion as VerticalSuggestion)?.verticalKey !== undefined;\n}\n\n/**\n * A map of vertical keys to labels.\n *\n * @public\n */\nexport interface VerticalLabelMap {\n  /** Config mapped to a vertical. */\n  [verticalKey: string]: Pick<VerticalConfig, 'label'>\n}\n\n/**\n * Props for {@link AlternativeVerticals}.\n *\n * @public\n */\nexport interface AlternativeVerticalsProps {\n  /** The label for the current vertical. */\n  currentVerticalLabel: string,\n  /** A map of verticalKeys to the display label for that vertical. */\n  verticalConfigMap: VerticalLabelMap,\n  /**\n   * Whether or not all results should be displayed when there are none returned from the search.\n   * Defaults to true.\n   */\n  displayAllOnNoResults?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: AlternativeVerticalsCssClasses\n}\n\n/**\n * A component that displays the alternative verticals that have results if a search returns none\n * on the current vertical.\n *\n * @public\n *\n * @param props - {@link AlternativeVerticalsProps}\n * @returns A React element for the alternative verticals, or null if there are none with results\n */\nexport function AlternativeVerticals({\n  currentVerticalLabel,\n  verticalConfigMap,\n  displayAllOnNoResults = true,\n  customCssClasses\n}: AlternativeVerticalsProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  const alternativeVerticals = useSearchState(state => state.vertical.noResults?.alternativeVerticals) || [];\n  const allResultsForVertical =\n    useSearchState(state => state.vertical.noResults?.allResultsForVertical.results) || [];\n  const query = useSearchState(state => state.query.mostRecentSearch);\n\n  const verticalSuggestions = buildVerticalSuggestions(verticalConfigMap, alternativeVerticals);\n  const isShowingAllResults = displayAllOnNoResults && allResultsForVertical.length > 0;\n\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n  const containerClassNames = classNames(cssClasses.alternativeVerticalsContainer, {\n    [cssClasses.alternativeVerticalsLoading ?? '']: isLoading\n  });\n\n  function buildVerticalSuggestions(\n    verticalConfigMap: VerticalLabelMap,\n    alternativeVerticals: VerticalResultsData[]): VerticalSuggestion[] {\n\n    return alternativeVerticals\n      .filter((alternativeResults: VerticalResultsData) => {\n        return !!verticalConfigMap[alternativeResults.verticalKey];\n      })\n      .map((alternativeResults: VerticalResultsData) => {\n        return {\n          label: verticalConfigMap[alternativeResults.verticalKey].label,\n          verticalKey: alternativeResults.verticalKey,\n          resultsCount: alternativeResults.resultsCount\n        };\n      })\n      .filter(isVerticalSuggestion)\n      .filter(verticalSuggestion => verticalSuggestion.resultsCount > 0);\n  }\n\n  const values = useMemo(() => ({ query }), [query]);\n  const components = useMemo(() => ({ strong: <strong /> }), []);\n\n  if (verticalSuggestions.length <= 0) {\n    return null;\n  }\n\n  const count = verticalSuggestions.length;\n\n  return (\n    <div className={containerClassNames}>\n      {renderNoResultsInfo()}\n      {verticalSuggestions &&\n        <div className='pt-4 text-neutral-dark'>\n          <div className={cssClasses.categoriesText}>\n            <Trans\n              i18nKey='categoriesText'\n              count={count}\n              values={values}\n              components={components}\n            />\n          </div>\n          <ul className='pt-4'>\n            {verticalSuggestions.map(renderSuggestion)}\n          </ul>\n        </div>\n      }\n    </div>\n  );\n\n  function renderNoResultsInfo() {\n    return (\n      <div className={cssClasses.noResultsText}>\n        <span>{t('noResultsFoundIn', { currentVerticalLabel })}</span>\n        {isShowingAllResults &&\n          <span> {t('showingAllInstead', { currentVerticalLabel })}</span>\n        }\n      </div>\n    );\n  }\n\n  function renderSuggestion(suggestion: VerticalSuggestion) {\n    const { verticalKey, resultsCount, label } = suggestion;\n    return (\n      <li key={verticalKey} className={cssClasses.suggestion}>\n        <div className={cssClasses.verticalIcon}><StarIcon/></div>\n        <span className='font-bold'>{\n          t('suggestionResultsCount', {\n            label,\n            count: resultsCount,\n          })}\n        </span>\n      </li>\n    );\n  }\n}\n","import React from 'react';\n\nexport function StarIcon({ className }: { className?: string }): React.JSX.Element {\n  return (\n    <svg\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 18 18\"\n      className={className}\n      aria-hidden=\"true\"\n    >\n      <path d=\"M8.991 0C4.023 0 0 4.032 0 9s4.023 9 8.991 9C13.968 18 18 13.968 18 9s-4.032-9-9.009-9zm3.816 14.4L9 12.105 5.193 14.4l1.008-4.329-3.357-2.907 4.428-.378L9 2.7l1.728 4.077 4.428.378-3.357 2.907z\"></path>\n    </svg>\n  );\n}\n","import { useTranslation } from 'react-i18next';\nimport {\n  SearchTypeEnum,\n  useSearchState,\n  VerticalResults,\n  VerticalSearchState\n} from '@yext/search-headless-react';\nimport classNames from 'classnames';\nimport { useComposedCssClasses } from '../hooks';\nimport React from 'react';\n\n/**\n *  The CSS class interface for {@link ResultsCount}.\n *\n * @public\n */\nexport interface ResultsCountCssClasses {\n  resultsCountContainer?: string,\n  resultsCountLoading?: string\n}\n\n/**\n * Props for {@link ResultsCount}.\n *\n * @public\n */\nexport interface ResultsCountProps {\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: ResultsCountCssClasses\n}\n\nconst builtInCssClasses: Readonly<ResultsCountCssClasses> = {\n  resultsCountContainer: 'font-semibold text-neutral mb-4 py-2 mr-2.5 whitespace-nowrap',\n  resultsCountLoading: 'opacity-50'\n};\n\n/**\n * Renders results count of a universal/vertical search.\n *\n * @public\n *\n * @param props - {@link ResultsCountProps}\n */\nexport function ResultsCount({ customCssClasses }: ResultsCountProps): React.JSX.Element | null {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const isLoading = useSearchState(state => state.searchStatus.isLoading);\n  const resultsCountText = useResultsCount();\n\n  const resultsCountClassnames = classNames(cssClasses.resultsCountContainer, {\n    [cssClasses.resultsCountLoading ?? '']: isLoading\n  });\n  return <div className={resultsCountClassnames}>{resultsCountText}</div>;\n}\n\n/**\n * Generates a string for the results count of the recent universal/vertical search.\n */\nfunction useResultsCount() {\n  const { t } = useTranslation();\n  const isVertical = useSearchState(state => state.meta.searchType) === SearchTypeEnum.Vertical;\n  const results = useSearchState(state => isVertical ? state.vertical : state.universal.verticals);\n  const offset = useSearchState(state => state.vertical.offset) || 0;\n  const limit = useSearchState(state => state.vertical.limit) || 20;\n  let resultsCount = 0;\n  if (results) {\n    if (isUniversalSearchResults(results)) {\n      results.forEach(resultsOfAVertical => resultsCount += resultsOfAVertical.resultsCount);\n    } else {\n      resultsCount = results.resultsCount ?? 0;\n    }\n  }\n  if (resultsCount === 0) {\n    return null;\n  }\n\n  if (resultsCount > limit && isVertical){\n    const paginateStart = offset + 1;\n    const paginateEnd = Math.min((offset + limit), resultsCount);\n    return t('resultsCountWithPaginationText', { paginateStart, paginateEnd, resultsCount });\n  } else {\n    return t('resultsCountText', { count: resultsCount });\n  }\n}\n\nfunction isUniversalSearchResults(data: VerticalResults[] | VerticalSearchState): data is VerticalResults[] {\n  return Array.isArray(data);\n}\n","import { useTranslation } from 'react-i18next';\nimport { useSearchUtilities } from '@yext/search-headless-react';\nimport React, { PropsWithChildren, useMemo, useState } from 'react';\nimport {\n  CheckboxOption,\n  CollapsibleSection,\n  FilterOptionConfig,\n  SearchInput,\n  FilterGroupProvider,\n  useFilterGroupContext,\n  CheckboxCssClasses\n} from './Filters';\nimport { FacetTitle } from './FacetTiltle';\n\nconst DEFAULT_CUSTOM_CSS_CLASSES = {};\n\n/**\n * The CSS class interface for FilterGroup.\n *\n * @public\n */\nexport interface FilterGroupCssClasses {\n  titleLabel?: string,\n  searchInput?: string,\n  optionsContainer?: string,\n  option?: string,\n  optionInput?: string,\n  optionLabel?: string\n}\n\n/**\n * Props for the FilterGroup component.\n *\n * @public\n */\nexport interface FilterGroupProps {\n  /** The fieldId corresponding to the filter group. */\n  fieldId: string,\n  /** {@inheritDoc FilterOptionConfig} */\n  filterOptions: FilterOptionConfig[],\n  /** The displayed label for the filter group. */\n  title: string,\n  /** Whether or not the filter is collapsible. Defaults to true. */\n  collapsible?: boolean,\n  /**\n   * If the filter group is collapsible, whether or not it should start out\n   * expanded. Defaults to true.\n   */\n  defaultExpanded?: boolean,\n  /** Whether or not to display a text input to search for filter options. */\n  searchable?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: FilterGroupCssClasses,\n  /** Limit on the number of options to be displayed. */\n  showMoreLimit?: number\n}\n\n/**\n * Renders a group of selectable filters with support for searching and collapsing.\n */\nexport function FilterGroup({\n  fieldId,\n  filterOptions,\n  title,\n  collapsible = true,\n  defaultExpanded = true,\n  searchable,\n  customCssClasses = DEFAULT_CUSTOM_CSS_CLASSES,\n  showMoreLimit = filterOptions.length,\n  children\n}: PropsWithChildren<FilterGroupProps>) {\n  const cssClasses = useMemo(() => {\n    const { option, optionLabel, optionInput, ...remainingClasses } = customCssClasses;\n    return {\n      ...remainingClasses,\n      ...option && { optionContainer: option },\n      ...optionLabel && { label: optionLabel },\n      ...optionInput && { input: optionInput }\n    };\n  }, [customCssClasses]);\n\n  return (\n    <FilterGroupProvider\n      fieldId={fieldId}\n      defaultExpanded={!collapsible || defaultExpanded}\n    >\n      <FacetTitle\n        label={title}\n        customCssClasses={customCssClasses}\n        collapsible={collapsible}\n      />\n      {collapsible ? (\n        <CollapsibleSection className={cssClasses.optionsContainer}>\n          {searchable && <SearchInput className={cssClasses.searchInput} />}\n          <CheckboxOptions\n            filterOptions={filterOptions}\n            showMoreLimit={showMoreLimit}\n            cssClasses={cssClasses} />\n          {children}\n        </CollapsibleSection>\n      ) : (\n        <div className={cssClasses.optionsContainer || 'space-y-3'}>\n          {searchable && <SearchInput className={cssClasses.searchInput} />}\n          <CheckboxOptions\n            filterOptions={filterOptions}\n            showMoreLimit={showMoreLimit}\n            cssClasses={cssClasses} />\n          {children}\n        </div>\n      )}\n    </FilterGroupProvider>\n  );\n}\n\nfunction CheckboxOptions({\n  filterOptions,\n  showMoreLimit,\n  cssClasses\n}: {\n  filterOptions: FilterOptionConfig[],\n  showMoreLimit: number,\n  cssClasses: CheckboxCssClasses\n}) {\n  const { t } = useTranslation();\n  const searchUtilities = useSearchUtilities();\n  const { searchValue } = useFilterGroupContext();\n\n  const shouldRenderOption = (\n    option: FilterOptionConfig\n  ) => {\n    return searchUtilities.isCloseMatch(option.displayName || option.value.toString(), searchValue);\n  };\n\n  let displayedOptions = filterOptions.filter(shouldRenderOption).map(o => {\n    return (\n      <CheckboxOption\n        {...o}\n        key={o.displayName || o.value.toString()}\n        customCssClasses={cssClasses}\n      />\n    );\n  });\n\n  const isLimited = displayedOptions.length > showMoreLimit;\n\n  const [showAll, setShowAll] = useState<boolean>(!isLimited);\n  displayedOptions = displayedOptions.slice(0, showAll ? displayedOptions.length : showMoreLimit);\n\n  return (\n    <>\n      {displayedOptions}\n      {isLimited &&\n        /* eslint-disable-next-line react-perf/jsx-no-new-function-as-prop */\n        <button className='text-primary py-1 text-sm' onClick={() => setShowAll(!showAll)}>\n          {showAll ? t('showLess') : t('showMore')}\n        </button>\n      }\n    </>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport { FieldValueFilter, Matcher, NumberRangeValue } from '@yext/search-headless-react';\nimport React, { ChangeEvent, useCallback, useEffect, useMemo } from 'react';\nimport { useFiltersContext } from './FiltersContext';\nimport { useFilterGroupContext } from './FilterGroupContext';\nimport { useComposedCssClasses } from '../../hooks';\nimport { findSelectableFieldValueFilter, isNumberRangeValue, getDefaultFilterDisplayName } from '../../utils/filterutils';\nimport classNames from 'classnames';\nimport { useId } from '../../hooks/useId';\n\n/**\n * The configuration data for a field value filter option.\n *\n * @public\n */\nexport interface FilterOptionConfig {\n  /** The value used to perform filtering. */\n  value: string | number | boolean | NumberRangeValue,\n  /** The type of filtering operation used. Defaults to an equals comparison. */\n  matcher?: Matcher,\n  /** If this particular filter should be selected by default. */\n  selectedByDefault?: boolean,\n  /** The display name. Defaults to the value prop. */\n  displayName?: string,\n  /** The number of results associated with this filter. */\n  resultsCount?: number\n}\n\n/**\n * Props for the {@link Filters.CheckboxOption}.\n *\n * @public\n */\nexport interface CheckboxOptionProps extends FilterOptionConfig {\n  /** CSS classes for customizing the component styling defined by {@link Filters.CheckboxCssClasses}. */\n  customCssClasses?: CheckboxCssClasses\n}\n\n/**\n * The CSS class interface for {@link Filters.CheckboxOption}.\n *\n * @public\n */\nexport interface CheckboxCssClasses {\n  input?: string,\n  input___disabled?: string,\n  label?: string,\n  label___disabled?: string,\n  container?: string,\n  optionContainer?: string,\n  tooltipContainer?: string,\n  tooltip?: string\n}\n\nconst builtInCssClasses: Readonly<CheckboxCssClasses> = {\n  label: 'text-neutral text-sm font-normal cursor-pointer',\n  label___disabled: 'opacity-50 cursor-not-allowed',\n  input: 'w-3.5 h-3.5 form-checkbox cursor-pointer border border-gray-300 rounded-sm text-primary focus:ring-primary',\n  input___disabled: 'border-gray-200 bg-gray-50 cursor-not-allowed',\n  container: 'flex items-center',\n  optionContainer: 'flex items-center space-x-3 peer',\n  tooltipContainer: 'invisible peer-hover:visible relative -right-5 -top-5',\n  tooltip: 'absolute z-10 left-0 -top-0.5 whitespace-nowrap rounded shadow-lg p-3 text-sm bg-neutral-dark text-white'\n};\n\n/**\n * A checkbox component that represents a single FieldValueFilter.\n *\n * @public\n *\n * @param props - {@link Filters.CheckboxOptionProps}\n */\nexport function CheckboxOption(props: CheckboxOptionProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const { fieldId, isOptionsDisabled } = useFilterGroupContext();\n  const {\n    value,\n    matcher = Matcher.Equals,\n    selectedByDefault = false,\n    displayName = props.value,\n    resultsCount\n  } = props;\n  const cssClasses = useComposedCssClasses(builtInCssClasses, props.customCssClasses);\n  const optionId = useId('facet');\n  const { selectFilter, filters, applyFilters } = useFiltersContext();\n\n  const handleClick = useCallback((checked: boolean) => {\n    selectFilter({\n      matcher,\n      fieldId,\n      value,\n      displayName: typeof displayName === 'string' ? displayName : undefined,\n      selected: checked\n    });\n    applyFilters();\n  }, [applyFilters, fieldId, displayName, selectFilter, value, matcher]);\n\n  const handleChange = useCallback((evt: ChangeEvent<HTMLInputElement>) => {\n    handleClick(evt.target.checked);\n  }, [handleClick]);\n\n  const optionFilter: FieldValueFilter = useMemo(() => {\n    return {\n      fieldId,\n      matcher,\n      value\n    };\n  }, [fieldId, value, matcher]);\n  const existingStoredFilter = findSelectableFieldValueFilter(optionFilter, filters);\n\n  useEffect(() => {\n    if (!existingStoredFilter && selectedByDefault) {\n      selectFilter({\n        ...optionFilter,\n        displayName: typeof displayName === 'string' ? displayName : undefined,\n        selected: true\n      });\n    }\n  }, [displayName, selectFilter, selectedByDefault, existingStoredFilter, optionFilter]);\n\n  const isSelected = existingStoredFilter ? existingStoredFilter.selected : false;\n\n  const displayNameString = isNumberRangeValue(displayName)\n    ? getDefaultFilterDisplayName(displayName)\n    : displayName.toString();\n  const labelText = resultsCount\n    ? `${displayNameString} (${resultsCount})`\n    : displayNameString;\n\n  const inputClasses = classNames(cssClasses.input, {\n    [cssClasses.input___disabled ?? '']: isOptionsDisabled\n  });\n  const labelClasses = classNames(cssClasses.label, {\n    [cssClasses.label___disabled ?? '']: isOptionsDisabled\n  });\n\n  return (\n    <div className={cssClasses.container}>\n      <div className={cssClasses.optionContainer}>\n        <input\n          type='checkbox'\n          id={optionId}\n          checked={isSelected}\n          className={inputClasses}\n          onChange={handleChange}\n          disabled={isOptionsDisabled}\n        />\n        <label className={labelClasses} htmlFor={optionId}>{labelText}</label>\n      </div>\n      {isOptionsDisabled &&\n        <div className={cssClasses.tooltipContainer}>\n          <div className={cssClasses.tooltip}>\n            {t('clearTheRangeToSelectOptions')}\n          </div>\n        </div>\n      }\n    </div>\n  );\n}\n","import { createContext, useContext } from 'react';\nimport { useCollapse } from 'react-collapsed';\n\ntype UseCollapseOutput = ReturnType<typeof useCollapse>;\n\n/**\n * FilterGroupContext is responsible for searchable filters and collapsible filter groups.\n *\n * @public\n */\nexport interface FilterGroupContextType {\n  /** The value which is being used to search the FilterGroup. */\n  searchValue: string,\n  /** The fieldId to use with child filter components e.g. {@link Filters.CheckboxOption}. */\n  fieldId: string,\n  /** Sets the searchValue which is used to filter the FilterGroup. */\n  setSearchValue: (value: string) => void,\n  /** Returns the attributes used to collapse the filter group. */\n  getCollapseProps: UseCollapseOutput['getCollapseProps'],\n  /** Returns the attributes used to toggle the filter group. */\n  getToggleProps: UseCollapseOutput['getToggleProps'],\n  /** Indicates whether or not the filter group is expanded. */\n  isExpanded: boolean,\n  /** Whether or not the filter options should be disabled. */\n  isOptionsDisabled: boolean,\n  /** Sets the value for whether or not the filter options should be disabled. */\n  setIsOptionsDisabled: (value: boolean) => void\n}\n\n/**\n * Filter context to support searchable filters and collapsible filter groups.\n *\n * @public\n */\nexport const FilterGroupContext = createContext<FilterGroupContextType | null>(null);\n\n/**\n * A hook used to access the {@link Filters.FilterGroupContextType}.\n *\n * @public\n */\nexport function useFilterGroupContext(): FilterGroupContextType {\n  const filterGroupContextInstance = useContext(FilterGroupContext);\n  if (filterGroupContextInstance === null) {\n    throw new Error('Tried to use FilterGroupContext when none exists.');\n  }\n  return filterGroupContextInstance;\n}","import classNames from 'classnames';\nimport { ChevronIcon } from '../../icons/ChevronIcon';\nimport { useFilterGroupContext } from './FilterGroupContext';\nimport { useComposedCssClasses } from '../../hooks';\nimport React from 'react';\n\n/**\n * The CSS class interface for {@link CollapsibleLabelProps}.\n *\n * @public\n */\nexport interface CollapsibleLabelCssClasses {\n  label?: string\n}\n\n/**\n * Props for {@link Filters.CollapsibleLabel}.\n *\n * @public\n */\nexport interface CollapsibleLabelProps {\n  /** The label's text value which is displayed by the component. */\n  label?: string,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: CollapsibleLabelCssClasses\n}\n\nexport const builtInCssClasses: Readonly<CollapsibleLabelCssClasses> = {\n  label: 'text-neutral-dark text-sm font-medium text-left',\n};\n\n/**\n * CollapsibleLabel is a button for collapsing and expanding filters within a parent\n * {@link Filters.FilterGroupProvider}.\n *\n * For more customization, use {@link Filters.FilterGroupContext} directly.\n *\n * @param props - {@link Filters.CollapsibleLabelProps}\n *\n * @public\n */\nexport function CollapsibleLabel({ label, customCssClasses }: CollapsibleLabelProps): React.JSX.Element {\n  const { isExpanded, getToggleProps } = useFilterGroupContext();\n  const iconClassName = classNames('w-3 text-gray-400', {\n    'transform rotate-180': !isExpanded\n  });\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  return (\n    <button className='w-full flex justify-between items-center mb-4' {...getToggleProps()}>\n      <div className={cssClasses.label}>\n        {label}\n      </div>\n      <ChevronIcon className={iconClassName}/>\n    </button>\n  );\n}\n","import React, { PropsWithChildren } from 'react';\nimport { useFilterGroupContext } from './FilterGroupContext';\n\n/**\n * Props for the {@link Filters.CollapsibleSection}.\n *\n * @public\n */\nexport type CollapsibleSectionProps = PropsWithChildren<{\n  /** CSS classes applied to the component's container div. */\n  className?: string\n}>;\n\n/**\n * CollapsibleSection are used for collapsing and un-collapsing groups of filters.\n * It is intended to be used with {@link Filters.CollapsibleLabel}s within the same\n * {@link Filters.FilterGroupProvider}.\n *\n * @param props - {@link Filters.CollapsibleSectionProps}\n *\n * @public\n */\nexport function CollapsibleSection(props: CollapsibleSectionProps): React.JSX.Element {\n  const {\n    className = 'space-y-3',\n    children\n  } = props;\n\n  const { getCollapseProps } = useFilterGroupContext();\n\n  return (\n    <div className={className} {...getCollapseProps()}>\n      {children}\n    </div>\n  );\n}","import {\n  DisplayableFacet,\n  useSearchActions,\n  useSearchState\n} from '@yext/search-headless-react';\nimport React, { ReactNode, useMemo } from 'react';\nimport { SelectableFieldValueFilter } from '../../models/SelectableFieldValueFilter';\n\nimport { getSelectedNumericalFacetFields, isNumberRangeValue } from '../../utils/filterutils';\nimport { clearStaticRangeFilters } from '../../utils/filterutils';\nimport { executeSearch } from '../../utils';\nimport { FiltersContext, FiltersContextType } from './FiltersContext';\n\n/**\n * Props for {@link Filters.FacetsProvider}\n *\n * @public\n */\nexport interface FacetsProviderProps {\n  /** CSS class names applied to the component's container div. */\n  className?: string,\n  /** Whether or not a search is automatically run when a filter is selected. Defaults to true. */\n  searchOnChange?: boolean,\n  /** A function which renders the Facets UI with the provided facets data.\n   *\n   * @remarks\n   * It is intended to be used with the Filters subcomponents including Filters.FilterGroupProvider,\n   * Filters.CollapsibleLabel, Filters.SearchInput, Filters.CheckboxOption, Filters.CollapsibleSection\n   */\n  children?: (facets: DisplayableFacet[]) => ReactNode\n}\n\n/**\n * The FacetsProvider component is a wrapper component around {@link Filters} that updates facet\n * options when a child filter is updated.\n *\n * The representation of the facets is configured using a FACC (function as a child component)\n * The FACC is passed the facets data, and is intended for use with components like\n * {@link Filters.CheckboxOption}.\n *\n * @public\n *\n * @param props - {@link Filters.FacetsProviderProps}\n */\nexport function FacetsProvider({\n  children,\n  className = 'w-full',\n  searchOnChange = true\n}: FacetsProviderProps): React.JSX.Element {\n  const searchActions = useSearchActions();\n  const facetsInState = useSearchState(state => state.filters.facets);\n  const facets = useMemo(() => facetsInState ?? [], [facetsInState]);\n  const filters: SelectableFieldValueFilter[] = useMemo(() => {\n    return facets.flatMap(f => f.options.map(o => {\n      return {\n        fieldId: f.fieldId,\n        value: o.value,\n        matcher: o.matcher,\n        selected: o.selected,\n        displayName: o.displayName\n      };\n    }));\n  }, [facets]);\n\n  const filtersContextInstance: FiltersContextType = useMemo(() => {\n    return {\n      selectFilter(filter: SelectableFieldValueFilter) {\n        if (typeof filter.value === 'object' && !isNumberRangeValue(filter.value)) {\n          console.error('Facets only support string, number, boolean, and NumberRangeValue. Found the following object value instead:', filter.value);\n          return;\n        }\n        const facetOption = {\n          matcher: filter.matcher,\n          value: filter.value\n        };\n        searchActions.setFacetOption(filter.fieldId, facetOption, filter.selected);\n      },\n      applyFilters() {\n        if (searchOnChange) {\n          searchActions.setOffset(0);\n          clearStaticRangeFilters(searchActions, getSelectedNumericalFacetFields(searchActions));\n          executeSearch(searchActions);\n        }\n      },\n      filters\n    };\n  }, [searchActions, filters, searchOnChange]);\n\n  return (\n    <div className={className}>\n      <FiltersContext.Provider value={filtersContextInstance}>\n        {children?.(facets)}\n      </FiltersContext.Provider>\n    </div>\n  );\n}","import React, { PropsWithChildren, useMemo, useState } from 'react';\nimport { useCollapse } from 'react-collapsed';\nimport { FilterGroupContext } from './FilterGroupContext';\n\n/**\n * Props for a {@link Filters.FilterGroupProvider}.\n *\n * @public\n */\nexport type FilterGroupProviderProps = PropsWithChildren<{\n  /** Whether the {@link Filters.FilterGroupProvider} should start out expanded. Defaults to true. */\n  defaultExpanded?: boolean,\n  /** {@inheritDoc Filters.FilterGroupContextType.fieldId} */\n  fieldId: string\n}>;\n\n/**\n * The Filters.FilterGroupProvider component represents a group of filters to\n * support for searching and collapsing.\n *\n * @remarks\n * A Filter.Group designates a set of filters which may be collapsed through the\n * {@link Filters.CollapsibleLabel} and {@link Filters.CollapsibleSection} components. A Filter.Group\n * also designates a set of filters which may be searched with the {@link Filters.SearchInput}\n * component.\n *\n * @public\n *\n * @param props - {@link Filters.FilterGroupProviderProps}\n */\nexport function FilterGroupProvider(props: FilterGroupProviderProps): React.JSX.Element {\n  const {\n    children,\n    defaultExpanded = true,\n    fieldId\n  } = props;\n\n  const [searchValue, setSearchValue] = useState('');\n  const [isOptionsDisabled, setIsOptionsDisabled] = useState(false);\n  const { getCollapseProps, getToggleProps, isExpanded } = useCollapse({ defaultExpanded });\n  const FilterGroupContextInstance = useMemo(() => {\n    return {\n      fieldId,\n      searchValue,\n      setSearchValue,\n      getCollapseProps,\n      getToggleProps,\n      isExpanded,\n      isOptionsDisabled,\n      setIsOptionsDisabled\n    };\n  }, [\n    fieldId,\n    getCollapseProps,\n    getToggleProps,\n    isExpanded,\n    searchValue,\n    isOptionsDisabled\n  ]);\n\n  return (\n    <FilterGroupContext.Provider value={FilterGroupContextInstance}>\n      {children}\n    </FilterGroupContext.Provider>\n  );\n}","import { useTranslation } from 'react-i18next';\nimport React, { ChangeEvent, useCallback } from 'react';\nimport { useFilterGroupContext } from './FilterGroupContext';\n\n/**\n * Props for the {@link Filters.SearchInput}.\n *\n * @public\n */\nexport interface SearchInputProps {\n  /** CSS class names applied to the input element. */\n  className?: string,\n  /** {@inheritDoc FilterSearch.placeholder} */\n  placeholder?: string\n}\n\n/**\n * SearchInput is a simple input component that updates the\n * active searchValue for a particular {@link Filters.FilterGroupProvider}.\n *\n * @param props - {@link Filters.SearchInputProps}\n *\n * @public\n */\nexport function SearchInput(props: SearchInputProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const {\n    className = 'text-sm form-input bg-white h-9 w-full outline-none p-2 mb-2 rounded-md border border-gray-300 focus:ring-primary focus:ring-0 text-neutral-dark placeholder:text-neutral',\n    placeholder\n  } = props;\n  const { searchValue, setSearchValue } = useFilterGroupContext();\n  const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n    setSearchValue(e.target.value);\n  }, [setSearchValue]);\n\n  return (\n    <input\n      className={className}\n      type='text'\n      placeholder={placeholder ?? t('searchHere')}\n      value={searchValue}\n      onChange={handleChange}\n    />\n  );\n}\n","import { useSearchActions, useSearchState } from '@yext/search-headless-react';\nimport React, { PropsWithChildren, useMemo } from 'react';\nimport { SelectableFieldValueFilter } from '../../models/SelectableFieldValueFilter';\nimport { getSelectableFieldValueFilters } from '../../utils/filterutils';\nimport { executeSearch } from '../../utils';\nimport { FiltersContext, FiltersContextType } from './FiltersContext';\n\n/**\n * Props for the {@link Filters.StaticFiltersProvider}.\n *\n * @public\n */\nexport type StaticFiltersProviderProps = PropsWithChildren<{\n  /** CSS class names applied to the StaticFilter's container div. */\n  className?: string,\n  /** Whether or not a search is automatically run when a filter is selected. Defaults to true. */\n  searchOnChange?: boolean\n}>;\n\n/**\n * The StaticFilters component is a wrapper component around {@link Filters} that updates static filter\n * options when a child filter is updated.\n *\n * The representation of the facets is configured using props.children,\n * and is intended for use with components like {@link Filters.CheckboxOption}.\n *\n * @param props - {@link Filters.StaticFiltersProviderProps}\n *\n * @public\n */\nexport function StaticFiltersProvider({\n  children,\n  className = 'w-full',\n  searchOnChange = true\n}: StaticFiltersProviderProps): React.JSX.Element {\n  const searchActions = useSearchActions();\n  const displayableFilters = useSearchState(state => state.filters.static);\n\n  const filtersContextInstance: FiltersContextType = useMemo(() => {\n    return {\n      selectFilter(filter: SelectableFieldValueFilter) {\n        const { selected, displayName, ...fieldValueFilter } = filter;\n        searchActions.setFilterOption({\n          filter: {\n            kind: 'fieldValue',\n            ...fieldValueFilter\n          },\n          selected,\n          displayName\n        });\n      },\n      applyFilters() {\n        if (searchOnChange) {\n          searchActions.setOffset(0);\n          searchActions.resetFacets();\n          executeSearch(searchActions);\n        }\n      },\n      filters: getSelectableFieldValueFilters(displayableFilters ?? [])\n    };\n  }, [searchActions, displayableFilters, searchOnChange]);\n\n  return (\n    <div className={className}>\n      <FiltersContext.Provider value={filtersContextInstance}>\n        {children}\n      </FiltersContext.Provider>\n    </div>\n  );\n}\n","import { useTranslation } from 'react-i18next';\nimport { Matcher, NumberRangeValue, useSearchActions, useSearchState } from '@yext/search-headless-react';\nimport React, { ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useFilterGroupContext } from './FilterGroupContext';\nimport { useComposedCssClasses } from '../../hooks';\nimport { getDefaultFilterDisplayName, clearStaticRangeFilters, findSelectableFieldValueFilter, getSelectableFieldValueFilters, parseNumberRangeInput } from '../../utils/filterutils';\nimport { executeSearch } from '../../utils';\nimport classNames from 'classnames';\nimport { useFiltersContext } from './FiltersContext';\nimport { InvalidIcon } from '../../icons/InvalidIcon';\n\n/**\n * Props for RangeInput\n *\n * @public\n */\nexport interface RangeInputProps {\n  /**\n   * Returns the filter's display name based on the range values which is used when the filter\n   * is displayed by other components such as AppliedFilters.\n   *\n   * @remarks\n   * By default, the displayName separates the range with a dash such as '10 - 20'.\n   * If the range is unbounded, it will display as 'Up to 20' or 'Over 10'.\n   */\n  getFilterDisplayName?: (value: NumberRangeValue) => string,\n  /**\n   * An optional element which renders in front of the input text.\n   */\n  inputPrefix?: React.JSX.Element,\n  /** CSS classes for customizing the component styling defined by RangeInputCssClasses */\n  customCssClasses?: RangeInputCssClasses\n}\n\n/**\n * The CSS class interface for RangeInput.\n *\n * @public\n */\nexport interface RangeInputCssClasses {\n  rangeInputContainer?: string,\n  input?: string,\n  input___withPrefix?: string,\n  input___withoutPrefix?: string,\n  input___disabled?: string,\n  input___enabled?: string,\n  input___valid?: string,\n  input___invalid?: string,\n  inputContainer?: string,\n  inputRowContainer?: string,\n  buttonsContainer?: string,\n  inputPrefix?: string,\n  inputPrefix___disabled?: string,\n  inputPrefix___enabled?: string,\n  applyButton?: string,\n  clearButton?: string,\n  tooltipContainer?: string,\n  tooltip?: string,\n  invalidMessage?: string,\n  invalidRowContainer?: string\n}\n\nconst builtInCssClasses: Readonly<RangeInputCssClasses> = {\n  rangeInputContainer: 'flex flex-col',\n  input: 'w-full h-9 form-input cursor-pointer border rounded-md focus:ring-0 text-neutral-dark text-sm text-right appearance-none leading-9',\n  input___withPrefix: 'pl-[2.5rem]',\n  input___withoutPrefix: 'px-2',\n  input___disabled: 'bg-gray-50 placeholder:text-neutral-light cursor-not-allowed',\n  input___enabled: 'placeholder:text-neutral',\n  input___valid: 'border-gray-300 focus:border-primary',\n  input___invalid: 'border-red-700 focus:border-red-700',\n  inputContainer: 'relative',\n  inputRowContainer: 'flex flex-row items-center space-x-3 group',\n  buttonsContainer: 'flex flex-row items-center justify-between pt-2',\n  inputPrefix: 'absolute left-2 top-2 text-sm',\n  inputPrefix___disabled: 'text-neutral-light cursor-not-allowed',\n  inputPrefix___enabled: 'text-neutral',\n  applyButton: 'text-sm text-primary font-medium',\n  clearButton: 'text-sm text-neutral font-medium',\n  tooltipContainer: 'invisible group-hover:visible relative -top-6',\n  tooltip: 'absolute z-10 left-0 whitespace-nowrap rounded shadow-lg p-3 text-sm bg-neutral-dark text-white',\n  invalidMessage: 'pl-3 text-sm text-red-700',\n  invalidRowContainer: 'pt-2 flex flex-row items-center'\n};\n\n/**\n * Represents a single number range static filter which accepts user input.\n *\n * @public\n *\n * @param props - RangeInputProps\n */\nexport function RangeInput(props: RangeInputProps): React.JSX.Element | null {\n  const { t } = useTranslation();\n  const { filters } = useFiltersContext();\n  const { fieldId, setIsOptionsDisabled } = useFilterGroupContext();\n  const {\n    getFilterDisplayName = getDefaultFilterDisplayName,\n    inputPrefix\n  } = props;\n  const cssClasses = useComposedCssClasses(builtInCssClasses, props.customCssClasses);\n  const searchActions = useSearchActions();\n  const [minRangeInput, setMinRangeInput] = useState<string>('');\n  const [maxRangeInput, setMaxRangeInput] = useState<string>('');\n  const staticFilters = useSearchState(state => state.filters.static);\n  const fieldValueFilters = useMemo(\n    () => getSelectableFieldValueFilters(staticFilters ?? []),\n    [staticFilters]\n  );\n  const isDisabled = filters.some(filter => filter.selected && filter.fieldId === fieldId);\n\n  const rangeFilter = useMemo(() => {\n    return {\n      kind: 'fieldValue' as const,\n      fieldId,\n      matcher: Matcher.Between,\n      value: parseNumberRangeInput(minRangeInput, maxRangeInput),\n    };\n  }, [fieldId, maxRangeInput, minRangeInput]);\n\n  const isValid = isValidRange(rangeFilter.value);\n\n   // Find a static filter which matches the current range input\n  const matchingFilter = findSelectableFieldValueFilter(rangeFilter, fieldValueFilters);\n  const isSelectedInAnswersState = matchingFilter?.selected === true;\n  const hasUserInput = !!(minRangeInput || maxRangeInput);\n  const shouldRenderApplyButton = hasUserInput && !isSelectedInAnswersState;\n\n  useEffect(() => {\n    setIsOptionsDisabled(hasUserInput);\n  }, [hasUserInput, setIsOptionsDisabled]);\n\n  const handleMinChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n    const input = event?.target?.value;\n    validateNumericInput(input) && setMinRangeInput(input);\n  }, []);\n\n  const handleMaxChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n    const input = event?.target?.value;\n    validateNumericInput(input) && setMaxRangeInput(input);\n  }, []);\n\n  const handleClickApply = useCallback(() => {\n    if (!rangeFilter.value.start && !rangeFilter.value.end) {\n      return;\n    }\n    if (!isValid) {\n      return;\n    }\n    const displayName = getFilterDisplayName(rangeFilter.value);\n    clearStaticRangeFilters(searchActions, new Set([fieldId]));\n    searchActions.setFilterOption({\n      filter: rangeFilter,\n      selected: true,\n      displayName\n    });\n    searchActions.setOffset(0);\n    executeSearch(searchActions);\n  }, [searchActions, fieldId, getFilterDisplayName, isValid, rangeFilter]);\n\n  const handleClickClear = useCallback(() => {\n    const displayName = getFilterDisplayName(rangeFilter.value);\n    searchActions.setFilterOption({\n      filter: rangeFilter,\n      selected: false,\n      displayName\n    });\n    setMinRangeInput('');\n    setMaxRangeInput('');\n    searchActions.setOffset(0);\n    executeSearch(searchActions);\n  }, [searchActions, getFilterDisplayName, rangeFilter]);\n\n  const inputClasses = classNames(cssClasses.input, {\n    [cssClasses.input___withPrefix ?? '']: !!inputPrefix,\n    [cssClasses.input___withoutPrefix ?? '']: !inputPrefix,\n    [cssClasses.input___disabled ?? '']: isDisabled,\n    [cssClasses.input___enabled ?? '']: !isDisabled,\n    [cssClasses.input___invalid ?? '']: !isValid,\n    [cssClasses.input___valid ?? '']: isValid\n  });\n\n  const inputPrefixClasses = classNames(cssClasses.inputPrefix, {\n    [cssClasses.inputPrefix___disabled ?? '']: isDisabled,\n    [cssClasses.inputPrefix___enabled ?? '']: !isDisabled,\n  });\n\n  function renderInput(\n    value: string,\n    onChange: React.ChangeEventHandler<HTMLInputElement> | undefined,\n    placeholder: string\n  ) {\n    return (\n      <div className={cssClasses.inputContainer}>\n        {inputPrefix && <span className={inputPrefixClasses} aria-hidden='true'>{inputPrefix}</span>}\n        <input\n          type='text'\n          inputMode='decimal'\n          value={value}\n          placeholder={placeholder}\n          disabled={isDisabled}\n          className={inputClasses}\n          onChange={onChange}\n        />\n      </div>\n    );\n  }\n\n  return (\n    <div className={cssClasses.rangeInputContainer}>\n      <div className={cssClasses.inputRowContainer}>\n        {renderInput(minRangeInput, handleMinChange, t('min'))}\n        <div className='w-2.5 text-sm text-neutral'>-</div>\n        {renderInput(maxRangeInput, handleMaxChange, t('max'))}\n        {isDisabled &&\n        <div className={cssClasses.tooltipContainer}>\n          <div className={cssClasses.tooltip}>\n            {t('unselectAnOptionToEnterInARange')}</div>\n        </div>\n        }\n      </div>\n      {!isValid &&\n        <div className={cssClasses.invalidRowContainer}>\n          <InvalidIcon/>\n          <div className={cssClasses.invalidMessage}>{t('invalidRange')}</div>\n        </div>\n      }\n      {hasUserInput &&\n        <div className={cssClasses.buttonsContainer}>\n          <button\n            className={cssClasses.clearButton}\n            onClick={handleClickClear}\n          >\n            {t('clearMinAndMax')}</button>\n          {shouldRenderApplyButton &&\n            <button\n              className={cssClasses.applyButton}\n              onClick={handleClickApply}\n            >\n              {t('apply')}</button>\n          }\n        </div>\n      }\n    </div>\n  );\n}\n\n/**\n * Returns true only if the provided string passes the numeric validation.\n *\n * @remarks\n * Allows whole numbers and numbers with a single period.\n */\nfunction validateNumericInput(str: string) {\n  const numberRegex = new RegExp(/^\\d*\\.?\\d*$/);\n  return numberRegex.test(str);\n}\n\n/**\n * Determines if the range is valid.\n */\nfunction isValidRange(range: NumberRangeValue): boolean {\n  if (range.start && range.end) {\n    return range.start.value <= range.end.value;\n  }\n  return true;\n}\n","import React from 'react';\n\nexport function InvalidIcon(): React.JSX.Element {\n  return (\n    <svg width=\"20\" height=\"18\" viewBox=\"0 0 20 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n      <path d=\"M9.99955 7V9M9.99955 13H10.0095M3.07134 17H16.9277C18.4673 17 19.4296 15.3333 18.6598 14L11.7316 2C10.9618 0.666667 9.0373 0.666667 8.2675 2L1.33929 14C0.569492 15.3333 1.53174 17 3.07134 17Z\" stroke=\"#B91C1C\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n    </svg>\n  );\n}\n","import { builtInCollapsibleLabelCssClasses, CollapsibleLabel, CollapsibleLabelCssClasses } from './Filters';\nimport React, { Fragment, useMemo } from 'react';\nimport { twMerge } from '../hooks/useComposedCssClasses';\nimport { FilterGroupCssClasses } from './FilterGroup';\n\n/**\n * Props for the {@link FacetTitle} component.\n *\n * @internal\n */\nexport interface FacetTitleProps {\n  /** The label to use in the title. */\n  label?: string,\n  /** {@inheritDoc FilterGroupProps.collapsible} */\n  collapsible?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: FilterGroupCssClasses\n}\n\n/**\n * The tile of a facet component.\n *\n * @param props - props to render the component\n * @returns A React component\n *\n * @internal\n */\nexport function FacetTitle({\n  label,\n  customCssClasses,\n  collapsible = true,\n}: FacetTitleProps) {\n  const collapsibleLabelCssClasses: CollapsibleLabelCssClasses = useMemo(() => {\n    return {\n      label: customCssClasses?.titleLabel\n    };\n  }, [customCssClasses]);\n\n  return <Fragment>\n    {collapsible\n      ? <CollapsibleLabel label={label} customCssClasses={collapsibleLabelCssClasses} />\n      : (label && <div className={twMerge(\n        'mb-4', builtInCollapsibleLabelCssClasses.label, collapsibleLabelCssClasses.label)}>\n        {label}\n      </div>)}\n  </Fragment>;\n}\n","import { FilterGroup, FilterGroupCssClasses } from './FilterGroup';\nimport { FilterOptionConfig } from './Filters';\nimport { StaticFiltersProvider } from './Filters';\nimport React from 'react';\n\n/**\n * The CSS class interface for {@link StaticFilters}.\n *\n * @public\n */\nexport interface StaticFiltersCssClasses extends FilterGroupCssClasses {\n  staticFiltersContainer?: string\n}\n\n/**\n * The configuration data for a field value static filter option.\n *\n * @public\n */\nexport type StaticFilterOptionConfig = Omit<FilterOptionConfig, 'value'> & {\n  /** The value used to perform filtering. */\n  value: string | number | boolean\n};\n\n/**\n * Props for the {@link StaticFilters} component.\n *\n * @public\n */\nexport interface StaticFiltersProps {\n  /** The fieldId corresponding to the static filter group. */\n  fieldId: string,\n  /** {@inheritDoc StaticFilterOptionConfig} */\n  filterOptions: StaticFilterOptionConfig[],\n  /** The displayed label for the static filter group. */\n  title: string,\n  /** {@inheritDoc FilterGroupProps.collapsible} */\n  collapsible?: boolean,\n  /** {@inheritDoc FilterGroupProps.defaultExpanded} */\n  defaultExpanded?: boolean,\n  /** {@inheritDoc FilterGroupProps.searchable} */\n  searchable?: boolean,\n  /**\n   * Whether or not a search is automatically run when a filter is selected.\n   * Defaults to true.\n   */\n  searchOnChange?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: StaticFiltersCssClasses\n}\n\n/**\n * A component that displays a group of user-configured field value filters\n * that will be applied to the current vertical search.\n *\n * @param props - {@link StaticFiltersProps}\n * @returns A React component for field value static filters\n *\n * @public\n */\nexport function StaticFilters(props: StaticFiltersProps): React.JSX.Element {\n  const { searchOnChange, customCssClasses = {}, ...filterGroupProps } = props;\n  const { staticFiltersContainer: containerClassName, ...filterGroupCssClasses } = customCssClasses;\n  return (\n    <StaticFiltersProvider searchOnChange={searchOnChange} className={containerClassName}>\n      <FilterGroup\n        key={filterGroupProps.fieldId}\n        customCssClasses={filterGroupCssClasses}\n        {...filterGroupProps}\n      />\n    </StaticFiltersProvider>\n  );\n}\n","import { FacetsProvider } from './Filters';\nimport { FilterGroup, FilterGroupCssClasses } from './FilterGroup';\nimport React, { Fragment } from 'react';\nimport { FilterDivider } from './FilterDivider';\nimport { isStringFacet } from '../utils/filterutils';\n\n/**\n * The CSS class interface for {@link StandardFacets}.\n *\n * @deprecated Use {@link StandardFacet} with {@link Facets} instead.\n * @public\n */\nexport interface StandardFacetsCssClasses extends FilterGroupCssClasses {\n  standardFacetsContainer?: string,\n  divider?: string\n}\n\n/**\n * Props for the {@link StandardFacets} component.\n *\n * @deprecated Use {@link StandardFacet} with {@link Facets} instead.\n * @public\n */\nexport interface StandardFacetsProps {\n  /** {@inheritDoc FilterGroupProps.collapsible} */\n  collapsible?: boolean,\n  /** {@inheritDoc FilterGroupProps.defaultExpanded} */\n  defaultExpanded?: boolean,\n  /**\n   * Whether or not a search is automatically run when a filter is selected.\n   * Defaults to true.\n   */\n  searchOnChange?: boolean,\n  /** List of filter ids that should not be displayed. */\n  excludedFieldIds?: string[],\n  /**\n   * Whether or not to show the option counts for each filter.\n   * Defaults to true.\n   */\n  showOptionCounts?: boolean,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: StandardFacetsCssClasses,\n  /**\n   * Limit on the number of options to be displayed.\n   * Defaults to 10.\n   */\n  showMoreLimit?: number\n}\n\n/**\n * A component that displays simple facets applicable to the current vertical search.\n *\n * @remarks\n * Numerical facets is not included. Hierachical facets will not be display in a\n * tree level structure. Use `excludedFieldIds` to exclude hierachical facets, if any,\n * when using this component.\n *\n * @param props - {@link StandardFacetsProps}\n * @returns A React component for facets\n *\n * @deprecated Use {@link Facets} instead.\n * @public\n */\nexport function StandardFacets(props: StandardFacetsProps): React.JSX.Element {\n  const {\n    searchOnChange,\n    excludedFieldIds = [],\n    customCssClasses = {},\n    showMoreLimit = 10,\n    showOptionCounts = true,\n    ...filterGroupProps\n  } = props;\n  return (\n    <FacetsProvider searchOnChange={searchOnChange} className={customCssClasses.standardFacetsContainer}>\n      {facets => facets\n        .filter(f => !excludedFieldIds.includes(f.fieldId) && isStringFacet(f))\n        .map((f, i) => {\n          return (\n            <Fragment key={f.fieldId}>\n              <FilterGroup\n                fieldId={f.fieldId}\n                filterOptions={f.options.map(o => {\n                  return showOptionCounts ? { ...o, resultsCount: o.count } : o;\n                })}\n                title={f.displayName}\n                customCssClasses={customCssClasses}\n                showMoreLimit={showMoreLimit}\n                searchable={f.options.length > showMoreLimit}\n                {...filterGroupProps}\n              />\n              {(i < facets.length - 1) && <FilterDivider className={customCssClasses.divider}/>}\n            </Fragment>\n          );\n        })\n      }\n    </FacetsProvider>\n  );\n}\n","import { twMerge } from '../hooks/useComposedCssClasses';\nimport React from 'react';\n/**\n * A divider component used to separate NumericalFacets, HierarchicalFacets, StandardFacets,\n * and StaticFilters.\n *\n * @param props - A customizable className for filter divider\n * @returns A React component for filter divider\n *\n * @public\n */\nexport function FilterDivider({ className }: { className?: string }): React.JSX.Element {\n  return <div className={twMerge('w-full h-px bg-gray-200 my-4', className)} />;\n}","import {\n  CollapsibleLabel,\n  CollapsibleSection,\n  FacetsProvider,\n  FilterGroupProvider,\n  HierarchicalFacetDisplay,\n  HierarchicalFacetDisplayCssClasses\n} from './Filters';\nimport { StandardFacetsProps } from './StandardFacets';\nimport React, { Fragment } from 'react';\nimport { FilterDivider } from './FilterDivider';\n\n/**\n * The CSS class interface for {@link HierarchicalFacets}.\n *\n * @public\n */\nexport interface HierarchicalFacetsCssClasses extends HierarchicalFacetDisplayCssClasses {\n  hierarchicalFacetsContainer?: string,\n  divider?: string\n}\n\n/**\n * Props for the {@link HierarchicalFacets} component.\n *\n * @deprecated Use {@link HierarchicalFacet} with {@link Facets} instead.\n * @public\n */\nexport interface HierarchicalFacetsProps extends Omit<StandardFacetsProps, 'excludedFieldIds'> {\n  /** List of filter ids to render as hierarchical facets. */\n  includedFieldIds: string[],\n  /** The delimiter for determining facet hierarchies, defaults to \"\\>\". */\n  delimiter?: string,\n  /** The maximum number of options to render before displaying the \"Show more/less\" button. Defaults to 4. */\n  showMoreLimit?: number,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: HierarchicalFacetsCssClasses\n}\n\n/**\n * A component that displays hierarchical facets, in a tree level structure,\n * applicable to the current vertical search.\n *\n * @param props - {@link HierarchicalFacetsProps}\n * @returns A React component for facets\n *\n * @deprecated Use {@link HierarchicalFacet} with {@link Facets} instead.\n * @public\n */\nexport function HierarchicalFacets({\n  searchOnChange,\n  collapsible,\n  defaultExpanded,\n  includedFieldIds,\n  customCssClasses = {},\n  delimiter,\n  showMoreLimit\n}: HierarchicalFacetsProps): React.JSX.Element {\n  return (\n    <FacetsProvider searchOnChange={searchOnChange} className={customCssClasses.hierarchicalFacetsContainer}>\n      {facets => facets\n        .filter(f => f.options.length > 0 && includedFieldIds.includes(f.fieldId))\n        .map((f, i) => {\n          return (\n            <Fragment key={f.fieldId}>\n              <FilterGroupProvider\n                fieldId={f.fieldId}\n                defaultExpanded={!collapsible || defaultExpanded}\n              >\n                {collapsible\n                  ? <CollapsibleLabel label={f.displayName} />\n                  : (f.displayName && <div className='text-neutral-dark text-sm font-medium text-left mb-4'>{f.displayName}</div>)\n                }\n                <CollapsibleSection >\n                  <HierarchicalFacetDisplay\n                    facet={f}\n                    delimiter={delimiter}\n                    showMoreLimit={showMoreLimit}\n                    customCssClasses={customCssClasses}\n                  />\n                </CollapsibleSection>\n              </FilterGroupProvider>\n              {(i < facets.length - 1) && <FilterDivider className={customCssClasses.divider}/>}\n            </Fragment>\n          );\n        })\n      }\n    </FacetsProvider>\n  );\n}","import { FacetsProvider, RangeInput, RangeInputCssClasses } from './Filters/index';\nimport { FilterGroup, FilterGroupCssClasses } from './FilterGroup';\nimport React, { Fragment } from 'react';\nimport { NumberRangeValue } from '@yext/search-headless-react';\nimport { StandardFacetsProps } from './StandardFacets';\nimport { isNumericalFacet } from '../utils/filterutils';\nimport { FilterDivider } from './FilterDivider';\n\n/**\n * The CSS class interface for {@link NumericalFacets}.\n *\n * @public\n */\nexport interface NumericalFacetsCssClasses extends FilterGroupCssClasses, RangeInputCssClasses {\n  numericalFacetsContainer?: string,\n  divider?: string\n}\n\n/**\n * Props for the {@link NumericalFacets} component.\n *\n * @deprecated Use {@link NumericalFacet} with {@link Facets} instead.\n * @public\n */\nexport interface NumericalFacetsProps extends Omit<StandardFacetsProps, 'excludedFieldIds'> {\n  /** List of filter ids to render as numerical facets. */\n  includedFieldIds?: string[],\n  /**\n   * Returns the filter's display name based on the range values which is used when the filter\n   * is displayed by other components such as AppliedFilters.\n   *\n   * @remarks\n   * By default, the displayName separates the range with a dash such as '10 - 20'.\n   * If the range is unbounded, it will display as 'Up to 20' or 'Over 10'.\n   */\n  getFilterDisplayName?: (value: NumberRangeValue) => string,\n  /**\n   * An optional element which renders in front of the input text.\n   */\n  inputPrefix?: React.JSX.Element,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: NumericalFacetsCssClasses\n}\n\nconst DEFAULT_RANGE_INPUT_PREFIX = <>$</>;\n\n/**\n * A component that displays numerical facets applicable to the current vertical search.\n *\n * @param props - {@link NumericalFacetsProps}\n * @returns A React component for facets\n *\n * @deprecated Use {@link NumericalFacet} with {@link Facets} instead.\n * @public\n */\nexport function NumericalFacets({\n  searchOnChange,\n  includedFieldIds = [],\n  getFilterDisplayName,\n  inputPrefix = DEFAULT_RANGE_INPUT_PREFIX,\n  customCssClasses = {},\n  ...filterGroupProps\n}: NumericalFacetsProps): React.JSX.Element {\n  return (\n    <FacetsProvider searchOnChange={searchOnChange} className={customCssClasses.numericalFacetsContainer}>\n      {facets => facets\n        .filter(f => isNumericalFacet(f)\n          && (includedFieldIds.length === 0 || includedFieldIds.includes(f.fieldId)))\n        .map((f, i) => {\n          return (\n            <Fragment key={f.fieldId}>\n              <FilterGroup\n                fieldId={f.fieldId}\n                filterOptions={f.options}\n                title={f.displayName}\n                customCssClasses={customCssClasses}\n                {...filterGroupProps}\n              >\n                <RangeInput\n                  getFilterDisplayName={getFilterDisplayName}\n                  inputPrefix={inputPrefix}\n                  customCssClasses={customCssClasses}\n                />\n              </FilterGroup>\n              {(i < facets.length - 1) && <FilterDivider className={customCssClasses.divider}/>}\n            </Fragment>\n          );\n        })\n      }\n    </FacetsProvider>\n  );\n}","import { FilterGroup } from './FilterGroup';\nimport { DisplayableFacet } from '@yext/search-headless-react';\nimport { StandardFacetProps } from './FacetProps';\nimport React from 'react';\n\n/**\n * A component that displays the content of a standard facet.\n *\n * @param props - props to render the component\n * @returns A React component for the content of a standard facet\n *\n * @internal\n */\nexport function StandardFacetContent({\n  fieldId,\n  label,\n  transformOptions,\n  customCssClasses,\n  facet,\n  showMoreLimit = 10,\n  showOptionCounts = true,\n  ...filterGroupProps\n}: StandardFacetProps & { facet: DisplayableFacet }) {\n  const options = facet.options || [];\n  const transformedOptions = transformOptions ? (transformOptions(options) || []) : options;\n\n  return (\n    <FilterGroup\n      fieldId={fieldId}\n      filterOptions={transformedOptions.map(o => {\n        return showOptionCounts ? { ...o, resultsCount: o.count } : o;\n      })}\n      title={label || facet.displayName}\n      customCssClasses={customCssClasses}\n      showMoreLimit={showMoreLimit}\n      searchable={facet?.options.length > showMoreLimit}\n      {...filterGroupProps}\n    />\n  );\n}\n","import { FacetsProvider } from './Filters';\nimport { StandardFacetContent } from './StandardFacetContent';\nimport {\n  FacetProps, FacetsCssClasses,\n  FacetsProps, HierarchicalFacetProps, NumericalFacetProps,\n  StandardFacetProps\n} from './FacetProps';\nimport { isNumericalFacet, isStringFacet } from '../utils/filterutils';\nimport { FilterDivider } from './FilterDivider';\nimport React, { Fragment, ReactElement, useMemo } from 'react';\nimport { NumericalFacetContent } from './NumericalFacetContent';\nimport { HierarchicalFacetContent } from './HierarchicalFacetContent';\nimport { DisplayableFacet } from '@yext/search-headless-react';\n\n/** @internal */\nenum FacetType {\n  STANDARD = 'STANDARD',\n  NUMERICAL = 'NUMERICAL',\n  HIERARCHICAL = 'HIERARCHICAL'\n}\n\n/**\n * A component that displays all facets applicable to the current vertical search.\n *\n * @remarks\n * This component is a quick way of getting facets on the page, and it will render standard facets,\n * numerical facets, and hierarchical facets. The {@link StandardFacet}, {@link NumericalFacet},\n * and {@link HierarchicalFacet} components can be used to override the default facet configuration.\n *\n * @param props - {@link FacetsProps}\n * @returns A React component for facets\n *\n * @public\n */\nexport function Facets(props: FacetsProps): React.JSX.Element {\n  const {\n    searchOnChange,\n    onlyRenderChildren = false,\n    children,\n    hierarchicalFieldIds,\n    excludedFieldIds = [],\n    customCssClasses = {},\n  } = props;\n  const resolvedHierarchicalFieldIds = useMemo(() => hierarchicalFieldIds ?? [], [hierarchicalFieldIds]);\n\n  const fieldIdToCustomFacetProps = new Map();\n  const fieldIds: string[] = [];\n  if (children) {\n    (Array.isArray(children) ? children : [children])\n      .filter((child): child is ReactElement<FacetProps> =>\n        React.isValidElement<FacetProps>(child) && !!child?.props?.fieldId)\n      .forEach(child => {\n        fieldIdToCustomFacetProps.set(child.props.fieldId, child);\n        fieldIds.push(child.props.fieldId);\n      });\n  }\n\n  return (\n    <div>\n      <FacetsProvider searchOnChange={searchOnChange} className={customCssClasses.facetsContainer}>\n        {facets => {\n          if (!facets?.length) {\n            return;\n          }\n\n          if (!onlyRenderChildren) {\n            facets.forEach(facet => {\n              if (!fieldIds.includes(facet.fieldId)) {\n                fieldIds.push(facet.fieldId);\n              }\n            });\n          }\n\n          const fieldIdToFacet = new Map();\n          facets.forEach(facet => fieldIdToFacet.set(facet.fieldId, facet));\n\n          return fieldIds\n            .filter(fieldId =>\n              !excludedFieldIds.includes(fieldId)\n              && fieldIdToFacet.get(fieldId).options.length > 0\n              && (!onlyRenderChildren || fieldIdToCustomFacetProps.has(fieldId)))\n            .map((fieldId, i) => {\n              const facet: DisplayableFacet = fieldIdToFacet.get(fieldId);\n\n              return (\n                <Fragment key={facet.fieldId}>\n                  <Facet\n                    facet={facet}\n                    facetsCustomCssClasses={customCssClasses}\n                    fieldIdToCustomFacetProps={fieldIdToCustomFacetProps}\n                    hierarchicalFieldIds={resolvedHierarchicalFieldIds}\n                  />\n                  {(i < facets.length - 1)\n                    && <FilterDivider className={customCssClasses?.divider}/>}\n                </Fragment>\n              );\n            });\n        }\n        }\n      </FacetsProvider>\n    </div>\n  );\n}\n\n/**\n * A component that displays a single standard facet. Use this to override the default rendering.\n *\n * @param props - {@link StandardFacetProps}\n * @returns ReactElement\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function StandardFacet(props: StandardFacetProps) { return null; }\n\n/**\n * A component that displays a single numerical facet. Use this to override the default rendering.\n *\n * @param props - {@link NumericalFacetProps}\n * @returns ReactElement\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function NumericalFacet(props: NumericalFacetProps) { return null; }\n\n/**\n * A component that displays a single hierarchical facet, in a tree level structure, applicable to\n * the current vertical search. Use this to override the default rendering.\n *\n * @param props - {@link HierarchicalFacetProps}\n * @returns ReactElement\n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function HierarchicalFacet(props: HierarchicalFacetProps) { return null; }\n\n/**\n * A component that represents a single facet.\n *\n * @param facet - {@link DisplayableFacet}\n * @param facetsCustomCssClasses - {@link FacetsCssClasses}\n * @param fieldIdToCustomFacetProps - a map of fieldId to facet props\n * @param hierarchicalFieldIds - a list of hierarchical field ids\n * @returns {@link ReactElement}\n *\n * @internal\n */\nexport function Facet({\n  facet,\n  facetsCustomCssClasses,\n  fieldIdToCustomFacetProps,\n  hierarchicalFieldIds,\n}: {\n  facet: DisplayableFacet,\n  facetsCustomCssClasses: FacetsCssClasses,\n  fieldIdToCustomFacetProps: Map<string, any>,\n  hierarchicalFieldIds: string[]\n}) {\n  let facetType: FacetType;\n  let facetProps: FacetProps = {\n    fieldId: facet.fieldId,\n    label: facet.displayName,\n  };\n  const customFacetElement = fieldIdToCustomFacetProps.get(facet.fieldId);\n  if (customFacetElement) {\n    facetProps = { ...facetProps, ...customFacetElement.props };\n    facetType = getFacetTypeFromReactElementType(\n      (typeof customFacetElement.type === 'function')\n        ? customFacetElement.type.name : '');\n  } else {\n    facetType = getFacetTypeFromFacet(facet, hierarchicalFieldIds);\n  }\n\n  facetProps = {\n    ...facetProps,\n    customCssClasses: {\n      ...facetsCustomCssClasses,\n      ...facetProps.customCssClasses,\n    },\n  };\n\n  switch (facetType) {\n    case FacetType.NUMERICAL:\n      return (<NumericalFacetContent facet={facet} {...facetProps}/>);\n    case FacetType.HIERARCHICAL:\n      return (<HierarchicalFacetContent facet={facet} {...facetProps}/>);\n    case FacetType.STANDARD:\n    // fall through\n    default:\n      return (<StandardFacetContent facet={facet} {...facetProps}/>);\n  }\n}\n\n/**\n * Returns the type of the facet based on the props.\n * @param elementType - string\n * @returns {@link FacetType}\n *\n * @internal\n */\nexport function getFacetTypeFromReactElementType(elementType: string) {\n  switch (elementType) {\n    case NumericalFacet.name.toString():\n      return FacetType.NUMERICAL;\n    case HierarchicalFacet.name.toString():\n      return FacetType.HIERARCHICAL;\n    case StandardFacet.name.toString():\n      // fall through\n    default:\n      return FacetType.STANDARD;\n  }\n}\n\n/**\n * Returns the type of the facet based on facet.\n * @param facet - {@link DisplayableFacet}\n * @param hierarchicalFieldIds - string\n * @returns {@link FacetType}\n *\n * @internal\n */\nexport function getFacetTypeFromFacet(\n  facet: DisplayableFacet,\n  hierarchicalFieldIds: string[] = [],\n) {\n  if (hierarchicalFieldIds.includes(facet.fieldId)) {\n    return FacetType.HIERARCHICAL;\n  } else if (isStringFacet(facet)) {\n    return FacetType.STANDARD;\n  } else if (isNumericalFacet(facet)) {\n    return FacetType.NUMERICAL;\n  }\n\n  return FacetType.STANDARD;\n}\n","import { FilterGroup } from './FilterGroup';\nimport { DisplayableFacet } from '@yext/search-headless-react';\nimport { NumericalFacetProps } from './FacetProps';\nimport { RangeInput } from './Filters';\nimport React from 'react';\n\nconst DEFAULT_RANGE_INPUT_PREFIX = <>$</>;\n\n/**\n * A component that displays the content of a numerical facet.\n *\n * @param props - props to render the component\n * @returns A React component for the content of a standard facet\n *\n * @internal\n */\nexport function NumericalFacetContent({\n  fieldId,\n  label,\n  transformOptions,\n  customCssClasses,\n  getFilterDisplayName,\n  facet,\n  showMoreLimit = 10,\n  showOptionCounts = false,\n  inputPrefix = DEFAULT_RANGE_INPUT_PREFIX,\n  ...filterGroupProps\n}: NumericalFacetProps & { facet: DisplayableFacet }) {\n  const options = facet.options || [];\n  const transformedOptions = transformOptions ? (transformOptions(options) || []) : options;\n\n  return (\n    <FilterGroup\n      fieldId={fieldId}\n      filterOptions={transformedOptions.map(o => {\n        return showOptionCounts ? { ...o, resultsCount: o.count } : o;\n      })}\n      title={label || facet.displayName}\n      customCssClasses={customCssClasses}\n      showMoreLimit={showMoreLimit}\n      searchable={facet?.options.length > showMoreLimit}\n      {...filterGroupProps}\n    >\n      <RangeInput\n        getFilterDisplayName={getFilterDisplayName}\n        inputPrefix={inputPrefix}\n        customCssClasses={customCssClasses}\n      />\n    </FilterGroup>\n  );\n}\n","import { DisplayableFacet } from '@yext/search-headless-react';\nimport { HierarchicalFacetProps } from './FacetProps';\nimport {\n  CollapsibleSection,\n  FilterGroupProvider,\n  HierarchicalFacetDisplay\n} from './Filters';\nimport { FacetTitle } from './FacetTiltle';\nimport React from 'react';\n\n/**\n * A component that displays the content of a hierarchical facet.\n *\n * @param props - props to render the component\n * @returns A React component for the content of a hierarchical facet\n *\n * @internal\n */\nexport function HierarchicalFacetContent({\n  fieldId,\n  label,\n  transformOptions,\n  customCssClasses,\n  delimiter,\n  facet,\n  collapsible = true,\n  defaultExpanded = true,\n  showMoreLimit = 4,\n}: HierarchicalFacetProps & { facet: DisplayableFacet }) {\n  const options = facet.options || [];\n  const transformedOptions = transformOptions ? (transformOptions(options) || []) : options;\n\n  return (\n    <FilterGroupProvider fieldId={fieldId} defaultExpanded={!collapsible || defaultExpanded}>\n      <FacetTitle\n        label={label || facet.displayName}\n        customCssClasses={customCssClasses}\n        collapsible={collapsible}\n      />\n      {collapsible ? (\n        <CollapsibleSection >\n          <HierarchicalFacetDisplay\n            // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop\n            facet={{\n              ...facet,\n              options: transformedOptions,\n            }}\n            delimiter={delimiter}\n            showMoreLimit={showMoreLimit}\n            customCssClasses={customCssClasses}\n          />\n        </CollapsibleSection>\n      ) : (\n        <div className='space-y-3'>\n          <HierarchicalFacetDisplay\n            // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop\n            facet={{\n              ...facet,\n              options: transformedOptions,\n            }}\n            delimiter={delimiter}\n            showMoreLimit={showMoreLimit}\n            customCssClasses={customCssClasses}\n          />\n        </div>\n      )}\n    </FilterGroupProvider>\n  );\n}\n","import { useTranslation } from 'react-i18next';\nimport { useSearchActions } from '@yext/search-headless-react';\nimport { useCallback } from 'react';\nimport { useComposedCssClasses } from '../hooks';\nimport { clearStaticRangeFilters, getSelectedNumericalFacetFields } from '../utils/filterutils';\nimport { executeSearch } from '../utils';\nimport React from 'react';\n\n/**\n * Props for {@link ApplyFiltersButton}\n *\n * @public\n */\nexport interface ApplyFiltersButtonProps {\n  /** The label for the button, defaults to 'Apply Filters' */\n  label?: string,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: ApplyFiltersButtonCssClasses\n}\n\n/**\n * The CSS class interface for {@link ApplyFiltersButtonProps}.\n *\n * @public\n */\nexport interface ApplyFiltersButtonCssClasses {\n  button?: string\n}\n\nconst builtInCssClasses: Readonly<ApplyFiltersButtonCssClasses> = {\n  button: 'border border-gray-300 px-2.5 py-1 rounded-md text-primary bg-white shadow-md sticky bottom-3'\n};\n\n/**\n * Runs a vertical search.\n * By default has `position: sticky` styling that anchors it to the bottom of the page.\n *\n * @remarks\n * This is intended to be used when `searchOnChange` field is set to false on all\n * the Facets/StaticFilters components.\n *\n * @public\n */\nexport function ApplyFiltersButton({\n  customCssClasses,\n  label\n}: ApplyFiltersButtonProps): React.JSX.Element {\n  const { t } = useTranslation();\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n  const searchActions = useSearchActions();\n  const handleClick = useCallback(() => {\n    searchActions.setOffset(0);\n    clearStaticRangeFilters(searchActions, getSelectedNumericalFacetFields(searchActions));\n    executeSearch(searchActions);\n  }, [searchActions]);\n\n  return (\n    <button\n      onClick={handleClick}\n      className={cssClasses.button}\n    >\n      {label ?? t('applyFilters')}\n    </button>\n  );\n}","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport mapboxgl, { MarkerOptions } from 'mapbox-gl';\nimport { Result, useSearchState, SelectableStaticFilter } from '@yext/search-headless-react';\nimport { useDebouncedFunction } from '../hooks/useDebouncedFunction';\nimport _ from 'lodash';\n\nimport ReactDOM from 'react-dom';\n// Try to statically import createRoot, will be undefined for <18.\nimport * as ReactDomClient from 'react-dom/client';\n\ntype LegacyReactDOM = {\n  render?: (element: React.ReactElement, container: Element) => void,\n  unmountComponentAtNode?: (container: Element | DocumentFragment) => boolean\n};\n\ntype RootHandle = {\n  render: (children: React.ReactNode) => void,\n  unmount: () => void\n};\n\nconst legacyReactDOM = ReactDOM as LegacyReactDOM;\nconst reactMajorVersion = Number(React.version.split('.')[0]);\nconst supportsCreateRoot = !Number.isNaN(reactMajorVersion) && reactMajorVersion >= 18;\n\n/**\n * Props for rendering a custom marker on the map.\n *\n * @public\n */\nexport type PinComponentProps<T> = {\n  /** The index of the pin. */\n  index: number,\n  /** The Mapbox map. */\n  mapbox: mapboxgl.Map,\n  /** The search result corresponding to the pin. */\n  result: Result<T>,\n  /** Where the pin is selected. */\n  selected?: boolean\n};\n\n/**\n * A functional component that can be used to render a custom marker on the map.\n *\n * @public\n */\nexport type PinComponent<T> = (props: PinComponentProps<T>) => React.JSX.Element;\n\n/**\n * A function use to derive a result's coordinate.\n *\n * @public\n */\nexport type CoordinateGetter<T> = (result: Result<T>) => Coordinate | undefined;\n\n/**\n * Coordinate use to represent the result's location on a map.\n *\n * @public\n */\nexport interface Coordinate {\n  /** The latitude of the location. */\n  latitude: number,\n  /** The longitude of the location. */\n  longitude: number\n}\n\n/**\n * A function which is called when user drags or zooms the map.\n *\n * @public\n */\nexport type OnDragHandler = (center: mapboxgl.LngLat, bounds: mapboxgl.LngLatBounds) => void;\n\n/**\n * Props for the {@link MapboxMap} component.\n * The type param \"T\" represents the type of \"rawData\" field of the results use in the map.\n *\n * @public\n */\nexport interface MapboxMapProps<T> {\n  /** Mapbox access token. */\n  mapboxAccessToken: string,\n  /** Interface for map customization derived from Mapbox GL's Map options. */\n  mapboxOptions?: Omit<mapboxgl.MapboxOptions, 'container'>,\n  /**\n   * Custom Pin component to render for markers on the map.\n   * By default, the built-in marker image from Mapbox GL is used.\n   * This prop should not be used with\n   * {@link MapboxMapProps.renderPin | renderPin}. If both are provided,\n   * only PinComponent will be used.\n   */\n  PinComponent?: PinComponent<T>,\n  /**\n   * Render function for a custom marker on the map. This function takes in an\n   * HTML element and is responible for rendering the pin into that element,\n   * which will be used as the marker.\n   * By default, the built-in marker image from Mapbox GL is used.\n   * This prop should not be used with\n   * {@link MapboxMapProps.PinComponent | PinComponent}. If both are provided,\n   * only PinComponent will be used.\n   */\n  renderPin?: (props: PinComponentProps<T> & { container: HTMLElement }) => void,\n  /**\n   * A function to derive a result's coordinate for the corresponding marker's location on the map.\n   * By default, \"yextDisplayCoordinate\" field is used as the result's display coordinate.\n   */\n  getCoordinate?: CoordinateGetter<T>,\n  /** {@inheritDoc OnDragHandler} */\n  onDrag?: OnDragHandler,\n  /**\n   * The window object of the iframe where the map should rendered. Must have mapboxgl loaded.\n   * If not provided or mapboxgl not loaded, the map will be rendered in the parent window.\n   */\n  iframeWindow?: Window,\n  /**\n   * If set to true, the map will update its options when the mapboxOptions prop changes.\n   * Otherwise, the map will not update its options once initially set.\n   */\n  allowUpdates?: boolean,\n  /** A function that handles a pin click event. */\n  onPinClick?: (result: Result<T> | undefined) => void,\n  /** The options to apply to the map markers based on whether it is selected. */\n  markerOptionsOverride?: (selected: boolean) => MarkerOptions\n}\n\n/**\n * A component that renders a map with markers to show result locations using Mapbox GL.\n *\n * @remarks\n * For the map to work properly, be sure to include Mapbox GL stylesheet in the application.\n *\n * @example\n * For instance, user may add the following import statement in their application's index file\n * or in the file where `MapboxMap` is used:\n * `import 'mapbox-gl/dist/mapbox-gl.css';`\n *\n * Or, user may add a stylesheet link in their html page:\n * `<link href=\"https://api.mapbox.com/mapbox-gl-js/v2.9.2/mapbox-gl.css\" rel=\"stylesheet\" />`\n *\n * @param props - {@link MapboxMapProps}\n * @returns A React element containing a Mapbox Map\n *\n * @public\n */\nexport function MapboxMap<T>({\n  mapboxAccessToken,\n  mapboxOptions,\n  PinComponent,\n  renderPin,\n  getCoordinate = getDefaultCoordinate,\n  onDrag,\n  iframeWindow,\n  allowUpdates = false,\n  onPinClick,\n  markerOptionsOverride,\n}: MapboxMapProps<T>): React.JSX.Element {\n  const mapboxInstance = (iframeWindow as Window & { mapboxgl?: typeof mapboxgl })?.mapboxgl ?? mapboxgl;\n  // keep the mapbox access token in sync with prop changes.\n  useEffect(() => {\n    mapboxInstance.accessToken = mapboxAccessToken;\n  }, [mapboxAccessToken, mapboxInstance]);\n\n  const mapContainer = useRef<HTMLDivElement>(null);\n  const map = useRef<mapboxgl.Map | null>(null);\n  const markers = useRef<mapboxgl.Marker[]>([]);\n  const markerRoots = useRef(new Map<HTMLElement, RootHandle>());\n  const activeMarkerElements = useRef(new Set<HTMLElement>());\n  const markerData = useRef<Array<{ marker: mapboxgl.Marker, result: Result<T>, index: number }>>([]);\n\n  const locationResults = useSearchState(state => state.vertical.results) as Result<T>[];\n  const staticFilters = useSearchState(state => state.filters?.static);\n  const onDragDebounced = useDebouncedFunction(onDrag, 100);\n  const [selectedResult, setSelectedResult] = useState<Result<T> | undefined>(undefined);\n\n  const handlePinClick = useCallback((result: Result<T>) => {\n    setSelectedResult(prev => prev === result ? undefined : result);\n  }, []);\n\n  // notify consumers when the selected pin changes.\n  useEffect(() => {\n    onPinClick?.(selectedResult);\n  }, [onPinClick, selectedResult]);\n\n  const scheduleRootUnmount = useCallback((root: RootHandle) => {\n    if (typeof queueMicrotask === 'function') {\n      queueMicrotask(() => root.unmount());\n    } else {\n      setTimeout(() => root.unmount(), 0);\n    }\n  }, []);\n\n  const cleanupPinComponent = useCallback((element: HTMLElement) => {\n    activeMarkerElements.current.delete(element);\n    if (supportsCreateRoot) {\n      const root = markerRoots.current.get(element);\n      if (root) {\n        // unmount must be called after the current render finishes, so schedule it for the next\n        // microtask\n        scheduleRootUnmount(root);\n        markerRoots.current.delete(element);\n      }\n    } else {\n      legacyReactDOM.unmountComponentAtNode?.(element);\n    }\n  }, [scheduleRootUnmount]);\n\n  const attachPinComponent = useCallback((element: HTMLElement, component: React.JSX.Element) => {\n    if (supportsCreateRoot && typeof ReactDomClient.createRoot === 'function') {\n      // Use React 18+ API\n      let root = markerRoots.current.get(element);\n      if (!root) {\n        root = ReactDomClient.createRoot(element);\n        markerRoots.current.set(element, root);\n      }\n      root.render(component);\n    } else if (typeof legacyReactDOM.render === 'function') {\n      // Fallback for React <18\n      legacyReactDOM.render(component, element);\n    }\n  }, []);\n\n  // builds and attaches a single marker to the mapbox map\n  const createMarker = useCallback((\n    mapbox: mapboxgl.Map,\n    result: Result<T>,\n    index: number,\n    selected: boolean\n  ) => {\n    const markerLocation = getCoordinate(result);\n    if (!markerLocation) {\n      return null;\n    }\n    const { latitude, longitude } = markerLocation;\n    if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n      return null;\n    }\n\n    const el = document.createElement('div');\n    let markerOptions: mapboxgl.MarkerOptions = {};\n    if (PinComponent) {\n      if (renderPin) {\n        console.warn(\n          'Found both PinComponent and renderPin props. Using PinComponent.'\n        );\n      }\n      attachPinComponent(el, (\n        <PinComponent\n          index={index}\n          mapbox={mapbox}\n          result={result}\n          selected={selected}\n        />\n      ));\n      markerOptions.element = el;\n    } else if (renderPin) {\n      renderPin({ index, mapbox, result, container: el });\n      markerOptions.element = el;\n    }\n\n    if (markerOptionsOverride) {\n      markerOptions = {\n        ...markerOptions,\n        ...markerOptionsOverride(selected)\n      };\n    }\n\n    const marker = new mapboxInstance.Marker(markerOptions)\n      .setLngLat({ lat: latitude, lng: longitude })\n      .addTo(mapbox);\n\n    marker?.getElement().addEventListener('click', () => handlePinClick(result));\n\n    return { marker, location: markerLocation };\n  }, [\n    PinComponent,\n    attachPinComponent,\n    getCoordinate,\n    handlePinClick,\n    mapboxInstance,\n    markerOptionsOverride,\n    renderPin\n  ]);\n\n  const removeMarkers = useCallback(() => {\n    markers.current.forEach(marker => {\n      if (!marker) {\n        return;\n      }\n      const element = marker?.getElement?.();\n      if (element) {\n        cleanupPinComponent(element);\n      }\n      if (typeof marker.remove === 'function') {\n        marker.remove();\n      }\n    });\n    markers.current = [];\n    markerData.current = [];\n  }, [cleanupPinComponent]);\n\n  const locale = useSearchState(state => state.meta?.locale);\n  // keep track of the previous value of mapboxOptions across renders\n  const prevMapboxOptions = useRef(mapboxOptions);\n\n  /**\n   * Localizes Mapbox label text to a specific locale.\n   *\n   * Updates symbol layers that are place names such that labels prefer `name_<lang>`\n   * (e.g. `name_fr`) and fall back to `name` when unavailable.\n   *\n   * Note:\n   * - Symbol layers that are place names would have `text-field` properties that includes\n   *   'name', which are localized.\n   * - Other symbol layers (e.g. road shields, transit, icons) are left unchanged.\n   */\n  const localizeMap = useCallback(() => {\n    const mapbox = map.current;\n    if (!mapbox || !locale) return;\n\n    const localizeLabels = () => {\n      mapbox.getStyle().layers.forEach(layer => {\n        if (layer.type !== 'symbol') {\n          return;\n        }\n        const textField = layer.layout?.['text-field'];\n        if (typeof textField === 'string'\n          ? textField.includes('name')\n          : (Array.isArray(textField) && JSON.stringify(textField).includes('name'))) {\n          mapbox.setLayoutProperty(\n            layer.id,\n            'text-field',\n            [\n              'coalesce',\n              ['get', `name_${getMapboxLanguage(locale)}`],\n              ['get', 'name']\n            ]\n          );\n        }\n      });\n    };\n\n    if (mapbox.isStyleLoaded()) {\n      localizeLabels();\n    } else {\n      mapbox.once('styledata', () => localizeLabels());\n    }\n  }, [locale]);\n\n  // initialize the map once and update mapbox options when allowUpdates is true.\n  useEffect(() => {\n    if (mapContainer.current) {\n      if (map.current && allowUpdates) {\n        // Compare current and previous mapboxOptions using deep equality\n        if (!_.isEqual(prevMapboxOptions.current, mapboxOptions)) {\n          // Update to existing Map\n          handleMapboxOptionsUpdates(mapboxOptions, map.current);\n          prevMapboxOptions.current = (mapboxOptions);\n        }\n      } else if (!map.current && mapboxInstance) {\n        const options: mapboxgl.MapboxOptions = {\n          container: mapContainer.current,\n          style: 'mapbox://styles/mapbox/streets-v11',\n          center: [-74.005371, 40.741611],\n          zoom: 9,\n          ...mapboxOptions\n        };\n        map.current = new mapboxInstance.Map(options);\n        const mapbox = map.current;\n        mapbox.resize();\n        const nav = new mapboxInstance.NavigationControl({\n          showCompass: false,\n          showZoom: true,\n          visualizePitch: false\n        });\n        mapbox.addControl(nav, 'top-right');\n        if (onDragDebounced) {\n          mapbox.on('drag', () => {\n            onDragDebounced(mapbox.getCenter(), mapbox.getBounds());\n          });\n          mapbox.on('zoom', (e) => {\n            if (e.originalEvent) {\n              // only trigger on user zoom, not programmatic zoom (e.g. from fitBounds)\n              onDragDebounced(mapbox.getCenter(), mapbox.getBounds());\n            }\n          });\n          return () => {\n            mapbox.off('drag', () => {\n              onDragDebounced(mapbox.getCenter(), mapbox.getBounds());\n            });\n            mapbox.off('zoom', (e) => {\n              if (e.originalEvent) {\n                onDragDebounced(mapbox.getCenter(), mapbox.getBounds());\n              }\n            });\n          };\n        }\n      }\n      localizeMap();\n    }\n  }, [allowUpdates, mapboxInstance, mapboxOptions, onDragDebounced, localizeMap]);\n\n  // resize the map when its iframe container changes size.\n  useEffect(() => {\n    if (iframeWindow && map.current) {\n      map.current.resize();\n    }\n  }, [iframeWindow]);\n\n  // create and place markers when results change, then cleanup on teardown\n  useEffect(() => {\n    removeMarkers();\n    const mapbox = map.current;\n    if (mapbox && locationResults) {\n      if (locationResults.length > 0) {\n        const bounds = new mapboxInstance.LngLatBounds();\n        // create a marker for each result\n        locationResults.forEach((result, i) => {\n          const created = createMarker(mapbox, result, i, false);\n          if (!created) {\n            return;\n          }\n          markers.current.push(created.marker);\n          markerData.current.push({ marker: created.marker, result, index: i });\n          bounds.extend([created.location.longitude, created.location.latitude]);\n        });\n\n        // fit the map to the markers\n        mapbox.resize();\n        const canvas = mapbox.getCanvas();\n\n        // add padding to map\n        if (!bounds.isEmpty()\n            && !!canvas\n            && canvas.clientHeight > 0\n            && canvas.clientWidth > 0\n        ) {\n          const resolvedOptions = {\n            // these settings are defaults and will be overriden if present on fitBoundsOptions\n            padding: { top: 50, bottom: 50, left: 50, right: 50 },\n            maxZoom: mapboxOptions?.maxZoom ?? 15,\n            ...mapboxOptions?.fitBoundsOptions,\n          };\n\n          let resolvedPadding;\n          if (typeof resolvedOptions.padding === 'number') {\n            resolvedPadding = {\n              top: resolvedOptions.padding,\n              bottom: resolvedOptions.padding,\n              left: resolvedOptions.padding,\n              right: resolvedOptions.padding\n            };\n          } else {\n            resolvedPadding = {\n              top: resolvedOptions.padding?.top ?? 0,\n              bottom: resolvedOptions.padding?.bottom ?? 0,\n              left: resolvedOptions.padding?.left ?? 0,\n              right: resolvedOptions.padding?.right ?? 0\n            };\n          }\n\n          // Padding must not exceed the map's canvas dimensions\n          const verticalPaddingSum = resolvedPadding.top + resolvedPadding.bottom;\n          if (verticalPaddingSum >= canvas.clientHeight) {\n            const ratio = canvas.clientHeight / (verticalPaddingSum || 1);\n            resolvedPadding.top = Math.max(0, resolvedPadding.top * ratio - 1);\n            resolvedPadding.bottom = Math.max(0, resolvedPadding.bottom * ratio - 1);\n          }\n          const horizontalPaddingSum = resolvedPadding.left + resolvedPadding.right;\n          if (horizontalPaddingSum >= canvas.clientWidth) {\n            const ratio = canvas.clientWidth / (horizontalPaddingSum || 1);\n            resolvedPadding.left = Math.max(0, resolvedPadding.left * ratio - 1);\n            resolvedPadding.right = Math.max(0, resolvedPadding.right * ratio - 1);\n          }\n          resolvedOptions.padding = resolvedPadding;\n          mapbox.fitBounds(bounds, resolvedOptions);\n        }\n\n        // return a cleanup function to remove markers when the map component unmounts\n        return () => {\n          markers.current.forEach((marker, i) => {\n            marker?.getElement().removeEventListener('click', () => handlePinClick(locationResults[i]));\n          });\n          removeMarkers();\n        };\n      } else if (staticFilters?.length) {\n        const locationFilterValue = getLocationFilterValue(staticFilters);\n        if (locationFilterValue) {\n          mapbox.flyTo({\n            center: locationFilterValue\n          });\n        }\n      }\n    }\n  }, [\n    createMarker,\n    handlePinClick,\n    locationResults,\n    mapboxInstance,\n    mapboxOptions,\n    removeMarkers,\n    staticFilters\n  ]);\n\n  const previousSelectedResult = useRef<Result<T> | undefined>(undefined);\n\n  // update marker options when markerOptionsOverride changes or selectedResult changes\n  useEffect(() => {\n    const mapbox = map.current;\n    if (!mapbox || !markerOptionsOverride) {\n      previousSelectedResult.current = selectedResult;\n      return;\n    }\n\n    const prevSelected = previousSelectedResult.current;\n    previousSelectedResult.current = selectedResult;\n\n    // markerOptionsOverride is applied at creation time, so we recreate only the affected\n    // markers to reflect selection changes without tearing down all pins.\n    const resultsToUpdate = new Set<Result<T>>();\n    if (prevSelected) {\n      resultsToUpdate.add(prevSelected);\n    }\n    if (selectedResult) {\n      resultsToUpdate.add(selectedResult);\n    }\n\n    resultsToUpdate.forEach((result) => {\n      const markerEntry = markerData.current.find(entry => entry.result === result);\n      if (!markerEntry) {\n        return;\n      }\n      // recreate the marker to apply new markerOptionsOverride (e.g. color/scale).\n      const oldMarker = markerEntry.marker;\n      const element = oldMarker?.getElement?.();\n      if (element) {\n        cleanupPinComponent(element);\n      }\n      oldMarker?.remove?.();\n\n      const created = createMarker(mapbox, result, markerEntry.index, selectedResult === result);\n      if (!created) {\n        return;\n      }\n      markerEntry.marker = created.marker;\n      markers.current[markerEntry.index] = created.marker;\n    });\n  }, [cleanupPinComponent, createMarker, markerOptionsOverride, selectedResult]);\n\n  // re-render custom PinComponent on selection changes to update the visual state\n  useEffect(() => {\n    const mapbox = map.current;\n    if (!mapbox || !PinComponent) {\n      return;\n    }\n    markerData.current.forEach(({ marker, result, index }) => {\n      const element = marker?.getElement?.();\n      if (!element) {\n        return;\n      }\n      attachPinComponent(element, (\n        <PinComponent\n          index={index}\n          mapbox={mapbox}\n          result={result}\n          selected={selectedResult === result}\n        />\n      ));\n    });\n  }, [attachPinComponent, PinComponent, selectedResult]);\n\n  return (\n    <div ref={mapContainer} className='h-full w-full' />\n  );\n}\n\nfunction handleMapboxOptionsUpdates(mapboxOptions: Omit<mapboxgl.MapboxOptions, 'container'> | undefined, currentMap: mapboxgl.Map) {\n  if (mapboxOptions?.style) {\n    currentMap.setStyle(mapboxOptions.style);\n  }\n  // Add more options to update as needed\n}\n\nfunction isCoordinate(data: unknown): data is Coordinate {\n  return typeof data == 'object'\n    && typeof (data as any)?.['latitude'] === 'number'\n    && typeof (data as any)?.['longitude'] === 'number';\n}\n\nfunction getDefaultCoordinate<T>(result: Result<T>): Coordinate | undefined {\n  const yextDisplayCoordinate: Coordinate = (result.rawData as any)['yextDisplayCoordinate'];\n  if (!yextDisplayCoordinate) {\n    console.error('Unable to use the default \"yextDisplayCoordinate\" field as the result\\'s coordinate to display on map.'\n    + '\\nConsider providing the \"getCoordinate\" prop to MapboxMap component to fetch the desire coordinate from result.');\n    return undefined;\n  }\n  if (!isCoordinate(yextDisplayCoordinate)) {\n    console.error('The default `yextDisplayCoordinate` field from result is not of type \"Coordinate\".');\n    return undefined;\n  }\n  return yextDisplayCoordinate;\n}\n\nexport function getMapboxLanguage(locale: string) {\n  try {\n    const localeOptions = new Intl.Locale(locale.replaceAll('_', '-'));\n    return localeOptions.script ? `${localeOptions.language}-${localeOptions.script}` : localeOptions.language;\n  } catch (e) {\n    console.warn(`Locale \"${locale}\" is not supported.`);\n  }\n  return 'en';\n}\n\nfunction getLocationFilterValue(staticFilters: SelectableStaticFilter[]): [number, number] | undefined {\n  const locationFilter = staticFilters.find(f => (f.filter as any)['fieldId'] === 'builtin.location' && (f.filter as any)['value'])?.filter;\n  if (locationFilter) {\n    const { lat, lng } = (locationFilter as any)['value'];\n    return [lng, lat];\n  }\n}\n","import React, { PropsWithChildren, useEffect, useRef } from 'react';\nimport { AnalyticsContext } from '../hooks/useAnalytics';\nimport { CloudRegion, Environment } from '@yext/search-core';\nimport { SearchAnalyticsEventServiceImpl } from '../models/SearchAnalyticsEventServiceImpl';\nimport { SearchAnalyticsEventService } from '../models';\n\n/**\n * A higher-order component which provides analytics for its children.\n *\n * @public\n *\n * @param props - The configuration for the analytics service\n * @returns A React element that provides analytics context\n */\nexport function AnalyticsProvider(props: PropsWithChildren<SearchAnalyticsConfig>): React.JSX.Element {\n  const { children, ...searchAnalyticsConfig } = props;\n\n  const analyticsRef = useRef<SearchAnalyticsEventService | null>(null);\n\n  if (analyticsRef.current === null) {\n    analyticsRef.current = new SearchAnalyticsEventServiceImpl(searchAnalyticsConfig);\n  }\n\n  const analytics = analyticsRef.current;\n\n  // Adds enableYextAnalytics to the window. Typically used during consent banner implementation.\n  useEffect(() => {\n    (window as any).enableYextAnalytics = () => {\n      analytics.optIn();\n    };\n\n    return () => {\n      delete (window as any).enableYextAnalytics;\n    };\n  }, [analytics]);\n\n  return (\n    <AnalyticsContext.Provider value={ analytics }>\n      {children}\n    </AnalyticsContext.Provider>\n  );\n}\n\n/**\n * An interface representing the configuration for search analytics reporting.\n *\n * @public\n */\nexport interface SearchAnalyticsConfig {\n  /** The apiKey of the App with Events SDK access. */\n  apiKey: string,\n  /** The Yext environment to send requests to. Defaults to 'PRODUCTION'. */\n  environment?: Environment,\n  /** The region to send requests to. Defaults to 'US'. */\n  cloudRegion?: CloudRegion,\n  /** Whether to enable session tracking for analytics events. */\n  sessionTrackingEnabled?: boolean,\n  /** Whether a user must consent to analytics tracking before events are fired. Defaults to false. */\n  requireOptIn?: boolean\n}\n","/**\n * Defines the environment of the API domains.\n *\n * @public\n */\nexport enum Environment {\n  PROD = 'prod',\n  SANDBOX = 'sbx',\n  /** For internal development only */\n  QA = 'qa',\n  /** For internal development only */\n  DEV = 'dev',\n}","/**\n * Defines the cloud region of the API domains.\n *\n * @public\n */\nexport enum CloudRegion {\n  US = 'us',\n  EU = 'eu',\n}","import { analytics, AnalyticsConfig, AnalyticsEventService, EventPayload } from '@yext/analytics';\nimport { SearchAnalyticsConfig } from '../components';\nimport { CloudRegion, Environment } from '@yext/search-core';\nimport { SearchEventPayload } from './SearchEventPayload';\nimport { SearchAnalyticsEventService } from './SearchAnalyticsEventService';\n\n/** An implementation of {@link SearchAnalyticsEventService} which makes calls to the Analytics Events API */\nexport class SearchAnalyticsEventServiceImpl implements SearchAnalyticsEventService {\n  private internalService: AnalyticsEventService;\n  private analyticsEnabled: boolean;\n  /**\n   * @param searchAnalyticsConfig - configuration for analytics reporting.\n   */\n  constructor(searchAnalyticsConfig: SearchAnalyticsConfig) {\n    const analyticsConfig: AnalyticsConfig = {\n      authorizationType: 'apiKey',\n      authorization: searchAnalyticsConfig.apiKey,\n      env: searchAnalyticsConfig.environment &&\n            searchAnalyticsConfig.environment === Environment.PROD ? 'PRODUCTION' :\n        searchAnalyticsConfig.environment === Environment.SANDBOX ? 'SANDBOX' : undefined,\n      region: searchAnalyticsConfig.cloudRegion && searchAnalyticsConfig.cloudRegion === CloudRegion.US ? 'US' : 'EU',\n      sessionTrackingEnabled: searchAnalyticsConfig.sessionTrackingEnabled\n    };\n    this.internalService = analytics(analyticsConfig);\n    // if requireOptIn is undefined or set to false, analytics are enabled\n    this.analyticsEnabled = !searchAnalyticsConfig.requireOptIn;\n  }\n\n  public optIn(): void {\n    this.analyticsEnabled = true;\n  }\n\n  public optOut(): void {\n    this.analyticsEnabled = false;\n  }\n\n  public isYextAnalyticsEnabled(): boolean {\n    return this.analyticsEnabled;\n  }\n\n  public async report(payload: SearchEventPayload): Promise<string> {\n    if (!this.analyticsEnabled) {\n      return Promise.resolve('');\n    }\n    const eventPayload: EventPayload = {\n      action: payload.action,\n      destinationUrl: payload.destinationUrl,\n      entity: payload.entity,\n      locale: payload.locale,\n      search: {\n        searchId: payload.searchId,\n        queryId: payload.queryId,\n        experienceKey: payload.experienceKey,\n        verticalKey: payload.verticalKey,\n        versionLabel: payload.versionLabel,\n        versionNumber: payload.versionNumber,\n        isDirectAnswer: payload.isDirectAnswer,\n        isGenerativeDirectAnswer: payload.isGenerativeDirectAnswer\n      },\n      searchTerm: payload.searchTerm\n    };\n    return this.internalService.report(eventPayload);\n  }\n}\n","import { useTranslation } from 'react-i18next';\nimport {\n  GenerativeDirectAnswerResponse,\n  useSearchActions,\n  useSearchState,\n  SearchTypeEnum,\n  Result\n} from '@yext/search-headless-react';\nimport { useComposedCssClasses } from '../hooks';\nimport { useCardAnalytics } from '../hooks/useCardAnalytics';\nimport { DefaultRawDataType } from '../models/index';\nimport { executeGenerativeDirectAnswer } from '../utils/search-operations';\nimport { Markdown, MarkdownCssClasses } from './Markdown';\nimport React, { useCallback, useMemo, useRef } from 'react';\n\n/**\n * The CSS class interface used for {@link GenerativeDirectAnswer}.\n *\n * @public\n */\nexport interface GenerativeDirectAnswerCssClasses {\n  container?: string,\n  header?: string,\n  answerText?: string,\n  divider?: string,\n  citationsContainer?: string,\n  citation?: string,\n  citationTitle?: string,\n  citationSnippet?: string\n}\n\nconst builtInCssClasses: Readonly<GenerativeDirectAnswerCssClasses> = {\n  container: 'p-6 border border-gray-200 rounded-lg shadow-sm',\n  header: 'text-xl',\n  answerText: 'mt-4 prose',\n  divider: 'border-b border-gray-200 w-full pb-6 mb-6',\n  citationsContainer: 'mt-4 flex overflow-x-auto gap-4',\n  citation: 'p-4 border border-gray-200 rounded-lg shadow-sm bg-slate-100 flex flex-col grow-0 shrink-0 basis-64 text-sm text-neutral overflow-x-auto cursor-pointer hover:border-indigo-500',\n  citationTitle: 'font-bold',\n  citationSnippet: 'line-clamp-2 text-ellipsis break-words'\n};\n\n/**\n * Props for {@link GenerativeDirectAnswer}.\n *\n * @public\n */\nexport interface GenerativeDirectAnswerProps {\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: GenerativeDirectAnswerCssClasses,\n  /** The header for the answer section of the generative direct answer. */\n  answerHeader?: string | React.JSX.Element,\n  /** The header for the citations section of the generative direct answer. */\n  citationsHeader?: string | React.JSX.Element,\n  /**\n   * The citations container component for customizing the logic that determines which results\n   * can be rendered.\n   * By default, a section for citations is displayed if the results that correspond to the\n   * citations have the default minimum required info, which is `rawData.uid` and `rawData.name`.\n  */\n  CitationsContainer?: (props: CitationsProps) => React.JSX.Element | null,\n  /** The citation card component for customizing how each citation is displayed. */\n  CitationCard?: (props: CitationProps) => React.JSX.Element | null\n}\n\n/**\n * Displays the AI generated answer of a generative direct answer.\n *\n * @public\n *\n * @param props - {@link GenerativeDirectAnswerProps}\n * @returns A React element for the generative direct answer, or null if there is no generated answer\n */\nexport function GenerativeDirectAnswer({\n  customCssClasses,\n  answerHeader,\n  citationsHeader,\n  CitationCard,\n  CitationsContainer = Citations,\n}: GenerativeDirectAnswerProps): React.JSX.Element | null {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  const isUniversal = useSearchState(state => state.meta.searchType) === SearchTypeEnum.Universal;\n  const universalResults = useSearchState(state => state.universal);\n  const verticalResults = useSearchState(state => state.vertical);\n  const searchId = useSearchState(state => state.meta.uuid);\n\n  const searchResults: Result[] | undefined = React.useMemo(() => {\n    if (isUniversal) {\n      return universalResults.verticals?.flatMap(v => v.results);\n    } else {\n      return verticalResults.results;\n    }\n  }, [isUniversal, universalResults, verticalResults]);\n\n  const lastExecutedSearchResults = useRef(undefined as Result[] | undefined);\n  const searchActions = useSearchActions();\n  const gdaResponse = useSearchState(state => state.generativeDirectAnswer?.response);\n  const isLoading = useSearchState(state => state.generativeDirectAnswer?.isLoading);\n  const handleClickEvent = useReportClickEvent();\n\n  React.useEffect(() => {\n    if (!searchResults?.length || !searchId || searchResults === lastExecutedSearchResults.current) {\n      return;\n    }\n    executeGenerativeDirectAnswer(searchActions);\n    lastExecutedSearchResults.current = searchResults;\n  }, [searchActions, searchResults, searchId]);\n\n  if (!searchResults?.length || isLoading || !gdaResponse || gdaResponse.resultStatus !== 'SUCCESS') {\n    return null;\n  }\n\n  return (\n    <div className={cssClasses.container}>\n      <Answer\n        gdaResponse={gdaResponse}\n        cssClasses={cssClasses}\n        answerHeader={answerHeader}\n        linkClickHandler={handleClickEvent}\n      />\n      <CitationsContainer\n        gdaResponse={gdaResponse}\n        cssClasses={cssClasses}\n        searchResults={searchResults}\n        citationsHeader={citationsHeader}\n        CitationCard={CitationCard}\n        citationClickHandler={handleClickEvent}\n      />\n    </div>\n  );\n}\n\ninterface AnswerProps {\n  gdaResponse: GenerativeDirectAnswerResponse,\n  cssClasses: GenerativeDirectAnswerCssClasses,\n  answerHeader?: string | React.JSX.Element,\n  linkClickHandler?: (data: GdaClickEventData) => void\n}\n\n/**\n * The answer section of the Generative Direct Answer.\n */\nfunction Answer(props: AnswerProps) {\n  const {\n    gdaResponse,\n    cssClasses,\n    answerHeader,\n    linkClickHandler\n  } = props;\n  const { t } = useTranslation();\n  const markdownCssClasses: MarkdownCssClasses = useMemo(\n    () => ({\n      container: cssClasses.answerText,\n    }),\n    [cssClasses.answerText]\n  );\n\n  const handleMarkdownLinkClick = useCallback((destinationUrl?: string) => {\n    if (destinationUrl) {\n      linkClickHandler?.({ destinationUrl });\n    }\n  }, [linkClickHandler]);\n\n  return <>\n    <div className={cssClasses.header}>\n      {answerHeader ?? t('aiGeneratedAnswer')}\n    </div>\n    <Markdown\n      content={gdaResponse.directAnswer}\n      onLinkClick={handleMarkdownLinkClick}\n      customCssClasses={markdownCssClasses}\n    />\n  </>;\n}\n\n/**\n * Props for citations component.\n *\n * @public\n */\nexport interface CitationsProps {\n  /** Response object containing generative direct answer info. */\n  gdaResponse: GenerativeDirectAnswerResponse,\n  /** CSS classes for customizing the component styling. */\n  cssClasses: GenerativeDirectAnswerCssClasses,\n  /** Returned results relevant to the users' query to be used in Citations. */\n  searchResults: Result[],\n  /** The header for the citations section generative direct answer. */\n  citationsHeader?: string | React.JSX.Element,\n  /** The component for citation card */\n  CitationCard?: (props: CitationProps) => React.JSX.Element | null,\n  /** Handle onClick event for citation link. */\n  citationClickHandler?: (data: GdaClickEventData) => void\n}\n\n/**\n * Displays the citations section of the Generative Direct Answer.\n */\nfunction Citations(props: CitationsProps) {\n  const {\n    gdaResponse,\n    cssClasses,\n    searchResults,\n    citationsHeader,\n    CitationCard = Citation,\n    citationClickHandler\n  } = props;\n  const { t } = useTranslation();\n  const citationResults = React.useMemo(() => {\n    // If an entity is returned by multiple different verticals, it will be present in\n    // searchResults multiple times. We want to only show it once in the citations.\n    const citationIds = new Set(gdaResponse.citations);\n    return searchResults.filter(result => {\n      const { uid, name } = result.rawData ?? {};\n      const dataIsInvalid = !uid || !name || typeof name != 'string' || typeof uid != 'string';\n      if (dataIsInvalid || !citationIds.has(uid)) {\n        return false;\n      }\n      citationIds.delete(uid);\n      return true;\n    });\n  }, [gdaResponse.citations, searchResults]);\n\n  const count = citationResults.length;\n  if (!count) {\n    return null;\n  }\n\n  return <>\n    <div className={cssClasses.divider} />\n    <div className={cssClasses.header}>\n      {citationsHeader ?? t('sources', { count })}\n    </div>\n    <div className={cssClasses.citationsContainer}>\n      {citationResults.map((result, index) => (\n        <CitationCard\n          key={index}\n          searchResult={result}\n          cssClasses={cssClasses}\n          citationClickHandler={citationClickHandler}\n        />\n      ))}\n    </div>\n  </>;\n}\n\n/**\n * Props for citation card.\n *\n * @public\n */\nexport interface CitationProps {\n  searchResult: Result,\n  cssClasses: GenerativeDirectAnswerCssClasses,\n  citationClickHandler?: (data: GdaClickEventData) => void\n}\n\n/**\n * Displays a citation card for the citations section of the Generative Direct Answer.\n */\nfunction Citation(props: CitationProps) {\n  const {\n    searchResult,\n    cssClasses,\n    citationClickHandler\n  } = props;\n  const { name, description, answer, link } = searchResult.rawData ?? {};\n  const citationTitle = String(name ?? '');\n  const citationSnippet = String(description ?? answer ?? '');\n  const citationUrl = typeof link === 'string' ? link : undefined;\n  const handleCitationClick = useCallback(() => {\n    if (citationUrl) {\n      citationClickHandler?.({ searchResult, destinationUrl: citationUrl });\n    }\n  }, [citationClickHandler, citationUrl, searchResult]);\n\n  return (\n    <a\n      className={cssClasses.citation}\n      href={citationUrl}\n      onClick={handleCitationClick}\n    >\n      <div className={cssClasses.citationTitle}>{citationTitle}</div>\n      <div className={cssClasses.citationSnippet}>{citationSnippet}</div>\n    </a>\n  );\n}\n\n/**\n * Payload for click events fired on a generative direct answer card.\n *\n * @public\n */\nexport interface GdaClickEventData {\n  searchResult?: Result,\n  destinationUrl: string\n}\n\nfunction useReportClickEvent<T = DefaultRawDataType>(): (data: GdaClickEventData) => void {\n  const reportAnalyticsEvent = useCardAnalytics<T>();\n  return React.useCallback((data: GdaClickEventData) => {\n    if (data.searchResult) {\n      reportAnalyticsEvent(data, 'CITATION_CLICK');\n    } else {\n      reportAnalyticsEvent(data, 'CTA_CLICK');\n    }\n  }, [reportAnalyticsEvent]);\n}\n","import ReactMarkdown, {\n  PluggableList,\n  ReactMarkdownOptions,\n} from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize from 'rehype-sanitize';\nimport React, { useMemo } from 'react';\nimport { useComposedCssClasses } from '../hooks/useComposedCssClasses';\n\n// The Remark and Rehype plugins to use in conjunction with ReactMarkdown.\nconst unifiedPlugins: { remark?: PluggableList, rehype: PluggableList } = {\n  remark: [\n    remarkGfm, //renders Github-Flavored Markdown\n  ],\n  rehype: [\n    rehypeRaw, //to support HTML embedded in markdown\n    rehypeSanitize, //to sanitize HTML content\n  ],\n};\n\n/**\n * The CSS class interface for the Markdown component.\n *\n * @internal\n */\nexport interface MarkdownCssClasses {\n  container?: string,\n  link?: string\n}\n\nconst builtInCssClasses: MarkdownCssClasses = {\n  link: 'cursor-pointer',\n};\n\ninterface MarkdownProps {\n  /** Stringified markdown. */\n  content: string,\n  /** CSS classes for customizing the component styling. */\n  customCssClasses?: MarkdownCssClasses,\n  /** A callback which is called when a link is clicked. */\n  onLinkClick?: (href?: string) => void\n}\n\n/**\n * Renders Github-Flavored Markdown from the Knowledge Graph. This Markdown can include\n * arbitrary HTML. Any HTML will be sanitized according to Rehype's default Schema.\n *\n * @remarks\n * A link click will send a CHAT_LINK_CLICK analytics event\n *\n * @internal\n */\nexport function Markdown({\n  content,\n  customCssClasses,\n  onLinkClick,\n}: MarkdownProps) {\n  const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);\n\n  const components: ReactMarkdownOptions['components'] = useMemo(() => {\n    const createClickHandlerFn = (href?: string) => () => {\n      onLinkClick?.(href);\n    };\n    return {\n      a: ({ node: _, children, ...props }) => {\n        return (\n          <a\n            {...props}\n            onClick={createClickHandlerFn(props.href)}\n            rel=\"noopener noreferrer\"\n            className={cssClasses.link}\n          >\n            {children}\n          </a>\n        );\n      },\n    };\n  }, [\n    cssClasses,\n    onLinkClick,\n  ]);\n\n  return (\n    <ReactMarkdown\n      className={cssClasses.container}\n      children={content}\n      remarkPlugins={unifiedPlugins.remark}\n      rehypePlugins={unifiedPlugins.rehype}\n      components={components}\n    />\n  );\n}\n","import React, { PropsWithChildren } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport { SearchHeadless } from '@yext/search-headless-react';\nimport { i18nInstance } from '../utils';\n\ntype translationKeys =\n  'aiGeneratedAnswer' |\n  'allCategories' |\n  'appliedFiltersToCurrentSearch' |\n  'apply' |\n  'applyFilters' |\n  'autocompleteOptionsFound_zero' | 'autocompleteOptionsFound_one' | 'autocompleteOptionsFound_two' | 'autocompleteOptionsFound_few' | 'autocompleteOptionsFound_many' | 'autocompleteOptionsFound_other' |\n  'autocompleteSuggestion' |\n  'autocompleteSuggestionsFound_zero' | 'autocompleteSuggestionsFound_one' | 'autocompleteSuggestionsFound_two' | 'autocompleteSuggestionsFound_few' | 'autocompleteSuggestionsFound_many' | 'autocompleteSuggestionsFound_other' |\n  'basedOnYourDevice' |\n  'basedOnYourInternetAddress' |\n  'categoriesText_zero' | 'categoriesText_one' | 'categoriesText_two' | 'categoriesText_few' | 'categoriesText_many' | 'categoriesText_other' |\n  'clearAll' |\n  'clearMinAndMax' |\n  'clearTheRangeToSelectOptions' |\n  'clearTheSearchBar' |\n  'conductASearch' |\n  'currentLocation' |\n  'didYouMean' |\n  'dropDownScreenReaderInstructions' |\n  'feedback' |\n  'invalidRange' |\n  'max' |\n  'min' |\n  'navigateToTheNextResultsPage' |\n  'navigateToThePreviousResultsPage' |\n  'noAutocompleteOptionsFound' |\n  'noAutocompleteSuggestionsFound' |\n  'noResultsFoundIn' |\n  'pagination' |\n  'readMoreAbout' |\n  'recentSearch' |\n  'recentSearchesFound_zero' | 'recentSearchesFound_one' | 'recentSearchesFound_two' | 'recentSearchesFound_few' | 'recentSearchesFound_many' | 'recentSearchesFound_other' |\n  'removeFilter' |\n  'resultPreview' |\n  'resultPreviewsFound_zero' | 'resultPreviewsFound_one' | 'resultPreviewsFound_two' | 'resultPreviewsFound_few' | 'resultPreviewsFound_many' | 'resultPreviewsFound_other' |\n  'resultsCountText_zero' | 'resultsCountText_one' | 'resultsCountText_two' | 'resultsCountText_few' | 'resultsCountText_many' | 'resultsCountText_other' |\n  'resultsCountWithPaginationText' |\n  'searchHere' |\n  'showLess' |\n  'showMore' |\n  'showingAllInstead' |\n  'sources_zero' | 'sources_one' | 'sources_two' | 'sources_few' | 'sources_many' | 'sources_other' |\n  'submitSearch' |\n  'suggestionResultsCount_zero' | 'suggestionResultsCount_one' | 'suggestionResultsCount_two' | 'suggestionResultsCount_few' | 'suggestionResultsCount_many' | 'suggestionResultsCount_other' |\n  'thisAnsweredMyQuestion' |\n  'thisDidNotAnswerMyQuestion' |\n  'unselectAnOptionToEnterInARange' |\n  'updateYourLocation' |\n  'viewAll' |\n  'viewDetails' |\n  'useMyLocation' |\n  'viewAll' |\n  'viewDetails';\n\ntype translations = {\n  [key in translationKeys]?: string;\n};\n\n/**\n * SearchI18next translation overrides\n *\n * The key is the locale to override.\n * The value is the translation object that define specific translations override.\n *\n * @public\n */\nexport type SearchTranslationOverrides = {\n  [key: string]: translations\n};\n\n/**\n * The configuration options for Search I18next.\n *\n * @public\n */\ndeclare interface SearchI18nextConfig {\n  searcher: SearchHeadless,\n  translationOverrides?: SearchTranslationOverrides\n}\n\n/**\n * A higher-order component which provides translations for search react components.\n *\n * @public\n *\n * @param props - The configuration for the search headless service\n * @returns A React element that provides translation context\n */\nexport function SearchI18nextProvider(props: PropsWithChildren<SearchI18nextConfig>): React.JSX.Element {\n  const { searcher, translationOverrides, children } = props;\n\n  React.useEffect(() => {\n    translationOverrides && Object.entries(translationOverrides).forEach(([locale, translation]) => {\n      i18nInstance.addResourceBundle(locale, 'search-ui-react', translation, true, true);\n    });\n    i18nInstance.changeLanguage(searcher.state.meta.locale);\n    searcher.addListener<string | undefined>({\n      valueAccessor: state => state.meta.locale,\n      callback: locale => {\n        i18nInstance.changeLanguage(locale);\n      }\n    });\n  }, [searcher, translationOverrides]);\n\n  return (\n    <I18nextProvider i18n={i18nInstance}>\n      {children}\n    </I18nextProvider>\n  );\n}\n","import { HighlightedValue } from '@yext/search-headless-react';\n\n/**\n * The data used by the {@link StandardCard} and taken from the original Result.\n *\n * @public\n */\nexport interface StandardCardData {\n  /** The text to display in the card's header. */\n  title: HighlightedValue | string,\n  /** The content to display in the card's body. */\n  description: HighlightedValue | string,\n  /** CTA data to render. */\n  cta1: CtaData,\n  /** CTA data to render. */\n  cta2: CtaData\n}\n\n/**\n * The shape of a StandardCard CTA field's data.\n *\n * @public\n */\nexport interface CtaData {\n  /** The display label for the CTA element. */\n  label: string,\n  /** The CTA link source. */\n  link: string,\n  /** The CTA link type (e.g. URL, Phone, Email, Other). */\n  linkType: string\n}\n\n/**\n * Type guard for CtaData.\n *\n * @public\n *\n * @param data - the data to validate.\n * @returns whether the data is of type CtaData.\n */\nexport function isCtaData(data: unknown): data is CtaData {\n  if (typeof data !== 'object' || data === null) {\n    return false;\n  }\n  const expectedKeys = ['label', 'link', 'linkType'];\n  return expectedKeys.every(key => {\n    return key in data;\n  });\n}"]}