{"version":3,"sources":["webpack://@verndale/toolkit/./src/js/modules/search/hooks/useParams.ts","webpack://@verndale/toolkit/./src/js/modules/search/hooks/useFetch.ts","webpack://@verndale/toolkit/./src/js/modules/search/state/Context.tsx","webpack://@verndale/toolkit/./src/js/modules/search/hooks/useSearch.tsx","webpack://@verndale/toolkit/./src/js/modules/search/state/SearchProvider.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/SearchInput.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/FacetsApplied.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/FacetsCategory.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/MobileSort.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/Facets.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/Pagination.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/ResultsCard.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/ResourceCard.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/BlogCard.tsx","webpack://@verndale/toolkit/./src/js/modules/search/components/ProductCard.tsx","webpack://@verndale/toolkit/./src/js/modules/search/App.tsx","webpack://@verndale/toolkit/./src/js/modules/search/index.tsx"],"names":["onPopState","updateQs","useRef","query","page","sort","selectedFacets","useMemo","_a","qs","__objRest","key","queryParams","setQueryParams","useState","updateQueryParams","params","useEffect","buildQueryString","p","qsValue","__spreadValues","newUrl","handlePopState","qsParams","updatedQueryParams","endpoint","data","setData","loading","setLoading","error","setError","__async","result","searchReducer","state","action","selectedfacetClone","category","__spreadProps","SearchContext","React","useContext","sortOrder","children","firstLoad","payload","dispatch","useParams","useFetch","updateQuery","updatePage","updateSort","addFacet","facet","removeFacet","clearFacets","placeholder","useSearch","search","setSearch","handleSubmint","e","clearLabel","facets","getFacetName","tag","processedFacets","item","name","label","tags","expanded","isExpanded","setIsExpanded","uuid","uuidv4","panelEl","togglePanel","el","inner","expand","animate","listEl","handleCheckboxChange","id","isSelected","labelSortRelevance","labelSortAlphabetical","labelSortRecent","getLabel","classNames","title","buttonLabel","labelSortBy","isDesktop","isOpen","isLoading","onClose","toggleFacetsPanel","open","panel","timeline","FacetsApplied","index","FacetsCategory","MobileSort","itemsPerPage","onPaginate","html","locale","resultsTotal","totalPages","goToPage","translate","pages","i","offsetLeft","offsetRight","url","heading","image","type","mastheadSubhead","articleDate","articleAuthor","prodName","solutionName","prodUrl","description","cardType","hasQuery","labelHeading","labelHeadingSummary","labelSearchSummary","labelFilter","labelFilterSort","labelFilterButton","labelFilterClear","labelNoResults","results","refEl","refLoading","setIsDesktop","isFasetPanelOpen","setIsFasetPanelOpen","breakpoint","breakpoints","handleResize","paths","sequence","path","handlePageChange","getSortOptions","sortOrderList","a","b","option","SearchInput","Facets","ResourceCard","BlogCard","ProductCard","ResultsCard","Pagination","_b","SearchProvider","SearchApp"],"mappings":"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","file":"scripts/6531.d443d5cb88bebed2c74d.js","sourcesContent":["import { useRef, useMemo, useState, useEffect } from 'react';\nimport qs from 'qs';\nimport { SelectedFacetsProps } from '../state/Context';\n\nexport type QueryParams = {\n  query?: string;\n  page: number;\n  sort?: string;\n  selectedFacets: SelectedFacetsProps;\n};\n\nconst useParams = (onPopState: (params: QueryParams) => void) => {\n  const updateQs = useRef(false);\n\n  // Get initial params from query string\n  const { query, page, sort, selectedFacets } = useMemo(() => {\n    // Parse the query string\n    const { query, page, sort, ...selectedFacets } = qs.parse(location.search, {\n      ignoreQueryPrefix: true\n    });\n\n    // If the value of the param is a string,\n    // convert it to a single item array\n    Object.keys(selectedFacets).forEach(key => {\n      if (typeof selectedFacets[key] === 'string') {\n        selectedFacets[key] = [selectedFacets[key] as string];\n      }\n    });\n\n    return { query, page, sort, selectedFacets };\n  }, []);\n\n  const [queryParams, setQueryParams] = useState<QueryParams>({\n    query: query ? `${query}` : undefined,\n    page: parseInt(`${page}`) || 1,\n    sort: sort ? `${sort}` : undefined,\n    selectedFacets: selectedFacets as SelectedFacetsProps\n  });\n\n  const updateQueryParams = (params: QueryParams) => {\n    setQueryParams(params);\n  };\n\n  useEffect(() => {\n    // Build the query string and update the URL\n    const buildQueryString = () => {\n      const { selectedFacets, ...p } = queryParams;\n\n      const qsValue = qs.stringify(\n        { ...p, ...selectedFacets },\n        {\n          encode: false,\n          encodeValuesOnly: true,\n          arrayFormat: 'repeat'\n        }\n      );\n\n      const newUrl = `${location.protocol}//${location.host}${\n        location.pathname\n      }${qsValue ? `?${qsValue}` : ''}`;\n      history.pushState({}, '', newUrl);\n    };\n\n    if (updateQs.current) {\n      buildQueryString();\n    } else {\n      updateQs.current = true;\n    }\n  }, [queryParams]);\n\n  useEffect(() => {\n    const handlePopState = () => {\n      const qsParams = qs.parse(location.search, { ignoreQueryPrefix: true });\n      updateQs.current = false;\n\n      const updatedQueryParams = {\n        query: qsParams.query ? `${qsParams.query}` : '',\n        page: parseInt(`${qsParams.page}`) || 1,\n        sort: qsParams.sort ? `${qsParams.sort}` : '',\n        selectedFacets: qsParams.selectedFacets\n          ? (qsParams.selectedFacets as SelectedFacetsProps)\n          : {}\n      };\n\n      if (onPopState) {\n        onPopState(updatedQueryParams);\n      }\n    };\n\n    window.addEventListener('popstate', handlePopState);\n    return () => window.removeEventListener('popstate', handlePopState);\n  }, []);\n\n  return { queryParams, updateQueryParams };\n};\n\nexport default useParams;\n","import { useState, useEffect } from 'react';\nimport { FacetsData } from '../components/Facets';\nimport { SearchStateProps } from '../state/Context';\n\ntype FetchParams = {\n  [key: string]: string | number | string[];\n};\n\ntype EndpointResponse = {\n  facets: FacetsData;\n  resultsTotal: number;\n  results: any[];\n};\n\nconst useFetch = (\n  endpoint: string,\n  { query, page, sort, selectedFacets }: SearchStateProps\n) => {\n  const [data, setData] = useState<EndpointResponse>({\n    facets: [],\n    resultsTotal: 0,\n    results: []\n  });\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(false);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      const params: FetchParams = {};\n      setLoading(true);\n      setError(false);\n\n      if (query) {\n        params.query = query;\n      }\n\n      if (page) {\n        params.page = page;\n      }\n\n      if (sort) {\n        params.sort = sort;\n      }\n\n      if (selectedFacets) {\n        Object.keys(selectedFacets).forEach(key => {\n          params[key] = selectedFacets[key];\n        });\n      }\n\n      try {\n        const result = await fetch(endpoint, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify(params)\n        });\n\n        setData(await result.json());\n      } catch (error) {\n        setError(true);\n      }\n\n      setLoading(false);\n    };\n\n    fetchData();\n  }, [endpoint, query, page, sort, selectedFacets]);\n\n  return { data, loading, error };\n};\n\nexport default useFetch;\n","import * as React from 'react';\n\nexport type FacetProps = {\n  id: string;\n  name: string;\n  count: number;\n};\n\nexport type FacetCategoryProps = {\n  name: string;\n  label: string;\n  tags: FacetProps[];\n};\n\nexport type SelectedFacetsProps = {\n  [category: string]: string[];\n};\n\nexport type SearchStateProps = {\n  query?: string;\n  page: number;\n  sort: string;\n  facets: FacetCategoryProps[];\n  selectedFacets: SelectedFacetsProps;\n  results: any[];\n  resultsTotal: number;\n  loading: boolean;\n};\n\ntype SearchContextProps = {\n  state: SearchStateProps;\n  updateQuery: (query: string) => void;\n  updatePage: (page: number) => void;\n  updateSort: (sort: string) => void;\n  addFacet: (category: string, facet: string) => void;\n  removeFacet: (category: string, facet: string) => void;\n  clearFacets: () => void;\n};\n\ntype SearchActionType =\n  | 'UPDATE_PARAMS'\n  | 'UPDATE_QUERY'\n  | 'UPDATE_PAGE'\n  | 'UPDATE_SORT'\n  | 'ADD_FACET'\n  | 'REMOVE_FACET'\n  | 'CLEAR_FACETS'\n  | 'SET_DATA';\n\ntype SearchAction = { type: SearchActionType; payload?: any };\n\nexport const searchReducer = (\n  state: SearchStateProps,\n  action: SearchAction\n) => {\n  let selectedfacetClone: SelectedFacetsProps;\n  let category: string[];\n\n  switch (action.type) {\n    case 'UPDATE_PARAMS':\n      return {\n        ...state,\n        ...action.payload\n      };\n    case 'UPDATE_QUERY':\n      return {\n        ...state,\n        query: action.payload,\n        page: 1\n      };\n    case 'UPDATE_PAGE':\n      return {\n        ...state,\n        page: action.payload\n      };\n    case 'UPDATE_SORT':\n      return {\n        ...state,\n        sort: action.payload,\n        page: 1\n      };\n    case 'ADD_FACET':\n      selectedfacetClone = JSON.parse(JSON.stringify(state.selectedFacets));\n      category = selectedfacetClone[action.payload.category] || [];\n      selectedfacetClone[action.payload.category] = [\n        ...category,\n        action.payload.facet\n      ];\n\n      return {\n        ...state,\n        selectedFacets: selectedfacetClone,\n        page: 1\n      };\n    case 'REMOVE_FACET':\n      selectedfacetClone = JSON.parse(JSON.stringify(state.selectedFacets));\n\n      selectedfacetClone[action.payload.category].splice(\n        selectedfacetClone[action.payload.category].indexOf(\n          action.payload.facet\n        ),\n        1\n      );\n\n      if (!selectedfacetClone[action.payload.category].length) {\n        delete selectedfacetClone[action.payload.category];\n      }\n\n      return {\n        ...state,\n        selectedFacets: selectedfacetClone,\n        page: 1\n      };\n    case 'CLEAR_FACETS':\n      return {\n        ...state,\n        selectedFacets: {},\n        page: 1\n      };\n    case 'SET_DATA':\n      return {\n        ...state,\n        results: action.payload.results,\n        resultsTotal: action.payload.resultsTotal,\n        facets: action.payload.facets\n      };\n    default:\n      return state;\n  }\n};\n\nexport const SearchContext = React.createContext<SearchContextProps>({\n  state: {\n    page: 1,\n    sort: 'relevance',\n    facets: [],\n    selectedFacets: {},\n    results: [],\n    resultsTotal: 0,\n    loading: false\n  },\n  updateQuery: () => undefined,\n  updatePage: () => undefined,\n  updateSort: () => undefined,\n  addFacet: () => undefined,\n  removeFacet: () => undefined,\n  clearFacets: () => undefined\n});\n","import { useContext } from 'react';\nimport { SearchContext } from '../state/Context';\n\nconst useSearch = () => useContext(SearchContext);\n\nexport default useSearch;\n","import * as React from 'react';\nimport { useFetch, useParams } from '../hooks';\nimport { QueryParams } from '../hooks/useParams';\nimport { SearchContext, searchReducer } from './Context';\n\nconst SearchProvider: React.FC<\n  { endpoint: string; sortOrder: string | undefined } & React.PropsWithChildren\n> = ({ endpoint, sortOrder, children }) => {\n  const firstLoad = React.useRef(true);\n\n  const onPopState = React.useCallback((payload: QueryParams) => {\n    dispatch({ type: 'UPDATE_PARAMS', payload });\n  }, []);\n\n  const {\n    queryParams: { query, page, sort, selectedFacets },\n    updateQueryParams\n  } = useParams(onPopState);\n\n  const [state, dispatch] = React.useReducer(searchReducer, {\n    query,\n    page,\n    sort: sortOrder ? sortOrder.split(',')[0] : sort,\n    facets: [],\n    selectedFacets,\n    results: [],\n    resultsTotal: 0,\n    loading: false\n  });\n\n  const { data, loading } = useFetch(endpoint, state);\n\n  const updateQuery = (payload: string) => {\n    dispatch({ type: 'UPDATE_QUERY', payload });\n  };\n\n  const updatePage = (payload: number) =>\n    dispatch({ type: 'UPDATE_PAGE', payload });\n\n  const updateSort = (payload: string) =>\n    dispatch({ type: 'UPDATE_SORT', payload });\n\n  const addFacet = (category: string, facet: string) =>\n    dispatch({ type: 'ADD_FACET', payload: { category, facet } });\n\n  const removeFacet = (category: string, facet: string) =>\n    dispatch({ type: 'REMOVE_FACET', payload: { category, facet } });\n\n  const clearFacets = () => dispatch({ type: 'CLEAR_FACETS' });\n\n  React.useEffect(() => {\n    if (!firstLoad.current) {\n      updateQueryParams({\n        query: state.query,\n        page: state.page,\n        sort: state.sort,\n        selectedFacets: state.selectedFacets\n      });\n\n      dispatch({ type: 'SET_DATA', payload: data });\n    } else {\n      firstLoad.current = false;\n    }\n  }, [data]);\n\n  return (\n    <SearchContext.Provider\n      value={{\n        state: { ...state, loading },\n        updateQuery,\n        updatePage,\n        updateSort,\n        addFacet,\n        removeFacet,\n        clearFacets\n      }}\n    >\n      {children}\n    </SearchContext.Provider>\n  );\n};\n\nexport default SearchProvider;\n","import * as React from 'react';\nimport { useSearch } from '../hooks';\n\ninterface ISearchInput {\n  placeholder?: string;\n}\n\nconst SearchInput: React.FC<ISearchInput> = ({ placeholder }) => {\n  const {\n    state: { query },\n    updateQuery\n  } = useSearch();\n  const [search, setSearch] = React.useState(query);\n\n  const handleSubmint = React.useCallback(\n    (e: React.FormEvent<HTMLFormElement>) => {\n      e.preventDefault();\n      if (search) {\n        updateQuery(search);\n      }\n    },\n    [search]\n  );\n\n  return (\n    <form className=\"search__input\" onSubmit={handleSubmint}>\n      <input\n        type=\"text\"\n        placeholder={placeholder}\n        className=\"search__input-field\"\n        value={search}\n        onChange={e => setSearch(e.target.value)}\n      />\n      {search && (\n        <button\n          type=\"button\"\n          aria-label=\"Clear\"\n          className=\"search__input-clear\"\n          onClick={() => setSearch('')}\n        >\n          <svg role=\"presentation\">\n            <use xlinkHref=\"#close\" />\n          </svg>\n        </button>\n      )}\n    </form>\n  );\n};\n\nexport default SearchInput;\n","import * as React from 'react';\nimport { useSearch } from '../hooks';\n\nexport type Facet = {\n  id: string;\n  name: string;\n};\n\nexport type SelectedFacets = {\n  [key: string]: Facet[];\n};\n\nconst FacetsApplied: React.FC<{ clearLabel: string }> = ({ clearLabel }) => {\n  const {\n    state: { facets, selectedFacets },\n    removeFacet,\n    clearFacets\n  } = useSearch();\n\n  if (!Object.keys(selectedFacets).length) return null;\n\n  const getFacetName = (category: string, key: string) => {\n    const facet = facets.find(facet => facet.name === category);\n    const tag = facet?.tags.find(facet => facet.id === key);\n\n    return tag?.name;\n  };\n\n  const processedFacets = Object.keys(selectedFacets)\n    .map(key => {\n      return selectedFacets[key]\n        .map(item => {\n          const name = getFacetName(key, item);\n\n          if (!name) return null;\n          return { key, item, name };\n        })\n        .filter(facet => facet !== null);\n    })\n    .flat();\n\n  if (!processedFacets.length) return null;\n\n  return (\n    <div className=\"search__facets-applied\">\n      <ul className=\"search__facets-applied__list\">\n        {processedFacets.map(facet =>\n          facet ? (\n            <li key={facet.item}>\n              <button\n                className=\"btn btn--primary\"\n                onClick={() => removeFacet(facet.key, facet.item)}\n              >\n                <span>\n                  {facet.name}\n                  <svg role=\"presentation\">\n                    <use xlinkHref=\"#close\" />\n                  </svg>\n                </span>\n              </button>\n            </li>\n          ) : null\n        )}\n      </ul>\n      <button className=\"search__facets-applied__clear\" onClick={clearFacets}>\n        {clearLabel}\n      </button>\n    </div>\n  );\n};\n\nexport default FacetsApplied;\n","import * as React from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { animate } from 'motion';\nimport { FacetProps } from '../state/Context';\nimport { useSearch } from '../hooks';\n\nexport interface IFacetsCategory {\n  name: string;\n  label: string;\n  tags: FacetProps[];\n  expanded: boolean;\n}\n\nconst FacetsCategory: React.FC<IFacetsCategory> = ({\n  name,\n  label,\n  tags,\n  expanded = false\n}) => {\n  const {\n    state: { selectedFacets },\n    addFacet,\n    removeFacet\n  } = useSearch();\n  const [isExpanded, setIsExpanded] = React.useState(expanded);\n  const uuid = React.useMemo(() => uuidv4(), []);\n  const panelEl = React.useRef<HTMLDivElement>(null);\n\n  const togglePanel = React.useCallback(\n    async (el: HTMLDivElement, inner: HTMLUListElement, expand: boolean) => {\n      if (expand) {\n        inner.style.display = 'block';\n\n        await animate(\n          el,\n          {\n            height: `${inner.clientHeight}px`\n          },\n          {\n            duration: 0.3\n          }\n        ).finished;\n\n        el.style.height = 'auto';\n      } else {\n        el.style.height = `${inner.clientHeight}px`;\n        await animate(\n          el,\n          {\n            height: 0\n          },\n          {\n            duration: 0.3\n          }\n        ).finished;\n        inner.style.display = 'none';\n      }\n    },\n    []\n  );\n\n  React.useEffect(() => {\n    const listEl = panelEl.current?.querySelector('ul');\n    if (panelEl.current && listEl) {\n      togglePanel(panelEl.current, listEl, isExpanded);\n    }\n  }, [isExpanded]);\n\n  const handleCheckboxChange = React.useCallback(\n    (id: string) => {\n      if (!isSelected(id)) {\n        addFacet(name, id);\n      } else {\n        removeFacet(name, id);\n      }\n    },\n    [selectedFacets]\n  );\n\n  const isSelected = React.useCallback(\n    (id: string) => {\n      return !!selectedFacets[name] && !!selectedFacets[name].includes(id);\n    },\n    [selectedFacets]\n  );\n\n  if (!tags.filter(tag => !!tag.count).length) {\n    return null;\n  }\n\n  return (\n    <div className=\"search__facets-category\">\n      <button\n        type=\"button\"\n        className=\"search__facets-category__trigger\"\n        id={`trigger-${uuid}`}\n        aria-expanded={isExpanded}\n        onClick={() => setIsExpanded(!isExpanded)}\n        aria-controls={`panel-${uuid}`}\n      >\n        <div>\n          {label}{' '}\n          {!!selectedFacets[name]?.length && (\n            <span>({selectedFacets[name].length})</span>\n          )}\n        </div>\n        <svg role=\"presentation\">\n          <use xlinkHref=\"#chevron-down\" />\n        </svg>\n      </button>\n\n      <div\n        ref={panelEl}\n        role=\"region\"\n        className=\"search__facets-category__panel\"\n        id={`panel-${uuid}`}\n        aria-labelledby={`trigger-${uuid}`}\n      >\n        <ul>\n          {tags\n            .filter(tag => !!tag.count)\n            .map(tag => (\n              <li key={tag.id}>\n                <label className=\"search__facets-category__item\">\n                  <div>\n                    <input\n                      type=\"checkbox\"\n                      checked={isSelected(tag.id)}\n                      onChange={() => handleCheckboxChange(tag.id)}\n                    />\n                    {tag.name}\n                  </div>\n                  <span>{tag.count}</span>\n                </label>\n              </li>\n            ))}\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nexport default FacetsCategory;\n","import * as React from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { animate } from 'motion';\nimport { useSearch } from '../hooks';\nimport classNames from 'classnames';\n\nexport interface IMobileSort {\n  label: string;\n  labelSortRelevance: string;\n  labelSortAlphabetical: string;\n  labelSortRecent: string;\n}\n\nconst MobileSort: React.FC<IMobileSort> = ({\n  label,\n  labelSortRelevance,\n  labelSortAlphabetical,\n  labelSortRecent\n}) => {\n  const {\n    state: { sort },\n    updateSort\n  } = useSearch();\n  const [isExpanded, setIsExpanded] = React.useState(false);\n  const uuid = React.useMemo(() => uuidv4(), []);\n  const panelEl = React.useRef<HTMLDivElement>(null);\n\n  const togglePanel = React.useCallback(\n    async (el: HTMLDivElement, inner: HTMLUListElement, expand: boolean) => {\n      if (expand) {\n        inner.style.display = 'block';\n\n        animate(\n          el,\n          {\n            height: `${inner.clientHeight}px`\n          },\n          {\n            duration: 0.3\n          }\n        );\n      } else {\n        await animate(\n          el,\n          {\n            height: 0\n          },\n          {\n            duration: 0.3\n          }\n        ).finished;\n        inner.style.display = 'none';\n      }\n    },\n    []\n  );\n\n  React.useEffect(() => {\n    const listEl = panelEl.current?.querySelector('ul');\n    if (panelEl.current && listEl) {\n      togglePanel(panelEl.current, listEl, isExpanded);\n    }\n  }, [isExpanded]);\n\n  const getLabel = () => {\n    switch (sort) {\n      case 'relevance':\n        return labelSortRelevance;\n      case 'alphabetical':\n        return labelSortAlphabetical;\n      case 'recent':\n        return labelSortRecent;\n      default:\n        return labelSortRelevance;\n    }\n  };\n\n  return (\n    <div className=\"search__facets-category search__facets-category--sort\">\n      <button\n        type=\"button\"\n        className=\"search__facets-category__trigger\"\n        id={`trigger-${uuid}`}\n        aria-expanded={isExpanded}\n        onClick={() => setIsExpanded(!isExpanded)}\n        aria-controls={`panel-${uuid}`}\n      >\n        <div>\n          {label} {getLabel()}\n        </div>\n        <svg role=\"presentation\">\n          <use xlinkHref=\"#chevron-down\" />\n        </svg>\n      </button>\n\n      <div\n        ref={panelEl}\n        role=\"region\"\n        className=\"search__facets-category__panel\"\n        id={`panel-${uuid}`}\n        aria-labelledby={`trigger-${uuid}`}\n      >\n        <ul>\n          <li>\n            <button\n              className={classNames([\n                'search__facets-category__item',\n                'search__facets-category__item--button',\n                {\n                  'search__facets-category__item--active':\n                    !sort || sort === 'relevance'\n                }\n              ])}\n              onClick={() => updateSort('relevance')}\n            >\n              {labelSortRelevance}\n            </button>\n          </li>\n          <li>\n            <button\n              className={classNames([\n                'search__facets-category__item',\n                'search__facets-category__item--button',\n                {\n                  'search__facets-category__item--active':\n                    sort === 'alphabetical'\n                }\n              ])}\n              onClick={() => updateSort('alphabetical')}\n            >\n              {labelSortAlphabetical}\n            </button>\n          </li>\n          <li>\n            <button\n              className={classNames([\n                'search__facets-category__item',\n                'search__facets-category__item--button',\n                { 'search__facets-category__item--active': sort === 'recent' }\n              ])}\n              onClick={() => updateSort('recent')}\n            >\n              {labelSortRecent}\n            </button>\n          </li>\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nexport default MobileSort;\n","import * as React from 'react';\nimport { timeline } from 'motion';\nimport { TimelineDefinition } from '@motionone/dom/types/timeline/types';\nimport FacetsApplied from '../components/FacetsApplied';\nimport FacetsCategory, { IFacetsCategory } from '../components/FacetsCategory';\nimport { useSearch } from '../hooks';\nimport MobileSort from './MobileSort';\nimport classNames from 'classnames';\n\nexport type FacetsData = Array<IFacetsCategory>;\n\ninterface IFacets {\n  title: string;\n  buttonLabel: string;\n  clearLabel: string;\n  labelSortBy: string;\n  labelSortRelevance: string;\n  labelSortAlphabetical: string;\n  labelSortRecent: string;\n  isDesktop: boolean;\n  isOpen: boolean;\n  isLoading: boolean;\n  onClose: () => void;\n}\n\nconst Facets: React.FC<IFacets> = ({\n  title,\n  clearLabel,\n  buttonLabel,\n  labelSortBy,\n  labelSortRelevance,\n  labelSortAlphabetical,\n  labelSortRecent,\n  isDesktop,\n  isOpen,\n  isLoading,\n  onClose\n}) => {\n  const {\n    state: { facets }\n  } = useSearch();\n\n  const panelEl = React.useRef<HTMLDivElement>(null);\n\n  const toggleFacetsPanel = React.useCallback(async (open: boolean) => {\n    const panel = panelEl.current;\n    const inner = panelEl.current?.querySelector('.search__facets-inner');\n\n    if (panel && inner) {\n      if (open) {\n        panelEl.current.style.visibility = 'visible';\n\n        const sequence = [\n          [panel, { opacity: 1 }, { duration: 0.2 }],\n          [inner, { x: 0 }, { duration: 0.8, easing: 'ease-out' }]\n        ] as TimelineDefinition;\n\n        await timeline(sequence, { duration: 0.6 });\n      } else {\n        const sequence = [\n          [inner, { x: '100%' }, { duration: 0.8, easing: 'ease-in' }],\n          [panel, { opacity: 0 }, { duration: 0.2 }]\n        ] as TimelineDefinition;\n\n        await timeline(sequence, { duration: 0.6 }).finished;\n        panelEl.current.style.visibility = 'hidden';\n      }\n    }\n  }, []);\n\n  React.useEffect(() => {\n    toggleFacetsPanel(isOpen);\n  }, [isOpen]);\n\n  return (\n    <div\n      className={classNames([\n        'search__facets',\n        { 'search__facets--hidden': isLoading }\n      ])}\n      ref={panelEl}\n    >\n      <div className=\"search__facets-inner\">\n        <div className=\"search__facets-header\">\n          <p className=\"search__facets-title\">{title}</p>\n          {!isDesktop && (\n            <button onClick={onClose} aria-label=\"Close\">\n              <svg role=\"presentation\">\n                <use xlinkHref=\"#close\" />\n              </svg>\n            </button>\n          )}\n        </div>\n\n        {!isDesktop && <FacetsApplied clearLabel={clearLabel} />}\n\n        {facets.map((category, index) => (\n          <FacetsCategory\n            key={category.label}\n            {...category}\n            expanded={!index}\n          />\n        ))}\n\n        <MobileSort\n          label={labelSortBy}\n          labelSortRelevance={labelSortRelevance}\n          labelSortAlphabetical={labelSortAlphabetical}\n          labelSortRecent={labelSortRecent}\n        />\n\n        <button type=\"button\" className=\"btn btn--primary\" onClick={onClose}>\n          <span>{buttonLabel}</span>\n        </button>\n      </div>\n    </div>\n  );\n};\n\nexport default Facets;\n","import * as React from 'react';\nimport { useSearch } from '../hooks';\n\ninterface PaginationProps {\n  itemsPerPage: number;\n  onPaginate: () => void;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n  itemsPerPage,\n  onPaginate\n}) => {\n  // Get locale from html element\n  const html = document.querySelector('html');\n  const locale = html?.getAttribute('lang') || 'en';\n\n  const {\n    state: { page, resultsTotal },\n    updatePage\n  } = useSearch();\n\n  const totalPages = Math.ceil(resultsTotal / itemsPerPage);\n\n  const goToPage = (page: number) => {\n    onPaginate();\n    updatePage(page);\n  };\n\n  if (totalPages < 2) {\n    return null;\n  }\n\n  const translate = (key: number) => {\n    return key.toLocaleString(locale);\n  };\n\n  const displayPages = () => {\n    const pages = [];\n\n    for (let i = 1; i <= totalPages; i++) {\n      if (i > 1 && i < totalPages) {\n        const offsetLeft = page === 1 ? 2 : 1;\n        const offsetRight = page === totalPages ? 2 : 1;\n\n        if (i === page + offsetLeft + 1 || i === page - offsetRight - 1) {\n          pages.push(\n            <span className=\"pagination__separator\" key={`separator-${i}`}>\n              ...\n            </span>\n          );\n        }\n\n        if (i > page + offsetLeft || i < page - offsetRight) {\n          continue;\n        }\n      }\n\n      pages.push(\n        <button\n          key={`page-${i}`}\n          className=\"pagination__button\"\n          aria-label={`Goto Page ${i}`}\n          aria-current={i === page ? 'true' : undefined}\n          onClick={() => goToPage(i)}\n        >\n          {translate(i)}\n        </button>\n      );\n    }\n\n    return pages;\n  };\n\n  return (\n    <nav className=\"pagination\" aria-label=\"Pagination\">\n      <button\n        className=\"pagination__prev\"\n        aria-label=\"Goto Previous Page\"\n        disabled={page === 1}\n        onClick={() => goToPage(page - 1)}\n      >\n        <span></span>\n      </button>\n      {displayPages()}\n      <button\n        className=\"pagination__next\"\n        aria-label=\"Goto Next Page\"\n        disabled={page === totalPages}\n        onClick={() => goToPage(page + 1)}\n      >\n        <span></span>\n      </button>\n    </nav>\n  );\n};\n\nexport default Pagination;\n","import * as React from 'react';\n\ninterface IResultsCard {\n  url: string;\n  heading: string;\n  tags: Array<string>;\n}\n\nconst ResultsCard: React.FC<IResultsCard> = ({ url, heading, tags }) => {\n  return (\n    <a href={url} className=\"release-card\">\n      <h3 className=\"release-card__heading\">{heading}</h3>\n      <p className=\"release-card__description\">{tags.join(', ')}</p>\n    </a>\n  );\n};\n\nexport default ResultsCard;\n","import * as React from 'react';\n\ninterface IResourceCard {\n  url: string;\n  image: {\n    description: string;\n    png: string;\n    webp: string;\n  };\n  heading: string;\n  type: string;\n}\n\nconst ResourceCard: React.FC<IResourceCard> = ({\n  url,\n  image,\n  heading,\n  type\n}) => {\n  return (\n    <a href={url} className=\"image-card\">\n      <div className=\"picture\">\n        <picture>\n          <source srcSet={image?.webp} type=\"image/webp\" />\n          <img\n            src={image?.png}\n            width=\"665\"\n            height=\"375\"\n            alt={image?.description}\n          />\n        </picture>\n      </div>\n      <div className=\"image-card__content\">\n        <h3 className=\"image-card__heading\">{heading}</h3>\n        <p className=\"image-card__description\">{type}</p>\n      </div>\n    </a>\n  );\n};\n\nexport default ResourceCard;\n","import * as React from 'react';\n\ninterface IBlogCard {\n  url: string;\n  image: {\n    description: string;\n    png: string;\n    webp: string;\n  };\n  heading: string;\n  blurb: string;\n  tags: string[];\n  articleDate: string;\n  articleAuthor: string;\n  mastheadSubhead: string;\n}\n\nconst BlogCard: React.FC<IBlogCard> = ({\n  url,\n  image,\n  heading,\n  mastheadSubhead,\n  tags,\n  articleDate,\n  articleAuthor,\n}) => {\n  return (\n    <a href={url} className=\"blog-card bListing\">\n      <div className=\"picture\">\n        <picture>\n          <source srcSet={image?.webp} type=\"image/webp\" />\n          <img\n            src={image?.png}\n            width=\"665\"\n            height=\"375\"\n            alt={image?.description}\n          />\n        </picture>\n      </div>\n      <div className=\"blog-card__content\">\n      {tags.length > 0 && (\n            <ul className=\"blog-card__tags\">\n              {tags.map(tag => (\n                <li key={tag} className=\"blog-card__tag\">\n                  {tag}\n                </li>\n              ))}\n            </ul>\n          )}\n        <h3 className=\"blog-card__heading\">{heading}</h3>\n        <div className=\"blog-card__details\">\n          <div className=\"blog-card__info-tags\">\n          <p className=\"blog-card__info-tag\"><a href={url} className=\"\">{articleAuthor}</a></p>\n          <p className=\"blog-card__info-tag\">{articleDate}</p>              \n          </div>\n        </div>\n        <p className=\"blog-card__description\">{mastheadSubhead}</p>\n      </div>\n    </a>\n  );\n};\n\nexport default BlogCard;\n","import * as React from 'react';\n\ninterface IProductCard {\n  url: string;\n  prodUrl: string;\n  prodName: string;\n  solutionName: string;\n  description: string;\n  tags: string[];\n}\n\nconst ProductCard: React.FC<IProductCard> = ({\n  url,\n  prodName,\n  solutionName,\n  prodUrl,\n  description,\n  tags,\n}) => {\n  return (\n    <a href={url} className=\"product-card\">\n      <div className=\"product-card__content\">\n      <div className='product-card__title'>\n        <h3 className=\"product-card__solution\">{solutionName}</h3>\n        <h3 className=\"product-card__heading\">{prodName}</h3>        \n      </div>\n        <div className=\"product-card__details\">\n          <div className=\"product-card__info-tags\">             \n          </div>\n        </div>\n        <p className=\"product-card__description\">{description}</p>\n\n        {tags.length > 0 && (\n        <p className='product-card__tags-heading'>Features</p>\n        )}\n        {tags.length > 0 && (          \n            <ul className=\"product-card__tags\">\n              {tags.map(tag => (\n                <li key={tag} className=\"product-card__tag\">\n                  <a href={prodUrl}>{tag}</a>\n                </li>\n              ))}\n            </ul>\n        )}\n      \n      </div>\n    </a>\n  );\n};\n\nexport default ProductCard;","import * as React from 'react';\nimport classNames from 'classnames';\nimport { timeline } from 'motion';\nimport { TimelineDefinition } from '@motionone/dom/types/timeline/types';\nimport { breakpoints } from '../../helpers/variables';\nimport SearchInput from './components/SearchInput';\nimport Facets from './components/Facets';\nimport FacetsApplied from './components/FacetsApplied';\nimport Pagination from './components/Pagination';\nimport ResultsCard from './components/ResultsCard';\nimport { useSearch } from './hooks';\nimport ResourceCard from './components/ResourceCard';\nimport BlogCard from './components/BlogCard';\nimport ProductCard from './components/ProductCard';\n\n\nexport interface AppProps {\n  cardType: string;\n  sortOrder: string;\n  hasQuery?: string;\n  placeholder?: string;\n  itemsPerPage: string;\n  labelHeading?: string;\n  labelHeadingSummary?: string;\n  labelSearchSummary: string;\n  labelSortBy: string;\n  labelFilter: string;\n  labelFilterSort: string;\n  labelFilterButton: string;\n  labelFilterClear: string;\n  labelSortRelevance: string;\n  labelSortAlphabetical: string;\n  labelSortRecent: string;\n  labelNoResults: string;\n}\n\nconst SearchApp: React.FC<AppProps> = ({\n  cardType,\n  sortOrder = 'relevance,recent,alphabetical',\n  hasQuery,\n  placeholder,\n  itemsPerPage,\n  labelHeading,\n  labelHeadingSummary,\n  labelSearchSummary,\n  labelSortBy,\n  labelFilter,\n  labelFilterSort,\n  labelFilterButton,\n  labelFilterClear,\n  labelSortRelevance,\n  labelSortAlphabetical,\n  labelSortRecent,\n  labelNoResults\n}) => {\n  const {\n    state: { loading, query, sort, resultsTotal, results },\n    updateSort\n  } = useSearch();\n  const refEl = React.useRef<HTMLDivElement>(null);\n  const refLoading = React.useRef<SVGSVGElement>(null);\n  const [isDesktop, setIsDesktop] = React.useState(false);\n  const [isFasetPanelOpen, setIsFasetPanelOpen] = React.useState(false);\n  const breakpoint = window.matchMedia(`(min-width: ${breakpoints.desktop}px)`);\n\n  React.useEffect(() => {\n    const handleResize = () => {\n      setIsDesktop(breakpoint.matches);\n    };\n\n    handleResize();\n    breakpoint.addEventListener('change', handleResize);\n\n    return () => {\n      breakpoint.removeEventListener('change', handleResize);\n    };\n  }, []);\n\n  React.useEffect(() => {\n    const paths = refLoading.current?.querySelectorAll('path');\n\n    if (paths) {\n      const sequence: TimelineDefinition = [];\n\n      paths.forEach(path => {\n        sequence.push([\n          path,\n          { scale: [0, 1] },\n          { duration: 1, at: '-0.2', easing: 'ease-in' }\n        ]);\n      });\n\n      timeline(sequence, {\n        duration: 1.5,\n        endDelay: 2,\n        direction: 'alternate',\n        repeat: Infinity\n      });\n    }\n  }, [refLoading.current, loading]);\n\n  const handlePageChange = () => {\n    if (refEl.current) {\n      refEl.current.scrollIntoView({ behavior: 'smooth' });\n    }\n  };\n\n  const getSortOptions = React.useCallback(() => {\n    const sortOrderList = sortOrder.split(',');\n    const options = [\n      {\n        value: 'relevance',\n        label: `${labelSortBy} ${labelSortRelevance}`\n      },\n      {\n        value: 'alphabetical',\n        label: `${labelSortBy} ${labelSortAlphabetical}`\n      },\n      {\n        value: 'recent',\n        label: `${labelSortBy} ${labelSortRecent}`\n      }\n    ];\n\n    return options\n      .sort(\n        (a, b) =>\n          sortOrderList.indexOf(a.value.trim()) -\n          sortOrderList.indexOf(b.value.trim())\n      )\n      .map(option => (\n        <option key={option.value} value={option.value}>\n          {option.label}\n        </option>\n      ));\n  }, []);\n\n  return (\n    <div ref={refEl}>\n      {labelHeading && (\n        <div className=\"search__header\">\n          <h1 className=\"search__heading\">{labelHeading}</h1>\n          {(query || (!loading && query)) && (\n            <p className=\"search__subheading\">\n              {labelHeadingSummary\n                ?.replace('[keyword]', query)\n                .replace('[total]', resultsTotal.toString())}\n            </p>\n          )}\n        </div>\n      )}\n\n      {hasQuery === 'true' && <SearchInput placeholder={placeholder} />}\n\n      <div className=\"search__container\">\n        <Facets\n          title={labelFilter}\n          buttonLabel={labelFilterButton}\n          clearLabel={labelFilterClear}\n          labelSortBy={labelSortBy}\n          labelSortRelevance={labelSortRelevance}\n          labelSortAlphabetical={labelSortAlphabetical}\n          labelSortRecent={labelSortRecent}\n          isDesktop={isDesktop}\n          isOpen={isFasetPanelOpen}\n          isLoading={loading}\n          onClose={() => setIsFasetPanelOpen(false)}\n        />\n\n        <div className=\"search__results\">\n          {!loading && (\n            <>\n              <div className=\"search__results-top\">\n                <p className=\"search__results-count\">\n                  {labelSearchSummary\n                    .replace('[count]', results.length.toString())\n                    .replace('[total]', resultsTotal.toString())}\n                </p>\n                {isDesktop ? (\n                  <select\n                    className=\"dropdown\"\n                    value={sort}\n                    onChange={e => updateSort(e.target.value)}\n                  >\n                    {getSortOptions()}\n                  </select>\n                ) : (\n                  <button\n                    className=\"dropdown dropdown--sort\"\n                    onClick={() => setIsFasetPanelOpen(true)}\n                  >\n                    {labelFilterSort}\n                  </button>\n                )}\n              </div>\n\n              <FacetsApplied clearLabel={labelFilterClear} />\n\n              {!results.length && query && (\n                <div\n                  className=\"search__no-results\"\n                  dangerouslySetInnerHTML={{\n                    __html: labelNoResults.replace('[keyword]', query)\n                  }}\n                ></div>\n              )}\n\n              {!!results.length && (\n                <>\n                  <div\n                    className={classNames([\n                      'search__results-list',\n                      { 'grid grid--33-33-33': cardType === 'resource' },\n                      { 'grid grid--50-50': cardType === 'product' },\n                      { '': cardType === 'landing' }\n                    ])}\n                  >\n                    {results.map(result =>\n                      cardType === 'resource' ? (<ResourceCard key={result.id} {...result} />) : cardType === 'landing' ?(<BlogCard key={result.id} {...result} />) : cardType === 'product' ? (<ProductCard key={result.id} {...result} />)\n                      : \n                      ((<ResultsCard key={result.id} {...result} />))\n                    )}\n                    \n                  </div>\n                  <Pagination\n                    itemsPerPage={parseInt(itemsPerPage)}\n                    onPaginate={handlePageChange}\n                  />\n                </>\n              )}\n            </>\n          )}\n\n          {loading && (\n            <div className=\"search__loading\">\n              <svg\n                viewBox=\"0 0 75 59\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                ref={refLoading}\n              >\n                <path d=\"M11.9077 58.0077H0L42.6923 0.938477V16.4462L11.9077 58.0077Z\" />\n                <path d=\"M27.5314 58.0077H15.6468L42.6929 22.0308V37.5385L27.5314 58.0077Z\" />\n                <path d=\"M43.2923 58.0077H31.4077L74.0538 0.938477V16.4462L43.2923 58.0077Z\" />\n                <path d=\"M58.9385 58.0077H47.0539L74.0539 22.0308V37.5385L58.9385 58.0077Z\" />\n                <path d=\"M74.0538 58.0077H61.9384L74.0538 42.3846V58.0077Z\" />\n              </svg>\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default SearchApp;","import * as React from 'react';\nimport SearchProvider from './state/SearchProvider';\nimport SearchApp, { AppProps } from './App';\n\ninterface SearchProps extends AppProps {\n  endpoint: string;\n}\n\nconst Search: React.FC<SearchProps> = ({ endpoint, ...params }) => {\n  return (\n    <SearchProvider endpoint={endpoint} sortOrder={params.sortOrder}>\n      <SearchApp {...params} />\n    </SearchProvider>\n  );\n};\n\nexport default Search;\n"],"sourceRoot":""}