{"version":3,"file":"search.726d28973dd64e6b311c.js?ssi=0","mappings":"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","sources":["webpack://@logos/commerceweb-frontend/./Scripts/site/components/error-boundary/index.jsx","webpack://@logos/commerceweb-frontend/./Scripts/site/hooks/use-author.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/shared/books-by-author/index.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/hooks/use-publisher.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/content/section-content.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/clients/content-client.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/category-content.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/user-search-filter-context.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/accordion/accordion.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/search-resources.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/bounded-responses-cache.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/algolia-search-context.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/util.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/filters.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/refinements.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/hidden-facet-refinements.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/skeleton/index.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/shared/enhanced-for-logos-label/index.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/shared/enhanced-for-logos-with-tooltip/index.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/use-product-card.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/product-image.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/discount-badge.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/product-title.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/product-authors.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/product-pricing.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/algolia-grid-card.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/product-overview.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/product-card/algolia-list-card.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/products.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/radio-accordion.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/sort-by-accordion.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/hits-per-page-accordion.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/use-view-mode.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/routing.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/use-hydration-settled.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/index.tsx","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/hooks/use-search-impressions.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/components/search/hooks/use-search-analytics.ts","webpack://@logos/commerceweb-frontend/./Scripts/site/util/safe-json-parse.ts"],"sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nclass ErrorBoundary extends Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\thasError: false,\n\t\t\terror: null,\n\t\t\terrorInfo: null,\n\t\t};\n\t}\n\n\tstatic getDerivedStateFromError(error) {\n\t\t// Update state so the next render will show the fallback UI\n\t\treturn { hasError: true };\n\t}\n\n\tcomponentDidCatch(error, errorInfo) {\n\t\t// Store error details in state\n\t\tthis.setState({\n\t\t\terror,\n\t\t\terrorInfo,\n\t\t});\n\n\t\t// Notify parent component about the error\n\t\tif (this.props.onError) {\n\t\t\tthis.props.onError(error, errorInfo);\n\t\t}\n\n\t\t// Log error to console or external service\n\t\tconsole.error('ErrorBoundary caught an error:', error, errorInfo);\n\t}\n\n\tresetErrorBoundary = () => {\n\t\tthis.setState({\n\t\t\thasError: false,\n\t\t\terror: null,\n\t\t\terrorInfo: null,\n\t\t});\n\n\t\t// Notify parent that error was reset\n\t\tif (this.props.onReset) {\n\t\t\tthis.props.onReset();\n\t\t}\n\t};\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\t// If custom error template is provided, use it\n\t\t\tif (this.props.fallback) {\n\t\t\t\tif (typeof this.props.fallback !== 'function') {\n\t\t\t\t\treturn this.fallback;\n\t\t\t\t}\n\n\t\t\t\t// Pass error details and reset function to custom template\n\t\t\t\treturn this.props.fallback({\n\t\t\t\t\terror: this.state.error,\n\t\t\t\t\terrorInfo: this.state.errorInfo,\n\t\t\t\t\tresetErrorBoundary: this.resetErrorBoundary,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If fallbackComponent is provided as a React component\n\t\t\tif (this.props.fallbackComponent) {\n\t\t\t\tconst FallbackComponent = this.props.fallbackComponent;\n\t\t\t\treturn (\n\t\t\t\t\t<FallbackComponent\n\t\t\t\t\t\terror={this.state.error}\n\t\t\t\t\t\terrorInfo={this.state.errorInfo}\n\t\t\t\t\t\tresetErrorBoundary={this.resetErrorBoundary}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n\nErrorBoundary.propTypes = {\n\tchildren: PropTypes.node.isRequired,\n\tfallback: PropTypes.func,\n\tfallbackComponent: PropTypes.elementType,\n\tonError: PropTypes.func,\n\tonReset: PropTypes.func,\n\tshowError: PropTypes.bool,\n};\n\nErrorBoundary.defaultProps = {\n\tshowError: false,\n};\n\nexport default ErrorBoundary;\n","import { createBatchContext } from './use-batch';\n\nexport interface AuthorInfo {\n\tid: string;\n\tdisplayName: string;\n\timageUrlLarge?: string;\n\tlongDescription?: string;\n}\n\nexport const AuthorBatch = createBatchContext<string, AuthorInfo>(\n\tasync ids => {\n\t\tconst nonEmptyIds = ids.filter(id => id);\n\t\tif (nonEmptyIds.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst response = await fetch(`/api/authors?ids=${nonEmptyIds.join(',')}`);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t}\n\n\t\treturn (await response.json()) as AuthorInfo[];\n\t},\n\t(id, data) => data.find(d => d.id === id)\n);\n\nexport function useAuthor(id: string) {\n\treturn AuthorBatch.useData(id);\n}\n","import React, { useState } from 'react';\nimport { IconButton, Typography } from '@faithlife/commerce-components';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { useRefinementList } from 'react-instantsearch';\nimport { AuthorBio } from '../author-bio';\nimport { useAuthor } from '../../../hooks/use-author';\n\nconst useGetRefinedValues = (attribute: string) =>\n\tuseRefinementList({ attribute })\n\t\t.items.filter(item => item.isRefined)\n\t\t.map(item => item.value) ?? [];\n\ninterface BooksByAuthorProps {\n\tresources: {\n\t\tbooksBy: string;\n\t\tshowMore: string;\n\t\tshowLess: string;\n\t};\n}\n\nexport const BooksByAuthor = ({ resources }: BooksByAuthorProps) => {\n\tconst refinedAuthorIds = useGetRefinedValues('authorIds');\n\tconst authorId = refinedAuthorIds?.length === 1 ? refinedAuthorIds[0] : '';\n\tconst { data: author, isLoading } = useAuthor(authorId);\n\n\tconst [isCollapsed, setIsCollapsed] = useState(false);\n\n\tif (isLoading || !authorId || !author || !author.displayName || !author.longDescription) {\n\t\treturn <></>;\n\t}\n\n\treturn (\n\t\t<div className=\"bg-[#f2f2f2] border-t border-b border-[#b1b1b1] px-3 py-4 md:p-6\">\n\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t<Typography variant=\"headingH6\">\n\t\t\t\t\t{resources.booksBy} {author?.displayName}\n\t\t\t\t</Typography>\n\t\t\t\t<IconButton aria-label=\"Toggle collapse\" scale=\"sm\" onClick={() => setIsCollapsed(!isCollapsed)}>\n\t\t\t\t\t{isCollapsed ? <ChevronDown /> : <ChevronUp />}\n\t\t\t\t</IconButton>\n\t\t\t</div>\n\t\t\t{!isCollapsed && (\n\t\t\t\t<AuthorBio\n\t\t\t\t\tclassName=\"mt-4 rounded-[3px] border border-[#d8d8d8] bg-white p-4 md:p-8\"\n\t\t\t\t\tresources={resources}\n\t\t\t\t\tdisplayName={author?.displayName}\n\t\t\t\t\timageUrl={author?.imageUrlLarge}\n\t\t\t\t\tbio={author?.longDescription}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { createBatchContext } from './use-batch';\n\nexport interface PublisherInfo {\n\tid: string;\n\tdisplayName: string;\n}\n\nexport const PublisherBatch = createBatchContext<string, PublisherInfo>(\n\tasync ids => {\n\t\tconst nonEmptyIds = ids.filter(id => id);\n\t\tif (nonEmptyIds.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst response = await fetch(`/api/publisher?ids=${nonEmptyIds.join(',')}`);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t}\n\n\t\treturn (await response.json()) as PublisherInfo[];\n\t},\n\t(id, data) => data.find(d => d.id === id)\n);\n\nexport function usePublisher(id: string) {\n\treturn PublisherBatch.useData(id);\n}\n","import React, { useEffect, useRef, useState } from 'react';\n\nimport { RenderBuilderContent } from '../builder';\nimport { getSections } from '../../clients/content-client';\nimport { useLocation } from '../../location';\nimport { useIsPreviewingThisBuilderModel, SectionContentViewModel, SectionKind } from '../../builder';\nimport { c_defaultUserInfo } from '../per-user-data/per-user-data-context';\nimport { notifyWarning } from '../notifications';\n\ninterface ContentChangeEvent {\n\thasContent: boolean;\n\tcontentKey: string;\n}\n\nconst builderIoModelNamesBySectionKindMap: Record<SectionKind, string> = {\n\tsearchResultsAbove: 'search-results-above',\n\tsearchResultsBelow: 'search-results-below',\n\tuniversalHeader: 'universal-header',\n\tuniversalFooter: 'universal-footer',\n\tsubscriptionChurnPrevention: 'subscription-churn-prevention',\n\tconfigurationWizardSubscriptionsBanner: 'configuration-wizard-subscriptions-banner',\n\tconfigurationWizardSubscriptionsContent: 'configuration-wizard-subscriptions-content',\n\tconfigurationWizardLibrariesBanner: 'configuration-wizard-libraries-banner',\n\torderSummary: 'order-summary',\n\torderSummaryFooter: 'order-summary-footer',\n\tproductPage: 'product-page',\n\tadzone: 'adzone',\n\tnotifications: 'notifications',\n};\n\nfunction getContentKey(sectionContents: SectionContentViewModel[]): string {\n\treturn sectionContents\n\t\t.filter(sc => !!sc)\n\t\t.map(sc => `${sc.sectionKind}:${sc.contentSourceKind}:${sc.contentId}`)\n\t\t.join('|');\n}\n\nconst SectionContent = ({\n\tsectionKind,\n\tinitialSectionContents,\n\tonContentChange,\n}: {\n\tsectionKind: SectionKind;\n\tinitialSectionContents?: SectionContentViewModel[];\n\tonContentChange?: (event: ContentChangeEvent) => void;\n}) => {\n\tconst [sectionContents, setSectionContents] = useState<SectionContentViewModel[]>(initialSectionContents ?? []);\n\tconst builderIoModel = builderIoModelNamesBySectionKindMap[sectionKind];\n\tconst isBuilderIoPreviewingThisModel = useIsPreviewingThisBuilderModel(builderIoModel);\n\tconst location = useLocation();\n\tconst lastRequestedLocationHref = useRef(initialSectionContents === undefined ? undefined : location.href);\n\n\tuseEffect(() => {\n\t\tconst fetchSections = async () => {\n\t\t\tconst sections = await getSections({\n\t\t\t\tkind: sectionKind,\n\t\t\t\turl: location.href,\n\t\t\t});\n\n\t\t\tsetSectionContents(sections);\n\n\t\t\tconst filteredSections = sections.filter(sc => !!sc);\n\t\t\tonContentChange?.({\n\t\t\t\thasContent: filteredSections.length > 0 || isBuilderIoPreviewingThisModel,\n\t\t\t\tcontentKey: getContentKey(filteredSections),\n\t\t\t});\n\t\t};\n\n\t\tif (!isBuilderIoPreviewingThisModel && location.href !== lastRequestedLocationHref.current) {\n\t\t\tlastRequestedLocationHref.current = location.href;\n\t\t\tfetchSections();\n\t\t}\n\t}, [sectionKind, location.href, onContentChange, isBuilderIoPreviewingThisModel, initialSectionContents]);\n\n\tuseEffect(() => {\n\t\tif (isBuilderIoPreviewingThisModel) {\n\t\t\tnotifyWarning(`You are previewing the \"${builderIoModel}\" Builder.io model.`);\n\t\t}\n\t}, [isBuilderIoPreviewingThisModel, builderIoModel]);\n\n\tif (isBuilderIoPreviewingThisModel) {\n\t\treturn (\n\t\t\t<RenderBuilderContent\n\t\t\t\tmodel={builderIoModel}\n\t\t\t\tstaticData={{\n\t\t\t\t\tstaticProductData: [],\n\t\t\t\t\tuserInfo: c_defaultUserInfo,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst filteredContents = sectionContents.filter(sc => !!sc);\n\tconst hasContent = filteredContents.length > 0;\n\n\tif (!hasContent) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{filteredContents.map(sc =>\n\t\t\t\tsc.contentSourceKind === 'builderIo' ? <RenderBuilderContent key={sc.contentId} {...sc.builderIo} /> : null\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nexport default SectionContent;\n","import { fetch } from '../util/fetch';\nimport { SectionContentViewModel, SectionKind } from '../builder';\n\ninterface Params {\n\tkind: SectionKind;\n\turl: string;\n}\n\nexport async function getSections({ kind, url }: Params): Promise<SectionContentViewModel[]> {\n\ttry {\n\t\tconst response = await fetch.get({\n\t\t\turl: '/api/sections',\n\t\t\tparams: { kind, url },\n\t\t});\n\n\t\tconst results = await response.json();\n\t\treturn results as unknown as SectionContentViewModel[];\n\t} catch (error) {\n\t\treturn [];\n\t}\n}\n","import React, { useState, useCallback } from 'react';\n\nimport ReadMoreReadLess from '../read-more-read-less';\nimport { SectionContent } from '../content';\nimport ErrorBoundary from '../error-boundary';\nimport type { SectionContentViewModel, SectionKind } from '../../builder';\n\ninterface Props {\n\tsectionKind: SectionKind;\n\tinitialSectionContents?: SectionContentViewModel[];\n}\n\ninterface ContentChangeEvent {\n\thasContent: boolean;\n\tcontentKey: string;\n}\n\nconst CategoryContent = ({ sectionKind, initialSectionContents }: Props) => {\n\t// Merged into one state object so both values update in a single render,\n\t// avoiding separate re-renders that can cause SectionContent to remount.\n\tconst [{ hasContent, contentKey }, setContentState] = useState(() => {\n\t\tconst filteredSections = initialSectionContents?.filter(sc => !!sc) ?? [];\n\t\treturn {\n\t\t\thasContent: filteredSections.length > 0,\n\t\t\tcontentKey: filteredSections.map(sc => `${sc.sectionKind}:${sc.contentSourceKind}:${sc.contentId}`).join('|'),\n\t\t};\n\t});\n\n\tconst handleContentChange = useCallback((event: ContentChangeEvent) => {\n\t\tsetContentState(prev =>\n\t\t\tprev.hasContent === event.hasContent && prev.contentKey === event.contentKey\n\t\t\t\t? prev\n\t\t\t\t: { hasContent: event.hasContent, contentKey: event.contentKey }\n\t\t);\n\t}, []);\n\n\t// SectionContent always stays in the same tree position (inside ReadMoreReadLess).\n\t// Changing the parent conditionally would cause SectionContent to unmount/remount\n\t// and re-fire the sections AJAX on every hasContent or contentKey state change.\n\treturn (\n\t\t<ErrorBoundary>\n\t\t\t<div className={hasContent ? 'w-full' : 'hidden'}>\n\t\t\t\t<ReadMoreReadLess contentKey={contentKey}>\n\t\t\t\t\t<SectionContent\n\t\t\t\t\t\tsectionKind={sectionKind}\n\t\t\t\t\t\tinitialSectionContents={initialSectionContents}\n\t\t\t\t\t\tonContentChange={handleContentChange}\n\t\t\t\t\t/>\n\t\t\t\t</ReadMoreReadLess>\n\t\t\t</div>\n\t\t</ErrorBoundary>\n\t);\n};\n\nexport default CategoryContent;\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { useLocation } from '../../location';\n\nexport interface UserSearchFilterOption {\n\tdisplayName: string;\n\tisDefault?: boolean;\n\talgoliaValue: string;\n\ttoken: string;\n}\n\nexport interface UserSearchFilter {\n\ttitle: string;\n\toptions: UserSearchFilterOption[];\n\ttoken: string;\n}\n\nexport interface UserSearchFilters {\n\tfilters: UserSearchFilter[];\n}\n\ninterface UserSearchFilterContextValue {\n\tselectedFilterOptions: Record<string, string>;\n\tsetSelectedFilterOption: (filterToken: string, optionToken: string) => void;\n\tuserSearchFilters: UserSearchFilter[];\n}\n\nconst UserSearchFilterContext = createContext<UserSearchFilterContextValue | null>(null);\n\nfunction getDefaultSelectedFilterOptions(userSearchFilters: UserSearchFilter[]) {\n\treturn userSearchFilters.reduce<Record<string, string>>((selectedOptions, filter) => {\n\t\tconst options = Array.isArray(filter?.options) ? filter.options : [];\n\t\tconst selectedOption = options.find(option => option?.isDefault) ?? options[0];\n\n\t\tif (selectedOption?.token) {\n\t\t\tselectedOptions[filter.token] = selectedOption.token;\n\t\t}\n\n\t\treturn selectedOptions;\n\t}, {});\n}\n\nfunction areSelectedFilterOptionsEqual(first: Record<string, string>, second: Record<string, string>): boolean {\n\tconst firstKeys = Object.keys(first);\n\tconst secondKeys = Object.keys(second);\n\n\treturn firstKeys.length === secondKeys.length && firstKeys.every(key => first[key] === second[key]);\n}\n\nfunction readUserFilterSelectionsFromUrl(\n\tuserSearchFilters: UserSearchFilter[],\n\tsearchParams: URLSearchParams\n): Record<string, string> {\n\tconst defaults = getDefaultSelectedFilterOptions(userSearchFilters);\n\n\treturn userSearchFilters.reduce<Record<string, string>>((selectedOptions, filter) => {\n\t\tconst options = Array.isArray(filter?.options) ? filter.options : [];\n\t\tconst urlValue = searchParams.get(filter.token);\n\t\tconst matchingOption = urlValue ? options.find(option => option?.token === urlValue) : undefined;\n\n\t\tconst resolved = matchingOption?.token ?? defaults[filter.token];\n\t\tif (resolved) {\n\t\t\tselectedOptions[filter.token] = resolved;\n\t\t}\n\n\t\treturn selectedOptions;\n\t}, {});\n}\n\nfunction writeUserFilterSelectionsToUrl(\n\tselectedFilterOptions: Record<string, string>,\n\tuserSearchFilters: UserSearchFilter[],\n\tsearch: string,\n\tpathname: string,\n\treplaceUrl: (url: string) => void\n) {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(`https://placeholder${pathname}${search}`);\n\t} catch {\n\t\t// Malformed pathname/search — skip URL update rather than crash.\n\t\treturn;\n\t}\n\n\tfor (const filter of userSearchFilters) {\n\t\tconst selectedToken = selectedFilterOptions[filter.token];\n\n\t\tif (selectedToken) {\n\t\t\turl.searchParams.set(filter.token, selectedToken);\n\t\t} else {\n\t\t\turl.searchParams.delete(filter.token);\n\t\t}\n\t}\n\n\ttry {\n\t\treplaceUrl(`${url.pathname}${url.search}`);\n\t} catch {\n\t\t// History replacement can fail in some browsers / iframes.\n\t}\n}\n\nexport function useUserSearchFilterContext() {\n\tconst context = useContext(UserSearchFilterContext);\n\tif (!context) {\n\t\tthrow new Error('useUserSearchFilterContext must be used within UserSearchFilterProvider');\n\t}\n\treturn context;\n}\n\nexport function UserSearchFilterProvider({\n\tuserSearchFilters,\n\tinitialSelectedFilterOptions,\n\tsetSelectedFilterOptionsOverride,\n\tchildren,\n}: {\n\tuserSearchFilters: UserSearchFilter[];\n\tinitialSelectedFilterOptions?: Record<string, string>;\n\tsetSelectedFilterOptionsOverride?: () => Record<string, string>;\n\tchildren: React.ReactNode;\n}) {\n\tconst { search, pathname, replaceUrl } = useLocation();\n\tconst searchParams = useMemo(() => new URLSearchParams(search), [search]);\n\n\tconst [selectedFilterOptions, setSelectedFilterOptions] = useState<Record<string, string>>(() => {\n\t\tconst urlSelections = readUserFilterSelectionsFromUrl(userSearchFilters, searchParams);\n\n\t\treturn userSearchFilters.reduce<Record<string, string>>((selectedOptions, filter) => {\n\t\t\tconst initialSelection = initialSelectedFilterOptions?.[filter.token];\n\t\t\tconst isInitialSelectionValid = filter.options.some(option => option.token === initialSelection);\n\t\t\tconst selectedOption = isInitialSelectionValid ? initialSelection : urlSelections[filter.token];\n\n\t\t\tif (selectedOption) {\n\t\t\t\tselectedOptions[filter.token] = selectedOption;\n\t\t\t}\n\n\t\t\treturn selectedOptions;\n\t\t}, {});\n\t});\n\n\tuseEffect(() => {\n\t\tsetSelectedFilterOptions(prev => {\n\t\t\tlet next: Record<string, string>;\n\n\t\t\tif (setSelectedFilterOptionsOverride) {\n\t\t\t\tnext = setSelectedFilterOptionsOverride();\n\t\t\t} else {\n\t\t\t\tconst urlSelections = readUserFilterSelectionsFromUrl(userSearchFilters, searchParams);\n\n\t\t\t\t// Only reset if userSearchFilters changed (not a URL-driven update).\n\t\t\t\t// Preserve current selection if the option is still valid for the new filter set.\n\t\t\t\tnext = userSearchFilters.reduce<Record<string, string>>((selectedOptions, filter) => {\n\t\t\t\t\tconst currentSelection = prev[filter.token];\n\t\t\t\t\tconst isStillValid = filter.options.some(option => option.token === currentSelection);\n\t\t\t\t\tconst selectedOption = isStillValid ? currentSelection : urlSelections[filter.token];\n\n\t\t\t\t\tif (selectedOption) {\n\t\t\t\t\t\tselectedOptions[filter.token] = selectedOption;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn selectedOptions;\n\t\t\t\t}, {});\n\t\t\t}\n\n\t\t\treturn areSelectedFilterOptionsEqual(prev, next) ? prev : next;\n\t\t});\n\t}, [setSelectedFilterOptionsOverride, userSearchFilters, searchParams]);\n\n\tuseEffect(() => {\n\t\twriteUserFilterSelectionsToUrl(selectedFilterOptions, userSearchFilters, search, pathname, replaceUrl);\n\t}, [selectedFilterOptions, userSearchFilters, search, pathname, replaceUrl]);\n\n\tconst handleSetSelectedFilterOption = (filterToken: string, optionToken: string) => {\n\t\tsetSelectedFilterOptions(prev => ({\n\t\t\t...prev,\n\t\t\t[filterToken]: optionToken,\n\t\t}));\n\t};\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tselectedFilterOptions,\n\t\t\tsetSelectedFilterOption: handleSetSelectedFilterOption,\n\t\t\tuserSearchFilters,\n\t\t}),\n\t\t[selectedFilterOptions, userSearchFilters]\n\t);\n\n\treturn <UserSearchFilterContext.Provider value={contextValue}>{children}</UserSearchFilterContext.Provider>;\n}\n","import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { ChevronDown } from 'lucide-react';\n\nimport { cn } from '../../util/cn';\n\nconst Accordion = AccordionPrimitive.Root;\n\nconst AccordionItem = React.forwardRef<\n\tReact.ComponentRef<typeof AccordionPrimitive.Item>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => <AccordionPrimitive.Item className={cn('', className)} ref={ref} {...props} />);\n\nAccordionItem.displayName = AccordionPrimitive.Item.displayName;\n\nconst AccordionTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof AccordionPrimitive.Trigger>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Header className=\"flex\">\n\t\t<AccordionPrimitive.Trigger\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-1 items-center justify-between py-[9.5px] text-lg font-bold outline-hidden transition-all hover:text-secondary focus-visible:text-secondary [&[data-state=open]>svg]:rotate-180',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t{/* TODO: For the sake of moving fast we are leaving this in, but in the future we need to figure out how enable custom icons */}\n\t\t\t<ChevronDown className=\"h-6 w-6 shrink-0 transition-transform duration-200\" />\n\t\t</AccordionPrimitive.Trigger>\n\t</AccordionPrimitive.Header>\n));\n\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nconst AccordionContent = React.forwardRef<\n\tReact.ComponentRef<typeof AccordionPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Content\n\t\tclassName={cn(\n\t\t\t'data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down mb-4 overflow-hidden transition-all',\n\t\t\tclassName\n\t\t)}\n\t\tref={ref}\n\t\t{...props}\n\t>\n\t\t{children}\n\t</AccordionPrimitive.Content>\n));\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","import { createContext, useContext } from 'react';\n\nexport const SearchResourcesContext = createContext<Record<string, string>>({});\n\nexport function useSearchResources(): Record<string, string> {\n\treturn useContext(SearchResourcesContext);\n}\n","import type { Cache, CacheEvents } from '@algolia/client-common';\n\n// Algolia's default `createMemoryCache` never evicts, so a long filtering session retains every\n// distinct search indefinitely. That is costly here because ownership-filtered searches carry a\n// `filters` string listing every owned productId, and it is stored twice: once as the cache key and\n// again inside the response, which echoes the request params back. Measured against a 20k-product\n// library, each cached search retained ~2.1MB (~1.0MB key, ~1.1MB value) against a ~0.15MB baseline,\n// and 14 cached searches held 26.6MB.\n//\n// Because entry size scales with the size of the user's library, the budget is in characters rather\n// than entries. This cache otherwise keeps `createMemoryCache`'s exact semantics -- same\n// `JSON.stringify` key, same serialized value, same miss handling -- and only adds eviction, so an\n// evicted entry behaves precisely like the cache miss that would have happened before it was ever\n// cached.\n\nconst defaultMaxCharacters = 8 * 1024 * 1024;\n\nfunction serializeKey(key: Record<string, any> | string): string {\n\treturn JSON.stringify(key);\n}\n\nexport function createBoundedResponsesCache(maxCharacters: number = defaultMaxCharacters): Cache {\n\tconst cache = new Map<string, string>();\n\tlet characters = 0;\n\n\tfunction evict() {\n\t\t// Always keep the most recently written entry, so a single oversized response still caches.\n\t\twhile (characters > maxCharacters && cache.size > 1) {\n\t\t\tconst oldestKey = cache.keys().next().value;\n\t\t\tif (oldestKey === undefined) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcharacters -= oldestKey.length + (cache.get(oldestKey)?.length ?? 0);\n\t\t\tcache.delete(oldestKey);\n\t\t}\n\t}\n\n\treturn {\n\t\tget<TValue>(\n\t\t\tkey: Record<string, any> | string,\n\t\t\tdefaultValue: () => Promise<TValue>,\n\t\t\tevents: CacheEvents<TValue> = { miss: () => Promise.resolve() }\n\t\t): Promise<TValue> {\n\t\t\tconst serializedKey = serializeKey(key);\n\t\t\tconst cached = cache.get(serializedKey);\n\n\t\t\tif (cached !== undefined) {\n\t\t\t\tcache.delete(serializedKey);\n\t\t\t\tcache.set(serializedKey, cached);\n\n\t\t\t\treturn Promise.resolve(JSON.parse(cached) as TValue);\n\t\t\t}\n\n\t\t\tconst promise = defaultValue();\n\n\t\t\treturn promise.then(value => events.miss(value)).then(() => promise);\n\t\t},\n\n\t\tset<TValue>(key: Record<string, any> | string, value: TValue): Promise<TValue> {\n\t\t\tconst serializedKey = serializeKey(key);\n\t\t\tconst serializedValue = JSON.stringify(value);\n\n\t\t\tconst existing = cache.get(serializedKey);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tcharacters -= serializedKey.length + existing.length;\n\t\t\t\tcache.delete(serializedKey);\n\t\t\t}\n\n\t\t\tcache.set(serializedKey, serializedValue);\n\t\t\tcharacters += serializedKey.length + serializedValue.length;\n\t\t\tevict();\n\n\t\t\treturn Promise.resolve(value);\n\t\t},\n\n\t\tdelete(key: Record<string, any> | string): Promise<void> {\n\t\t\tconst serializedKey = serializeKey(key);\n\t\t\tconst existing = cache.get(serializedKey);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tcharacters -= serializedKey.length + existing.length;\n\t\t\t\tcache.delete(serializedKey);\n\t\t\t}\n\n\t\t\treturn Promise.resolve();\n\t\t},\n\n\t\tclear(): Promise<void> {\n\t\t\tcache.clear();\n\t\t\tcharacters = 0;\n\n\t\t\treturn Promise.resolve();\n\t\t},\n\t};\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { algoliasearch } from 'algoliasearch';\nimport insightsClient from 'search-insights';\nimport { createBoundedResponsesCache } from './bounded-responses-cache';\n\n// ---------------------------------------------------------------------------\n// Algolia search context — provides the configured Algolia client\n// ---------------------------------------------------------------------------\n\ninterface AlgoliaSearchContextValue {\n\tclient: ReturnType<typeof algoliasearch>;\n\tindexName: string;\n\tstorefrontShortname: string;\n\tuserId: string | null;\n\tanonymousUserToken: string | null;\n}\n\nconst AlgoliaSearchContext = createContext<AlgoliaSearchContextValue | null>(null);\n\ninterface AlgoliaSearchContextProviderProps {\n\tappId: string;\n\tappKey: string;\n\tindexName: string;\n\tstorefrontShortname: string;\n\tuserId?: string | null;\n\tchildren: React.ReactNode;\n}\n\nexport function AlgoliaSearchContextProvider({\n\tappId,\n\tappKey,\n\tindexName,\n\tstorefrontShortname,\n\tuserId = null,\n\tchildren,\n}: AlgoliaSearchContextProviderProps) {\n\tconst client = useMemo(\n\t\t() => algoliasearch(appId, appKey, { responsesCache: createBoundedResponsesCache() }),\n\t\t[appId, appKey]\n\t);\n\tconst [anonymousUserToken, setAnonymousUserToken] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\tinsightsClient('init', { appId, apiKey: appKey });\n\t\tinsightsClient('getUserToken', {}, (error, userToken) => {\n\t\t\tif (!error && userToken !== undefined) {\n\t\t\t\tsetAnonymousUserToken(String(userToken));\n\t\t\t}\n\t\t});\n\t\tif (userId) {\n\t\t\tinsightsClient('setAuthenticatedUserToken', userId);\n\t\t}\n\t}, [appId, appKey, userId]);\n\n\tconst value = useMemo(\n\t\t() => ({ client, indexName, storefrontShortname, userId, anonymousUserToken }),\n\t\t[client, indexName, storefrontShortname, userId, anonymousUserToken]\n\t);\n\n\treturn <AlgoliaSearchContext.Provider value={value}>{children}</AlgoliaSearchContext.Provider>;\n}\n\nexport function useAlgoliaSearch(): AlgoliaSearchContextValue {\n\tconst context = useContext(AlgoliaSearchContext);\n\n\tif (!context) {\n\t\tthrow new Error('useAlgoliaSearch must be used within an AlgoliaSearchContextProvider');\n\t}\n\n\treturn context;\n}\n","import type { ProductPriceAmount } from '../per-user-data/per-user-data-context';\n\ninterface SavingsPrices {\n\tsalePrice?: Pick<ProductPriceAmount, 'amount'> | null;\n\tanchorPrice?: Pick<ProductPriceAmount, 'amount'> | null;\n}\n\n/**\n * Transliterates Unicode characters to their closest ASCII equivalents.\n * Approximates the behavior of the .NET Unidecode library used by SlugHelper on the server.\n */\nfunction unidecode(text: string): string {\n\t// Handle characters that don't decompose via NFD but have ASCII equivalents.\n\t// Order matters: apply multi-char replacements before NFD strips combining marks.\n\tconst result = text\n\t\t.replace(/ß/g, 'ss')\n\t\t.replace(/[æÆ]/g, 'ae')\n\t\t.replace(/[œŒ]/g, 'oe')\n\t\t.replace(/[øØ]/g, 'o')\n\t\t.replace(/[ðÐ]/g, 'd')\n\t\t.replace(/[þÞ]/g, 'th')\n\t\t.replace(/[łŁ]/g, 'l');\n\n\t// Strip combining diacritical marks from remaining Latin characters via NFD normalization.\n\treturn result.normalize('NFD').replace(/\\p{Mn}/gu, '');\n}\n\n/**\n * Converts a string to a URL-friendly slug.\n * Matches the server-side SlugHelper.Slugify method used to generate product URL slugs.\n */\nexport function slugify(value: string | undefined): string {\n\tif (!value) {\n\t\treturn '';\n\t}\n\n\t// Remove trademark/registered symbols\n\tlet input = value.replace(/®/g, '').replace(/™/g, '');\n\n\t// Transliterate Unicode → ASCII, then lowercase (matches .Unidecode().ToLowerInvariant())\n\tinput = unidecode(input).toLowerCase();\n\n\t// Remove trailing parenthetical and bracket blocks, e.g. \"Title (Subtitle) [Edition]\"\n\t// Matches s_parenBlocks = new Regex(\"(\\\\(.*\\\\))?(\\\\s*\\\\[.*\\\\])*$\")\n\tinput = input.replace(/(\\(.*\\))?(\\s*\\[.*\\])*$/g, '');\n\n\t// Strip HTML tags — matches s_htmlTags = new Regex(\"</?[^>]+>\")\n\tinput = input.replace(/<\\/?[^>]+>/g, '');\n\n\t// Expand ampersand\n\tinput = input.replace(/ & /g, ' and ');\n\n\t// Convert separating punctuation to spaces — matches s_punctuationForSpace = new Regex(\"[/\\\\-:_]\")\n\tinput = input.replace(/[/\\-:_]/g, ' ');\n\n\t// Remove all remaining non-alphanumeric, non-space characters — matches s_punctuationAndNonAlpha = new Regex(\"[^a-z0-9 ]\")\n\tinput = input.replace(/[^a-z0-9 ]/g, '');\n\n\t// Collapse whitespace runs to hyphens — matches s_excessWhitespace = new Regex(\"\\\\s+\")\n\treturn input.trim().replace(/\\s+/g, '-');\n}\n\nexport function getSavingsPercent(prices: SavingsPrices | null | undefined): number {\n\tconst anchor = prices?.anchorPrice?.amount;\n\tconst sale = prices?.salePrice?.amount;\n\tif (!anchor || !sale) {\n\t\treturn 0;\n\t}\n\tif (anchor <= 0) {\n\t\treturn 0;\n\t}\n\treturn ((anchor - sale) / anchor) * 100;\n}\n\n/**\n * Splits an author/publisher facet value of the form \"id:displayName\" into its parts.\n * Uses the first colon as the separator so display names that themselves contain colons\n * are preserved. When no colon is present, the whole value is treated as both id and name.\n */\nexport function parseFacetValue(value: string): { id: string; displayName: string } {\n\tconst separatorIndex = value.indexOf(':');\n\tif (separatorIndex === -1) {\n\t\treturn { id: value, displayName: value };\n\t}\n\treturn {\n\t\tid: value.substring(0, separatorIndex),\n\t\tdisplayName: value.substring(separatorIndex + 1),\n\t};\n}\n\nexport function safeUrl(input: string, base?: string): URL | null {\n\ttry {\n\t\treturn new URL(input, base);\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport insightsClient from 'search-insights';\nimport { LinkButton, Typography } from '@faithlife/commerce-components';\nimport {\n\tRefinementListItem,\n\tRefinementListRenderState,\n} from 'instantsearch.js/es/connectors/refinement-list/connectRefinementList';\nimport { useRefinementList } from 'react-instantsearch';\nimport { cn } from '../../util/cn';\n\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../accordion';\nimport { useSearchResources } from './search-resources';\nimport { UserSearchFilter, UserSearchFilterOption, useUserSearchFilterContext } from './user-search-filter-context';\nimport { useAlgoliaSearch } from './algolia-search-context';\nimport { parseFacetValue } from './util';\n\nfunction Check({ className, checked }: { className?: string; checked: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn('inline', className)}\n\t\t\tfill=\"none\"\n\t\t\theight=\"14\"\n\t\t\tviewBox=\"0 0 13 14\"\n\t\t\twidth=\"13\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tfill={checked ? '#1E6AFE' : 'white'}\n\t\t\t\theight=\"13\"\n\t\t\t\trx=\"1\"\n\t\t\t\tstroke={checked ? undefined : '#C7C7C7'}\n\t\t\t\twidth=\"13\"\n\t\t\t\ty=\"0.5\"\n\t\t\t/>\n\t\t\t<path d=\"M3.28223 7.73706L5.2634 9.71824L9.71857 5.26308\" stroke=\"white\" strokeLinecap=\"round\" />\n\t\t</svg>\n\t);\n}\n\nconst c_statusLabelKeys: Record<string, string> = {\n\t'status > live': 'liveStatusText',\n\t'status > prepub': 'prepubStatusText',\n\t'status > prepub > gatheringinterest': 'gatheringInterestStatusText',\n\t'status > prepub > undercontract': 'underContractStatusText',\n\t'status > prepub > gatheringinterest > almostfunded': 'almostFundedStatusText',\n\t'status > prepub > undercontract > shippingsoon': 'shippingSoonStatusText',\n};\n\nfunction ShowMoreToggle({\n\tshowMore,\n\tattribute,\n\tsetShowMore,\n}: {\n\tshowMore: string | undefined;\n\tattribute: string;\n\tsetShowMore: (showMore: string | undefined) => void;\n}) {\n\tconst resources = useSearchResources();\n\tconst isShowingMore = showMore === attribute;\n\n\treturn (\n\t\t<LinkButton as=\"button\" onClick={() => setShowMore(isShowingMore ? undefined : attribute)} scale=\"sm\">\n\t\t\t{isShowingMore ? resources['showLess'] : resources['showMore']}\n\t\t</LinkButton>\n\t);\n}\n\nfunction countDepth(value: string) {\n\tlet index = value.indexOf('>');\n\tlet depth = 0;\n\n\twhile (index !== -1) {\n\t\tindex = value.indexOf('>', index + 1);\n\t\tdepth += 1;\n\t}\n\n\treturn depth;\n}\n\nexport interface RefinementItem {\n\trefinement: RefinementListRenderState;\n\titem: RefinementListItem;\n}\n\nfunction hasChildren(items: RefinementItem[], { item: parent }: RefinementItem) {\n\treturn items.some(({ item }) => parent !== item && item.value.startsWith(parent.value));\n}\n\nfunction getChildren(items: RefinementItem[], parent: RefinementItem) {\n\tconst depth = countDepth(parent.item.value);\n\n\treturn items.filter(({ item }) => countDepth(item.value) === depth + 1 && item.value.startsWith(parent.item.value));\n}\n\nexport function getAccordions(category: string, items: RefinementItem[]) {\n\tconst root = {\n\t\tkey: category,\n\t\tlabel: category,\n\t\titems: items.filter(({ item }) => countDepth(item.value) === 0),\n\t};\n\n\tconst subCategories = items\n\t\t.filter(({ item }) => item.isRefined)\n\t\t.filter(parent => hasChildren(items, parent))\n\t\t.map(c => ({\n\t\t\tkey: c.item.value,\n\t\t\tlabel: c.item.label.replace(/^((.*) > )*/, ''),\n\t\t\titems: getChildren(items, c),\n\t\t}));\n\n\treturn [root, ...subCategories];\n}\n\nfunction useRefinementLists(category: string, levels?: number) {\n\t// not neccessary, but let's avoid shooting ourselves in the foot, shall we?\n\tconst levelsRef = useRef(levels);\n\tconst items: RefinementItem[] = [];\n\n\tif (levelsRef.current !== undefined) {\n\t\tfor (let level = 0; level <= levelsRef.current; level += 1) {\n\t\t\tconst attribute = `${category}.lvl${level}`;\n\t\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\t\tconst refinement = useRefinementList({ attribute, limit: 1000 }, { skipSuspense: level < levelsRef.current - 1 });\n\n\t\t\titems.push(...refinement.items.map(item => ({ item, refinement })));\n\t\t}\n\t} else {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst refinement = useRefinementList({ attribute: category, limit: 1000 });\n\n\t\titems.push(...refinement.items.map(item => ({ item, refinement })));\n\t}\n\n\treturn items;\n}\n\nfunction Category({\n\tcategory,\n\tsetExpandedFacets,\n\tsetShowMore,\n\tshowMore,\n\tmaxLevel,\n}: {\n\tcategory: string;\n\tsetExpandedFacets: (setState: (expandedFacets: string[]) => string[]) => void;\n\tsetShowMore: (showMore: string | undefined) => void;\n\tshowMore: string | undefined;\n\tmaxLevel?: number;\n}) {\n\tconst resources = useSearchResources();\n\tconst { indexName } = useAlgoliaSearch();\n\tconst items = useRefinementLists(category, maxLevel);\n\n\tif (!items?.length) {\n\t\treturn null;\n\t}\n\n\tconst accordions = getAccordions(category, items);\n\n\treturn accordions.map(accordion => (\n\t\t<AccordionItem key={accordion.key} value={accordion.key}>\n\t\t\t<AccordionTrigger className=\"border-t border-primary-100 p-4 lg:border-t-0 [&>svg]:text-primary\">\n\t\t\t\t<Typography className=\"text-primary-400\" variant=\"bodyRegular\" tag=\"div\">\n\t\t\t\t\t{resources[accordion.label] ?? accordion.label}\n\t\t\t\t</Typography>\n\t\t\t</AccordionTrigger>\n\t\t\t<AccordionContent className=\"m-0 bg-grey-200 p-4\">\n\t\t\t\t<div className=\"flex flex-col gap-y-4\">\n\t\t\t\t\t{(showMore === accordion.key ? accordion.items : accordion.items.slice(0, 7)).map(({ item, refinement }) => (\n\t\t\t\t\t\t<div key={item.value}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'text-black-200 hover:text-secondary-200': !item.isRefined,\n\t\t\t\t\t\t\t\t\t\t'text-primary': item.isRefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'bodySm w-full text-left capitalize'\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\trefinement.refine(item.value);\n\n\t\t\t\t\t\t\t\t\tinsightsClient('clickedFilters', {\n\t\t\t\t\t\t\t\t\t\tindex: indexName,\n\t\t\t\t\t\t\t\t\t\teventName: 'Clicked filter',\n\t\t\t\t\t\t\t\t\t\tfilters: [`${category}:${item.value}`],\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tif (!item.isRefined) {\n\t\t\t\t\t\t\t\t\t\tsetExpandedFacets(old => [...old, item.value]);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\titems\n\t\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t({ item: child }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tchild.isRefined && child.value !== item.value && child.value.startsWith(item.value)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t.forEach(({ item: child, refinement: childRefinement }) => {\n\t\t\t\t\t\t\t\t\t\t\t\tchildRefinement.refine(child.value);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tsetExpandedFacets(old => old.filter(v => !v.startsWith(item.value)));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check checked={item.isRefined} className=\"mr-3\" />\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{`${\n\t\t\t\t\t\t\t\t\t\titem.label.lastIndexOf('>') === -1\n\t\t\t\t\t\t\t\t\t\t\t? item.label\n\t\t\t\t\t\t\t\t\t\t\t: item.label.substring(item.label.lastIndexOf('>') + 2)\n\t\t\t\t\t\t\t\t\t} `}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"text-black-100\">\n\t\t\t\t\t\t\t\t\t{'('}\n\t\t\t\t\t\t\t\t\t{item.count}\n\t\t\t\t\t\t\t\t\t{')'}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t\t{accordion.items.length > 7 && (\n\t\t\t\t\t\t<ShowMoreToggle attribute={accordion.key} setShowMore={setShowMore} showMore={showMore} />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</AccordionContent>\n\t\t</AccordionItem>\n\t));\n}\n\nfunction AuthorFacetItem({\n\tid,\n\tdisplayName,\n\tcount,\n\tisRefined,\n\tonRefine,\n}: {\n\tid: string;\n\tdisplayName: string;\n\tcount: number;\n\tisRefined: boolean;\n\tonRefine: (id: string) => void;\n}) {\n\treturn (\n\t\t<div>\n\t\t\t<button\n\t\t\t\tclassName={cn(\n\t\t\t\t\t{\n\t\t\t\t\t\t'text-black-200 hover:text-secondary-200': !isRefined,\n\t\t\t\t\t\t'text-primary': isRefined,\n\t\t\t\t\t},\n\t\t\t\t\t'bodySm w-full text-left capitalize'\n\t\t\t\t)}\n\t\t\t\tonClick={() => onRefine(id)}\n\t\t\t>\n\t\t\t\t{displayName}{' '}\n\t\t\t\t<span className=\"text-black-100\">\n\t\t\t\t\t{'('}\n\t\t\t\t\t{count}\n\t\t\t\t\t{')'}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction PublisherFacetItem({\n\tid,\n\tdisplayName,\n\tcount,\n\tisRefined,\n\tonRefine,\n}: {\n\tid: string;\n\tdisplayName: string;\n\tcount: number;\n\tisRefined: boolean;\n\tonRefine: (id: string) => void;\n}) {\n\treturn (\n\t\t<div>\n\t\t\t<button\n\t\t\t\tclassName={cn(\n\t\t\t\t\t{\n\t\t\t\t\t\t'text-black-200 hover:text-secondary-200': !isRefined,\n\t\t\t\t\t\t'text-primary': isRefined,\n\t\t\t\t\t},\n\t\t\t\t\t'bodySm w-full text-left capitalize'\n\t\t\t\t)}\n\t\t\t\tonClick={() => onRefine(id)}\n\t\t\t>\n\t\t\t\t{displayName}{' '}\n\t\t\t\t<span className=\"text-black-100\">\n\t\t\t\t\t{'('}\n\t\t\t\t\t{count}\n\t\t\t\t\t{')'}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction AuthorsOrPublishers({\n\tattribute,\n\tnameAttribute,\n\tsetShowMore,\n\tshowMore,\n}: {\n\tattribute: 'authorIds' | 'publisherIds';\n\tnameAttribute: 'authorFacets' | 'publisherFacets';\n\tshowMore: string | undefined;\n\tsetShowMore: (showMore: string | undefined) => void;\n}) {\n\tconst resources = useSearchResources();\n\tconst { indexName } = useAlgoliaSearch();\n\n\tconst { isShowingMore, items, canToggleShowMore, toggleShowMore } = useRefinementList({\n\t\tattribute: nameAttribute,\n\t\tlimit: 7,\n\t\tshowMore: true,\n\t});\n\tconst { items: idItems, refine } = useRefinementList({\n\t\tattribute,\n\t});\n\n\tuseEffect(() => {\n\t\tif ((showMore === attribute) !== isShowingMore) {\n\t\t\ttoggleShowMore();\n\t\t}\n\t}, [attribute, isShowingMore, showMore, toggleShowMore]);\n\n\tconst FacetItem = attribute === 'authorIds' ? AuthorFacetItem : PublisherFacetItem;\n\n\tconst facetItems = items.map(item => {\n\t\tconst { id, displayName } = parseFacetValue(item.value);\n\t\treturn {\n\t\t\tid,\n\t\t\tdisplayName,\n\t\t\tcount: item.count,\n\t\t\tisRefined: idItems.some(idItem => idItem.value === id && idItem.isRefined),\n\t\t};\n\t});\n\n\tfacetItems.sort((a, b) => {\n\t\tif (a.isRefined && !b.isRefined) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (!a.isRefined && b.isRefined) {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn b.count - a.count;\n\t});\n\n\treturn (\n\t\t<AccordionItem value={attribute}>\n\t\t\t<AccordionTrigger className=\"border-t border-primary-100 p-4 lg:border-t-0 [&>svg]:text-primary\">\n\t\t\t\t<Typography className=\"text-primary-400\" variant=\"bodyRegular\" tag=\"div\">\n\t\t\t\t\t{resources[attribute] ?? attribute}\n\t\t\t\t</Typography>\n\t\t\t</AccordionTrigger>\n\t\t\t<AccordionContent className=\"m-0 bg-grey-200 p-4\">\n\t\t\t\t<div className=\"flex flex-col gap-y-4\">\n\t\t\t\t\t{facetItems.map(i => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<FacetItem\n\t\t\t\t\t\t\t\tkey={i.id}\n\t\t\t\t\t\t\t\t{...i}\n\t\t\t\t\t\t\t\tonRefine={id => {\n\t\t\t\t\t\t\t\t\trefine(id);\n\t\t\t\t\t\t\t\t\tinsightsClient('clickedFilters', {\n\t\t\t\t\t\t\t\t\t\tindex: indexName,\n\t\t\t\t\t\t\t\t\t\teventName: 'Clicked filter',\n\t\t\t\t\t\t\t\t\t\tfilters: [`${attribute}:${id}`],\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\t{canToggleShowMore && <ShowMoreToggle attribute={attribute} setShowMore={setShowMore} showMore={showMore} />}\n\t\t\t\t</div>\n\t\t\t</AccordionContent>\n\t\t</AccordionItem>\n\t);\n}\n\nfunction Statuses({\n\tsetExpandedFacets,\n}: {\n\tsetExpandedFacets: (setState: (expandedFacets: string[]) => string[]) => void;\n}) {\n\tconst resources = useSearchResources();\n\tconst { indexName } = useAlgoliaSearch();\n\tconst level1 = useRefinementList({ attribute: 'categories.lvl1', limit: 100 }, { skipSuspense: true });\n\tconst level2 = useRefinementList({ attribute: 'categories.lvl2', limit: 1000 }, { skipSuspense: true });\n\tconst level3 = useRefinementList({ attribute: 'categories.lvl3', limit: 1000 }, { skipSuspense: true });\n\tconst level4 = useRefinementList({ attribute: 'categories.lvl4', limit: 1000 }, { skipSuspense: true });\n\n\tconst sections: {\n\t\tvalue: string;\n\t\trefinement: RefinementListRenderState;\n\t\titems: RefinementListItem[];\n\t}[] = [\n\t\t{\n\t\t\tvalue: 'status',\n\t\t\trefinement: level1,\n\t\t\titems: level1.items.filter(i => i.value.startsWith('status')),\n\t\t},\n\t\t...level1.items\n\t\t\t.filter(i => i.isRefined && i.value.startsWith('status'))\n\t\t\t.map(status => ({\n\t\t\t\tvalue: status.value,\n\t\t\t\trefinement: level2,\n\t\t\t\titems: level2.items.filter(i => i.value.startsWith(status.value)),\n\t\t\t})),\n\t\t...level2.items\n\t\t\t.filter(i => i.isRefined && i.value.startsWith('status'))\n\t\t\t.map(status => ({\n\t\t\t\tvalue: status.value,\n\t\t\t\trefinement: level3,\n\t\t\t\titems: level3.items.filter(i => i.value.startsWith(status.value)),\n\t\t\t})),\n\t\t...level3.items\n\t\t\t.filter(i => i.isRefined && i.value.startsWith('status'))\n\t\t\t.map(status => ({\n\t\t\t\tvalue: status.value,\n\t\t\t\trefinement: level4,\n\t\t\t\titems: level4.items.filter(i => i.value.startsWith(status.value)),\n\t\t\t})),\n\t];\n\n\treturn (\n\t\t<>\n\t\t\t{sections.map(({ value, refinement, items }) =>\n\t\t\t\titems.length ? (\n\t\t\t\t\t<AccordionItem key={value} value={value}>\n\t\t\t\t\t\t<AccordionTrigger className=\"border-t border-primary-100 p-4 lg:border-t-0 [&>svg]:text-primary\">\n\t\t\t\t\t\t\t<Typography className=\"text-primary-400\" variant=\"bodyRegular\" tag=\"div\">\n\t\t\t\t\t\t\t\t{resources[c_statusLabelKeys[value] ?? value] ?? value}\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t<AccordionContent className=\"m-0 bg-grey-200 p-4\">\n\t\t\t\t\t\t\t<div className=\"flex flex-col gap-y-4\">\n\t\t\t\t\t\t\t\t{items.map(item => (\n\t\t\t\t\t\t\t\t\t<div key={item.value}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t'text-black-200 hover:text-secondary-200': !item.isRefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t'text-primary': item.isRefined,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t'bodySm w-full text-left capitalize'\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\trefinement.refine(item.value);\n\n\t\t\t\t\t\t\t\t\t\t\t\tinsightsClient('clickedFilters', {\n\t\t\t\t\t\t\t\t\t\t\t\t\tindex: indexName,\n\t\t\t\t\t\t\t\t\t\t\t\t\teventName: 'Clicked filter',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilters: [`categories:${item.value}`],\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (!item.isRefined) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetExpandedFacets(old => [...old, item.value]);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{resources[c_statusLabelKeys[item.value] ?? item.value] ?? item.value}{' '}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-black-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t{'('}\n\t\t\t\t\t\t\t\t\t\t\t\t{item.count}\n\t\t\t\t\t\t\t\t\t\t\t\t{')'}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t</AccordionItem>\n\t\t\t\t) : null\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nexport function UserSearchFilterAccordionItem({ filter }: { filter: UserSearchFilter }) {\n\tconst { selectedFilterOptions, setSelectedFilterOption } = useUserSearchFilterContext();\n\tconst selectedFilterOption = selectedFilterOptions[filter.token];\n\tconst title = filter.title;\n\tconst options = (Array.isArray(filter.options) ? filter.options : []).filter(\n\t\t(option: { displayName: string }) => option && option.displayName !== ''\n\t);\n\n\tif (!title || options.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<AccordionItem value={`user-filter-${title}`}>\n\t\t\t<AccordionTrigger className=\"border-t border-primary-100 p-4 lg:border-t-0 [&>svg]:text-primary\">\n\t\t\t\t<Typography className=\"text-primary-400\" variant=\"bodyRegular\" tag=\"div\">\n\t\t\t\t\t{title}\n\t\t\t\t</Typography>\n\t\t\t</AccordionTrigger>\n\t\t\t<AccordionContent className=\"m-0 bg-grey-200 p-4\">\n\t\t\t\t<div className=\"flex flex-col gap-y-4\">\n\t\t\t\t\t{options.map((option: UserSearchFilterOption) => {\n\t\t\t\t\t\tconst label = option.displayName;\n\t\t\t\t\t\tconst isSelected = selectedFilterOption === option.token;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center text-black-200\"\n\t\t\t\t\t\t\t\tkey={label}\n\t\t\t\t\t\t\t\ttag=\"label\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\tclassName=\"mr-3 h-[13px] w-[13px] border-grey-100 text-primary\"\n\t\t\t\t\t\t\t\t\tonChange={() => setSelectedFilterOption(filter.token, option.token)}\n\t\t\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t\t\tvalue={option.token}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className={cn(isSelected ? 'text-primary' : 'text-black-200 hover:text-secondary-200')}>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</AccordionContent>\n\t\t</AccordionItem>\n\t);\n}\n\nexport function Categories() {\n\tconst [expandedFacets, setExpandedFacets] = useState<string[]>([]);\n\tconst [showMore, setShowMore] = useState<string>();\n\tconst { userSearchFilters } = useUserSearchFilterContext();\n\n\treturn (\n\t\t<Accordion onValueChange={setExpandedFacets} type=\"multiple\" value={expandedFacets}>\n\t\t\t{userSearchFilters?.map((filter, index) => {\n\t\t\t\tconst key = `${filter.title}-${index}`;\n\n\t\t\t\treturn <UserSearchFilterAccordionItem filter={filter} key={key} />;\n\t\t\t})}\n\t\t\t<Category\n\t\t\t\tcategory=\"topic\"\n\t\t\t\tmaxLevel={3}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"resourceType\"\n\t\t\t\tmaxLevel={1}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<AuthorsOrPublishers\n\t\t\t\tattribute=\"authorIds\"\n\t\t\t\tnameAttribute=\"authorFacets\"\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Statuses setExpandedFacets={setExpandedFacets} />\n\t\t\t<Category\n\t\t\t\tcategory=\"specials\"\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"language\"\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"seriesSets\"\n\t\t\t\tmaxLevel={1}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<AuthorsOrPublishers\n\t\t\t\tattribute=\"publisherIds\"\n\t\t\t\tnameAttribute=\"publisherFacets\"\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"bibleAndApocrypha\"\n\t\t\t\tmaxLevel={3}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"containment\"\n\t\t\t\tmaxLevel={1}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category category=\"format\" setExpandedFacets={setExpandedFacets} setShowMore={setShowMore} showMore={showMore} />\n\t\t\t<Category\n\t\t\t\tcategory=\"genre\"\n\t\t\t\tmaxLevel={2}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"licensingMethod\"\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t\t<Category\n\t\t\t\tcategory=\"religiousGroup\"\n\t\t\t\tmaxLevel={0}\n\t\t\t\tsetExpandedFacets={setExpandedFacets}\n\t\t\t\tsetShowMore={setShowMore}\n\t\t\t\tshowMore={showMore}\n\t\t\t/>\n\t\t</Accordion>\n\t);\n}\n","import React, { useEffect, useRef } from 'react';\nimport {\n\tCurrentRefinementsConnectorParamsItem,\n\tCurrentRefinementsConnectorParamsRefinement,\n} from 'instantsearch.js/es/connectors/current-refinements/connectCurrentRefinements';\nimport { X } from 'lucide-react';\nimport { useCurrentRefinements, useRefinementList, useSearchBox } from 'react-instantsearch';\n\nimport { useLocation } from '../../location';\nimport { useAuthor } from '../../hooks/use-author';\nimport { usePublisher } from '../../hooks/use-publisher';\nimport { parseFacetValue } from './util';\n\n// ---------------------------------------------------------------------------\n// CurrentRefinements — chips for active facet refinements\n// ---------------------------------------------------------------------------\n\nfunction RefinementLabel({ attribute, value }: { attribute: string; value: string }) {\n\tconst stringValue = typeof value === 'string' ? value : String(value ?? '');\n\n\tif (attribute === 'authorIds') {\n\t\treturn <AuthorLabel value={stringValue} />;\n\t}\n\n\tif (attribute === 'publisherIds') {\n\t\treturn <PublisherLabel value={stringValue} />;\n\t}\n\n\treturn <span>{stringValue.replace(/^((.*) > )*/, '')}</span>;\n}\n\nfunction AuthorLabel({ value }: { value: string }) {\n\tconst { items } = useRefinementList({ attribute: 'authorFacets' });\n\n\tif (!items.length) {\n\t\treturn <span>{'…'}</span>;\n\t}\n\n\tconst item = items.find(i => i.value.startsWith(`${value}:`));\n\n\tif (item) {\n\t\tconst { displayName } = parseFacetValue(item.label);\n\t\treturn <span>{displayName}</span>;\n\t}\n\n\treturn <AuthorApiLabel value={value} />;\n}\n\nfunction AuthorApiLabel({ value }: { value: string }) {\n\tconst { data, isLoading } = useAuthor(value);\n\n\tif (isLoading) {\n\t\treturn <span>{'…'}</span>;\n\t}\n\n\tif (!data) {\n\t\treturn null;\n\t}\n\n\treturn <span>{data.displayName}</span>;\n}\n\nfunction PublisherLabel({ value }: { value: string }) {\n\tconst { items } = useRefinementList({ attribute: 'publisherFacets' });\n\n\tif (!items.length) {\n\t\treturn <span>{'…'}</span>;\n\t}\n\n\tconst item = items.find(i => i.value.startsWith(`${value}:`));\n\n\tif (item) {\n\t\tconst { displayName } = parseFacetValue(item.label);\n\t\treturn <span>{displayName}</span>;\n\t}\n\n\treturn <PublisherApiLabel value={value} />;\n}\n\nfunction PublisherApiLabel({ value }: { value: string }) {\n\tconst { data, isLoading } = usePublisher(value);\n\n\tif (isLoading) {\n\t\treturn <span>{'…'}</span>;\n\t}\n\n\tif (!data) {\n\t\treturn null;\n\t}\n\n\treturn <span>{data.displayName}</span>;\n}\n\nexport function CurrentRefinements() {\n\tconst currentRefinements = useCurrentRefinements();\n\tconst itemsByAttribute: Record<string, CurrentRefinementsConnectorParamsItem> = {};\n\tconst refinementList: CurrentRefinementsConnectorParamsRefinement[] = [];\n\n\tfor (const item of currentRefinements?.items ?? []) {\n\t\titemsByAttribute[item.attribute] = item;\n\n\t\tfor (const refinement of item.refinements ?? []) {\n\t\t\trefinementList.push(refinement);\n\t\t}\n\t}\n\n\treturn refinementList.map(item => {\n\t\tconst itemValue = item.value;\n\t\tconst itemAndChildren =\n\t\t\ttypeof itemValue === 'string'\n\t\t\t\t? refinementList.filter(r => typeof r.value === 'string' && r.value.startsWith(itemValue))\n\t\t\t\t: [item];\n\n\t\treturn (\n\t\t\t<RefinementChip\n\t\t\t\tattribute={item.attribute}\n\t\t\t\titemAndChildren={itemAndChildren}\n\t\t\t\titemsByAttribute={itemsByAttribute}\n\t\t\t\tkey={`${item.attribute}:${String(itemValue)}`}\n\t\t\t\tlabel={item.label}\n\t\t\t\tvalue={String(itemValue)}\n\t\t\t/>\n\t\t);\n\t});\n}\n\nfunction RefinementChip({\n\tattribute,\n\tvalue,\n\tlabel,\n\titemAndChildren,\n\titemsByAttribute,\n}: {\n\tattribute: string;\n\tvalue: string;\n\tlabel: string;\n\titemAndChildren: CurrentRefinementsConnectorParamsRefinement[];\n\titemsByAttribute: Record<string, CurrentRefinementsConnectorParamsItem>;\n}) {\n\treturn (\n\t\t<button\n\t\t\taria-label={`Remove ${label} from filters`}\n\t\t\tclassName=\"flex items-center gap-x-1 bg-grey-200 py-[6px] pl-3 pr-2 text-xs capitalize text-black-100\"\n\t\t\tonClick={() => itemAndChildren.forEach(i => itemsByAttribute[attribute]?.refine(i))}\n\t\t>\n\t\t\t<RefinementLabel attribute={attribute} value={value} />\n\t\t\t<X aria-hidden=\"true\" height={14} width={14} />\n\t\t</button>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// CurrentQueryRefinement — chip for the active search query\n// ---------------------------------------------------------------------------\n\nexport default function CurrentQueryRefinement() {\n\tconst { searchParams } = useLocation();\n\tconst urlQuery = searchParams.get('query')?.trim() ?? '';\n\n\tconst { query, refine, clear } = useSearchBox();\n\tconst queryRef = useRef(query);\n\tqueryRef.current = query;\n\n\tuseEffect(() => {\n\t\tif (urlQuery && queryRef.current !== urlQuery) {\n\t\t\trefine(urlQuery);\n\t\t}\n\t}, [urlQuery, refine]);\n\n\tconst removeQuery = () => {\n\t\tclear();\n\t};\n\n\treturn query ? (\n\t\t<button\n\t\t\taria-label=\"remove search term from filters\"\n\t\t\tclassName=\"flex items-center gap-x-1 bg-grey-200 py-[6px] pl-3 pr-2 text-xs capitalize text-black-100\"\n\t\t\tonClick={removeQuery}\n\t\t>\n\t\t\t<span>\n\t\t\t\t{'\"'}\n\t\t\t\t{query}\n\t\t\t\t{'\"'}\n\t\t\t</span>\n\t\t\t<X aria-hidden=\"true\" height={14} width={14} />\n\t\t</button>\n\t) : null;\n}\n","import React from 'react';\nimport { useRefinementList } from 'react-instantsearch';\n\nimport type { FacetConfiguration } from './routing';\n\n// Keeps a real refinementList widget mounted for each hidden facet attribute (and, for hierarchical facets,\n// each of its levels) so Algolia treats it as refinable, without rendering any UI. Filtering itself is driven\n// entirely by the URL via routing.ts.\n// skipSuspense avoids blocking rendering on data that is never displayed.\nfunction HiddenRefinementList({ attribute }: { attribute: string }) {\n\tuseRefinementList({ attribute }, { skipSuspense: true });\n\n\treturn null;\n}\n\nfunction getHiddenAlgoliaAttributes(config: FacetConfiguration): string[] {\n\tif (config.type === 'simple') {\n\t\treturn [config.algoliaAttribute];\n\t}\n\n\tconst attributes: string[] = [];\n\n\tfor (let level = config.minLevel; level <= config.maxLevel; level += 1) {\n\t\tattributes.push(`${config.algoliaAttributeBase}.lvl${level}`);\n\t}\n\n\treturn attributes;\n}\n\nexport default function HiddenFacetRefinements({ facetConfigurations }: { facetConfigurations: FacetConfiguration[] }) {\n\tconst attributes = facetConfigurations.filter(config => config.isHidden).flatMap(getHiddenAlgoliaAttributes);\n\n\treturn (\n\t\t<>\n\t\t\t{attributes.map(attribute => (\n\t\t\t\t<HiddenRefinementList attribute={attribute} key={attribute} />\n\t\t\t))}\n\t\t</>\n\t);\n}\n","import React, { ReactNode } from 'react';\nimport { cn } from '../../util/cn';\n\nfunction SkeletonRoot({\n\tclassName,\n\tchildren,\n\tpending = false,\n\thideOverflow = false,\n}: {\n\tclassName?: string;\n\tchildren?: React.ReactNode;\n\tpending?: boolean;\n\thideOverflow?: boolean;\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn('@container', hideOverflow && 'overflow-hidden', className)}\n\t\t\tdata-pending={pending ? '' : undefined}\n\t\t\trole={pending ? 'status' : undefined}\n\t\t>\n\t\t\t{children}\n\t\t\t{pending && <span className=\"sr-only\">{'Loading...'}</span>}\n\t\t</div>\n\t);\n}\n\nfunction SkeletonBox({ className }: { className?: string }) {\n\treturn <div className={cn('rounded-lg bg-gray-300', className)} />;\n}\n\nfunction SkeletonText({ characterCount = 10, className }: { characterCount?: number | 'full'; className?: string }) {\n\treturn (\n\t\t<div className={cn('flex h-[1lh] items-center', className)}>\n\t\t\t<div\n\t\t\t\tclassName={cn(`h-[1ex] max-w-full rounded-[inherit] bg-gray-300`)}\n\t\t\t\tstyle={{ width: characterCount === 'full' ? '100%' : `${characterCount}ch` }}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction SkeletonIcon({ className, icon }: { className?: string; icon: ReactNode }) {\n\treturn <div className={cn('text-gray-300 opacity-25', className)}>{icon}</div>;\n}\n\nexport { SkeletonIcon as Icon, SkeletonRoot as Root, SkeletonBox as Box, SkeletonText as Text };\n","import React from 'react';\n\nimport { CommandSentence } from '@faithlife/command-sentence-control';\nimport { useLocalization } from '../../../localization';\nimport { useBrandName } from '../../../util/brand-name-context';\n\nexport default function EnhancedForLogosLabel() {\n\tconst resources = useLocalization('CommerceWeb.Resources.Search.DisplayTemplates.ProductSearchResultViewModel');\n\tconst logosOrVerbum = useBrandName();\n\tconst isVerbum = logosOrVerbum?.toLowerCase() === 'verbum';\n\treturn (\n\t\t<CommandSentence className=\"text-xs text-primary\" template={resources.EnhancedForLogos}>\n\t\t\t<CommandSentence.Field name=\"ICON\">\n\t\t\t\t<img\n\t\t\t\t\tclassName={\n\t\t\t\t\t\tisVerbum\n\t\t\t\t\t\t\t? 'inline-block w-[17px] h-[12px] [vertical-align:-1.5px]'\n\t\t\t\t\t\t\t: 'inline-block w-[14px] h-[14px] [vertical-align:-2px] mx-px'\n\t\t\t\t\t}\n\t\t\t\t\talt={logosOrVerbum}\n\t\t\t\t\tsrc={\n\t\t\t\t\t\tisVerbum\n\t\t\t\t\t\t\t? 'https://files.logoscdn.com/v1/files/70496318/assets/14995970/content.svg?signature=SsnOeyt3lPzdfqreDLuA7km2gRs'\n\t\t\t\t\t\t\t: 'https://files.logoscdn.com/v1/files/71036773/assets/14991834/content.svg?signature=NlgSyNjXKmP7caOrWgZiZv5hSEE'\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</CommandSentence.Field>\n\t\t</CommandSentence>\n\t);\n}\n","import React from 'react';\nimport { CommandSentence } from '@faithlife/command-sentence-control';\n\nimport EnhancedForLogosLabel from '../enhanced-for-logos-label';\nimport Tooltip from '../tooltip';\nimport { InfoIconSvgUrl } from '../svgs';\n\nimport { useLocalization } from '../../../localization';\nimport { useBrandName } from '../../../util/brand-name-context';\n\nexport interface EnhancedForLogosWithTooltipProps {\n\tclassName?: string;\n}\n\nconst EnhancedForLogosWithTooltip = ({ className }: EnhancedForLogosWithTooltipProps) => {\n\tconst resources = useLocalization('CommerceWeb.Resources.Search.DisplayTemplates.ProductSearchResultViewModel');\n\n\tconst logosOrVerbum = useBrandName();\n\n\treturn (\n\t\t<Tooltip placement=\"bottom\" className={className} link={<EnhancedForLogosLabel />}>\n\t\t\t<div className={'w-[250px] text-start flex items-start gap-sp8'}>\n\t\t\t\t<div>\n\t\t\t\t\t<img className=\"max-w-none w-[20px] h-[20px]\" src={InfoIconSvgUrl} alt=\"\" />\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<CommandSentence className=\"text-xs\" template={resources.EnhancedForLogosTooltipContent}>\n\t\t\t\t\t\t<CommandSentence.Field name=\"LOGOSORVERBUM\">{logosOrVerbum}</CommandSentence.Field>\n\t\t\t\t\t</CommandSentence>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Tooltip>\n\t);\n};\n\nexport default EnhancedForLogosWithTooltip;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport insightsClient from 'search-insights';\n\nimport { useCurrentUser, usePricing } from '../../per-user-data/per-user-data-context';\nimport type { ProductPrices } from '../../per-user-data/per-user-data-context';\nimport { detectIsAmberOptimizedUrl } from '../../shared/enhanced-image-tag/image';\nimport { getSavingsPercent, slugify } from '../util';\nimport { ProductHitResult } from '../types';\nimport { useSearchResources } from '../search-resources';\nimport { useAlgoliaSearch } from '../algolia-search-context';\n\nconst usdFormat = new Intl.NumberFormat('en-US', {\n\tstyle: 'currency',\n\tcurrency: 'USD',\n\tminimumFractionDigits: 2,\n\tmaximumFractionDigits: 2,\n});\n\nconst placeholderImage = 'https://files.logoscdn.com/v1/assets/15953102/optimized';\n\ninterface UseProductCardProps {\n\thit: ProductHitResult;\n\tqueryId?: string | null;\n\tposition?: number;\n}\n\nexport function useProductCard({ hit, queryId = null, position }: UseProductCardProps) {\n\tconst { data: pricingData } = usePricing(hit.productId);\n\tconst { preferredCurrency } = useCurrentUser();\n\tconst { indexName, anonymousUserToken } = useAlgoliaSearch();\n\tconst hasGeoRestriction = pricingData?.isGeographicallyRestricted;\n\tconst [isAddingToCart, setIsAddingToCart] = useState(false);\n\tconst resources = useSearchResources();\n\tconst productId = hit?.productId;\n\tconst requestIdRef = useRef<string | null>(null);\n\n\t// Use API pricing when available, fall back to Algolia pricing\n\tconst prices: ProductPrices = pricingData?.primarySku?.prices ?? {\n\t\tsalePrice: {\n\t\t\tamount: hit.salePrice ?? 0,\n\t\t\tdisplayAmount: usdFormat.format(hit.salePrice ?? 0),\n\t\t\tdisplayAmountCurrencyCode: null,\n\t\t\tlocalizedDisplayAmount: null,\n\t\t\tcurrencyCode: 'USD',\n\t\t\tdisplayAmountByCurrency: null,\n\t\t},\n\t\tanchorPrice:\n\t\t\thit.salePrice !== hit.anchorPrice\n\t\t\t\t? {\n\t\t\t\t\t\tamount: hit.anchorPrice ?? 0,\n\t\t\t\t\t\tdisplayAmount: usdFormat.format(hit.anchorPrice ?? 0),\n\t\t\t\t\t\tdisplayAmountCurrencyCode: 'USD',\n\t\t\t\t\t\tlocalizedDisplayAmount: null,\n\t\t\t\t\t\tcurrencyCode: 'USD',\n\t\t\t\t\t\tdisplayAmountByCurrency: null,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\tdiscountSavings: null,\n\t};\n\n\tconst accessKind = pricingData?.accessKind;\n\tconst isOwned = accessKind === 'Permanent' || accessKind === 'Temporary';\n\tconst hasPreorder = pricingData?.hasPreorder;\n\tconst isPrepubProduct = pricingData?.isPrepubProduct;\n\tconst prepubProductStatusSummary = pricingData?.prepubProductStatusSummary;\n\tconst skuId = pricingData?.primarySku?.skuId;\n\tconst isPurchasable = pricingData?.primarySku?.isPurchasable ?? undefined;\n\n\tuseEffect(() => {\n\t\tconst handleCartUpdated = (e: CustomEvent) => {\n\t\t\tif (e.detail.requestId === requestIdRef.current) {\n\t\t\t\tsetIsAddingToCart(false);\n\t\t\t}\n\t\t};\n\n\t\tconst handleCartUpdateError = (e: CustomEvent) => {\n\t\t\tif (e.detail.requestId === requestIdRef.current) {\n\t\t\t\tsetIsAddingToCart(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('faithlife.sites.cart.updated', handleCartUpdated as EventListener);\n\t\tdocument.addEventListener('faithlife.sites.cart.updateError', handleCartUpdateError as EventListener);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('faithlife.sites.cart.updated', handleCartUpdated as EventListener);\n\t\t\tdocument.removeEventListener('faithlife.sites.cart.updateError', handleCartUpdateError as EventListener);\n\t\t};\n\t}, []);\n\n\tconst slug = slugify(hit.title);\n\tconst productPath = slug ? `/product/${productId}/${slug}` : `/product/${productId}`;\n\tconst productUrl = queryId ? `${productPath}?queryId=${encodeURIComponent(queryId)}` : productPath;\n\tconst productName = hit.title ?? '';\n\tconst regularPrice = prices?.anchorPrice?.displayAmount;\n\tconst salePrice = prices?.salePrice?.displayAmount;\n\tconst salePriceCurrency = preferredCurrency !== 'USD' ? 'USD' : undefined;\n\tconst localizedSalePrice = prices?.salePrice?.localizedDisplayAmount ?? undefined;\n\tconst discountPercentage = getSavingsPercent(prices);\n\tconst isDiscounted = !!pricingData?.primarySku?.prices?.discountSavings;\n\tconst productImageSrc = hit.primaryImageUri;\n\tconst imageSrc = detectIsAmberOptimizedUrl(productImageSrc ?? '') ? productImageSrc : placeholderImage;\n\tconst isLogosEdition = hit.isLogosEdition ?? false;\n\n\tconst handleProductClick = useCallback(() => {\n\t\tif (!productId) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (queryId && position) {\n\t\t\tinsightsClient('clickedObjectIDsAfterSearch', {\n\t\t\t\tindex: indexName,\n\t\t\t\teventName: `Clicked result on ${window.location.pathname}`.substring(0, 64),\n\t\t\t\tqueryID: queryId,\n\t\t\t\tobjectIDs: [productId],\n\t\t\t\tpositions: [position],\n\t\t\t});\n\t\t} else {\n\t\t\tinsightsClient('clickedObjectIDs', {\n\t\t\t\tindex: indexName,\n\t\t\t\teventName: `Clicked result on ${window.location.pathname}`.substring(0, 64),\n\t\t\t\tobjectIDs: [productId],\n\t\t\t});\n\t\t}\n\t}, [productId, queryId, position, indexName]);\n\n\tconst handleAddToCart = (e: React.MouseEvent<HTMLButtonElement>) => {\n\t\tif (!skuId || isAddingToCart) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Track add-to-cart with Algolia insights\n\t\tif (productId) {\n\t\t\tconst eventType = queryId ? 'addedToCartObjectIDsAfterSearch' : 'addedToCartObjectIDs';\n\t\t\tconst eventData: Record<string, any> = {\n\t\t\t\tindex: indexName,\n\t\t\t\teventName: `Added product to cart on ${window.location.pathname}`.substring(0, 64),\n\t\t\t\tobjectIDs: [productId],\n\t\t\t};\n\t\t\tif (queryId) {\n\t\t\t\teventData.queryID = queryId;\n\t\t\t}\n\t\t\tinsightsClient(eventType as any, eventData);\n\t\t}\n\n\t\tconst requestId = (requestIdRef.current = `${Date.now()}-${Math.random()}`);\n\n\t\tconst eventDetail: Record<string, any> = {\n\t\t\taddToCartUrl: pricingData?.primarySku?.routes?.AddToCartUrl,\n\t\t\tskuIds: [skuId],\n\t\t\tquantity: 1,\n\t\t\tpayInFull: true,\n\t\t\trequestId,\n\t\t};\n\n\t\t// Include the query ID for Algolia purchase attribution\n\t\tif (queryId) {\n\t\t\teventDetail.searchData = {\n\t\t\t\tqueryId,\n\t\t\t\t...(productId ? { productIds: [productId] } : {}),\n\t\t\t\tanonymousUserToken,\n\t\t\t};\n\t\t}\n\n\t\te.currentTarget.dispatchEvent(\n\t\t\tnew CustomEvent('faithlife.sites.addToCartButton.click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tdetail: eventDetail,\n\t\t\t})\n\t\t);\n\n\t\tsetIsAddingToCart(true);\n\t};\n\n\treturn {\n\t\tresources,\n\t\tproductUrl,\n\t\tproductName,\n\t\timageSrc,\n\t\tisLogosEdition,\n\t\tregularPrice,\n\t\tsalePrice,\n\t\tsalePriceCurrency,\n\t\tlocalizedSalePrice,\n\t\tdiscountPercentage,\n\t\tisDiscounted,\n\t\taccessKind,\n\t\tisOwned,\n\t\thasGeoRestriction,\n\t\tisPurchasable,\n\t\thasPreorder,\n\t\tisPrepubProduct,\n\t\tprepubProductStatusSummary,\n\t\tskuId,\n\t\tisAddingToCart,\n\t\thandleProductClick,\n\t\thandleAddToCart,\n\t\thit,\n\t};\n}\n\nexport type ProductCardData = ReturnType<typeof useProductCard>;\n","import React from 'react';\n\nimport { Image } from '../../shared/enhanced-image-tag/image';\n\ninterface ProductImageProps {\n\tproductName: string;\n\timageSrc: string;\n\tproductUrl: string;\n\tpriority?: boolean;\n\thandleProductClick: () => void;\n}\n\nexport function ProductImage({ productName, imageSrc, productUrl, priority, handleProductClick }: ProductImageProps) {\n\treturn (\n\t\t<a\n\t\t\tclassName=\"flex aspect-[100/122] w-auto justify-center lg:aspect-[129/158]\"\n\t\t\thref={productUrl}\n\t\t\tonClick={handleProductClick}\n\t\t\tonAuxClick={handleProductClick}\n\t\t>\n\t\t\t<Image\n\t\t\t\talt={productName}\n\t\t\t\tbelowTheFold={!priority}\n\t\t\t\tclassName=\"w-[100px] h-[122px] object-contain lg:h-[158px] lg:w-[129px]\"\n\t\t\t\tsizes={{ mobile: '100vw', tablet: '50vw', desktop: 129 }}\n\t\t\t\tsrc={imageSrc}\n\t\t\t\ttargetAspectRatio={[129, 158]}\n\t\t\t/>\n\t\t</a>\n\t);\n}\n","import React from 'react';\nimport { Typography } from '@faithlife/commerce-components';\n\nimport { useSearchResources } from '../search-resources';\n\ninterface DiscountBadgeProps {\n\tdiscountPercentage: number;\n\tisDiscounted: boolean;\n\tclassName?: string;\n}\n\nexport function DiscountBadge({ discountPercentage, isDiscounted, className }: DiscountBadgeProps) {\n\tconst resources = useSearchResources();\n\n\tif (discountPercentage <= 1) {\n\t\treturn null;\n\t}\n\n\tconst badgeClassName = isDiscounted ? 'bg-red-300 text-white' : 'bg-primary-200 text-primary-400';\n\n\treturn (\n\t\t<Typography className={`rounded-full px-2 py-[2px] ${badgeClassName} ${className ?? ''}`} variant=\"finePrint\">\n\t\t\t{resources['discountFormat']?.replace('%DISCOUNT_PERCENTAGE%', discountPercentage.toFixed())}\n\t\t</Typography>\n\t);\n}\n","import React from 'react';\nimport { Typography } from '@faithlife/commerce-components';\n\nimport { cn } from '../../../util/cn';\n\ninterface ProductTitleProps {\n\tproductName: string;\n\tproductUrl: string;\n\thandleProductClick: () => void;\n\tclassName?: string;\n}\n\nexport function ProductTitle({ productName, productUrl, handleProductClick, className }: ProductTitleProps) {\n\treturn (\n\t\t<a href={productUrl} onAuxClick={handleProductClick} onClick={handleProductClick} title={productName}>\n\t\t\t<Typography\n\t\t\t\tclassName={cn('line-clamp-2 hover:underline focus-visible:underline', className)}\n\t\t\t\ttag=\"h3\"\n\t\t\t\tvariant=\"bodySmall\"\n\t\t\t>\n\t\t\t\t{productName}\n\t\t\t</Typography>\n\t\t</a>\n\t);\n}\n","import React from 'react';\nimport { Typography } from '@faithlife/commerce-components';\n\ninterface ProductAuthorsProps {\n\tauthors?: string[];\n}\n\nexport function ProductAuthors({ authors }: ProductAuthorsProps) {\n\treturn (\n\t\t<Typography className=\"bodyMd line-clamp-1 text-black\" variant=\"finePrint\">\n\t\t\t{authors?.join(', ')}\n\t\t</Typography>\n\t);\n}\n","import React from 'react';\nimport { Button, PriceLabel, Typography } from '@faithlife/commerce-components';\nimport type { buttonScaleOptions } from '@faithlife/commerce-components';\n\nimport { cn } from '../../../util/cn';\nimport * as Skeleton from '../../skeleton';\nimport { useSearchResources } from '../search-resources';\nimport { ProductCardData } from './use-product-card';\n\ntype ButtonScale = (typeof buttonScaleOptions)[number];\n\nconst ctaButtonScale: ButtonScale = 'medium';\nconst skeletonHeightByButtonScale = {\n\tsmall: 'h-8',\n\tmedium: 'h-12',\n\tlarge: 'h-[60px]',\n} satisfies Record<ButtonScale, string>;\n\ninterface ProductPricingProps {\n\tcardData: ProductCardData;\n\tbuttonLayoutClassName: string;\n}\n\nfunction getOwnershipLabel(\n\tresources: ReturnType<typeof useSearchResources>,\n\thasGeoRestriction: boolean | undefined,\n\taccessKind: string | undefined,\n\thasPreorder: boolean | undefined\n): string | null {\n\tif (hasGeoRestriction) {\n\t\treturn resources['geoRestrictionMessage'];\n\t}\n\tif (accessKind === 'Permanent') {\n\t\treturn resources['permanentOwnMessage'];\n\t}\n\tif (accessKind === 'Temporary') {\n\t\treturn resources['temporaryOwnMessage'];\n\t}\n\tif (hasPreorder) {\n\t\treturn resources['hasPreorderMessage'];\n\t}\n\treturn null;\n}\n\nexport function ProductPricing({ cardData, buttonLayoutClassName }: ProductPricingProps) {\n\treturn (\n\t\t<>\n\t\t\t<ProductPrice cardData={cardData} className=\"items-end\" />\n\t\t\t<ProductCta\n\t\t\t\tbuttonLayoutClassName={buttonLayoutClassName}\n\t\t\t\tcardData={cardData}\n\t\t\t\townershipLabelClassName=\"text-right\"\n\t\t\t/>\n\t\t</>\n\t);\n}\n\ninterface ProductPriceProps {\n\tcardData: ProductCardData;\n\tclassName?: string;\n}\n\nexport function ProductPrice({ cardData, className }: ProductPriceProps) {\n\tconst { salePrice, salePriceCurrency, regularPrice, localizedSalePrice, isDiscounted, accessKind } = cardData;\n\n\tif (accessKind === 'Permanent' || accessKind === 'Temporary') {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<PriceLabel\n\t\t\tvariant={isDiscounted ? 'sale' : 'value'}\n\t\t\tlayout=\"vertical\"\n\t\t\tsalePrice={salePrice ?? ''}\n\t\t\tsalePriceCurrency={salePriceCurrency ?? undefined}\n\t\t\tanchorPrice={regularPrice}\n\t\t\tlocalizedSalePrice={localizedSalePrice ?? undefined}\n\t\t\tclassName={cn(className)}\n\t\t/>\n\t);\n}\n\ninterface ProductCtaProps {\n\tcardData: ProductCardData;\n\tbuttonLayoutClassName: string;\n\townershipLabelClassName?: string;\n}\n\nexport function ProductCta({ cardData, buttonLayoutClassName, ownershipLabelClassName }: ProductCtaProps) {\n\tconst resources = useSearchResources();\n\tconst {\n\t\tisPurchasable,\n\t\thasGeoRestriction,\n\t\taccessKind,\n\t\thasPreorder,\n\t\tskuId,\n\t\tisAddingToCart,\n\t\tisPrepubProduct,\n\t\thandleAddToCart,\n\t} = cardData;\n\n\tlet purchaseStatusMessage = getOwnershipLabel(resources, hasGeoRestriction, accessKind, hasPreorder);\n\n\tif (isPurchasable !== undefined && !isPurchasable && !purchaseStatusMessage) {\n\t\tpurchaseStatusMessage = resources['UnavailableToPurchase'];\n\t}\n\n\tif (purchaseStatusMessage) {\n\t\treturn (\n\t\t\t<Typography\n\t\t\t\tvariant=\"bodyRegular\"\n\t\t\t\tclassName={cn('text-primary-500', ownershipLabelClassName ?? cn('text-center', !hasPreorder && 'md:pt-sp16'))}\n\t\t\t>\n\t\t\t\t{purchaseStatusMessage}\n\t\t\t</Typography>\n\t\t);\n\t}\n\n\tif (skuId) {\n\t\treturn (\n\t\t\t<div className={cn('inline-flex gap-2 lg:gap-3', buttonLayoutClassName)}>\n\t\t\t\t<Button\n\t\t\t\t\tdisabled={isAddingToCart}\n\t\t\t\t\tonClick={handleAddToCart}\n\t\t\t\t\tscale={ctaButtonScale}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t>\n\t\t\t\t\t{isAddingToCart\n\t\t\t\t\t\t? resources['addingToCart']\n\t\t\t\t\t\t: isPrepubProduct\n\t\t\t\t\t\t\t? resources['preorder']\n\t\t\t\t\t\t\t: resources['addToCart']}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Skeleton.Root className={cn('animate-pulse inline-flex gap-2 lg:gap-3', buttonLayoutClassName)}>\n\t\t\t<Skeleton.Box className={cn('w-full', skeletonHeightByButtonScale[ctaButtonScale])} />\n\t\t</Skeleton.Root>\n\t);\n}\n","import React from 'react';\nimport { StarRating } from '@faithlife/commerce-components';\n\nimport { ProductHitResult } from '../types';\nimport { useProductInWishList } from '../../add-to-wish-list/hooks';\nimport { AddToWishListWithForm } from '../../add-to-wish-list';\nimport EnhancedForLogosWithTooltip from '../../shared/enhanced-for-logos-with-tooltip';\nimport { hasValidReviewData } from '../../shared/ratings/review-data';\nimport { PrepubProductStatusSummary } from '../../product/product-details-page/right-column/prepub-product-status-summary';\nimport { useProductCard } from './use-product-card';\nimport { ProductImage } from './product-image';\nimport { DiscountBadge } from './discount-badge';\nimport { ProductTitle } from './product-title';\nimport { ProductAuthors } from './product-authors';\nimport { ProductPrice, ProductCta } from './product-pricing';\n\ninterface AlgoliaGridCardProps {\n\thit: ProductHitResult;\n\tpriority?: boolean;\n\tqueryId?: string | null;\n\tposition?: number;\n}\n\nexport function AlgoliaGridCard({ hit, priority, queryId = null, position }: AlgoliaGridCardProps) {\n\tconst cardData = useProductCard({ hit, queryId, position });\n\tconst {\n\t\tproductUrl,\n\t\tproductName,\n\t\timageSrc,\n\t\tdiscountPercentage,\n\t\tisDiscounted,\n\t\thandleProductClick,\n\t\tskuId,\n\t\tisLogosEdition,\n\t\tprepubProductStatusSummary,\n\t\tisOwned,\n\t} = cardData;\n\tconst productInWishlist = useProductInWishList(hit.productId, skuId, !isOwned);\n\tconst averageRating = hit.averageRating ?? 0;\n\tconst reviewCount = hit.reviewCount ?? 0;\n\tconst hasReviewData = hasValidReviewData(averageRating, reviewCount);\n\n\treturn (\n\t\t<div className=\"grid gap-y-0 grid-rows-subgrid row-span-5 grid-cols-1\">\n\t\t\t{/* Row 1: Image — fixed aspect ratio, never grows */}\n\t\t\t<div className=\"relative flex flex-col items-center justify-start gap-sp12 pt-3 lg:pt-4\">\n\t\t\t\t<div className=\"flex h-43.5 w-full items-end justify-center\">\n\t\t\t\t\t<ProductImage\n\t\t\t\t\t\thandleProductClick={handleProductClick}\n\t\t\t\t\t\timageSrc={imageSrc}\n\t\t\t\t\t\tpriority={priority}\n\t\t\t\t\t\tproductName={productName}\n\t\t\t\t\t\tproductUrl={productUrl}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"h-4 text-center\">{isLogosEdition && <EnhancedForLogosWithTooltip />}</div>\n\t\t\t\t{!isOwned && (\n\t\t\t\t\t<DiscountBadge\n\t\t\t\t\t\tclassName=\"absolute top-2 left-2\"\n\t\t\t\t\t\tdiscountPercentage={discountPercentage}\n\t\t\t\t\t\tisDiscounted={isDiscounted}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<AddToWishListWithForm {...productInWishlist} variant=\"icon\" isOwned={isOwned} />\n\t\t\t</div>\n\n\t\t\t{/* Row 2: Info — grows to absorb variable space */}\n\t\t\t<div className=\"px-2 pt-sp12 pb-1 lg:px-4 lg:pb-2\">\n\t\t\t\t<ProductTitle\n\t\t\t\t\tclassName=\"line-clamp-2\"\n\t\t\t\t\thandleProductClick={handleProductClick}\n\t\t\t\t\tproductName={productName}\n\t\t\t\t\tproductUrl={productUrl}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"mt-sp8\">\n\t\t\t\t\t<ProductAuthors authors={hit.authors} />\n\t\t\t\t</div>\n\n\t\t\t\t{hasReviewData && (\n\t\t\t\t\t<div className=\"mt-sp8\">\n\t\t\t\t\t\t<StarRating rating={averageRating} reviewCount={reviewCount} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Row 3: Prepub summary — empty when not present */}\n\t\t\t<div className=\"px-2 lg:px-4\">\n\t\t\t\t{prepubProductStatusSummary && (\n\t\t\t\t\t<PrepubProductStatusSummary {...prepubProductStatusSummary} variant=\"search-grid\" />\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Row 4: Price — always aligned across cards */}\n\t\t\t<div className=\"flex items-end px-2 md:pb-1 lg:px-4\">\n\t\t\t\t<ProductPrice cardData={cardData} />\n\t\t\t</div>\n\n\t\t\t{/* Row 5: CTA — always aligned across cards */}\n\t\t\t<ProductCta buttonLayoutClassName=\"w-full flex-col px-2 pb-2 pt-2 lg:px-4 lg:pb-4\" cardData={cardData} />\n\t\t</div>\n\t);\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { LinkButton } from '@faithlife/commerce-components';\n\nimport { cn } from '../../../util/cn';\nimport { useSearchResources } from '../search-resources';\n\ninterface ProductOverviewProps {\n\toverview?: string;\n}\n\nexport function ProductOverview({ overview }: ProductOverviewProps) {\n\tconst [isExpanded, setIsExpanded] = useState(false);\n\tconst [showButton, setShowButton] = useState(false);\n\tconst overviewRef = useRef<HTMLDivElement>(null);\n\tconst resources = useSearchResources();\n\n\tuseEffect(() => {\n\t\tconst element = overviewRef.current;\n\n\t\tif (element) {\n\t\t\ttry {\n\t\t\t\tconst height = element.scrollHeight;\n\t\t\t\tconst computedLineHeight = getComputedStyle(element).lineHeight;\n\t\t\t\tconst parsedLineHeight = parseInt(computedLineHeight, 10);\n\t\t\t\tconst lineHeight = Number.isFinite(parsedLineHeight) && parsedLineHeight > 0 ? parsedLineHeight : 20;\n\t\t\t\tconst maxHeight = lineHeight * 4;\n\t\t\t\tconst maxHeightMobile = lineHeight * 2;\n\n\t\t\t\tif (height > maxHeight || height > maxHeightMobile) {\n\t\t\t\t\tsetShowButton(true);\n\t\t\t\t} else {\n\t\t\t\t\tsetShowButton(false);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetShowButton(false);\n\t\t\t}\n\t\t}\n\t}, [overview]);\n\n\tconst toggleExpand = () => {\n\t\tsetIsExpanded(!isExpanded);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'hidden text-black [&>*:first-child]:mt-0',\n\t\t\t\t\t!isExpanded && 'md:line-clamp-2',\n\t\t\t\t\tisExpanded && 'md:line-clamp-none'\n\t\t\t\t)}\n\t\t\t\tdangerouslySetInnerHTML={{ __html: overview ?? '' }}\n\t\t\t\tref={overviewRef}\n\t\t\t/>\n\t\t\t{showButton && (\n\t\t\t\t<LinkButton\n\t\t\t\t\tas=\"button\"\n\t\t\t\t\tclassName=\"hidden md:inline-flex bodyMd !font-normal\"\n\t\t\t\t\tintent=\"none\"\n\t\t\t\t\tonClick={toggleExpand}\n\t\t\t\t\tscale=\"sm\"\n\t\t\t\t>\n\t\t\t\t\t{isExpanded ? resources['readLess'] : resources['readMore']}\n\t\t\t\t</LinkButton>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","import React from 'react';\nimport { StarRating } from '@faithlife/commerce-components';\n\nimport { ProductHitResult } from '../types';\nimport { AddToWishListWithForm } from '../../add-to-wish-list';\nimport { useProductInWishList } from '../../add-to-wish-list/hooks';\nimport EnhancedForLogosWithTooltip from '../../shared/enhanced-for-logos-with-tooltip';\nimport { hasValidReviewData } from '../../shared/ratings/review-data';\nimport { PrepubProductStatusSummary } from '../../product/product-details-page/right-column/prepub-product-status-summary';\nimport { useProductCard } from './use-product-card';\nimport { DiscountBadge } from './discount-badge';\nimport { ProductTitle } from './product-title';\nimport { ProductAuthors } from './product-authors';\nimport { ProductOverview } from './product-overview';\nimport { ProductPricing } from './product-pricing';\nimport { ProductImage } from './product-image';\n\ninterface AlgoliaListCardProps {\n\thit: ProductHitResult;\n\tpriority?: boolean;\n\tqueryId?: string | null;\n\tposition?: number;\n}\n\nexport function AlgoliaListCard({ hit, priority, queryId = null, position }: AlgoliaListCardProps) {\n\tconst cardData = useProductCard({ hit, queryId, position });\n\tconst {\n\t\tproductUrl,\n\t\tproductName,\n\t\timageSrc,\n\t\tdiscountPercentage,\n\t\tisDiscounted,\n\t\thandleProductClick,\n\t\tskuId,\n\t\tisOwned,\n\t\tisLogosEdition,\n\t\tprepubProductStatusSummary,\n\t} = cardData;\n\tconst productInWishlist = useProductInWishList(hit.productId, skuId, !isOwned);\n\tconst averageRating = hit.averageRating ?? 0;\n\tconst reviewCount = hit.reviewCount ?? 0;\n\tconst hasReviewData = hasValidReviewData(averageRating, reviewCount);\n\n\treturn (\n\t\t<div className=\"grid grid-cols-[139px_auto] md:grid-cols-[190px_auto]\">\n\t\t\t<div className=\"relative col-span-1 flex w-full items-start justify-center\">\n\t\t\t\t<div className=\"flex w-auto flex-col gap-sp8 pt-2 pb-[43px] lg:pt-3 md:pb-9\">\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<ProductImage\n\t\t\t\t\t\t\thandleProductClick={handleProductClick}\n\t\t\t\t\t\t\timageSrc={imageSrc}\n\t\t\t\t\t\t\tpriority={priority}\n\t\t\t\t\t\t\tproductName={productName}\n\t\t\t\t\t\t\tproductUrl={productUrl}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!isOwned && (\n\t\t\t\t\t\t\t<DiscountBadge\n\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\"\n\t\t\t\t\t\t\t\tdiscountPercentage={discountPercentage}\n\t\t\t\t\t\t\t\tisDiscounted={isDiscounted}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{isLogosEdition && (\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<EnhancedForLogosWithTooltip />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid p-2 pb-8 md:grid-cols-[auto_168px] md:gap-8 md:pb-2 lg:p-3\">\n\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t<ProductTitle handleProductClick={handleProductClick} productName={productName} productUrl={productUrl} />\n\n\t\t\t\t\t<div className=\"mt-sp8\">\n\t\t\t\t\t\t<ProductAuthors authors={hit.authors} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{hasReviewData && (\n\t\t\t\t\t\t<div className=\"mt-sp8\">\n\t\t\t\t\t\t\t<StarRating rating={averageRating} reviewCount={reviewCount} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"mt-sp12\">\n\t\t\t\t\t\t<ProductOverview overview={hit.overview} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{prepubProductStatusSummary && (\n\t\t\t\t\t\t<PrepubProductStatusSummary {...prepubProductStatusSummary} variant=\"search-list\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex grow-0 flex-col gap-2 lg:gap-3 items-end\">\n\t\t\t\t\t<ProductPricing\n\t\t\t\t\t\tbuttonLayoutClassName=\"w-full flex-col xmd:flex-row md:flex-col max-w-[145px]\"\n\t\t\t\t\t\tcardData={cardData}\n\t\t\t\t\t/>\n\t\t\t\t\t<AddToWishListWithForm {...productInWishlist} variant=\"link\" isOwned={isOwned} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React, { useCallback } from 'react';\nimport { Hit } from 'instantsearch.js';\nimport { Hits, useInstantSearch } from 'react-instantsearch';\n\nimport { cn } from '../../util/cn';\nimport * as Skeleton from '../skeleton';\nimport { WishListProductBatchProvider } from '../add-to-wish-list/hooks';\nimport { ProductHit, ProductHitResult } from './types';\nimport { AlgoliaGridCard } from './product-card/algolia-grid-card';\nimport { AlgoliaListCard } from './product-card/algolia-list-card';\n\n// ---------------------------------------------------------------------------\n// ProductHits — grid/list of search result cards\n// ---------------------------------------------------------------------------\n\ninterface ProductHitsProps {\n\tlayoutType: 'grid' | 'list';\n\twishListsProductsUrl: string;\n\tcurrentHitsPerPage: number;\n}\n\nfunction SkeletonBlock({ className, rootClassName }: { className: string; rootClassName?: string }) {\n\treturn <Skeleton.Box className={cn(className, rootClassName)} />;\n}\n\nfunction SkeletonButton({ className }: { className: string }) {\n\treturn <Skeleton.Box className={cn('h-12 inline-flex gap-2 lg:gap-3', className)} />;\n}\n\nfunction ProductSkeleton({ layoutType }: { layoutType: 'grid' | 'list' }) {\n\tif (layoutType === 'list') {\n\t\treturn (\n\t\t\t<Skeleton.Root className=\"animate-pulse\">\n\t\t\t\t<div className=\"grid grid-cols-[139px_auto] md:grid-cols-[190px_auto]\">\n\t\t\t\t\t<div className=\"relative col-span-1 flex w-full items-start justify-center\">\n\t\t\t\t\t\t<div className=\"flex w-auto flex-col gap-sp8 pt-2 pb-[43px] lg:pt-3 md:pb-9\">\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<SkeletonBlock className=\"h-[122px] w-[122px] lg:h-[158px] lg:w-[158px]\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t\t<SkeletonBlock className=\"h-4 w-20\" rootClassName=\"mx-auto h-4 w-20\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"grid gap-sp8 p-2 pb-8 md:grid-cols-[auto_168px] md:gap-8 md:pb-2 lg:p-3\">\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<SkeletonBlock className=\"h-12 w-full\" />\n\t\t\t\t\t\t\t<SkeletonBlock className=\"mt-sp8 h-4 w-3/5\" />\n\t\t\t\t\t\t\t<SkeletonBlock className=\"mt-sp8 h-5 w-2/5\" />\n\t\t\t\t\t\t\t<SkeletonBlock className=\"mt-sp12 h-16 w-full\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex flex-col items-end gap-2 lg:gap-3\">\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-end gap-sp4\">\n\t\t\t\t\t\t\t\t<SkeletonBlock className=\"h-4 w-20\" />\n\t\t\t\t\t\t\t\t<SkeletonBlock className=\"h-7 w-24\" />\n\t\t\t\t\t\t\t\t<SkeletonBlock className=\"h-4 w-16\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<SkeletonButton className=\"w-full max-w-[145px]\" />\n\t\t\t\t\t\t\t<SkeletonBlock className=\"h-4 w-24\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</Skeleton.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Skeleton.Root className=\"animate-pulse grid gap-y-0 grid-rows-subgrid row-span-5 grid-cols-1\">\n\t\t\t<div className=\"relative flex flex-col items-center justify-start gap-sp12 pt-3 lg:pt-4\">\n\t\t\t\t<div className=\"flex h-43.5 w-full items-end justify-center\">\n\t\t\t\t\t<SkeletonBlock\n\t\t\t\t\t\tclassName=\"h-[122px] w-[100px] lg:h-[158px] lg:w-[129px]\"\n\t\t\t\t\t\trootClassName=\"h-[122px] w-[100px] lg:h-[158px] lg:w-[129px]\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<SkeletonBlock className=\"h-4 w-20\" rootClassName=\"mx-auto h-4 w-20\" />\n\t\t\t</div>\n\t\t\t<div className=\"px-2 pt-sp12 pb-1 lg:px-4 lg:pb-2\">\n\t\t\t\t<SkeletonBlock className=\"h-12 w-full\" />\n\t\t\t\t<SkeletonBlock className=\"mt-sp8 h-4 w-3/5\" />\n\t\t\t\t<SkeletonBlock className=\"mt-sp8 h-5 w-2/5\" />\n\t\t\t</div>\n\t\t\t<div className=\"px-2 lg:px-4\" />\n\t\t\t<div className=\"flex items-end px-2 md:pb-1 lg:px-4\">\n\t\t\t\t<div className=\"flex w-full flex-col gap-sp4\">\n\t\t\t\t\t<SkeletonBlock className=\"h-4 w-3/5\" rootClassName=\"h-4 w-3/5\" />\n\t\t\t\t\t<SkeletonBlock className=\"h-7 w-4/5\" rootClassName=\"h-7 w-4/5\" />\n\t\t\t\t\t<SkeletonBlock className=\"h-4 w-2/5\" rootClassName=\"h-4 w-2/5\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex items-end justify-center px-2 pb-2 pt-2 lg:px-4 lg:pb-4\">\n\t\t\t\t<SkeletonButton className=\"w-full\" />\n\t\t\t</div>\n\t\t</Skeleton.Root>\n\t);\n}\n\nfunction ProductSkeletons({\n\tlayoutType,\n\tcurrentHitsPerPage,\n}: {\n\tlayoutType: 'grid' | 'list';\n\tcurrentHitsPerPage: number;\n}) {\n\treturn (\n\t\t<ol\n\t\t\taria-label=\"Loading search results\"\n\t\t\tclassName={cn(\n\t\t\t\t'grid grid-cols-1',\n\t\t\t\tlayoutType === 'grid' &&\n\t\t\t\t\t'auto-rows-[max-content_auto_max-content_max-content_max-content] grid-cols-2 gap-sp8 lg:grid-cols-3 lg:gap-sp16',\n\t\t\t\tlayoutType === 'list' && 'gap-6 md:gap-8'\n\t\t\t)}\n\t\t>\n\t\t\t{Array.from({ length: currentHitsPerPage }, (_, index) => (\n\t\t\t\t<li\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tlayoutType === 'grid' &&\n\t\t\t\t\t\t\t'grid gap-y-0 grid-rows-subgrid row-span-5 grid-cols-1 outline outline-1 outline-grey',\n\t\t\t\t\t\tlayoutType === 'list' && 'first:border-t border-b border-grey-200 first:pt-6 first:md:pt-8'\n\t\t\t\t\t)}\n\t\t\t\t\tkey={index}\n\t\t\t\t>\n\t\t\t\t\t<ProductSkeleton layoutType={layoutType} />\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ol>\n\t);\n}\n\nfunction toProductHitResult(hit: Hit<ProductHit>): ProductHitResult {\n\treturn {\n\t\t...hit,\n\t\tproductId: hit.productId !== null && hit.productId !== undefined ? hit.productId.toString() : undefined,\n\t};\n}\n\nexport function ProductHits({ layoutType, wishListsProductsUrl, currentHitsPerPage }: ProductHitsProps) {\n\tconst Card = layoutType === 'list' ? AlgoliaListCard : AlgoliaGridCard;\n\tconst { status } = useInstantSearch();\n\tconst HitComponent = useCallback(\n\t\t({ hit }: { hit: Hit<ProductHit> }) => (\n\t\t\t<Card\n\t\t\t\thit={toProductHitResult(hit)}\n\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\tpriority={typeof hit.__position === 'number' && hit.__position <= 6}\n\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\tqueryId={(hit as any).__queryID ?? null}\n\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\tposition={hit.__position}\n\t\t\t/>\n\t\t),\n\t\t[Card]\n\t);\n\n\treturn (\n\t\t<WishListProductBatchProvider wishListsProductsUrl={wishListsProductsUrl}>\n\t\t\t<section aria-label=\"Search results\">\n\t\t\t\t{status === 'stalled' && (\n\t\t\t\t\t<div className=\"pt-4 pb-6 lg:px-4 lg:py-8\">\n\t\t\t\t\t\t<ProductSkeletons layoutType={layoutType} currentHitsPerPage={currentHitsPerPage} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<Hits\n\t\t\t\t\tclassNames={{\n\t\t\t\t\t\troot: cn('pt-4 pb-6 lg:px-4 lg:py-8', status === 'stalled' && 'hidden'),\n\t\t\t\t\t\tlist: cn(\n\t\t\t\t\t\t\t'grid grid-cols-1',\n\t\t\t\t\t\t\tlayoutType === 'grid' &&\n\t\t\t\t\t\t\t\t'auto-rows-[max-content_auto_max-content_max-content_max-content] grid-cols-2 gap-sp8 lg:grid-cols-3 lg:gap-sp16',\n\t\t\t\t\t\t\tlayoutType === 'list' && 'gap-6 md:gap-8'\n\t\t\t\t\t\t),\n\t\t\t\t\t\titem: cn(\n\t\t\t\t\t\t\t/* the grid definition must match AlgoliaGridCard to pass subgrid tracks to it correctly */\n\t\t\t\t\t\t\tlayoutType === 'grid' &&\n\t\t\t\t\t\t\t\t'grid gap-y-0 grid-rows-subgrid row-span-5 grid-cols-1 outline outline-1 outline-grey',\n\t\t\t\t\t\t\t/* first:pt matches the gap-6/md:gap-8 list gutter so item 1's top spacing matches the gap preceding every other item */\n\t\t\t\t\t\t\tlayoutType === 'list' && 'first:border-t border-b border-grey-200 first:pt-6 first:md:pt-8'\n\t\t\t\t\t\t),\n\t\t\t\t\t}}\n\t\t\t\t\thitComponent={HitComponent}\n\t\t\t\t/>\n\t\t\t</section>\n\t\t</WishListProductBatchProvider>\n\t);\n}\n\nexport default ProductHits;\n","import React from 'react';\nimport { Typography } from '@faithlife/commerce-components';\n\nimport { cn } from '../../util/cn';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../accordion';\n\nexport interface RadioAccordionItem<TValue extends string | number> {\n\tchecked: boolean;\n\tlabel: string;\n\tvalue: TValue;\n}\n\ninterface RadioAccordionProps<TValue extends string | number> {\n\tradioGroupName: string;\n\titems: RadioAccordionItem<TValue>[];\n\tonSelect: (value: TValue) => void;\n\tprefixLabel: string;\n}\n\nexport default function RadioAccordion<TValue extends string | number>({\n\tradioGroupName,\n\titems,\n\tonSelect,\n\tprefixLabel,\n}: RadioAccordionProps<TValue>) {\n\tconst currentItem = items.find(item => item.checked);\n\n\treturn (\n\t\t<Accordion collapsible type=\"single\">\n\t\t\t<AccordionItem value={radioGroupName}>\n\t\t\t\t<AccordionTrigger className=\"border-t border-primary-100 p-4 lg:border-t-0 [&>svg]:text-primary\">\n\t\t\t\t\t<Typography className=\"text-primary-400\" variant=\"bodyRegular\">\n\t\t\t\t\t\t{prefixLabel} {}\n\t\t\t\t\t\t{currentItem && <span className=\"font-semibold\">{currentItem.label}</span>}\n\t\t\t\t\t</Typography>\n\t\t\t\t</AccordionTrigger>\n\t\t\t\t<AccordionContent className=\"m-0 bg-grey-200 p-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-y-4\">\n\t\t\t\t\t\t{items.map(item => (\n\t\t\t\t\t\t\t<label className=\"bodySm flex cursor-pointer items-center text-black-200\" key={item.value}>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tchecked={item.checked}\n\t\t\t\t\t\t\t\t\tname={radioGroupName}\n\t\t\t\t\t\t\t\t\tclassName=\"mr-3 h-3.25 w-3.25 border-grey-100 text-primary\"\n\t\t\t\t\t\t\t\t\tonChange={() => onSelect(item.value)}\n\t\t\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t\t\tvalue={item.value}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className={cn(item.checked ? 'text-primary' : 'text-black-200 hover:text-secondary-200')}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</AccordionContent>\n\t\t\t</AccordionItem>\n\t\t</Accordion>\n\t);\n}\n","import React from 'react';\nimport { useSortBy } from 'react-instantsearch';\n\nimport { useSearchResources } from './search-resources';\nimport RadioAccordion from './radio-accordion';\n\ninterface SortByItem {\n\tlabel: string;\n\tvalue: string;\n}\n\ninterface SortByAccordionProps {\n\titems: SortByItem[];\n}\n\nexport default function SortByAccordion({ items }: SortByAccordionProps) {\n\tconst resources = useSearchResources();\n\tconst { currentRefinement, refine } = useSortBy({ items });\n\n\treturn (\n\t\t<RadioAccordion\n\t\t\tradioGroupName=\"sort-by\"\n\t\t\titems={items.map(item => ({ ...item, checked: item.value === currentRefinement }))}\n\t\t\tonSelect={refine}\n\t\t\tprefixLabel={resources['sortBy']}\n\t\t/>\n\t);\n}\n","import React from 'react';\nimport { useHitsPerPage } from 'react-instantsearch';\n\nimport { useSearchResources } from './search-resources';\nimport RadioAccordion from './radio-accordion';\n\ninterface HitsPerPageItem {\n\tdefault?: boolean;\n\tlabel: string;\n\tvalue: number;\n}\n\ninterface HitsPerPageAccordionProps {\n\titems: HitsPerPageItem[];\n}\n\nexport default function HitsPerPageAccordion({ items }: HitsPerPageAccordionProps) {\n\tconst resources = useSearchResources();\n\tconst { items: showItems, refine } = useHitsPerPage({ items });\n\n\treturn (\n\t\t<RadioAccordion\n\t\t\tradioGroupName=\"hits-per-page\"\n\t\t\titems={showItems.map(item => ({ ...item, checked: item.isRefined }))}\n\t\t\tonSelect={refine}\n\t\t\tprefixLabel={resources['show']}\n\t\t/>\n\t);\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport Cookies from 'js-cookie';\nimport { safeUrl } from './util';\n\nexport enum ViewMode {\n\tgrid = 'grid',\n\tlist = 'list',\n}\n\ninterface ViewModeContextType {\n\tviewMode: ViewMode;\n\tsetViewMode: (mode: ViewMode) => void;\n}\n\nconst ViewModeContext = createContext<ViewModeContextType | null>(null);\n\nexport const viewModeKey = 'viewMode';\n\nexport const ViewModeProvider = ({\n\tchildren,\n\tinitialViewMode,\n}: {\n\tchildren: React.ReactNode;\n\tinitialViewMode: ViewMode;\n}) => {\n\tconst [viewMode, setViewMode] = useState(initialViewMode);\n\n\tuseEffect(() => {\n\t\tconst url = typeof window !== 'undefined' ? safeUrl(window.location.href) : null;\n\t\tif (url) {\n\t\t\turl?.searchParams.set(viewModeKey, viewMode);\n\t\t\twindow.history.replaceState({}, '', url);\n\t\t}\n\t\tCookies.set(viewModeKey, viewMode);\n\t}, [viewMode]);\n\n\treturn <ViewModeContext.Provider value={{ viewMode, setViewMode }}>{children}</ViewModeContext.Provider>;\n};\n\nexport const useViewMode = () => {\n\tconst context = useContext(ViewModeContext);\n\n\tif (!context) {\n\t\tthrow new Error('useViewMode must be used within ViewModeProvider');\n\t}\n\n\treturn context;\n};\n","import { StateMapping, UiState } from 'instantsearch.js';\nimport history from 'instantsearch.js/es/lib/routers/history';\n\nimport { SearchCategory, SearchSortOrder } from './types';\nimport { UserSearchFilter } from './user-search-filter-context';\nimport { safeUrl } from './util';\nimport { viewModeKey } from './use-view-mode';\n\n// ---------------------------------------------------------------------------\n// Facet configuration\n// ---------------------------------------------------------------------------\n\nexport interface SimpleFacetConfiguration {\n\ttype: 'simple';\n\talgoliaAttribute: string;\n\trouteKey: string;\n\tisHidden?: boolean;\n}\n\nexport interface HierarchicalFacetConfiguration {\n\ttype: 'hierarchical';\n\talgoliaAttributeBase: string;\n\trouteKeyPrefix: string;\n\tminLevel: number;\n\tmaxLevel: number;\n\tcategoryToken?: string;\n\tisHidden?: boolean;\n}\n\nexport type FacetConfiguration = SimpleFacetConfiguration | HierarchicalFacetConfiguration;\n\n// ---------------------------------------------------------------------------\n// Route state types and helpers\n// ---------------------------------------------------------------------------\n\ntype RouteStateFacets = Record<string, string[]>;\ntype RouteStateFilters = Record<string, string>;\n\nfunction getAllFacetingKeys(facetConfigurations: FacetConfiguration[]): string[] {\n\treturn [\n\t\t...facetConfigurations\n\t\t\t.filter((config): config is SimpleFacetConfiguration => config.type === 'simple')\n\t\t\t.map(config => config.routeKey),\n\t\t...facetConfigurations\n\t\t\t.filter((config): config is HierarchicalFacetConfiguration => config.type === 'hierarchical')\n\t\t\t.flatMap(config => {\n\t\t\t\tconst keys: string[] = [];\n\n\t\t\t\tfor (let level = config.minLevel; level <= config.maxLevel; level += 1) {\n\t\t\t\t\tkeys.push(`${config.routeKeyPrefix}${level}`);\n\t\t\t\t}\n\n\t\t\t\treturn keys;\n\t\t\t}),\n\t];\n}\n\nexport interface RouteState {\n\tquery?: string;\n\n\tfacets?: RouteStateFacets;\n\tfilters?: RouteStateFilters;\n\n\tsortBy?: string;\n\tlimit?: number;\n\tpage?: number;\n}\n\nconst delimiter = '+';\n\nfunction arrayToQueryParam(array: string[] | undefined): string | undefined {\n\treturn array?.length ? array.join(delimiter) : undefined;\n}\n\nfunction emptyIfUndefined<T>(array: T[] | undefined): T[] {\n\treturn array && array.length > 0 ? array : [];\n}\n\nfunction getTrimmedOrUndefinedIfStringEmpty(value: string): string | undefined {\n\tconst trimmed = value.trim();\n\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\ninterface CategoryPageFacetConfiguration {\n\tqueryParamName: string;\n\tvalue: string;\n}\n\ninterface CategoryPageConfiguration {\n\tfacets: CategoryPageFacetConfiguration[];\n\tcategoryPageUrl: string;\n\tpageTitle: string;\n}\n\nfunction getMatchingCategoryPageFromRouteState(\n\trouteState: RouteState,\n\tcategoryPageConfigurations: CategoryPageConfiguration[],\n\tallFacetingKeys: string[]\n): CategoryPageConfiguration | null {\n\tconst facetKeys = new Set([...allFacetingKeys, ...Object.keys(routeState.facets ?? {})]);\n\tconst facets = [...facetKeys].map(key => ({\n\t\tkey,\n\t\tvalue: routeState.facets?.[key],\n\t}));\n\n\tfor (const categoryPageConfiguration of categoryPageConfigurations) {\n\t\tconst matches = checkCategoryPageConfigurationMatches(categoryPageConfiguration, facets);\n\n\t\tif (matches) {\n\t\t\treturn categoryPageConfiguration;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction preserveCustomQueryParams(sourceUrl: URL, targetUrl: URL, preserveKeys: Set<string>) {\n\tfor (const [key, value] of sourceUrl.searchParams.entries()) {\n\t\tif (preserveKeys.has(key)) {\n\t\t\ttargetUrl.searchParams.set(key, value);\n\t\t}\n\t}\n}\n\nfunction preserveNonSearchQueryParams(sourceUrl: URL, targetUrl: URL, searchParamKeys: Set<string>) {\n\tfor (const [key, value] of sourceUrl.searchParams.entries()) {\n\t\tif (!searchParamKeys.has(key)) {\n\t\t\ttargetUrl.searchParams.set(key, value);\n\t\t}\n\t}\n}\n\nfunction writeFacetsSearchParams(url: URL, facets?: RouteStateFacets, excludedKeys?: Set<string>) {\n\tif (!facets) {\n\t\treturn;\n\t}\n\n\tfor (const [key, value] of Object.entries(facets)) {\n\t\tif (excludedKeys?.has(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst candidateQueryParamValue = arrayToQueryParam(value);\n\n\t\tif (candidateQueryParamValue !== undefined) {\n\t\t\turl.searchParams.set(key, candidateQueryParamValue);\n\t\t}\n\t}\n}\n\nfunction writeUserFilterSearchParams(targetUrl: URL, userSearchFilters: UserSearchFilter[], sourceUrl: URL) {\n\tfor (const filter of userSearchFilters) {\n\t\tconst value = sourceUrl.searchParams.get(filter.token);\n\n\t\tif (value) {\n\t\t\ttargetUrl.searchParams.set(filter.token, value);\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// State mapping — Algolia UI state ↔ route state\n// ---------------------------------------------------------------------------\n\nexport function makeStateMapping(\n\tindex: string,\n\tfacetConfigurations: FacetConfiguration[],\n\tsortOrders: SearchSortOrder[]\n): StateMapping<UiState, RouteState> {\n\treturn {\n\t\tstateToRoute: (uiState: UiState) => {\n\t\t\tconst indexUiState = uiState[index];\n\n\t\t\tif (!indexUiState) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst facets: RouteStateFacets = {};\n\n\t\t\tfor (const config of facetConfigurations) {\n\t\t\t\tif (config.type === 'simple') {\n\t\t\t\t\tconst facetValues = indexUiState.refinementList?.[config.algoliaAttribute];\n\n\t\t\t\t\tif (facetValues) {\n\t\t\t\t\t\tfacets[config.routeKey] = facetValues;\n\t\t\t\t\t}\n\t\t\t\t} else if (config.type === 'hierarchical') {\n\t\t\t\t\tfor (let level = config.minLevel; level <= config.maxLevel; level += 1) {\n\t\t\t\t\t\tconst routeKey = `${config.routeKeyPrefix}${level}`;\n\t\t\t\t\t\tconst algoliaAttribute = `${config.algoliaAttributeBase}.lvl${level}`;\n\n\t\t\t\t\t\tconst facetValues = indexUiState.refinementList?.[algoliaAttribute];\n\n\t\t\t\t\t\tif (facetValues) {\n\t\t\t\t\t\t\tfacets[routeKey] = facetValues;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sortOrder = sortOrders.find(order => order.value === indexUiState.sortBy);\n\n\t\t\treturn {\n\t\t\t\tquery: indexUiState.query,\n\t\t\t\tfacets,\n\t\t\t\tsortBy: sortOrder?.routeValue ?? undefined,\n\t\t\t\tlimit: indexUiState.hitsPerPage,\n\t\t\t\tpage: indexUiState.page,\n\t\t\t} satisfies RouteState;\n\t\t},\n\t\trouteToState: (routeState: RouteState) => {\n\t\t\tconst refinementList: Record<string, string[]> = {};\n\n\t\t\tfor (const config of facetConfigurations) {\n\t\t\t\tif (config.type === 'simple') {\n\t\t\t\t\trefinementList[config.algoliaAttribute] = emptyIfUndefined(routeState.facets?.[config.routeKey]);\n\t\t\t\t} else if (config.type === 'hierarchical') {\n\t\t\t\t\tfor (let level = config.minLevel; level <= config.maxLevel; level += 1) {\n\t\t\t\t\t\tconst routeKey = `${config.routeKeyPrefix}${level}`;\n\n\t\t\t\t\t\tconst algoliaAttribute = `${config.algoliaAttributeBase}.lvl${level}`;\n\n\t\t\t\t\t\trefinementList[algoliaAttribute] = emptyIfUndefined(routeState.facets?.[routeKey]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sortBy = routeState.sortBy\n\t\t\t\t? sortOrders.find(order => order.routeValue === routeState.sortBy)?.value\n\t\t\t\t: undefined;\n\n\t\t\treturn {\n\t\t\t\t[index]: {\n\t\t\t\t\tquery: routeState.query,\n\t\t\t\t\tsortBy,\n\t\t\t\t\thitsPerPage: routeState.limit,\n\t\t\t\t\trefinementList,\n\t\t\t\t\tpage: routeState.page,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Category page configuration\n// ---------------------------------------------------------------------------\n\nfunction checkFacetValueConfigurationMatches(\n\tfacetValueConfiguration: string,\n\trouteStateFacetValue: string[] | undefined\n): boolean {\n\tif (routeStateFacetValue === undefined) {\n\t\treturn false;\n\t}\n\n\tif (routeStateFacetValue.length !== 1) {\n\t\treturn false;\n\t}\n\n\treturn facetValueConfiguration === routeStateFacetValue[0];\n}\n\nfunction checkCategoryPageConfigurationMatches(\n\tcategoryPageConfiguration: CategoryPageConfiguration,\n\trouteStateFacets: {\n\t\tkey: string;\n\t\tvalue: string[] | undefined;\n\t}[]\n): boolean {\n\tconst { facets: facetsConfiguration } = categoryPageConfiguration;\n\n\tlet matches = true;\n\n\tfor (const routeStateFacet of routeStateFacets) {\n\t\tconst facetConfiguration = facetsConfiguration.find(f => f.queryParamName === routeStateFacet.key);\n\n\t\tif (facetConfiguration) {\n\t\t\tif (!checkFacetValueConfigurationMatches(facetConfiguration.value, routeStateFacet.value)) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (routeStateFacet.value !== undefined && routeStateFacet.value.length > 0) {\n\t\t\tmatches = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn matches;\n}\n\nfunction writeCommonSearchParams(url: URL, routeState: RouteState) {\n\tif (routeState.query) {\n\t\turl.searchParams.set('query', routeState.query);\n\t}\n\n\tif (routeState.sortBy) {\n\t\turl.searchParams.set('sortBy', routeState.sortBy);\n\t}\n\n\tif (routeState.limit !== undefined) {\n\t\turl.searchParams.set('limit', String(routeState.limit));\n\t}\n\n\tif (routeState.page !== undefined) {\n\t\turl.searchParams.set('page', String(routeState.page));\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Router — URL creation and parsing\n// ---------------------------------------------------------------------------\n\nexport function makeRouter(\n\tcategoryPageConfigurations: CategoryPageConfiguration[],\n\tfacetConfigurations: FacetConfiguration[],\n\tuserSearchFilters: UserSearchFilter[] = [],\n\tinitialUrl?: string\n) {\n\tconst allFacetingKeys = getAllFacetingKeys(facetConfigurations);\n\tconst allFacetingKeysSet = new Set<string>(allFacetingKeys);\n\tconst userFilterKeysSet = new Set<string>(userSearchFilters.map(f => f.token));\n\tconst preserveCustomKeysSet = new Set<string>([viewModeKey, 'ownership', 'geographicAvailability']);\n\tconst searchParamKeysSet = new Set<string>([\n\t\t'query',\n\t\t'sortBy',\n\t\t'limit',\n\t\t'page',\n\t\t...allFacetingKeys,\n\t\t...userFilterKeysSet,\n\t\t...preserveCustomKeysSet,\n\t]);\n\tconst categoryPagesByCategoryPageUrl: Map<string, CategoryPageConfiguration> = new Map<\n\t\tstring,\n\t\tCategoryPageConfiguration\n\t>();\n\n\tfor (const configuration of categoryPageConfigurations) {\n\t\tcategoryPagesByCategoryPageUrl.set(configuration.categoryPageUrl, configuration);\n\t}\n\n\treturn history<RouteState>({\n\t\tgetLocation: () => {\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\treturn window.location;\n\t\t\t}\n\n\t\t\tconst location = safeUrl(initialUrl ?? '');\n\t\t\tif (!location) {\n\t\t\t\tthrow new Error('A valid initial URL is required to render search server-side.');\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tancestorOrigins: {\n\t\t\t\t\tcontains: () => false,\n\t\t\t\t\titem: () => null,\n\t\t\t\t\tlength: 0,\n\t\t\t\t\t[Symbol.iterator]: function (): IterableIterator<string> {\n\t\t\t\t\t\treturn [][Symbol.iterator]();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tassign: () => {\n\t\t\t\t\tthrow new Error('Search routing cannot navigate while rendering server-side.');\n\t\t\t\t},\n\t\t\t\thash: location.hash,\n\t\t\t\thost: location.host,\n\t\t\t\thostname: location.hostname,\n\t\t\t\thref: location.href,\n\t\t\t\torigin: location.origin,\n\t\t\t\tpathname: location.pathname,\n\t\t\t\tport: location.port,\n\t\t\t\tprotocol: location.protocol,\n\t\t\t\treload: () => {\n\t\t\t\t\tthrow new Error('Search routing cannot reload while rendering server-side.');\n\t\t\t\t},\n\t\t\t\treplace: () => {\n\t\t\t\t\tthrow new Error('Search routing cannot navigate while rendering server-side.');\n\t\t\t\t},\n\t\t\t\tsearch: location.search,\n\t\t\t\ttoString: () => location.toString(),\n\t\t\t};\n\t\t},\n\t\tcleanUrlOnDispose: false,\n\t\tcreateURL({ location, routeState }: { location: { href: string }; routeState: RouteState }) {\n\t\t\ttry {\n\t\t\t\t// detect if we match a category page\n\t\t\t\tconst matchingCategoryPage = getMatchingCategoryPageFromRouteState(\n\t\t\t\t\trouteState,\n\t\t\t\t\tcategoryPageConfigurations,\n\t\t\t\t\tallFacetingKeys\n\t\t\t\t);\n\n\t\t\t\tconst currentUrl = safeUrl(location.href);\n\t\t\t\tif (!currentUrl) {\n\t\t\t\t\treturn location.href;\n\t\t\t\t}\n\n\t\t\t\tif (matchingCategoryPage) {\n\t\t\t\t\tconst categoryPageUrl = safeUrl(matchingCategoryPage.categoryPageUrl, location.href);\n\t\t\t\t\tif (categoryPageUrl) {\n\t\t\t\t\t\twriteCommonSearchParams(categoryPageUrl, routeState);\n\t\t\t\t\t\tconst categoryFacetKeys = new Set(\n\t\t\t\t\t\t\tmatchingCategoryPage.facets.map(facetConfiguration => facetConfiguration.queryParamName)\n\t\t\t\t\t\t);\n\t\t\t\t\t\twriteFacetsSearchParams(categoryPageUrl, routeState.facets, categoryFacetKeys);\n\t\t\t\t\t\twriteUserFilterSearchParams(categoryPageUrl, userSearchFilters, currentUrl);\n\t\t\t\t\t\tpreserveCustomQueryParams(currentUrl, categoryPageUrl, preserveCustomKeysSet);\n\t\t\t\t\t\tpreserveNonSearchQueryParams(currentUrl, categoryPageUrl, searchParamKeysSet);\n\n\t\t\t\t\t\treturn categoryPageUrl.href;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst url = safeUrl('/search', location.href);\n\t\t\t\tif (!url) {\n\t\t\t\t\treturn location.href;\n\t\t\t\t}\n\n\t\t\t\twriteCommonSearchParams(url, routeState);\n\t\t\t\twriteFacetsSearchParams(url, routeState.facets);\n\t\t\t\twriteUserFilterSearchParams(url, userSearchFilters, currentUrl);\n\t\t\t\tpreserveCustomQueryParams(currentUrl, url, preserveCustomKeysSet);\n\t\t\t\tpreserveNonSearchQueryParams(currentUrl, url, searchParamKeysSet);\n\n\t\t\t\treturn url.href;\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[search] router.createURL failed', err);\n\t\t\t\treturn location.href;\n\t\t\t}\n\t\t},\n\n\t\tparseURL({ location }: { location: { href: string } }) {\n\t\t\ttry {\n\t\t\t\tconst locationUrl = safeUrl(location.href);\n\t\t\t\tif (!locationUrl) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst locationPathname = locationUrl.pathname;\n\n\t\t\t\tconst matchingCategoryPage = categoryPagesByCategoryPageUrl.get(locationPathname);\n\n\t\t\t\tconst routeState: RouteState = {};\n\n\t\t\t\tconst addRouteStateFacetValues = (key: string, values: string[]) => {\n\t\t\t\t\tif (values.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\trouteState.facets ??= {};\n\t\t\t\t\trouteState.facets[key] ??= [];\n\n\t\t\t\t\tfor (const value of values) {\n\t\t\t\t\t\trouteState.facets[key].push(value);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (matchingCategoryPage) {\n\t\t\t\t\tfor (const facetConfiguration of matchingCategoryPage.facets) {\n\t\t\t\t\t\taddRouteStateFacetValues(facetConfiguration.queryParamName, [facetConfiguration.value]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst queryParams = locationUrl.searchParams;\n\n\t\t\t\tfor (const [paramName, paramValue] of queryParams.entries()) {\n\t\t\t\t\tif (allFacetingKeysSet.has(paramName)) {\n\t\t\t\t\t\tif (matchingCategoryPage?.facets.some(facet => facet.queryParamName === paramName)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taddRouteStateFacetValues(\n\t\t\t\t\t\t\tparamName,\n\t\t\t\t\t\t\tparamValue\n\t\t\t\t\t\t\t\t.split(delimiter)\n\t\t\t\t\t\t\t\t.map(v => getTrimmedOrUndefinedIfStringEmpty(v))\n\t\t\t\t\t\t\t\t.filter((v): v is string => v !== undefined)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (userFilterKeysSet.has(paramName)) {\n\t\t\t\t\t\trouteState.filters ??= {};\n\t\t\t\t\t\trouteState.filters[paramName] = paramValue;\n\t\t\t\t\t} else if (paramName === 'query') {\n\t\t\t\t\t\trouteState.query = getTrimmedOrUndefinedIfStringEmpty(paramValue);\n\t\t\t\t\t} else if (paramName === 'sortBy') {\n\t\t\t\t\t\trouteState.sortBy = paramValue;\n\t\t\t\t\t} else if (paramName === 'limit') {\n\t\t\t\t\t\tconst limit = parseInt(paramValue, 10);\n\n\t\t\t\t\t\tif (Number.isFinite(limit) && limit > 0) {\n\t\t\t\t\t\t\trouteState.limit = limit;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (paramName === 'page') {\n\t\t\t\t\t\tconst page = parseInt(paramValue, 10);\n\n\t\t\t\t\t\tif (Number.isFinite(page) && page >= 1) {\n\t\t\t\t\t\t\trouteState.page = page;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn routeState;\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[search] router.parseURL failed', err);\n\t\t\t\treturn {};\n\t\t\t}\n\t\t},\n\n\t\twindowTitle(routeState: RouteState) {\n\t\t\ttry {\n\t\t\t\tconst matchingCategoryPage = getMatchingCategoryPageFromRouteState(\n\t\t\t\t\trouteState,\n\t\t\t\t\tcategoryPageConfigurations,\n\t\t\t\t\tallFacetingKeys\n\t\t\t\t);\n\n\t\t\t\tif (matchingCategoryPage) {\n\t\t\t\t\treturn matchingCategoryPage.pageTitle;\n\t\t\t\t}\n\n\t\t\t\treturn 'Search';\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[search] router.windowTitle failed', err);\n\t\t\t\treturn 'Search';\n\t\t\t}\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// Convert search categories to category page configurations\n// ---------------------------------------------------------------------------\n\nexport function convertSearchCategoriesToCategoryPageConfiguration(\n\tcategories: SearchCategory[]\n): CategoryPageConfiguration[] {\n\treturn (categories ?? [])\n\t\t.map(category => {\n\t\t\tif (!category) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst categoryPageUrl = category.categoryPageUrl;\n\t\t\tif (!categoryPageUrl) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (!category.facetRouteKey) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcategoryPageUrl,\n\t\t\t\tfacets: [\n\t\t\t\t\t{\n\t\t\t\t\t\tqueryParamName: category.facetRouteKey,\n\t\t\t\t\t\tvalue: category.displayName,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tpageTitle: category.pageTitle,\n\t\t\t} satisfies CategoryPageConfiguration;\n\t\t})\n\t\t.filter((x): x is CategoryPageConfiguration => x !== null);\n}\n","import { useEffect, useState } from 'react';\n\nexport const hydrationSettledAttribute = 'data-hydration-settled';\n\n/**\n * Reports when the calling component has stopped re-rendering after hydration.\n *\n * End-to-end tests need to know that no further widget can mount, because mounting one calls\n * `addWidgets`, which schedules a search once `ResetScheduleSearch` has restored `scheduleSearch`.\n * The timer is re-armed by every render and fires from a macrotask, so once it resolves any search\n * deferred to a microtask has already reached the network layer.\n *\n * The caller must subscribe to InstantSearch renders (via `useInstantSearch`) so that search\n * cycles re-arm the timer too.\n */\nexport default function useHydrationSettled(): boolean {\n\tconst [isSettled, setIsSettled] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst timeoutId = window.setTimeout(() => setIsSettled(true), 0);\n\t\treturn () => window.clearTimeout(timeoutId);\n\t});\n\n\treturn isSettled;\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { CommandSentence } from '@faithlife/command-sentence-control';\nimport { Button, Typography } from '@faithlife/commerce-components';\nimport { ChevronDown } from 'lucide-react';\nimport { UiState } from 'instantsearch.js';\nimport type { InstantSearchServerState } from 'react-instantsearch-core';\nimport {\n\tConfigure,\n\tConfigureProps,\n\tInstantSearch,\n\tInstantSearchProps,\n\tInstantSearchSSRProvider,\n} from 'react-instantsearch';\nimport {\n\tPagination,\n\tuseHitsPerPage,\n\tuseInstantSearch,\n\tuseCurrentRefinements,\n\tusePagination,\n\tuseSearchBox,\n\tuseSortBy,\n} from 'react-instantsearch';\nimport Drawer from '../shared/drawer';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuTrigger,\n} from '../shared/dropdown-menu';\nimport useScreensize from '../../util/hooks/use-screensize';\n\nimport { cn } from '../../util/cn';\nimport { PerUserDataContextProvider, useCurrentUser } from '../per-user-data/per-user-data-context';\n\nimport { safeJsonParse } from '../../util/safe-json-parse';\nimport { useLocalization } from '../../localization';\nimport { useLocation } from '../../location';\nimport ErrorBoundary from '../error-boundary';\nimport { BooksByAuthor } from '../shared/books-by-author';\nimport { AuthorBatch } from '../../hooks/use-author';\nimport type { AuthorInfo } from '../../hooks/use-author';\nimport { PublisherBatch } from '../../hooks/use-publisher';\nimport type { SectionContentViewModel } from '../../builder';\nimport CategoryContent from './category-content';\nimport {\n\tUserSearchFilter,\n\tUserSearchFilters,\n\tUserSearchFilterProvider,\n\tuseUserSearchFilterContext,\n} from './user-search-filter-context';\nimport { Categories } from './filters';\nimport CurrentQueryRefinement, { CurrentRefinements } from './refinements';\nimport HiddenFacetRefinements from './hidden-facet-refinements';\nimport ProductHits from './products';\nimport SortByAccordion from './sort-by-accordion';\nimport HitsPerPageAccordion from './hits-per-page-accordion';\nimport { SearchCategory, SearchSortOrder } from './types';\nimport { makeStateMapping, makeRouter, convertSearchCategoriesToCategoryPageConfiguration } from './routing';\nimport type { FacetConfiguration, RouteState } from './routing';\nexport { SearchResourcesContext, useSearchResources } from './search-resources';\nimport { SearchResourcesContext, useSearchResources } from './search-resources';\nimport { useSearchImpressions } from './hooks/use-search-impressions';\nimport { useSearchAnalytics } from './hooks/use-search-analytics';\nexport { AlgoliaSearchContextProvider, useAlgoliaSearch } from './algolia-search-context';\nimport { AlgoliaSearchContextProvider, useAlgoliaSearch } from './algolia-search-context';\nimport { useViewMode, ViewMode, ViewModeProvider } from './use-view-mode';\nimport useHydrationSettled, { hydrationSettledAttribute } from './use-hydration-settled';\n\n// ---------------------------------------------------------------------------\n// AlgoliaSSRProvider / AlgoliaProvider — InstantSearch + Configure wrappers\n// ---------------------------------------------------------------------------\n\ntype AlgoliaSearchParameters = Record<string, any>;\n\ntype ConfigurableConfigureProps = Pick<\n\tConfigureProps,\n\t'attributesToHighlight' | 'attributesToRetrieve' | 'queryType' | 'restrictSearchableAttributes'\n> & { searchParameters?: AlgoliaSearchParameters; userSearchFilters?: UserSearchFilter[] };\n\ntype AlgoliaProviderProps<TUiState extends UiState, TRouteState> = Pick<\n\tInstantSearchProps<TUiState, TRouteState>,\n\t'routing' | 'searchClient'\n> &\n\tConfigurableConfigureProps & { initialViewMode: ViewMode };\n\nfunction AlgoliaSSRProvider<TUiState extends UiState = UiState, TRouteState = TUiState>(\n\tprops: React.PropsWithChildren<AlgoliaProviderProps<TUiState, TRouteState>>\n) {\n\treturn <AlgoliaProvider {...props} />;\n}\n\nfunction AlgoliaProvider<TUiState extends UiState = UiState, TRouteState = TUiState>({\n\tattributesToHighlight,\n\tattributesToRetrieve,\n\tqueryType,\n\trestrictSearchableAttributes,\n\trouting,\n\tsearchClient,\n\tsearchParameters,\n\tinitialViewMode,\n\tchildren,\n}: React.PropsWithChildren<AlgoliaProviderProps<TUiState, TRouteState>>) {\n\tconst { indexName } = useAlgoliaSearch();\n\n\treturn (\n\t\t<ViewModeProvider initialViewMode={initialViewMode}>\n\t\t\t<InstantSearch\n\t\t\t\tfuture={{\n\t\t\t\t\tpreserveSharedStateOnUnmount: true,\n\t\t\t\t}}\n\t\t\t\tindexName={indexName}\n\t\t\t\tinsights\n\t\t\t\trouting={routing}\n\t\t\t\tsearchClient={searchClient}\n\t\t\t>\n\t\t\t\t<ConfigureCore\n\t\t\t\t\tattributesToHighlight={attributesToHighlight}\n\t\t\t\t\tattributesToRetrieve={attributesToRetrieve}\n\t\t\t\t\tqueryType={queryType}\n\t\t\t\t\trestrictSearchableAttributes={restrictSearchableAttributes}\n\t\t\t\t\tsearchParameters={searchParameters}\n\t\t\t\t/>\n\t\t\t\t{children}\n\t\t\t</InstantSearch>\n\t\t</ViewModeProvider>\n\t);\n}\n\nconst ParameterBlacklist = new Set(['facets']);\n\nfunction ConfigureCore({\n\tattributesToHighlight,\n\tattributesToRetrieve,\n\tqueryType,\n\trestrictSearchableAttributes,\n\tsearchParameters,\n}: ConfigurableConfigureProps) {\n\tconst { selectedFilterOptions, userSearchFilters } = useUserSearchFilterContext();\n\n\tconst props = useMemo(() => {\n\t\tconst mergedParams = { ...(searchParameters ?? {}) };\n\t\tconst userFilters = Array.isArray(userSearchFilters) ? userSearchFilters : [];\n\n\t\tconst selectedOptions = userFilters\n\t\t\t.map(uf => {\n\t\t\t\tconst selectedOptionToken = selectedFilterOptions[uf.token];\n\t\t\t\tif (!selectedOptionToken) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst selectedOption = uf.options?.find(o => o.token === selectedOptionToken);\n\t\t\t\tif (!selectedOption?.algoliaValue) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn selectedOption.algoliaValue;\n\t\t\t})\n\t\t\t.filter((o): o is string => typeof o === 'string' && o.length > 0);\n\n\t\tconst filterParts = [mergedParams.filters, ...selectedOptions].filter(\n\t\t\t(f): f is string => typeof f === 'string' && f.length > 0\n\t\t);\n\t\tif (filterParts.length > 0) {\n\t\t\tmergedParams.filters = filterParts.join(' AND ');\n\t\t} else {\n\t\t\tdelete mergedParams.filters;\n\t\t}\n\n\t\treturn Object.fromEntries(Object.entries(mergedParams).filter(([key]) => !ParameterBlacklist.has(key)));\n\t}, [searchParameters, userSearchFilters, selectedFilterOptions]);\n\n\treturn (\n\t\t<Configure\n\t\t\tattributesToHighlight={attributesToHighlight}\n\t\t\tattributesToRetrieve={attributesToRetrieve}\n\t\t\tdistinct\n\t\t\tqueryType={queryType}\n\t\t\trestrictSearchableAttributes={restrictSearchableAttributes}\n\t\t\tclickAnalytics\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// Icons\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction CloseIcon({ className, fillColor: _fillColor, ...rest }: any) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tfill=\"none\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\twidth=\"16\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...rest}\n\t\t>\n\t\t\t<path d=\"M12.5 3.5L3.5 12.5M3.5 3.5l9 9\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\" />\n\t\t</svg>\n\t);\n}\n\nfunction FilterIcon({ className, ...rest }: any) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tfill=\"none\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\twidth=\"16\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...rest}\n\t\t>\n\t\t\t<path d=\"M2 4h12M4 8h8M6 12h4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\" />\n\t\t</svg>\n\t);\n}\n\nfunction LayoutGridIcon({ className, ...rest }: any) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tfill=\"none\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\twidth=\"16\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...rest}\n\t\t>\n\t\t\t<rect height=\"5\" rx=\"1\" stroke=\"currentColor\" width=\"5\" x=\"1.5\" y=\"1.5\" />\n\t\t\t<rect height=\"5\" rx=\"1\" stroke=\"currentColor\" width=\"5\" x=\"9.5\" y=\"1.5\" />\n\t\t\t<rect height=\"5\" rx=\"1\" stroke=\"currentColor\" width=\"5\" x=\"1.5\" y=\"9.5\" />\n\t\t\t<rect height=\"5\" rx=\"1\" stroke=\"currentColor\" width=\"5\" x=\"9.5\" y=\"9.5\" />\n\t\t</svg>\n\t);\n}\n\nfunction LayoutListIcon({ className, ...rest }: any) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tfill=\"none\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\twidth=\"16\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...rest}\n\t\t>\n\t\t\t<rect height=\"3\" rx=\"1\" stroke=\"currentColor\" width=\"14\" x=\"1\" y=\"1.5\" />\n\t\t\t<rect height=\"3\" rx=\"1\" stroke=\"currentColor\" width=\"14\" x=\"1\" y=\"6.5\" />\n\t\t\t<rect height=\"3\" rx=\"1\" stroke=\"currentColor\" width=\"14\" x=\"1\" y=\"11.5\" />\n\t\t</svg>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// Layout buttons — grid/list toggle\n// ---------------------------------------------------------------------------\n\nconst LayoutButtonOptions = [\n\t{ label: 'Grid Layout', value: ViewMode.grid, icon: LayoutGridIcon, additionalClassNames: 'lg:p-[6px]' },\n\t{ label: 'List Layout', value: ViewMode.list, icon: LayoutListIcon, additionalClassNames: 'lg:px-[3px] lg:py-[6px]' },\n];\n\nfunction LayoutButtons({\n\tcurrentLayoutType,\n\tsetLayoutType,\n}: {\n\tcurrentLayoutType: ViewMode;\n\tsetLayoutType: (mode: ViewMode) => void;\n}) {\n\treturn (\n\t\t<div className=\"flex gap-[6px]\">\n\t\t\t{LayoutButtonOptions.map(option => {\n\t\t\t\tconst isSelected = currentLayoutType === option.value;\n\t\t\t\tconst IconComponent = option.icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\taria-label={option.label}\n\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\tonClick={() => setLayoutType(option.value)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'px-sp16 py-sp16',\n\t\t\t\t\t\t\t'inline-flex items-center gap-sp8',\n\t\t\t\t\t\t\t'rounded-[4px] border border-primary-500 lg:border-0',\n\t\t\t\t\t\t\t'cursor-pointer',\n\t\t\t\t\t\t\t'text-black-100 aria-pressed:text-primary-400',\n\t\t\t\t\t\t\toption.additionalClassNames\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconComponent />\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// ScrollToTopOnPaginationChange\n// ---------------------------------------------------------------------------\n\nfunction DesktopSearchControl({\n\tprefixText,\n\tvalue,\n\titems,\n\tonChange,\n\ttestId,\n\tcontentClassName,\n}: {\n\tprefixText: string;\n\tvalue: string | number;\n\titems: { label: string; value: string | number }[];\n\tonChange: (value: string | number) => void;\n\ttestId: string;\n\tcontentClassName?: string;\n}) {\n\tconst selectedItem = useMemo(() => {\n\t\treturn items.find(item => item.value === value) ?? items[0];\n\t}, [items, value]);\n\n\tconst selectedLabel = selectedItem?.label ?? value.toString();\n\n\tconst handleValueChange = useCallback(\n\t\t(newValue: string) => {\n\t\t\tconst matchedItem = items.find(item => item.value.toString() === newValue);\n\t\t\tif (matchedItem) {\n\t\t\t\tonChange(matchedItem.value);\n\t\t\t}\n\t\t},\n\t\t[items, onChange]\n\t);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tclassName=\"inline-flex cursor-pointer items-center whitespace-nowrap border-0 bg-transparent p-0 text-black [&[data-state=open]>svg]:rotate-180\"\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t<span className=\"mr-[3px] font-normal\">{prefixText}</span>\n\t\t\t\t<span className=\"font-semibold\">{selectedLabel}</span>\n\t\t\t\t<ChevronDown className=\"ml-[2px] h-4 w-4 transition-transform\" />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className={contentClassName}>\n\t\t\t\t<DropdownMenuRadioGroup onValueChange={handleValueChange} value={value.toString()}>\n\t\t\t\t\t{items.map(item => (\n\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\tclassName=\"w-full data-[state=checked]:bg-primary-100 active:bg-secondary-100 focus-visible:ring-2 focus-visible:ring-primary\"\n\t\t\t\t\t\t\tkey={item.value.toString()}\n\t\t\t\t\t\t\tvalue={item.value.toString()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction ScrollToTopOnPaginationChange() {\n\tconst { currentRefinement } = usePagination();\n\n\tuseEffect(() => {\n\t\twindow.scrollTo({ top: 0, behavior: 'smooth' });\n\t}, [currentRefinement]);\n\n\treturn null;\n}\n\nfunction NoResultsState({ query }: { query: string }) {\n\tconst resources = useSearchResources();\n\tconst normalizedQuery = query.trim();\n\tconst noResultsMessageTemplate = resources['noResults'];\n\tconst searchTips = [resources['checkSpelling'], resources['differentKeywords'], resources['lessSpecific']];\n\n\treturn (\n\t\t<section className=\"my-sp60 mx-auto flex w-full max-w-[640px] flex-col items-start gap-sp48 rounded-md border border-grey-200 bg-grey-50 p-sp60 text-left shadow-sm\">\n\t\t\t<Typography className=\"break-words text-left font-semibold text-black\" tag=\"p\" variant=\"bodyLarge\">\n\t\t\t\t{normalizedQuery && (\n\t\t\t\t\t<CommandSentence Container={React.Fragment} template={noResultsMessageTemplate}>\n\t\t\t\t\t\t<CommandSentence.Field name=\"QUERY\">{normalizedQuery}</CommandSentence.Field>\n\t\t\t\t\t</CommandSentence>\n\t\t\t\t)}\n\t\t\t</Typography>\n\t\t\t<div className=\"flex flex-col items-start gap-sp8 text-left text-black\">\n\t\t\t\t<Typography className=\"font-semibold text-black\" tag=\"p\" variant=\"bodyRegular\">\n\t\t\t\t\t{resources['searchTips']}\n\t\t\t\t</Typography>\n\t\t\t\t<ul className=\"list-disc pl-5\">\n\t\t\t\t\t{searchTips.map(tip => (\n\t\t\t\t\t\t<li className=\"bodyMd\" key={tip}>\n\t\t\t\t\t\t\t{tip}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<Button onClick={() => window.location.assign('/search')} type=\"button\" variant=\"primary\">\n\t\t\t\t{resources['seeAllProducts']}\n\t\t\t</Button>\n\t\t</section>\n\t);\n}\n// ---------------------------------------------------------------------------\n// FilterSortLayout — main search page layout\n// ---------------------------------------------------------------------------\n\nconst FilterSortLayout = ({\n\twishListsProductsUrl,\n\tenableAuthorBioView,\n\tpageLimits,\n\tsortOrders,\n\tsearchResultsAbove,\n}: {\n\twishListsProductsUrl: string;\n\tenableAuthorBioView: boolean;\n\tpageLimits: number[];\n\tsortOrders: SearchSortOrder[];\n\tsearchResultsAbove?: SectionContentViewModel[];\n}) => {\n\tconst resources = useSearchResources();\n\tconst authorBioResources = useLocalization('CommerceWeb.Resources.Search.AuthorBio');\n\n\tconst [isMobileFilterOpen, setIsMobileFilterOpen] = useState(false);\n\n\tconst { viewMode, setViewMode } = useViewMode();\n\tconst { isMobile, isDesktop } = useScreensize();\n\tconst isHydrationSettled = useHydrationSettled();\n\n\tuseSearchImpressions();\n\tuseSearchAnalytics();\n\tconst { results } = useInstantSearch();\n\tconst { query } = useSearchBox();\n\tconst hasNoSearchResults = !results.__isArtificial && results.nbHits === 0;\n\tconst shouldShowResultsRoute = !hasNoSearchResults;\n\tconst { items: currentRefinements } = useCurrentRefinements();\n\n\tconst allSortItems = useMemo(\n\t\t() =>\n\t\t\tsortOrders.map(sortOrder => ({\n\t\t\t\tlabel: resources[sortOrder.label] ?? sortOrder.label,\n\t\t\t\tvalue: sortOrder.value,\n\t\t\t\tisPrepub: sortOrder.isPrepub,\n\t\t\t})),\n\t\t[resources, sortOrders]\n\t);\n\tconst { currentRefinement: currentSortBy, refine: refineSortBy } = useSortBy({ items: allSortItems });\n\tconst hasPrepubCategory = currentRefinements.some(\n\t\titem =>\n\t\t\titem.attribute === 'categories.lvl1' &&\n\t\t\titem.refinements?.some(refinement => refinement.value === 'status > prepub')\n\t);\n\tconst sortItems = useMemo(\n\t\t() => allSortItems.filter(item => !item.isPrepub || hasPrepubCategory || item.value === currentSortBy),\n\t\t[allSortItems, currentSortBy, hasPrepubCategory]\n\t);\n\n\tconst hitsPerPageItems = useMemo(\n\t\t() => pageLimits.map((pageLimit, index) => ({ default: index === 0, label: String(pageLimit), value: pageLimit })),\n\t\t[pageLimits]\n\t);\n\tconst { items: showItems, refine: refineHitsPerPage } = useHitsPerPage({\n\t\titems: hitsPerPageItems,\n\t});\n\tconst currentHitsPerPage = showItems.find(item => item.isRefined)?.value ?? hitsPerPageItems[0].value;\n\n\tconst closeFilter = useCallback(() => setIsMobileFilterOpen(false), []);\n\tconst toggleFilter = useCallback(() => setIsMobileFilterOpen(prev => !prev), []);\n\n\t// Close when resized to desktop\n\tuseEffect(() => {\n\t\tif (isDesktop) {\n\t\t\tcloseFilter();\n\t\t}\n\t}, [isDesktop, closeFilter]);\n\n\tuseEffect(() => {\n\t\tif (hasNoSearchResults) {\n\t\t\tcloseFilter();\n\t\t}\n\t}, [hasNoSearchResults, closeFilter]);\n\n\t// Shared filter panel content used in both mobile fullscreen and tablet drawer\n\tconst filterPanelContent = (\n\t\t<div className=\"isolate flex h-full flex-col\">\n\t\t\t{/* Sticky header — title + close button always visible */}\n\t\t\t<div className=\"sticky top-0 z-10 flex items-center justify-between bg-white py-4 pl-4 pr-5 shadow-sm\">\n\t\t\t\t<Typography className=\"!font-medium text-primary-400\" variant=\"bodyLarge\">\n\t\t\t\t\t{resources['filterAndSort']}\n\t\t\t\t</Typography>\n\t\t\t\t<button\n\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\tclassName=\"w-auto border-0 bg-transparent p-0 hover:bg-transparent\"\n\t\t\t\t\tonClick={closeFilter}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t<CloseIcon className=\"h-4 w-4\" fillColor=\"fill-primary-400\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t{/* Scrollable body — active refinements, \"All filters\" label, sort, filter accordions, see results */}\n\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t<div className=\"px-4 pt-4\">\n\t\t\t\t\t<Typography className=\"mb-2 text-black\" variant=\"bodySmall\">\n\t\t\t\t\t\t{resources['allFilters']}\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<div className=\"mb-4 flex flex-wrap gap-1\">\n\t\t\t\t\t\t<CurrentQueryRefinement />\n\t\t\t\t\t\t<CurrentRefinements />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<SortByAccordion items={sortItems} />\n\t\t\t\t<HitsPerPageAccordion items={hitsPerPageItems} />\n\t\t\t\t<Categories />\n\t\t\t\t<div className=\"border-t border-grey-200 p-4\">\n\t\t\t\t\t<Button className=\"w-full\" onClick={closeFilter} type=\"button\" variant=\"primary\">\n\t\t\t\t\t\t{resources['seeResults']}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Tablet & Mobile: left-side slide-in drawer with scrim via react-modern-drawer, full screen on mobile*/}\n\t\t\t{!isDesktop && shouldShowResultsRoute && (\n\t\t\t\t<Drawer\n\t\t\t\t\tid=\"search-filter-drawer\"\n\t\t\t\t\tisOpen={isMobileFilterOpen}\n\t\t\t\t\tonClose={closeFilter}\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t\tsize={isMobile ? '100vw' : '320px' /* isTablet */}\n\t\t\t\t\tzIndex={5000}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"h-full bg-white\">{filterPanelContent}</div>\n\t\t\t\t</Drawer>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'relative grid gap-8 px-4 md:px-6 lg:mx-auto lg:max-w-[1323px] xxlg:px-4',\n\t\t\t\t\tshouldShowResultsRoute ? 'lg:grid-cols-[300px_auto] xl:grid-cols-[375px_auto]' : 'lg:grid-cols-1'\n\t\t\t\t)}\n\t\t\t\t{...{ [hydrationSettledAttribute]: isHydrationSettled || undefined }}\n\t\t\t>\n\t\t\t\t<ScrollToTopOnPaginationChange />\n\n\t\t\t\t{/* Desktop: static sidebar (always visible in grid flow) */}\n\t\t\t\t{shouldShowResultsRoute && (\n\t\t\t\t\t<div className=\"mt-sp20 hidden self-start border-b border-primary-100 lg:block\">\n\t\t\t\t\t\t<Typography className=\"mb-8 text-black\" variant=\"bodyLarge\">\n\t\t\t\t\t\t\t{resources['allFilters']}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t<Categories />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"flex flex-col gap-8\">\n\t\t\t\t\t\t<CategoryContent sectionKind=\"searchResultsAbove\" initialSectionContents={searchResultsAbove} />\n\t\t\t\t\t\t{enableAuthorBioView && <BooksByAuthor resources={authorBioResources} />}\n\t\t\t\t\t\t{hasNoSearchResults ? (\n\t\t\t\t\t\t\t<NoResultsState query={query} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"mt-sp20 -mx-4 flex flex-col-reverse justify-between px-4 md:-mx-6 md:px-6 lg:mx-0 lg:flex-row lg:items-start lg:px-0\">\n\t\t\t\t\t\t\t\t<div className=\"mt-4 flex flex-wrap items-center gap-1 lg:mt-0 lg:min-w-0 lg:flex-1\">\n\t\t\t\t\t\t\t\t\t<CurrentQueryRefinement />\n\t\t\t\t\t\t\t\t\t<CurrentRefinements />\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"flex shrink-0 gap-8\">\n\t\t\t\t\t\t\t\t\t<div className=\"mr-auto lg:hidden\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"inline-flex cursor-pointer items-center gap-sp8 rounded-[4px] border border-primary-500 px-sp16 py-sp16 text-primary-500 focus:outline-0 focus:ring-0\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid=\"filter-and-sort-button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={toggleFilter}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FilterIcon />\n\t\t\t\t\t\t\t\t\t\t\t<Typography className=\"text-primary-500 font-medium leading-[100%]\" variant=\"bodySmall\">\n\t\t\t\t\t\t\t\t\t\t\t\t{resources['filterAndSort']}\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<LayoutButtons currentLayoutType={viewMode} setLayoutType={setViewMode} />\n\t\t\t\t\t\t\t\t\t<div className=\"bodyMd hidden shrink-0 items-center text-black lg:flex\">\n\t\t\t\t\t\t\t\t\t\t<DesktopSearchControl\n\t\t\t\t\t\t\t\t\t\t\tonChange={newSortBy => refineSortBy(newSortBy.toString())}\n\t\t\t\t\t\t\t\t\t\t\titems={sortItems}\n\t\t\t\t\t\t\t\t\t\t\tprefixText={resources['sortBy']}\n\t\t\t\t\t\t\t\t\t\t\ttestId=\"sort-by-menu-button\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={currentSortBy ?? sortItems[0].value}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"bodyMd hidden shrink-0 items-center text-black lg:flex\">\n\t\t\t\t\t\t\t\t\t\t<DesktopSearchControl\n\t\t\t\t\t\t\t\t\t\t\tcontentClassName=\"w-(--radix-popper-anchor-width) min-w-0\"\n\t\t\t\t\t\t\t\t\t\t\tonChange={newHitsPerPage => refineHitsPerPage(Number(newHitsPerPage))}\n\t\t\t\t\t\t\t\t\t\t\titems={showItems.map(item => ({\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: item.label,\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t\t\t\t\t}))}\n\t\t\t\t\t\t\t\t\t\t\tprefixText={resources['show']}\n\t\t\t\t\t\t\t\t\t\t\ttestId=\"hits-per-page-menu-button\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={currentHitsPerPage ?? hitsPerPageItems[0].value}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t{shouldShowResultsRoute && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ProductHits\n\t\t\t\t\t\t\t\tlayoutType={viewMode}\n\t\t\t\t\t\t\t\twishListsProductsUrl={wishListsProductsUrl}\n\t\t\t\t\t\t\t\tcurrentHitsPerPage={currentHitsPerPage}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Pagination\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'[&>ul>li.previous-page-item>.ais-Pagination-link]:bodyLg',\n\t\t\t\t\t\t\t\t\t'[&>ul>li.next-page-item>.ais-Pagination-link]:bodyLg'\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tclassNames={{\n\t\t\t\t\t\t\t\t\troot: 'py-4 lg:px-4 lg:py-8',\n\t\t\t\t\t\t\t\t\tnoRefinementRoot: 'hidden',\n\t\t\t\t\t\t\t\t\tlist: 'flex gap-[2px] items-center justify-center',\n\t\t\t\t\t\t\t\t\titem: 'bodySm text-black h-6 w-[23px]',\n\t\t\t\t\t\t\t\t\tpreviousPageItem: 'previous-page-item text-primary',\n\t\t\t\t\t\t\t\t\tpageItem: 'pageItem',\n\t\t\t\t\t\t\t\t\tselectedItem: 'bg-primary-100 text-primary',\n\t\t\t\t\t\t\t\t\tdisabledItem: 'opacity-25',\n\t\t\t\t\t\t\t\t\tnextPageItem: 'next-page-item text-primary',\n\t\t\t\t\t\t\t\t\tlink: 'flex items-center justify-center px-2 py-1 h-full w-full',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tshowFirst={false}\n\t\t\t\t\t\t\t\tshowLast={false}\n\t\t\t\t\t\t\t\tshowNext\n\t\t\t\t\t\t\t\tshowPrevious\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\n// ---------------------------------------------------------------------------\n// InstantSearchWrapper — wires up Algolia routing + providers\n// ---------------------------------------------------------------------------\n\nconst InstantSearchWrapper = ({\n\tcategories,\n\tfacetConfigurations,\n\tsearchParameters,\n\twishListsProductsUrl,\n\tenableAuthorBioView,\n\tpageLimits,\n\tsortOrders,\n\tattributesToRetrieve,\n\tsearchResultsAbove,\n\tinitialViewMode,\n\tinitialAuthor,\n}: {\n\tcategories: SearchCategory[];\n\tfacetConfigurations: FacetConfiguration[];\n\tsearchParameters: AlgoliaSearchParameters;\n\twishListsProductsUrl: string;\n\tenableAuthorBioView: boolean;\n\tpageLimits: number[];\n\tsortOrders: SearchSortOrder[];\n\tattributesToRetrieve: string[];\n\tsearchResultsAbove?: SectionContentViewModel[];\n\tinitialViewMode: ViewMode;\n\tinitialAuthor?: AuthorInfo;\n}) => {\n\tconst { client: searchClient, indexName } = useAlgoliaSearch();\n\tconst { userSearchFilters } = useUserSearchFilterContext();\n\tconst { href } = useLocation();\n\tconst stateMapping = useMemo(\n\t\t() => makeStateMapping(indexName, facetConfigurations, sortOrders),\n\t\t[indexName, facetConfigurations, sortOrders]\n\t);\n\tconst categoryPageConfigurations = useMemo(\n\t\t() => convertSearchCategoriesToCategoryPageConfiguration(categories),\n\t\t[categories]\n\t);\n\tconst router = useMemo(\n\t\t() => makeRouter(categoryPageConfigurations, facetConfigurations, userSearchFilters, href),\n\t\t[categoryPageConfigurations, facetConfigurations, userSearchFilters, href]\n\t);\n\tconst routing = useMemo(() => ({ router, stateMapping }), [router, stateMapping]);\n\treturn (\n\t\t<AlgoliaSSRProvider<UiState, RouteState>\n\t\t\tattributesToRetrieve={attributesToRetrieve}\n\t\t\tqueryType=\"prefixNone\"\n\t\t\trouting={routing}\n\t\t\tsearchClient={searchClient}\n\t\t\tsearchParameters={searchParameters}\n\t\t\tinitialViewMode={initialViewMode}\n\t\t>\n\t\t\t<HiddenFacetRefinements facetConfigurations={facetConfigurations} />\n\t\t\t<AuthorBatch.Provider initialData={initialAuthor ? [{ id: initialAuthor.id, data: initialAuthor }] : undefined}>\n\t\t\t\t<PublisherBatch.Provider>\n\t\t\t\t\t<FilterSortLayout\n\t\t\t\t\t\tpageLimits={pageLimits}\n\t\t\t\t\t\tsortOrders={sortOrders}\n\t\t\t\t\t\twishListsProductsUrl={wishListsProductsUrl}\n\t\t\t\t\t\tenableAuthorBioView={enableAuthorBioView}\n\t\t\t\t\t\tsearchResultsAbove={searchResultsAbove}\n\t\t\t\t\t/>\n\t\t\t\t</PublisherBatch.Provider>\n\t\t\t</AuthorBatch.Provider>\n\t\t</AlgoliaSSRProvider>\n\t);\n};\n\n// ---------------------------------------------------------------------------\n// Search — top-level entry component (default export)\n// ---------------------------------------------------------------------------\n\ninterface SearchProps {\n\talgoliaAppId?: string;\n\talgoliaAppKey?: string;\n\talgoliaIndexName?: string;\n\tstorefrontShortname?: string;\n\talgoliaSearchParametersJson?: string;\n\tuserSearchFiltersJson?: string;\n\tinitialUserSearchFilterSelections?: Record<string, string>;\n\tfacetConfigurations?: FacetConfiguration[];\n\tsearchCategories?: SearchCategory[];\n\twishListsProductsUrl?: string;\n\tenableAuthorBioView?: boolean;\n\tsearchResultsAbove?: SectionContentViewModel[];\n\tsearchResultsBelow?: SectionContentViewModel[];\n\tinitialViewMode: ViewMode;\n\tpageLimits: number[];\n\tsortOrders: SearchSortOrder[];\n\tattributesToRetrieve: string[];\n\tserverState?: InstantSearchServerState;\n\tinitialAuthor?: AuthorInfo;\n}\n\nexport default function Search({\n\talgoliaAppId = '',\n\talgoliaAppKey = '',\n\talgoliaIndexName = '',\n\tstorefrontShortname = '',\n\talgoliaSearchParametersJson,\n\tuserSearchFiltersJson,\n\tinitialUserSearchFilterSelections,\n\tfacetConfigurations = [],\n\tsearchCategories = [],\n\twishListsProductsUrl = '',\n\tenableAuthorBioView = false,\n\tpageLimits,\n\tsortOrders,\n\tattributesToRetrieve,\n\tinitialViewMode,\n\tserverState,\n\tinitialAuthor,\n\tsearchResultsAbove,\n\tsearchResultsBelow,\n}: SearchProps) {\n\tconst localizedResources = useLocalization('CommerceWeb.Resources.Search.Search');\n\tconst { userId } = useCurrentUser();\n\tconst searchParameters = useMemo(\n\t\t() => safeJsonParse(algoliaSearchParametersJson) ?? {},\n\t\t[algoliaSearchParametersJson]\n\t);\n\tconst userSearchFilters = useMemo((): UserSearchFilter[] => {\n\t\tconst parsedFilters = safeJsonParse<UserSearchFilters>(userSearchFiltersJson);\n\t\treturn (\n\t\t\tparsedFilters?.filters?.map(filter => ({\n\t\t\t\t...filter,\n\t\t\t\toptions: filter.options.map(option => ({ ...option, isSelected: option.isDefault })),\n\t\t\t})) ?? []\n\t\t);\n\t}, [userSearchFiltersJson]);\n\n\treturn (\n\t\t<div className=\"tw-preflight\">\n\t\t\t<PerUserDataContextProvider>\n\t\t\t\t<SearchResourcesContext.Provider value={localizedResources}>\n\t\t\t\t\t<ErrorBoundary>\n\t\t\t\t\t\t<AlgoliaSearchContextProvider\n\t\t\t\t\t\t\tappId={algoliaAppId}\n\t\t\t\t\t\t\tappKey={algoliaAppKey}\n\t\t\t\t\t\t\tindexName={algoliaIndexName}\n\t\t\t\t\t\t\tstorefrontShortname={storefrontShortname}\n\t\t\t\t\t\t\tuserId={userId}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<UserSearchFilterProvider\n\t\t\t\t\t\t\t\tinitialSelectedFilterOptions={initialUserSearchFilterSelections}\n\t\t\t\t\t\t\t\tuserSearchFilters={userSearchFilters}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<InstantSearchSSRProvider initialResults={serverState?.initialResults}>\n\t\t\t\t\t\t\t\t\t<InstantSearchWrapper\n\t\t\t\t\t\t\t\t\t\tcategories={searchCategories}\n\t\t\t\t\t\t\t\t\t\tfacetConfigurations={facetConfigurations}\n\t\t\t\t\t\t\t\t\t\tsearchParameters={searchParameters}\n\t\t\t\t\t\t\t\t\t\twishListsProductsUrl={wishListsProductsUrl}\n\t\t\t\t\t\t\t\t\t\tenableAuthorBioView={enableAuthorBioView}\n\t\t\t\t\t\t\t\t\t\tpageLimits={pageLimits}\n\t\t\t\t\t\t\t\t\t\tsortOrders={sortOrders}\n\t\t\t\t\t\t\t\t\t\tattributesToRetrieve={attributesToRetrieve}\n\t\t\t\t\t\t\t\t\t\tsearchResultsAbove={searchResultsAbove}\n\t\t\t\t\t\t\t\t\t\tinitialViewMode={initialViewMode}\n\t\t\t\t\t\t\t\t\t\tinitialAuthor={initialAuthor}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</InstantSearchSSRProvider>\n\t\t\t\t\t\t\t</UserSearchFilterProvider>\n\t\t\t\t\t\t</AlgoliaSearchContextProvider>\n\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t</SearchResourcesContext.Provider>\n\t\t\t\t<CategoryContent sectionKind=\"searchResultsBelow\" initialSectionContents={searchResultsBelow} />\n\t\t\t</PerUserDataContextProvider>\n\t\t</div>\n\t);\n}\n","import { useEffect, useRef } from 'react';\nimport { useHits } from 'react-instantsearch';\n\nimport { ProductHit } from '../types';\n\n/**\n * Pushes UA Enhanced Ecommerce impression data to the dataLayer when search results change.\n * Matches the Skeletor pattern of `dataLayer.push({ ecommerce: { impressions: [...] } })`.\n */\nexport function useSearchImpressions() {\n\tconst { results } = useHits<ProductHit>();\n\tconst lastPushedQueryRef = useRef<string | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!results?.hits?.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Deduplicate pushes by using the Algolia query ID (or query string + page as fallback)\n\t\tconst queryKey = (results as any).queryID ?? `${results.query ?? ''}_${results.page ?? 0}`;\n\t\tif (queryKey === lastPushedQueryRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tlastPushedQueryRef.current = queryKey;\n\n\t\tconst impressions = results.hits.map((hit, index) => ({\n\t\t\tid: String(hit.productId),\n\t\t\tname: hit.title ?? '',\n\t\t\tprice: String(hit.salePrice ?? 0),\n\t\t\tlist: 'Search Results',\n\t\t\tposition: String(index),\n\t\t}));\n\n\t\t(window as any).dataLayer = (window as any).dataLayer || [];\n\t\t(window as any).dataLayer.push({\n\t\t\tecommerce: {\n\t\t\t\timpressions,\n\t\t\t},\n\t\t});\n\t}, [results]);\n}\n","import { useEffect, useRef } from 'react';\nimport { useInstantSearch } from 'react-instantsearch';\n\n/**\n * Pushes GTM dataLayer events when users interact with search facets, sort options,\n * and hits-per-page controls. Matches the Skeletor `facet_search` and `results_search` events.\n */\nexport function useSearchAnalytics() {\n\tconst { indexUiState } = useInstantSearch();\n\tconst previousStateRef = useRef<typeof indexUiState | null>(null);\n\n\tuseEffect(() => {\n\t\tconst prevState = previousStateRef.current;\n\t\tpreviousStateRef.current = indexUiState;\n\n\t\t// Skip the initial render — only track user-initiated changes\n\t\tif (!prevState) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dataLayer = ((window as any).dataLayer = (window as any).dataLayer || []);\n\n\t\t// Track sort changes\n\t\tif (indexUiState.sortBy !== prevState.sortBy) {\n\t\t\tdataLayer.push({\n\t\t\t\tevent: 'results_search',\n\t\t\t\tselection: {\n\t\t\t\t\tgroup: 'Sort By',\n\t\t\t\t\toption: indexUiState.sortBy ?? 'default',\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Track hits-per-page changes\n\t\tif (indexUiState.hitsPerPage !== prevState.hitsPerPage) {\n\t\t\tdataLayer.push({\n\t\t\t\tevent: 'results_search',\n\t\t\t\tselection: {\n\t\t\t\t\tgroup: 'Show',\n\t\t\t\t\toption: String(indexUiState.hitsPerPage ?? 15),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Track refinement list (facet) changes\n\t\tconst currentRefinements = indexUiState.refinementList ?? {};\n\t\tconst previousRefinements = prevState.refinementList ?? {};\n\n\t\tconst allFacetKeys = new Set([...Object.keys(currentRefinements), ...Object.keys(previousRefinements)]);\n\n\t\tfor (const facetKey of allFacetKeys) {\n\t\t\tconst currentValues = new Set(currentRefinements[facetKey] ?? []);\n\t\t\tconst previousValues = new Set(previousRefinements[facetKey] ?? []);\n\n\t\t\t// Find newly selected facets\n\t\t\tfor (const value of currentValues) {\n\t\t\t\tif (!previousValues.has(value)) {\n\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\tevent: 'facet_search',\n\t\t\t\t\t\tselection: {\n\t\t\t\t\t\t\tfacetGroup: facetKey,\n\t\t\t\t\t\t\tfacet: value,\n\t\t\t\t\t\t\tchecked: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Find deselected facets\n\t\t\tfor (const value of previousValues) {\n\t\t\t\tif (!currentValues.has(value)) {\n\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\tevent: 'facet_search',\n\t\t\t\t\t\tselection: {\n\t\t\t\t\t\t\tfacetGroup: facetKey,\n\t\t\t\t\t\t\tfacet: value,\n\t\t\t\t\t\t\tchecked: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Track page changes\n\t\tif (indexUiState.page !== prevState.page) {\n\t\t\tdataLayer.push({\n\t\t\t\tevent: 'results_search',\n\t\t\t\tselection: {\n\t\t\t\t\tgroup: 'Page',\n\t\t\t\t\toption: String(indexUiState.page ?? 1),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}, [indexUiState]);\n}\n","export function safeJsonParse<T = any>(json: string | null | undefined): T | null {\n\tif (json === null || json === undefined) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(json) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n"],"names":["ErrorBoundary","Component","constructor","props","super","_defineProperty","this","setState","hasError","error","errorInfo","onReset","state","getDerivedStateFromError","componentDidCatch","onError","console","render","fallback","resetErrorBoundary","fallbackComponent","FallbackComponent","React","children","propTypes","PropTypes","isRequired","showError","defaultProps","__WEBPACK_DEFAULT_EXPORT__","AuthorBatch","createBatchContext","async","nonEmptyIds","ids","filter","id","length","response","fetch","concat","join","ok","Error","status","json","data","find","d","useAuthor","useData","BooksByAuthor","_ref","resources","refinedAuthorIds","_useRefinementList$it","useRefinementList","attribute","items","item","isRefined","map","value","authorId","_useAuthor","author","isLoading","_useState","useState","_useState2","_slicedToArray","isCollapsed","setIsCollapsed","displayName","longDescription","className","Typography","variant","booksBy","IconButton","scale","onClick","ChevronDown","ChevronUp","AuthorBio","imageUrl","imageUrlLarge","bio","PublisherBatch","builderIoModelNamesBySectionKindMap","searchResultsAbove","searchResultsBelow","universalHeader","universalFooter","subscriptionChurnPrevention","configurationWizardSubscriptionsBanner","configurationWizardSubscriptionsContent","configurationWizardLibrariesBanner","orderSummary","orderSummaryFooter","productPage","adzone","notifications","getContentKey","sectionContents","sc","sectionKind","contentSourceKind","contentId","section_content","initialSectionContents","onContentChange","setSectionContents","builderIoModel","isBuilderIoPreviewingThisModel","useIsPreviewingThisBuilderModel","location","useLocation","lastRequestedLocationHref","useRef","undefined","href","useEffect","current","sections","kind","url","get","params","getSections","filteredSections","hasContent","contentKey","fetchSections","notifyWarning","RenderBuilderContent","model","staticData","staticProductData","userInfo","c_defaultUserInfo","filteredContents","_extends","key","builderIo","category_content","_initialSectionConten","_useState2$","setContentState","handleContentChange","useCallback","event","prev","ReadMoreReadLess","SectionContent","UserSearchFilterContext","createContext","readUserFilterSelectionsFromUrl","userSearchFilters","searchParams","defaults","reduce","selectedOptions","_options$find","options","Array","isArray","selectedOption","option","isDefault","token","getDefaultSelectedFilterOptions","_matchingOption$token","urlValue","matchingOption","resolved","useUserSearchFilterContext","context","useContext","UserSearchFilterProvider","initialSelectedFilterOptions","setSelectedFilterOptionsOverride","_useLocation","search","pathname","replaceUrl","useMemo","URLSearchParams","urlSelections","initialSelection","some","selectedFilterOptions","setSelectedFilterOptions","next","currentSelection","first","second","firstKeys","Object","keys","secondKeys","every","areSelectedFilterOptionsEqual","URL","_unused","selectedToken","set","delete","_unused2","writeUserFilterSelectionsToUrl","handleSetSelectedFilterOption","filterToken","optionToken","_objectSpread","contextValue","setSelectedFilterOption","Provider","Accordion","AccordionPrimitive","AccordionItem","ref","_objectWithoutProperties","_excluded","cn","AccordionTrigger","_ref2","_excluded2","AccordionContent","_ref3","_excluded3","SearchResourcesContext","useSearchResources","serializeKey","JSON","stringify","createBoundedResponsesCache","maxCharacters","arguments","cache","Map","characters","defaultValue","events","miss","Promise","resolve","serializedKey","cached","parse","promise","then","serializedValue","existing","size","_cache$get$length","_cache$get","oldestKey","evict","clear","AlgoliaSearchContext","AlgoliaSearchContextProvider","appId","appKey","indexName","storefrontShortname","_ref$userId","userId","client","algoliasearch","responsesCache","anonymousUserToken","setAnonymousUserToken","insightsClient","apiKey","userToken","String","useAlgoliaSearch","parseFacetValue","separatorIndex","indexOf","substring","safeUrl","input","base","Check","checked","fill","height","viewBox","width","xmlns","rx","stroke","y","strokeLinecap","c_statusLabelKeys","ShowMoreToggle","showMore","setShowMore","isShowingMore","LinkButton","as","countDepth","index","depth","getChildren","parent","_ref5","startsWith","Category","_ref8","category","setExpandedFacets","maxLevel","levels","levelsRef","level","refinement","limit","skipSuspense","push","useRefinementLists","accordions","root","label","_ref6","subCategories","_ref7","_ref4","hasChildren","c","replace","getAccordions","accordion","_resources$accordion$","tag","slice","_ref9","refine","eventName","filters","_ref0","child","forEach","_ref1","old","v","lastIndexOf","count","AuthorFacetItem","_ref10","onRefine","PublisherFacetItem","_ref11","AuthorsOrPublishers","_ref12","_resources$attribute","nameAttribute","_useRefinementList","canToggleShowMore","toggleShowMore","_useRefinementList2","idItems","FacetItem","facetItems","_parseFacetValue","idItem","sort","a","b","i","Statuses","_ref13","level1","level2","level3","level4","_ref14","_resources","_c_statusLabelKeys$va","_resources2","_c_statusLabelKeys$it","UserSearchFilterAccordionItem","_ref15","_useUserSearchFilterC","selectedFilterOption","title","isSelected","onChange","type","Categories","expandedFacets","_useState3","_useState4","onValueChange","RefinementLabel","stringValue","AuthorLabel","PublisherLabel","AuthorApiLabel","PublisherApiLabel","_usePublisher","CurrentRefinements","currentRefinements","useCurrentRefinements","itemsByAttribute","refinementList","_currentRefinements$i","_item$refinements","refinements","itemValue","itemAndChildren","r","RefinementChip","_itemsByAttribute$att","X","CurrentQueryRefinement","_searchParams$get$tri","_searchParams$get","urlQuery","trim","_useSearchBox","useSearchBox","query","queryRef","removeQuery","HiddenRefinementList","getHiddenAlgoliaAttributes","config","algoliaAttribute","attributes","minLevel","algoliaAttributeBase","HiddenFacetRefinements","facetConfigurations","isHidden","flatMap","SkeletonRoot","_ref$pending","pending","_ref$hideOverflow","hideOverflow","role","SkeletonBox","EnhancedForLogosLabel","useLocalization","logosOrVerbum","useBrandName","isVerbum","toLowerCase","CommandSentence","template","EnhancedForLogos","Field","name","alt","src","enhanced_for_logos_with_tooltip","Tooltip","placement","link","InfoIconSvgUrl","EnhancedForLogosTooltipContent","usdFormat","Intl","NumberFormat","style","currency","minimumFractionDigits","maximumFractionDigits","useProductCard","_pricingData$primaryS","_pricingData$primaryS2","_hit$salePrice","_hit$salePrice2","_hit$anchorPrice","_hit$anchorPrice2","_pricingData$primaryS3","_pricingData$primaryS4","_pricingData$primaryS5","_hit$title","_prices$anchorPrice","_prices$salePrice","_prices$salePrice$loc","_prices$salePrice2","_pricingData$primaryS6","_hit$isLogosEdition","hit","_ref$queryId","queryId","position","pricingData","usePricing","productId","preferredCurrency","useCurrentUser","_useAlgoliaSearch","hasGeoRestriction","isGeographicallyRestricted","isAddingToCart","setIsAddingToCart","requestIdRef","prices","primarySku","salePrice","amount","displayAmount","format","displayAmountCurrencyCode","localizedDisplayAmount","currencyCode","displayAmountByCurrency","anchorPrice","discountSavings","accessKind","isOwned","hasPreorder","isPrepubProduct","prepubProductStatusSummary","skuId","isPurchasable","handleCartUpdated","e","detail","requestId","handleCartUpdateError","document","addEventListener","removeEventListener","slug","text","normalize","slugify","productPath","productUrl","encodeURIComponent","productName","regularPrice","salePriceCurrency","localizedSalePrice","discountPercentage","anchor","sale","getSavingsPercent","isDiscounted","productImageSrc","primaryImageUri","imageSrc","detectIsAmberOptimizedUrl","isLogosEdition","handleProductClick","window","queryID","objectIDs","positions","handleAddToCart","_pricingData$primaryS7","eventType","eventData","Date","now","Math","random","eventDetail","addToCartUrl","routes","AddToCartUrl","skuIds","quantity","payInFull","searchData","productIds","currentTarget","dispatchEvent","CustomEvent","bubbles","ProductImage","priority","onAuxClick","Image","belowTheFold","sizes","mobile","tablet","desktop","targetAspectRatio","DiscountBadge","_resources$discountFo","badgeClassName","toFixed","ProductTitle","ProductAuthors","authors","ctaButtonScale","skeletonHeightByButtonScale","small","medium","large","ProductPricing","cardData","buttonLayoutClassName","ProductPrice","ProductCta","ownershipLabelClassName","PriceLabel","layout","purchaseStatusMessage","getOwnershipLabel","Button","disabled","Skeleton","AlgoliaGridCard","_hit$averageRating","_hit$reviewCount","productInWishlist","useProductInWishList","averageRating","reviewCount","hasReviewData","hasValidReviewData","EnhancedForLogosWithTooltip","AddToWishListWithForm","StarRating","rating","PrepubProductStatusSummary","ProductOverview","overview","isExpanded","setIsExpanded","showButton","setShowButton","overviewRef","element","scrollHeight","computedLineHeight","getComputedStyle","lineHeight","parsedLineHeight","parseInt","Number","isFinite","dangerouslySetInnerHTML","__html","intent","toggleExpand","AlgoliaListCard","SkeletonBlock","rootClassName","SkeletonButton","ProductSkeleton","layoutType","ProductSkeletons","currentHitsPerPage","from","_","toProductHitResult","toString","products","wishListsProductsUrl","Card","useInstantSearch","HitComponent","_queryID","__position","__queryID","WishListProductBatchProvider","Hits","classNames","list","hitComponent","RadioAccordion","radioGroupName","onSelect","prefixLabel","currentItem","collapsible","SortByAccordion","_useSortBy","useSortBy","currentRefinement","HitsPerPageAccordion","_useHitsPerPage","useHitsPerPage","showItems","ViewMode","ViewModeContext","viewModeKey","ViewModeProvider","initialViewMode","viewMode","setViewMode","history","replaceState","Cookies","arrayToQueryParam","array","emptyIfUndefined","getTrimmedOrUndefinedIfStringEmpty","trimmed","getMatchingCategoryPageFromRouteState","routeState","categoryPageConfigurations","allFacetingKeys","_routeState$facets","facets","Set","_routeState$facets2","categoryPageConfiguration","checkCategoryPageConfigurationMatches","preserveCustomQueryParams","sourceUrl","targetUrl","preserveKeys","entries","has","preserveNonSearchQueryParams","searchParamKeys","writeFacetsSearchParams","excludedKeys","candidateQueryParamValue","writeUserFilterSearchParams","checkFacetValueConfigurationMatches","facetValueConfiguration","routeStateFacetValue","routeStateFacets","facetsConfiguration","matches","routeStateFacet","facetConfiguration","f","queryParamName","writeCommonSearchParams","sortBy","page","hydrationSettledAttribute","AlgoliaSSRProvider","AlgoliaProvider","attributesToHighlight","attributesToRetrieve","queryType","restrictSearchableAttributes","routing","searchClient","searchParameters","InstantSearch","future","preserveSharedStateOnUnmount","insights","ConfigureCore","ParameterBlacklist","mergedParams","uf","_uf$options","selectedOptionToken","o","algoliaValue","filterParts","fromEntries","Configure","distinct","clickAnalytics","CloseIcon","rest","fillColor","strokeWidth","FilterIcon","LayoutButtonOptions","grid","icon","x","additionalClassNames","_excluded4","LayoutButtons","currentLayoutType","setLayoutType","IconComponent","DesktopSearchControl","_selectedItem$label","prefixText","testId","contentClassName","selectedItem","_items$find","selectedLabel","handleValueChange","newValue","matchedItem","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuRadioGroup","DropdownMenuRadioItem","ScrollToTopOnPaginationChange","usePagination","scrollTo","top","behavior","NoResultsState","normalizedQuery","noResultsMessageTemplate","searchTips","Container","tip","assign","FilterSortLayout","_showItems$find$value","_showItems$find","enableAuthorBioView","pageLimits","sortOrders","authorBioResources","isMobileFilterOpen","setIsMobileFilterOpen","_useViewMode","useViewMode","_useScreensize","useScreensize","isMobile","isDesktop","isHydrationSettled","isSettled","setIsSettled","timeoutId","setTimeout","clearTimeout","useHydrationSettled","results","useHits","lastPushedQueryRef","_results$hits","_results$query","_results$page","hits","queryKey","impressions","price","dataLayer","ecommerce","useSearchImpressions","indexUiState","previousStateRef","_indexUiState$refinem","_prevState$refinement","prevState","_indexUiState$sortBy","_indexUiState$hitsPer","selection","group","hitsPerPage","previousRefinements","allFacetKeys","facetKey","_currentRefinements$f","_previousRefinements$","currentValues","previousValues","facetGroup","facet","_indexUiState$page","useSearchAnalytics","hasNoSearchResults","__isArtificial","nbHits","shouldShowResultsRoute","allSortItems","sortOrder","_resources$sortOrder$","isPrepub","currentSortBy","refineSortBy","hasPrepubCategory","sortItems","hitsPerPageItems","pageLimit","default","refineHitsPerPage","closeFilter","toggleFilter","filterPanelContent","Drawer","isOpen","onClose","zIndex","CategoryContent","newSortBy","newHitsPerPage","ProductHits","Pagination","noRefinementRoot","previousPageItem","pageItem","disabledItem","nextPageItem","showFirst","showLast","showNext","showPrevious","InstantSearchWrapper","categories","initialAuthor","_useAlgoliaSearch2","stateMapping","stateToRoute","uiState","_sortOrder$routeValue","facetValues","routeKey","_indexUiState$refinem2","routeKeyPrefix","order","routeValue","routeToState","_sortOrders$find","_routeState$facets3","_routeState$facets4","makeStateMapping","categoryPageUrl","facetRouteKey","pageTitle","convertSearchCategoriesToCategoryPageConfiguration","router","initialUrl","getAllFacetingKeys","allFacetingKeysSet","userFilterKeysSet","preserveCustomKeysSet","searchParamKeysSet","categoryPagesByCategoryPageUrl","configuration","getLocation","ancestorOrigins","contains","Symbol","iterator","hash","host","hostname","origin","port","protocol","reload","cleanUrlOnDispose","createURL","matchingCategoryPage","currentUrl","categoryFacetKeys","err","parseURL","locationUrl","locationPathname","addRouteStateFacetValues","values","_routeState$facets5","_routeState$facets6","_routeState$facets6$k","queryParams","paramName","paramValue","split","_routeState$filters","windowTitle","makeRouter","initialData","Search","_ref12$algoliaAppId","algoliaAppId","_ref12$algoliaAppKey","algoliaAppKey","_ref12$algoliaIndexNa","algoliaIndexName","_ref12$storefrontShor","algoliaSearchParametersJson","userSearchFiltersJson","initialUserSearchFilterSelections","_ref12$facetConfigura","_ref12$searchCategori","searchCategories","_ref12$wishListsProdu","_ref12$enableAuthorBi","serverState","localizedResources","_safeJsonParse","safeJsonParse","_parsedFilters$filter","_parsedFilters$filter2","parsedFilters","PerUserDataContextProvider","InstantSearchSSRProvider","initialResults"],"sourceRoot":""}