@wayke-se/components-react 6.0.0-beta.4 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/components/SearchBar/index.tsx", "../src/hooks/useOutsideClick.ts", "../src/components/InputSearch/index.tsx", "../src/components/Icon/index.tsx", "../src/components/InputSearch/wrapper.tsx", "../src/layout/theme.ts", "../src/layout/helpers.tsx", "../src/components/Button/index.tsx", "../src/components/Utility/index.tsx", "../src/components/SearchBar/wrapper.tsx", "../src/layouts/search/index.tsx", "../src/components/Container/index.tsx", "../src/components/Container/wrapper.tsx", "../src/components/Filter/index.tsx", "../src/@types/filter.ts", "../src/Gql/searchParams.ts", "../src/Gql/facets.ts", "../src/State/Search/useSearch.ts", "../src/State/Search/SearchContext.ts", "../src/State/Settings/useSettings.ts", "../src/State/Settings/SettingsContext.ts", "../src/State/Settings/settings.ts", "../src/components/FilterPanel/index.tsx", "../src/utils/pubsub/pubsub.ts", "../src/components/Accordion/index.tsx", "../src/components/Accordion/wrapper.tsx", "../src/components/Panel/index.tsx", "../src/components/Heading/index.tsx", "../src/components/Portal/portal-namespace.ts", "../src/components/Portal/portal.tsx", "../src/components/Portal/portal-element.tsx", "../src/components/Panel/wrapper.tsx", "../src/layout/keyframes.tsx", "../src/components/Repeat/index.tsx", "../src/components/FilterPanel/faceSelector.tsx", "../src/components/FilterPanel/checkListFacet.tsx", "../src/components/Checklist/index.tsx", "../src/components/Checklist/wrapper.tsx", "../src/components/OverflowBox/index.tsx", "../src/components/OverflowBox/wrapper.tsx", "../src/components/FilterPanel/colorFacet.tsx", "../src/utils/constants.ts", "../src/utils/converters.ts", "../src/components/ColorSelect/index.tsx", "../src/components/ColorSelect/wrapper.tsx", "../src/components/FilterPanel/rangeFacet.tsx", "../src/components/RangeSlider/index.tsx", "../src/utils/formats.ts", "../src/components/RangeSlider/wrapper.tsx", "../src/components/Filter/wrapper.tsx", "../src/components/Grid/index.tsx", "../src/components/ProductCard/HitCard.tsx", "../src/Gql/hit.ts", "../src/components/ProductCard/index.tsx", "../src/hooks/useIsInViewport.ts", "../src/State/Router/useRouter.ts", "../src/State/Router/RouterContext.ts", "../src/components/ResponsiveImage/index.tsx", "../src/utils/image.ts", "../src/components/UspList/index.tsx", "../src/components/UspList/wrapper.tsx", "../src/components/ProductCard/wrapper.tsx", "../src/components/Grid/wrapper.tsx", "../src/components/Page/index.tsx", "../src/components/Result/index.tsx", "../src/utils/I18n.ts", "../src/utils/sortOptions.ts", "../src/components/Loader/index.tsx", "../src/components/SrOnly/index.tsx", "../src/components/Loader/wrapper.tsx", "../src/components/ProgressBar/index.tsx", "../src/components/ProgressBar/wrapper.tsx", "../src/components/SortSelect/index.tsx", "../src/components/SortSelect/wrapper.tsx", "../src/components/Result/wrapper.tsx", "../src/components/SearchFilter/index.tsx", "../src/Gql/client.ts", "../src/Gql/queries.ts", "../src/Gql/suggest.ts", "../src/components/SearchTerm/index.tsx", "../src/components/SearchTerm/wrapper.tsx", "../src/components/Snackbar/index.tsx", "../src/components/Snackbar/wrapper.tsx", "../src/layouts/searchItem/index.tsx", "../src/@types/conversion.ts", "../src/components/Blockquote/index.tsx", "../src/components/Avatar/index.tsx", "../src/components/Avatar/wrapper.tsx", "../src/components/Blockquote/wrapper.tsx", "../src/components/Content/index.tsx", "../src/utils/markdown.ts", "../src/components/Content/wrapper.tsx", "../src/components/ExtendContent/index.tsx", "../src/components/ExtendContent/wrapper.tsx", "../src/components/FinancialOptions/index.tsx", "../src/components/CreditorDisclaimer/index.tsx", "../src/components/Link/index.tsx", "../src/components/CreditorDisclaimer/wrapper.tsx", "../src/components/FinancialOptions/leasing.tsx", "../src/components/DataList/index.tsx", "../src/components/DataList/wrapper.tsx", "../src/components/Modal/index.tsx", "../src/components/Modal/wrapper.tsx", "../src/components/OptionBox/index.tsx", "../src/components/OptionBox/wrapper.tsx", "../src/components/FinancialOptions/loan.tsx", "../src/Gql/ad/useLoanCalculation.ts", "../src/Gql/ad/queries.ts", "../src/Gql/ad/legacyWaykeId.ts", "../src/Gql/ad/view.ts", "../src/State/Ad/AdContext.ts", "../src/components/FinancialOptions/LoanModal.tsx", "../src/components/ContentLogo/index.tsx", "../src/components/LogoBox/index.tsx", "../src/components/LogoBox/wrapper.tsx", "../src/components/RangeSlider/SliderWithLabel.tsx", "../src/components/RangeSliderLabel/index.tsx", "../src/components/RangeSliderLabel/wrapper.tsx", "../src/components/RangeSlider/RangeSliderSimple.tsx", "../src/components/Gallery/index.tsx", "../src/components/Lightbox/index.tsx", "../src/components/Sphere/SphereLightbox.tsx", "../src/components/Sphere/SphereViewer.tsx", "../src/components/Sphere/wrapper.tsx", "../src/components/ThreeSixty/wrapper.tsx", "../src/components/ThreeSixty/ThreeSixtLightbox.tsx", "../src/components/Lightbox/wrapper.tsx", "../src/components/ThreeSixty/Rotation.tsx", "../src/components/Video/EmbeddedVideoLightbox.tsx", "../src/components/Video/CustomPlayer.tsx", "../src/components/Video/Video.tsx", "../src/components/Video/wrapper.tsx", "../src/components/Video/VimeoPlayer.tsx", "../src/components/Video/utils.ts", "../src/components/Video/YoutubePlayer.tsx", "../src/components/NavButton/index.tsx", "../src/components/Sphere/Sphere.tsx", "../src/components/ThreeSixty/ThreeSixty.tsx", "../src/components/Gallery/wrapper.tsx", "../src/components/Video/EmbededVideo.tsx", "../src/components/Gallery/MediaButton.tsx", "../src/components/Video/useThumbnail.ts", "../src/hooks/useVimeoThumbnail.ts", "../src/hooks/useFetch.ts", "../src/components/Video/QuickNavEmbeded.tsx", "../src/components/InsuranceOptions/index.tsx", "../src/components/InsuranceOptions/Insurance.tsx", "../src/components/InsuranceOptions/InsuranceModal.tsx", "../src/Gql/ad/useInsuranceInquiry.ts", "../src/utils/ssn.ts", "../src/components/ColumnRow/index.tsx", "../src/components/DetailBox/index.tsx", "../src/components/DetailBox/wrapper.tsx", "../src/components/ExtendInfo/index.tsx", "../src/components/ExtendInfo/wrapper.tsx", "../src/components/InputGroup/index.tsx", "../src/components/InputLabel/index.tsx", "../src/components/InputLabel/wrapper.tsx", "../src/components/InputSelect/index.tsx", "../src/components/InputSelect/wrapper.tsx", "../src/components/InputText/index.tsx", "../src/components/InputText/wrapper.tsx", "../src/components/InsuranceOptions/InsuranceFree.tsx", "../src/components/InsuranceOptions/InsuranceFreeModal.tsx", "../src/components/PriceTable/index.tsx", "../src/components/Price/index.tsx", "../src/components/PriceTable/wrapper.tsx", "../src/components/ProductPage/index.tsx", "../src/Gql/ad/useAd.ts", "../src/layouts/searchItem/Accessories/index.tsx", "../src/components/AccessoryCard/index.tsx", "../src/components/AccessoryCard/wrapper.tsx", "../src/components/OverflowGrid/index.tsx", "../src/components/OverflowGrid/wrapper.tsx", "../src/layouts/searchItem/Accessories/AccessoryModal.tsx", "../src/components/Image/index.tsx", "../src/components/PriceBox/index.tsx", "../src/components/PriceBox/wrapper.tsx", "../src/layouts/searchItem/Branch.tsx", "../src/components/Map/index.tsx", "../src/components/Map/wrapper.tsx", "../src/components/OpeningHours/index.tsx", "../src/components/Badge/index.tsx", "../src/components/Badge/wrapper.tsx", "../src/components/TableColumn/index.tsx", "../src/components/PhoneNumber/index.tsx", "../src/utils/phonenumbers.ts", "../src/utils/metadata.min.json", "../src/layouts/searchItem/CheckList.tsx", "../src/components/ActionList/index.tsx", "../src/components/LeadForm/index.tsx", "../src/hooks/useSubmitLead.ts", "../package.json", "../src/components/InputCheckbox/index.tsx", "../src/components/InputCheckbox/wrapper.tsx", "../src/components/InputError/index.tsx", "../src/components/InputError/wrapper.ts", "../src/components/InputTextarea/index.tsx", "../src/components/InputTextarea/wrapper.ts", "../src/components/LeadForm/wrapper.ts", "../src/components/ActionList/toggle-item.tsx", "../src/components/CheckMarkList/index.tsx", "../src/components/CheckMarkList/wrapper.tsx", "../src/components/Columns/index.tsx", "../src/components/StateIndicator/index.tsx", "../src/components/SwitchBar/index.tsx", "../src/components/SwitchBar/wrapper.tsx", "../src/layouts/searchItem/PackageOptionModal.tsx", "../src/layouts/searchItem/DemoCarModal.tsx", "../src/layouts/searchItem/Documents.tsx", "../src/components/DocumentList/index.tsx", "../src/components/DocumentList/wrapper.tsx", "../src/layouts/searchItem/ManufacturerPackagesOption.tsx", "../src/layouts/searchItem/PackageOptions.tsx", "../src/layouts/searchItem/Page404.tsx", "../src/layouts/searchItem/PageLoading.tsx", "../src/layouts/searchItem/Property.tsx", "../src/components/TableList/index.tsx", "../src/components/Tabs/index.tsx", "../src/components/Tabs/wrapper.tsx", "../src/Gql/ad/propertyTree.ts", "../src/layouts/searchItem/MetadataItem.tsx", "../src/layouts/searchItem/Related.tsx", "../src/components/SectionHeader/index.tsx", "../src/components/SectionHeader/wrapper.tsx", "../src/Gql/ad/useRelatedAds.ts", "../src/layouts/searchItem/useEcom.ts", "../src/layouts/WaykeCompositeWithProvider.tsx", "../src/providers/WaykeProvider.tsx", "../src/components/Root/index.tsx", "../src/hooks/useInitializeTranslation.ts", "../src/State/Router/RouterProvider.tsx", "../src/State/Search/SearchProvider.tsx", "../src/Gql/legacyParams.ts", "../src/Gql/useAdsSearch.ts", "../src/providers/themeProvider.tsx", "../src/layouts/WaykeComposite.tsx", "../src/index.ts"],
4
- "sourcesContent": ["import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useOutsideClick from '../../hooks/useOutsideClick';\nimport InputSearch from '../InputSearch';\nimport { Suggestion, Suggestions } from './wrapper';\n\ninterface SearchBarProps {\n value: string;\n setValue: (value: string) => void;\n onSearch: (value: string) => void;\n /** Typeahead labels shown under the field */\n suggestions?: string[];\n onSelectSuggestion?: (index: number) => void;\n}\n\nconst SearchBar = ({\n value,\n setValue,\n onSearch,\n suggestions = [],\n onSelectSuggestion,\n}: SearchBarProps) => {\n const { t } = useTranslation();\n const ref = useRef<HTMLDivElement>(null);\n const listId = useId();\n const [active, setActive] = useState(-1);\n const open = suggestions.length > 0 && !!onSelectSuggestion;\n\n useEffect(() => setActive(-1), [suggestions]);\n\n const onChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => setValue(e.currentTarget.value),\n [setValue]\n );\n\n useOutsideClick(ref, () => setValue(''));\n\n const _onSearch = useCallback(() => {\n onSearch(value);\n }, [value, onSearch]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (open && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n const last = suggestions.length - 1;\n setActive((i) => (e.key === 'ArrowDown' ? Math.min(i + 1, last) : Math.max(i - 1, -1)));\n } else if (e.key === 'Escape') {\n setValue('');\n } else if (e.key === 'Enter') {\n if (open && active > -1) {\n onSelectSuggestion?.(active);\n } else {\n _onSearch();\n }\n }\n },\n [open, active, suggestions, onSelectSuggestion, _onSearch, setValue]\n );\n\n return (\n <InputSearch\n ref={ref}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onSearch={_onSearch}\n placeholder={t('searchBar.placeholder')}\n label={t('searchBar.placeholder')}\n id=\"main-search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={open && active > -1 ? `${listId}-${active}` : undefined}\n >\n {open && (\n <Suggestions id={listId} role=\"listbox\" aria-label={t('searchBar.searchResults')}>\n {suggestions.map((label, index) => (\n <Suggestion\n key={label}\n id={`${listId}-${index}`}\n role=\"option\"\n aria-selected={index === active}\n $active={index === active}\n // mousedown, so the pick lands before the field loses focus\n onMouseDown={(e) => {\n e.preventDefault();\n onSelectSuggestion?.(index);\n }}\n >\n {label}\n </Suggestion>\n ))}\n </Suggestions>\n )}\n </InputSearch>\n );\n};\n\nexport default SearchBar;\n", "import { useEffect } from 'react';\n\nconst useOutsideClick = (ref: React.RefObject<HTMLElement | null>, callback: () => void) => {\n const handleClick = (e: MouseEvent) => {\n if (ref.current && e.target && !ref.current.contains(e.target as Node)) {\n callback();\n }\n };\n\n useEffect(() => {\n document.addEventListener('click', handleClick);\n\n return () => {\n document.removeEventListener('click', handleClick);\n };\n });\n};\n\nexport default useOutsideClick;\n", "import React from 'react';\nimport { IconSearch } from '../Icon';\nimport { Action, ActionBtn, Input, Label, Search, Wrapper } from './wrapper';\n\ntype InputProps = React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\ntype Props = InputProps & {\n placeholder: string;\n label: string;\n value?: string;\n id: string;\n onSearch: () => void;\n};\n\nconst InputSearch = React.forwardRef<HTMLDivElement, Props>(\n ({ placeholder, label, value, id, onSearch, onChange, onKeyDown, children, ...aria }, ref) => (\n <Wrapper ref={ref}>\n <Label htmlFor={id}>{label}</Label>\n <Search>\n <Input\n placeholder={placeholder}\n name=\"search\"\n value={value}\n id={id}\n onChange={onChange}\n onKeyDown={onKeyDown}\n autoComplete=\"off\"\n {...aria}\n />\n {children}\n </Search>\n <Action>\n <ActionBtn onClick={onSearch} title={`Genomf\u00F6r ${label}`} aria-label={`Genomf\u00F6r ${label}`}>\n <IconSearch block />\n </ActionBtn>\n </Action>\n </Wrapper>\n )\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\ntype SharedIconProps = {\n block?: boolean;\n};\n\ntype IconProps = React.SVGProps<SVGSVGElement> & SharedIconProps;\n\nconst Icon = styled.svg.attrs(() => ({\n xmlns: 'http://www.w3.org/2000/svg',\n}))<IconProps>`\n display: inline-block;\n vertical-align: middle;\n width: 1em;\n height: 1em;\n fill: currentColor;\n\n ${({ block }) =>\n block &&\n css`\n display: block;\n `}\n`;\n\ntype IconInfoProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> &\n SharedIconProps;\n\nexport const IconInfo = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 24 24\" block={block}>\n <path d=\"M12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0zm0 2c5.5234 0 10 4.4766 10 10s-4.4766 10-10 10S2 17.5234 2 12 6.4766 2 12 2zm0 3.8125c-.1836 0-.336-.004-.5.0313-.164.0351-.3164.125-.4375.2187-.121.0938-.211.2227-.2813.375s-.0937.332-.0937.5625c0 .2266.0234.4063.0938.5625.0703.1563.1601.2813.2812.375.121.0938.2734.1484.4375.1875.164.039.3164.0625.5.0625.1797 0 .371-.0234.5313-.0625.1601-.039.2851-.0938.4062-.1875.121-.0938.211-.2188.2813-.375.0703-.1523.125-.336.125-.5625 0-.2305-.0547-.4102-.125-.5625-.0704-.1523-.1602-.2813-.2813-.375-.121-.0938-.246-.1836-.4063-.2188-.1601-.0351-.3515-.0312-.5312-.0312zm-1.2188 3.3438v8.9687h2.4375V9.1562z\" />\n </Icon>\n);\n\nexport const IconCancel = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.7 14.3c.4.4.4 1 0 1.4-.2.2-.5.3-.7.3s-.5-.1-.7-.3L8 9.4l-6.3 6.3c-.2.2-.4.3-.7.3s-.5-.1-.7-.3c-.4-.4-.4-1 0-1.4L6.6 8 .3 1.7C-.1 1.3-.1.7.3.3c.4-.4 1-.4 1.4 0L8 6.6 14.3.3c.4-.4 1-.4 1.4 0 .4.4.4 1 0 1.4L9.4 8l6.3 6.3z\" />\n </Icon>\n);\n\nexport const IconChevronDown = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M17.7 5L9 13.7.3 5l.7-.7 8 8 8-8 .7.7z\" />\n </Icon>\n);\n\nexport const IconChevronLeft = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M13 17.7L4.3 9 13 .3l.7.7-8 8 8 8-.7.7z\" />\n </Icon>\n);\n\nexport const IconChevronRight = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M5 .3L13.7 9 5 17.7l-.7-.7 8-8-8-8L5 .3z\" />\n </Icon>\n);\n\nexport const IconCheck = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.6 4.3l-9.3 9.4c-.5.5-1.4.5-1.9 0l-4-4c-.5-.5-.5-1.4 0-1.9s1.3-.5 1.9 0l3.1 3.1 8.4-8.5c.5-.5 1.4-.5 1.9 0s.4 1.3-.1 1.9z\" />\n </Icon>\n);\n\nexport const IconRadio = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M13 8c0 2.8-2.2 5-5 5s-5-2.2-5-5 2.2-5 5-5 5 2.2 5 5zm3 0c0 4.4-3.6 8-8 8s-8-3.6-8-8 3.6-8 8-8 8 3.6 8 8zm-1 0c0-3.9-3.1-7-7-7S1 4.1 1 8s3.1 7 7 7 7-3.1 7-7z\" />\n </Icon>\n);\n\nexport const IconSearch = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.5 15.3L11 10.8c1.2-1.1 2-2.7 2-4.5C13 2.9 10.2.1 6.8.1S.5 2.8.5 6.2s2.8 6.2 6.2 6.2c1.3 0 2.5-.4 3.5-1.1l4.6 4.6.7-.6zM1.4 6.2C1.4 3.3 3.8 1 6.7 1S12 3.3 12 6.2c0 1.5-.7 2.9-1.7 3.9l-.7.5c-.8.5-1.8.8-2.8.8-3 .1-5.4-2.3-5.4-5.2z\" />\n </Icon>\n);\n\nexport const IconExclamationCircle = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 32 32\" block={block}>\n <path d=\"M14.482 21.893c0-0.857 0.694-1.551 1.551-1.551s1.551 0.694 1.551 1.551c0 0.857-0.694 1.551-1.551 1.551s-1.551-0.694-1.551-1.551zM16.033 2.838c-7.271 0-13.187 5.916-13.187 13.187s5.916 13.187 13.187 13.187 13.187-5.916 13.187-13.187c0-7.271-5.916-13.187-13.187-13.187zM16.033 27.203c-6.163 0-11.178-5.015-11.178-11.178s5.015-11.178 11.178-11.178c6.164 0 11.178 5.015 11.178 11.178s-5.014 11.178-11.178 11.178zM16.033 8.308c-0.555 0-1.004 0.45-1.004 1.004v8.227c0 0.555 0.45 1.004 1.004 1.004s1.004-0.45 1.004-1.004v-8.227c0-0.555-0.45-1.004-1.004-1.004z\" />\n </Icon>\n);\n\nexport const IconExclamationTriangle = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 32 32\" block={block}>\n <path d=\"M15.951 19.663c-0.457 0-0.828-0.37-0.828-0.828v-4.357c0-0.457 0.37-0.828 0.828-0.828s0.828 0.37 0.828 0.828v4.357c0 0.457-0.371 0.828-0.828 0.828zM15.952 22.906c-0.305 0-0.606-0.126-0.821-0.341s-0.338-0.514-0.338-0.818 0.122-0.606 0.338-0.821c0.431-0.43 1.209-0.43 1.639 0 0.215 0.215 0.341 0.516 0.341 0.821s-0.126 0.603-0.341 0.818c-0.215 0.215-0.513 0.341-0.818 0.341zM27.049 27.070h-22.196c-0.352 0-0.677-0.186-0.855-0.489s-0.184-0.677-0.014-0.985l11.098-20.105c0.175-0.317 0.508-0.513 0.87-0.513s0.695 0.197 0.87 0.513l11.098 20.105c0.17 0.308 0.165 0.683-0.014 0.985s-0.504 0.489-0.856 0.489zM6.536 25.083h18.83l-9.415-17.056-9.415 17.056z\" />\n </Icon>\n);\n\nexport const IconImage = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path\n d=\"M14.4 1.6H1.6C.7 1.6 0 2.3 0 3.2v9.6c0 .9.7 1.6 1.6 1.6h12.8c.9 0 1.6-.7 1.6-1.6V3.2c0-.9-.7-1.6-1.6-1.6zm0 11.2H1.6V3.2h12.8v9.6zM3.2 6c0-.7.5-1.2 1.2-1.2s1.2.5 1.2 1.2-.5 1.2-1.2 1.2S3.2 6.7 3.2 6zm.2 4.5l6.2-4.4c.4-.3.9-.2 1.1.2v.1l2.4 4.2c.1.2 0 .4-.1.5-.1 0-.1.1-.2.1H3.7c-.2 0-.4-.2-.4-.4 0-.1 0-.3.1-.3z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </Icon>\n);\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'search',\n}))`\n display: flex;\n align-items: stretch;\n border-radius: 3px;\n`;\n\nexport const Label = styled.label`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n\nexport const Search = styled.div`\n flex: 1 1 auto;\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accentDark};\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n`;\n\nexport const ActionBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${(props) => props.theme.distances.inputHeight};\n height: ${(props) => props.theme.distances.inputHeight};\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n font-size: 1rem;\n`;\n\nexport const Input = styled.input.attrs(() => ({\n type: 'search',\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n padding: 0 ${size(2)};\n background-color: transparent;\n font-size: 16px;\n border: none;\n border-radius: 0;\n box-shadow: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::-webkit-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &::-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-ms-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "const _colors = {\n black: '#000',\n white: '#fff',\n gray: '#ddd',\n grayLight: '#f8f8f8',\n grayLightTransparent: 'rgba(248, 248, 248, 0)',\n grayLightDarker: '#ebebeb',\n grayDark: '#717171',\n blue: '#1d61ca',\n ui: {\n greenLight: '#cdf5c8',\n green: '#2b8747',\n redLight: '#ffd0d0',\n red: '#c71f1f',\n yellowLight: '#fff4c7',\n yellow: '#ffc700',\n blueLight: '#daf7fc',\n },\n};\n\nconst theme = {\n color: {\n bg: _colors.white,\n link: _colors.blue,\n accent: _colors.grayLight,\n accentTransparent: _colors.grayLightTransparent,\n accentDark: _colors.grayLightDarker,\n border: _colors.gray,\n textDark: _colors.black,\n textDarkLighten: _colors.grayDark,\n textLight: _colors.white,\n hoverOverlay: 'rgba(0, 0, 0, 0.04)',\n disabledBg: _colors.gray,\n disabledText: _colors.grayDark,\n placeholder: _colors.grayDark,\n ui: {\n positiveLight: _colors.ui.greenLight,\n positive: _colors.ui.green,\n neutralLight: _colors.ui.yellowLight,\n neutral: _colors.ui.yellow,\n negativeLight: _colors.ui.redLight,\n negative: _colors.ui.red,\n infoLight: _colors.ui.blueLight,\n },\n },\n breakpoint: {\n Sm: '@media (min-width: 600px)',\n LtSm: '@media (max-width: 599px)',\n Md: '@media (min-width: 900px)',\n LtMd: '@media (max-width: 899px)',\n Lg: '@media (min-width: 1200px)',\n LtLg: '@media (max-width: 1199px)',\n },\n mask: {\n gradient: {\n toTop: 'linear-gradient(to top, #000, transparent)',\n toBottom: 'linear-gradient(to bottom, #000, transparent)',\n toLeft: 'linear-gradient(to left, #000, transparent)',\n toRight: 'linear-gradient(to right, #000, transparent)',\n },\n },\n distances: {\n baseUnit: '8px',\n inputHeight: '48px',\n containerMaxWidth: '1312px',\n },\n};\n\nexport type Theme = typeof theme;\nexport default theme;\n", "import theme from './theme';\n\nexport const size = (multiplier = 1) => {\n const baseUnit = parseFloat(theme.distances.baseUnit);\n return `${multiplier * baseUnit}px`;\n};\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { UtilityTextRight } from '../Utility';\n\nexport const ButtonReset = styled.button.attrs(() => ({\n type: 'button',\n}))`\n display: inline-block;\n vertical-align: middle;\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: 0;\n border-radius: 0;\n font-family: sans-serif;\n font-weight: 400;\n font-size: 1em;\n color: currentColor;\n line-height: 1.2;\n text-align: center;\n text-decoration: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0.1);\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\ntype ButtonResetProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n fullWidth?: boolean;\n inputHeight?: boolean;\n};\n\nconst ButtonBase = styled(ButtonReset)<ButtonResetProps>`\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${size(1.75)} ${size(6)};\n border-radius: 3px;\n font-size: 1rem;\n line-height: 1.2;\n text-decoration: none;\n transform-origin: 50% 50%;\n transition:\n 200ms ease,\n transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.97);\n }\n\n &[disabled] {\n background-color: ${(props) => props.theme.color.disabledBg};\n border-color: ${(props) => props.theme.color.disabledBg};\n color: ${(props) => props.theme.color.disabledText};\n }\n\n ${({ fullWidth }) =>\n fullWidth &&\n css`\n display: flex;\n width: 100%;\n `}\n\n ${({ inputHeight }) =>\n inputHeight &&\n css`\n height: ${(props) => props.theme.distances.inputHeight};\n `}\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: ${size(1.75)} ${size(2.5)};\n font-size: 0.875rem;\n }\n`;\n\nexport const ButtonPrimary = styled(ButtonBase).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg wayke__font--bold',\n}))``;\n\nexport const ButtonSecondary = styled(ButtonBase).attrs(() => ({\n className: 'wayke__theme wayke__color--secondary-bg wayke__font--bold',\n}))`\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const ButtonContent = styled.div`\n position: relative;\n z-index: 1;\n\n & + & {\n margin-left: ${size(0.5)};\n }\n`;\n\nexport const ButtonClear = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n position: relative;\n font-size: 0.875rem;\n padding: ${size(1.5)};\n margin: ${size(-1.5)};\n text-align: left;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n ${UtilityTextRight} & {\n text-align: right;\n }\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\ntype ButtonInlineProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n inline?: boolean;\n as?: string;\n};\n\nexport const ButtonInline = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))<ButtonInlineProps>`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n text-decoration: underline;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDark};\n }\n\n ${({ inline }) =>\n inline &&\n css`\n display: inline;\n `}\n`;\n\nexport const ButtonInlineBold = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const ButtonInlineLight = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n text-decoration: none;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDarkLighten};\n }\n`;\n\nexport const ButtonInlinePrimary = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))<ButtonInlineProps>`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n", "import styled from 'styled-components';\n\nexport const UtilityTextRight = styled.div`\n text-align: right;\n`;\n\nexport const UtilityFontSizeSmall = styled.span`\n font-size: 0.875rem;\n`;\n\nexport const UtilityTextPrimary = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))``;\n\nexport const UtilityTextBold = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Suggestions = styled.ul.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 10;\n margin: ${size(0.5)} 0 0;\n padding: ${size(0.5)} 0;\n list-style: none;\n background-color: ${(props) => props.theme.color.bg};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n`;\n\nexport const Suggestion = styled.li<{ $active: boolean }>`\n padding: ${size(1)} ${size(2)};\n cursor: pointer;\n background-color: ${(props) => (props.$active ? props.theme.color.hoverOverlay : 'transparent')};\n\n &:hover {\n background-color: ${(props) => props.theme.color.hoverOverlay};\n }\n`;\n", "import React, { useCallback, useEffect } from 'react';\nimport { SearchFilterTypes } from '../../@types/filter';\nimport Container from '../../components/Container';\nimport Filter from '../../components/Filter';\nimport Grid from '../../components/Grid';\nimport { Page, PageSection } from '../../components/Page';\nimport { PortalElement, PortalNamespace } from '../../components/Portal';\nimport Result from '../../components/Result';\nimport SearchFilter from '../../components/SearchFilter';\nimport SearchTerm from '../../components/SearchTerm';\nimport Snackbar from '../../components/Snackbar';\nimport { FREE_TEXT } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { i18nScoped } from '../../utils/I18n';\nimport PubSub from '../../utils/pubsub/pubsub';\n\nexport interface WaykeSearchProps {\n /** The filters to show, in this order. By default all filters. */\n filterList?: SearchFilterTypes[];\n /** Filters applied when the search loads. */\n initialQueryParams?: URLSearchParams | string;\n removeSearchBar?: boolean;\n removeFilterOptions?: boolean;\n /** Url to an image for vehicles without images. */\n placeholderImage?: string;\n /** Sets the page title. */\n modifyDocumentTitleSearch?: string;\n /** Shows the branch name on the vehicles. */\n displayBranchName?: boolean;\n}\n\nconst WaykeSearch = ({\n filterList,\n initialQueryParams,\n removeSearchBar,\n placeholderImage,\n removeFilterOptions,\n modifyDocumentTitleSearch,\n displayBranchName,\n}: WaykeSearchProps) => {\n const { error, result, params, update, initialize } = useSearch();\n const query = params.toString();\n\n useEffect(() => {\n if (modifyDocumentTitleSearch) {\n document.title = modifyDocumentTitleSearch;\n }\n initialize(\n typeof initialQueryParams === 'string'\n ? new URLSearchParams(initialQueryParams)\n : initialQueryParams\n );\n PubSub.publish('View', { type: 'search' });\n }, []);\n\n useEffect(() => {\n PubSub.publish('SearchInitiated', { query });\n }, [query]);\n\n useEffect(() => {\n if (result) {\n PubSub.publish('SearchCompleted', {\n query,\n hits: result.hits.length,\n totalHits: result.found,\n });\n }\n }, [result]);\n\n const onClearQuery = useCallback(() => {\n const next = new URLSearchParams(params);\n PubSub.publish('SearchClearQuery', { query: next.get(FREE_TEXT) });\n next.delete(FREE_TEXT);\n update(next);\n }, [params, update]);\n\n const searchQuery = params.get(FREE_TEXT);\n\n return (\n <>\n <Page>\n {!removeSearchBar && (\n <PageSection>\n <Container>\n <SearchFilter />\n </Container>\n </PageSection>\n )}\n {searchQuery && (\n <PageSection>\n <Container>\n <SearchTerm onClear={onClearQuery}>{searchQuery}</SearchTerm>\n </Container>\n </PageSection>\n )}\n {!removeFilterOptions && (\n <PageSection>\n <Container>\n <Filter filterList={filterList} />\n </Container>\n </PageSection>\n )}\n <PageSection accent fillSpace className=\"wayke__theme wayke__color--accent-bg\">\n <Container>\n <Result>\n <>\n {error && (\n <Snackbar severity=\"error\" icon heading=\"Ett fel har intr\u00E4ffat\">\n V\u00E4nligen f\u00F6rs\u00F6k igen.\n </Snackbar>\n )}\n {!error && result && result.hits.length > 0 && (\n <Grid\n hits={result.hits}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n )}\n {!error && result && result.hits.length === 0 && (\n <Snackbar\n severity=\"warning\"\n icon\n heading={i18nScoped.t('search.snackbarNoSearchResults.heading') || undefined}\n >\n {i18nScoped.t('search.snackbarNoSearchResults.body')}\n </Snackbar>\n )}\n </>\n </Result>\n </Container>\n </PageSection>\n </Page>\n <PortalElement id={PortalNamespace.DefaultPortal} />\n </>\n );\n};\n\nexport default WaykeSearch;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst Container = ({ children }: Props) => <Wrapper>{children}</Wrapper>;\n\nexport default Container;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n width: 100%;\n max-width: ${(props) => props.theme.distances.containerMaxWidth};\n margin: 0 auto;\n padding: 0 ${size(3)};\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: 0 ${size(2)};\n }\n`;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { resolveFilterList, SearchFilterTypes } from '../../@types/filter';\nimport { isRangeFilter, listOptions, rangeSteps, selectedCount } from '../../Gql/facets';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport FilterPanel, { PanelFilter } from '../FilterPanel';\nimport { Action, Indicator, IndicatorValue, Item, Label, List } from './wrapper';\n\ninterface FilterProps {\n filterList?: SearchFilterTypes[];\n}\n\nconst Filter = ({ filterList }: FilterProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n const { params, result, unfiltered } = useSearch();\n const [open, setOpen] = useState<string>();\n const onClose = useCallback(() => setOpen(undefined), []);\n\n // The filters in the order asked for, leaving out those with nothing to pick.\n const filters = useMemo<PanelFilter[]>(\n () =>\n resolveFilterList(filterList)\n .filter((f) =>\n isRangeFilter(f.filterName)\n ? rangeSteps(f.filterName, unfiltered, marketCode).length > 1\n : listOptions(f.filterName, params, result?.facets).length > 0\n )\n .map((f) => ({\n id: f.filterName,\n displayName: f.displayName || t(`filter.${f.filterName}`),\n })),\n [filterList, unfiltered, result, params, marketCode]\n );\n\n if (!result) return null;\n\n return (\n <>\n {open && <FilterPanel filters={filters} open={open} onClose={onClose} />}\n <List>\n {filters.map((f) => {\n const selected = selectedCount(f.id, params);\n return (\n <Item key={f.id}>\n <Action\n onClick={() => setOpen(f.id)}\n title={f.displayName}\n aria-label={f.displayName}\n className={\n selected > 0\n ? 'wayke__theme wayke__color--primary-bg wayke__font--bold'\n : 'wayke__theme wayke__font--regular'\n }\n >\n <Label>{f.displayName}</Label>\n {selected > 0 && (\n <Indicator>\n <IndicatorValue>{selected}</IndicatorValue>\n </Indicator>\n )}\n </Action>\n </Item>\n );\n })}\n </List>\n </>\n );\n};\n\nexport default Filter;\n", "/** The filters the panel can show, named as their URL keys (see Gql/searchParams.ts). */\nexport type SearchFilterNameTypes =\n | 'manufacturer'\n | 'model'\n | 'modelSeries'\n | 'fuelType'\n | 'gearboxType'\n | 'branchDisplayName'\n | 'branchCity'\n | 'colorName'\n | 'environmentClass'\n | 'segment'\n | 'bodyStyle'\n | 'trimLevel'\n | 'inventoryStatus'\n | 'drivetrainType'\n | 'engineBaseType'\n | 'price'\n | 'odometer'\n | 'modelYear'\n | 'privateLease'\n | 'businessLease';\n\nexport type SearchFilterTypes = {\n filterName: SearchFilterNameTypes;\n displayName?: string;\n};\n\n/** Filter names from before 6.0 \u2192 their name now. */\nexport const LEGACY_FILTER_NAMES: Record<string, SearchFilterNameTypes> = {\n branch: 'branchDisplayName',\n color: 'colorName',\n 'properties.segment': 'segment',\n drivingWheel: 'drivetrainType',\n mileage: 'odometer',\n odometerValueAsKm: 'odometer',\n leasingPrice: 'privateLease',\n businessLeasingPrice: 'businessLease',\n};\n\nexport const DEFAULT_FILTER_LIST: SearchFilterTypes[] = [\n { filterName: 'manufacturer' },\n { filterName: 'modelSeries' },\n { filterName: 'fuelType' },\n { filterName: 'gearboxType' },\n { filterName: 'branchDisplayName' },\n { filterName: 'colorName' },\n { filterName: 'environmentClass' },\n { filterName: 'segment' },\n { filterName: 'drivetrainType' },\n { filterName: 'price' },\n { filterName: 'privateLease' },\n { filterName: 'businessLease' },\n { filterName: 'odometer' },\n { filterName: 'modelYear' },\n];\n\n/** The filter list with old names translated and duplicates (mileage + odometerValueAsKm) dropped. */\nexport const resolveFilterList = (filterList?: SearchFilterTypes[]): SearchFilterTypes[] => {\n if (!filterList) return DEFAULT_FILTER_LIST;\n const legacy = filterList.filter((f) => f.filterName in LEGACY_FILTER_NAMES);\n if (legacy.length) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(\n `Wayke: filterList uses filter names from before 6.0 (${legacy\n .map((f) => f.filterName)\n .join(', ')}); they are translated, see the README for the new names`\n );\n }\n const seen = new Set<string>();\n return filterList\n .map((f) => ({ ...f, filterName: LEGACY_FILTER_NAMES[f.filterName] || f.filterName }))\n .filter((f) => {\n if (seen.has(f.filterName)) return false;\n seen.add(f.filterName);\n return true;\n });\n};\n", "// The search URL grammar on /sok, shared with web-ui-v2 so that saved links\n// behave the same on wayke.se and on a dealer site: plain query string, one\n// key per filter, `.min`/`.max` for ranges, `sort=<key>` and `page=<n>`.\n// Everything here is the browser-side translation of that grammar into the\n// arguments of `search.ads`.\n\nimport { MarketCode } from '../@types/market';\n\nexport const FREE_TEXT = 'q';\nexport const SORT = 'sort';\nexport const PAGE = 'page';\n\n/** Facet filters whose URL key, facet field and search argument share a name. */\nexport const LIST_FILTERS = [\n 'manufacturer',\n 'model',\n 'modelSeries',\n 'fuelType',\n 'gearboxType',\n 'branchDisplayName',\n 'colorName',\n 'environmentClass',\n 'segment',\n 'drivetrainType',\n 'bodyStyle',\n 'engineBaseType',\n 'trimLevel',\n 'inventoryStatus',\n 'branchCity',\n] as const;\nexport type ListFilter = (typeof LIST_FILTERS)[number];\n\n/** Range filters: URL base key \u2192 the `\u2026Min`/`\u2026Max` argument pair. */\nexport const RANGE_FILTERS = {\n price: 'cashPrice',\n odometer: 'odometerReading',\n modelYear: 'modelYear',\n privateLease: 'leasingPrice',\n businessLease: 'companyLeasingPrice',\n} as const;\nexport type RangeFilter = keyof typeof RANGE_FILTERS;\n\nexport const BOOLEAN_FILTERS = [\n 'certifiedPreOwned',\n 'isDemoVersion',\n 'deductibleVat',\n 'ecom',\n 'leasing',\n 'businessLeasing',\n] as const;\n\nexport interface SortDefinition {\n field: string;\n direction: 'asc' | 'desc';\n /** Legacy token the sort panel translates; see Utils/SortOptions.ts. */\n legacyName: string;\n}\n\n/** `sort=` keys, in the order the sort panel lists them. The first is the default. */\nexport const SORT_OPTIONS: Record<string, SortDefinition> = {\n 'published-desc': { field: 'publishedAt', direction: 'desc', legacyName: 'published-desc' },\n 'published-asc': { field: 'publishedAt', direction: 'asc', legacyName: 'published-asc' },\n 'price-asc': { field: 'price', direction: 'asc', legacyName: 'price-asc' },\n 'price-desc': { field: 'price', direction: 'desc', legacyName: 'price-desc' },\n 'modelYear-desc': { field: 'modelYear', direction: 'desc', legacyName: 'model-desc' },\n 'modelYear-asc': { field: 'modelYear', direction: 'asc', legacyName: 'model-asc' },\n 'odometer-asc': { field: 'odometerReading', direction: 'asc', legacyName: 'mileage-asc' },\n 'odometer-desc': { field: 'odometerReading', direction: 'desc', legacyName: 'mileage-desc' },\n 'leasing-asc': { field: 'leasingPrice', direction: 'asc', legacyName: 'leasing-asc' },\n 'leasing-desc': { field: 'leasingPrice', direction: 'desc', legacyName: 'leasing-desc' },\n 'companyLeasing-asc': {\n field: 'companyLeasingPrice',\n direction: 'asc',\n legacyName: 'companyLeasing-asc',\n },\n 'companyLeasing-desc': {\n field: 'companyLeasingPrice',\n direction: 'desc',\n legacyName: 'companyLeasing-desc',\n },\n};\nexport const DEFAULT_SORT = 'published-desc';\n\n/** Page size as components-react's legacy search had it: 30, also after a filter. */\nexport const pageSize = (_params: URLSearchParams) => 30;\n\nconst KNOWN_KEYS = new Set<string>([\n FREE_TEXT,\n SORT,\n PAGE,\n ...LIST_FILTERS,\n ...BOOLEAN_FILTERS,\n ...Object.keys(RANGE_FILTERS).flatMap((k) => [`${k}.min`, `${k}.max`]),\n]);\n\nexport const isKnownKey = (key: string) => KNOWN_KEYS.has(key);\n\n/** Odometer values in the URL are in the market's display unit; the API takes km. */\nexport const kmPerOdometerUnit = (market: MarketCode) => (market === 'NO' ? 1 : 10);\n\nconst toInt = (value: string | null) => {\n if (value === null || value === '') return undefined;\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : undefined;\n};\n\nexport interface AdsVariables {\n market: string[];\n q?: string;\n page: number;\n perPage: number;\n sort?: { field: string; direction: 'asc' | 'desc' };\n [key: string]: unknown;\n}\n\n/**\n * URL params \u2192 `search.ads` variables. Unknown keys are ignored; the page is read\n * from `page` unless given explicitly (load more passes it).\n */\nexport const toSearchVariables = (\n params: URLSearchParams,\n market: MarketCode,\n options?: { page?: number; perPage?: number }\n): AdsVariables => {\n const variables: AdsVariables = {\n market: [market],\n page: options?.page ?? toInt(params.get(PAGE)) ?? 1,\n perPage: options?.perPage ?? pageSize(params),\n };\n\n const q = params.get(FREE_TEXT)?.trim();\n if (q) variables.q = q;\n\n LIST_FILTERS.forEach((key) => {\n const values = params.getAll(key).filter(Boolean);\n if (values.length) variables[key] = values;\n });\n\n BOOLEAN_FILTERS.forEach((key) => {\n if (params.get(key) === 'true') variables[key] = true;\n });\n\n (Object.keys(RANGE_FILTERS) as RangeFilter[]).forEach((key) => {\n const scale = key === 'odometer' ? kmPerOdometerUnit(market) : 1;\n const min = toInt(params.get(`${key}.min`));\n const max = toInt(params.get(`${key}.max`));\n if (min !== undefined) variables[`${RANGE_FILTERS[key]}Min`] = min * scale;\n if (max !== undefined) variables[`${RANGE_FILTERS[key]}Max`] = max * scale;\n });\n\n const sort = SORT_OPTIONS[params.get(SORT) || ''];\n if (sort) variables.sort = { field: sort.field, direction: sort.direction };\n\n return variables;\n};\n\n/** The canonical form written to the address bar: known keys only, sorted, no paging. */\nexport const canonicalParams = (params: URLSearchParams) => {\n const next = new URLSearchParams();\n params.forEach((value, key) => {\n if (!isKnownKey(key) || key === PAGE) return;\n if (key === SORT && (value === DEFAULT_SORT || !SORT_OPTIONS[value])) return;\n if (value === '') return;\n next.append(key, value);\n });\n next.sort();\n return next;\n};\n\nexport const toggleListValue = (params: URLSearchParams, key: string, value: string) => {\n const next = new URLSearchParams(params);\n const current = next.getAll(key);\n next.delete(key);\n if (current.includes(value)) {\n current.filter((v) => v !== value).forEach((v) => next.append(key, v));\n } else {\n [...current, value].forEach((v) => next.append(key, v));\n }\n return canonicalParams(next);\n};\n\nexport const withSort = (params: URLSearchParams, sortKey: string) => {\n const next = new URLSearchParams(params);\n next.set(SORT, sortKey);\n return canonicalParams(next);\n};\n\nexport const withPage = (params: URLSearchParams, page: number) => {\n const next = new URLSearchParams(params);\n next.set(PAGE, String(page));\n return next;\n};\n", "// The filter panel's view of a search: which values a list filter offers and\n// which domain a slider covers, read straight from the API responses.\n\nimport { MarketCode } from '../@types/market';\nimport { kmPerOdometerUnit, RANGE_FILTERS, RangeFilter } from './searchParams';\nimport { AdsResult, Facet, HistogramBucket } from './types';\n\nexport interface FacetOption {\n value: string;\n count: number;\n selected: boolean;\n}\n\n/**\n * The values of a list filter, with counts from the filtered result (where a\n * selected filter's own facet is counted without it, see useAdsSearch). A\n * selected value is always listed, so it can be unticked.\n */\nexport const listOptions = (\n field: string,\n params: URLSearchParams,\n facets: Facet[] | undefined\n): FacetOption[] => {\n const selected = params.getAll(field);\n const counts = facets?.find((f) => f.field === field)?.counts || [];\n const options = counts.map((c) => ({\n value: c.value,\n count: c.count,\n selected: selected.includes(c.value),\n }));\n selected\n .filter((value) => !counts.some((c) => c.value === value))\n .forEach((value) => options.push({ value, count: 0, selected: true }));\n return options.sort((a, b) => a.value.localeCompare(b.value));\n};\n\nexport const isRangeFilter = (key: string): key is RangeFilter => key in RANGE_FILTERS;\n\nconst histogram = (key: RangeFilter, unfiltered: AdsResult, market: MarketCode) => {\n const h = unfiltered.histograms;\n switch (key) {\n case 'price':\n return h?.price;\n case 'odometer': {\n // The API counts km; the slider shows the market's unit.\n const scale = kmPerOdometerUnit(market);\n return h?.odometerReading?.map((b) => ({\n value: Math.round(b.value / scale),\n count: b.count,\n }));\n }\n case 'privateLease':\n return h?.leasingPrice;\n case 'businessLease':\n return h?.businessLeasingPrice;\n case 'modelYear':\n return unfiltered.facets\n ?.find((f) => f.field === 'modelYear')\n ?.counts.map((c) => ({ value: Number.parseInt(c.value, 10), count: c.count }))\n .filter((b) => Number.isFinite(b.value));\n default:\n return undefined;\n }\n};\n\n/** The bucket start values of a slider, ascending, from the unfiltered search. */\nexport const rangeValues = (\n key: RangeFilter,\n unfiltered: AdsResult | undefined,\n market: MarketCode\n): number[] =>\n unfiltered\n ? [...(histogram(key, unfiltered, market) || [])]\n .sort((a: HistogramBucket, b: HistogramBucket) => a.value - b.value)\n .map((b) => b.value)\n : [];\n\n/** How many values of a filter are picked: list values, or 1 for a set range. */\nexport const selectedCount = (key: string, params: URLSearchParams) =>\n isRangeFilter(key)\n ? params.has(`${key}.min`) || params.has(`${key}.max`)\n ? 1\n : 0\n : params.getAll(key).length;\n\nconst averageDelta = (values: number[]) =>\n values.length > 1 ? (values[values.length - 1] - values[0]) / (values.length - 1) : 0;\n\n/**\n * Even steps of 1000 or 500 for wide ranges, else the bucket values themselves.\n * A single bucket, such as one car with business leasing, gets a range from 0\n * so the filter still shows, as in 5.x; a single model year has nothing to pick.\n */\nconst toSteps = (values: number[], fromZero: boolean) => {\n if (values.length === 1 && fromZero && values[0] > 0) {\n return toSteps([0, values[0]], false);\n }\n const delta = averageDelta(values);\n const max = values[values.length - 1];\n // Math.ceil: uneven buckets would otherwise give a fractional array length.\n if (delta > 1000) return new Array(Math.ceil(max / 1000) + 1).fill(0).map((_, i) => i * 1000);\n if (delta >= 500) return new Array(Math.ceil(max / 500) + 1).fill(0).map((_, i) => i * 500);\n return values;\n};\n\n/** The steps of a range filter's slider; fewer than two means there is nothing to pick. */\nexport const rangeSteps = (\n key: RangeFilter,\n unfiltered: AdsResult | undefined,\n market: MarketCode\n): number[] => toSteps(rangeValues(key, unfiltered, market), key !== 'modelYear');\n", "import { useContext } from 'react';\nimport { SearchContext } from './SearchContext';\n\nconst useSearch = () => useContext(SearchContext);\n\nexport default useSearch;\n", "import { createContext } from 'react';\nimport { AdsResult } from '../../Gql/types';\nimport { AdsSearchResult } from '../../Gql/useAdsSearch';\n\nexport interface SearchContextProps {\n /** The filters in the searchParams.ts grammar; empty until the search has initialized */\n params: URLSearchParams;\n /** The filtered result, every page loaded so far */\n result?: AdsSearchResult;\n /** Facets and histograms without filters: the panel's full value lists and slider domains */\n unfiltered?: AdsResult;\n loading: boolean;\n loadingMore: boolean;\n error: boolean;\n hasMore: boolean;\n /** Applies new filters. Old keys and sort tokens are translated. */\n update: (next: URLSearchParams | string) => void;\n loadMore: () => void;\n /** Starts the search with the url's filters and/or initialQueryParams */\n initialize: (initialQueryParams?: URLSearchParams) => void;\n}\n\nexport const SearchContext = createContext<SearchContextProps>({\n params: new URLSearchParams(),\n loading: false,\n loadingMore: false,\n error: false,\n hasMore: false,\n update: () => undefined,\n loadMore: () => undefined,\n initialize: () => undefined,\n});\n", "import { useContext } from 'react';\n\nimport { SettingsContext } from './SettingsContext';\n\nconst useSettings = () => useContext(SettingsContext);\n\nexport default useSettings;\n", "import { createContext } from 'react';\nimport { resolveSettings, Settings } from './settings';\n\nexport const SettingsContext = createContext<Settings>(resolveSettings());\n", "import { MarketCode } from '../../@types/market';\nimport { PublicApiSettings } from '../../Gql/config';\n\nexport type Environment = 'production' | 'test';\n\nconst ENVIRONMENTS: Record<\n Environment,\n { publicApiUrl: string; leadUrl: string; ecomUrl: string }\n> = {\n production: {\n publicApiUrl: 'https://public-api.wayke.com/graphql',\n leadUrl: 'https://api.wayke.se/lead',\n ecomUrl: 'https://ecom.wayke.se',\n },\n test: {\n publicApiUrl: 'https://public-test-api.wayke.com/graphql',\n leadUrl: 'https://api.wayketech.se/lead',\n ecomUrl: 'https://ecom.wayketech.se',\n },\n};\n\nexport type RoutingMode = 'hash' | 'path' | 'none';\n\nexport interface RoutingSettings {\n /**\n * How a vehicle is opened from the search. `hash` (default) adds `#<id>` to\n * the url, `path` links to `<basePath>/<id>`, `none` makes the vehicles plain\n * cards and only publishes `ItemClicked`.\n */\n mode?: RoutingMode;\n /** Required for `path`. Relative to the current page, or an absolute url to another site. */\n basePath?: string;\n /** Reads and writes the search filters in the url. */\n syncUrl?: boolean;\n}\n\nexport interface EcomSettings {\n /**\n * Buy online is shown on the vehicles the dealer sells online. `false` hides it\n * on this site. Default `true`.\n */\n enabled?: boolean;\n /** Defaults to the ecom API of `environment`. */\n url?: string;\n /** Url to the logo shown in buy online, as an image file (not a `data:` url). */\n serviceLogotypeUrl?: string;\n bankIdThumbprint?: string;\n}\n\nexport interface WaykeProviderSettings {\n /** Which Wayke environment to use. Default `production`. */\n environment?: Environment;\n /** Identifies the site instead of its domain. Sent as `x-api-key`. */\n apiKey?: string;\n /** Limits the vehicles to a group of branches. By default the key decides which vehicles are shown. */\n branchGroupId?: string;\n /** Language and market. Default `SE`. */\n marketCode?: MarketCode;\n routing?: RoutingSettings;\n /** Buy online, see EcomSettings. */\n ecom?: EcomSettings;\n /** A Google Maps Static API key. Without it, the map button opens Google Maps. */\n googleMapsApiKey?: string;\n /** Url to a custom marker for the map. */\n googleMapsMarker?: string;\n /** Overrides the public API url of `environment`. */\n publicApiUrl?: string;\n /** Overrides the lead url of `environment`. */\n leadUrl?: string;\n}\n\nexport interface Settings {\n publicApi: PublicApiSettings;\n marketCode: MarketCode;\n leadUrl: string;\n routing: Required<Omit<RoutingSettings, 'basePath'>> & { basePath?: string };\n /** Undefined when buy online is turned off. */\n ecom?: Required<Pick<EcomSettings, 'url'>> & Omit<EcomSettings, 'enabled'>;\n googleMapsApiKey?: string;\n googleMapsMarker?: string;\n}\n\n/** 5.x settings that 6.0 no longer reads, and what replaces them. */\nconst REMOVED_SETTINGS: Record<string, string> = {\n url: 'environment',\n urlMlt: 'environment',\n graphQlUrl: 'environment',\n ecomSettings: 'ecom (buy online is on by default)',\n useQueryParamsFromUrl: 'routing.syncUrl',\n pathRoute: \"routing: { mode: 'path', basePath }\",\n};\n\nconst warnRemovedSettings = (settings: object) => {\n for (const key of Object.keys(settings)) {\n if (key in REMOVED_SETTINGS) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(`Wayke: the setting ${key} was removed in 6.0, use ${REMOVED_SETTINGS[key]}`);\n }\n }\n};\n\nconst resolveEcom = (\n { enabled = true, url, ...ecom }: EcomSettings = {},\n environmentUrl: string\n): Settings['ecom'] => (enabled ? { ...ecom, url: url || environmentUrl } : undefined);\n\nexport const resolveSettings = (settings: WaykeProviderSettings = {}): Settings => {\n warnRemovedSettings(settings);\n const environment = ENVIRONMENTS[settings.environment || 'production'];\n const marketCode = settings.marketCode || 'SE';\n const mode = settings.routing?.mode || 'hash';\n\n if (mode === 'path' && !settings.routing?.basePath) {\n // Without a base path there is nowhere to put the vehicle id.\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn('Wayke: routing.mode \"path\" needs routing.basePath, using \"hash\" instead');\n }\n\n return {\n publicApi: {\n api: { url: settings.publicApiUrl || environment.publicApiUrl, apiKey: settings.apiKey },\n branchGroupId: settings.branchGroupId,\n market: marketCode,\n },\n marketCode,\n leadUrl: settings.leadUrl || environment.leadUrl,\n routing: {\n mode: mode === 'path' && !settings.routing?.basePath ? 'hash' : mode,\n basePath: settings.routing?.basePath,\n syncUrl: !!settings.routing?.syncUrl,\n },\n ecom: resolveEcom(settings.ecom, environment.ecomUrl),\n googleMapsApiKey: settings.googleMapsApiKey,\n googleMapsMarker: settings.googleMapsMarker,\n };\n};\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { SORT } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport Accordion, { AccordionItem } from '../Accordion';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport Panel from '../Panel';\nimport { FooterAction, FooterActionItem } from '../Panel/wrapper';\nimport { Repeat } from '../Repeat';\nimport FacetSelector from './faceSelector';\n\nexport interface PanelFilter {\n id: string;\n displayName: string;\n}\n\ninterface Props {\n filters: PanelFilter[];\n /** The filter whose section is open */\n open: string;\n onClose: () => void;\n}\n\nconst FilterPanel = ({ filters, open, onClose }: Props) => {\n const { t } = useTranslation();\n const { params, result, loading, update } = useSearch();\n const found = result?.found || 0;\n\n const onClearFilters = useCallback(() => {\n PubSub.publish('SearchClearAllFilters', { query: params.toString() });\n // The sort order is not a filter: it stays.\n const next = new URLSearchParams();\n const sort = params.get(SORT);\n if (sort) next.set(SORT, sort);\n update(next);\n }, [params, update]);\n\n return (\n <Panel\n title={t('search.filter')}\n onClose={onClose}\n footer={\n <FooterAction>\n <FooterActionItem>\n <ButtonSecondary fullWidth disabled={loading} onClick={onClearFilters}>\n <ButtonContent>{t('search.clearAllFilters.text')}</ButtonContent>\n </ButtonSecondary>\n </FooterActionItem>\n <FooterActionItem>\n <ButtonPrimary fullWidth disabled={loading} onClick={onClose}>\n <ButtonContent>\n {t('search.showNumberOfCustomUnit', {\n count: found,\n unit: t(`search.result.${found === 1 ? 'singular' : 'plural'}`),\n })}\n </ButtonContent>\n </ButtonPrimary>\n </FooterActionItem>\n </FooterAction>\n }\n >\n <Accordion>\n {filters.map((f) => (\n <AccordionItem key={f.id} heading={f.displayName} isActive={f.id === open}>\n <Repeat>\n <FacetSelector id={f.id} label={f.displayName} />\n </Repeat>\n </AccordionItem>\n ))}\n </Accordion>\n </Panel>\n );\n};\n\nexport default FilterPanel;\n", "import {\n ActionAll,\n ActionNames,\n ActionOnFilterUpdate,\n ActionTypes,\n CallbackOnFilterUpdate,\n} from './Actions';\nimport {\n CallbackEcom,\n CallbackHashRouteChange,\n CallbackItem,\n CallbackView,\n EventAll,\n EventEcom,\n EventFilterApply,\n EventFinanceClose,\n EventFinanceInterest,\n EventFinanceOpen,\n EventHashRouteChange,\n EventImagesClick,\n EventInsuranceClose,\n EventInsuranceInterest,\n EventInsuranceOpen,\n EventItemClicked,\n EventLeadOpen,\n EventLeadSent,\n EventMailClick,\n EventMailVisible,\n EventNames,\n EventOptionsClick,\n EventPhonenumberCall,\n EventPhonenumberVisible,\n EventSearch,\n EventSearchClearAllFiltersQuery,\n EventSearchClearQuery,\n EventSearchCompleted,\n EventSearchInitiated,\n EventType,\n EventView,\n} from './Events';\n\nexport type EventSubscriptions = {\n View: EventView[];\n HashRouteChange: EventHashRouteChange[];\n ItemClicked: EventItemClicked[];\n Ecom: EventEcom[];\n ImagesClick: EventImagesClick[];\n OptionsClick: EventOptionsClick[];\n PhonenumberVisible: EventPhonenumberVisible[];\n PhonenumberCall: EventPhonenumberCall[];\n MailVisible: EventMailVisible[];\n MailClick: EventMailClick[];\n LeadOpen: EventLeadOpen[];\n LeadSent: EventLeadSent[];\n InsuranceOpen: EventInsuranceOpen[];\n InsuranceClose: EventInsuranceClose[];\n InsuranceInterest: EventInsuranceInterest[];\n FinanceOpen: EventFinanceOpen[];\n FinanceClose: EventFinanceClose[];\n FinanceInterest: EventFinanceInterest[];\n Search: EventSearch[];\n SearchClearQuery: EventSearchClearQuery[];\n SearchClearAllFilters: EventSearchClearAllFiltersQuery[];\n SearchInitiated: EventSearchInitiated[];\n SearchCompleted: EventSearchCompleted[];\n FilterApply: EventFilterApply[];\n All: EventAll[];\n};\n\nexport type ActionSubscriptions = {\n onFilterUpdate: ActionOnFilterUpdate[];\n All: ActionAll[];\n};\n\nclass PubSub {\n private static events: EventSubscriptions = {\n View: [],\n HashRouteChange: [],\n ItemClicked: [],\n Ecom: [],\n ImagesClick: [],\n OptionsClick: [],\n PhonenumberVisible: [],\n PhonenumberCall: [],\n MailVisible: [],\n MailClick: [],\n LeadOpen: [],\n LeadSent: [],\n InsuranceOpen: [],\n InsuranceClose: [],\n InsuranceInterest: [],\n FinanceOpen: [],\n FinanceClose: [],\n FinanceInterest: [],\n Search: [],\n SearchClearQuery: [],\n SearchClearAllFilters: [],\n SearchInitiated: [],\n SearchCompleted: [],\n FilterApply: [],\n All: [],\n };\n\n private static actions: ActionSubscriptions = {\n onFilterUpdate: [],\n All: [],\n };\n\n public static subscribeAction = (event: ActionTypes) =>\n PubSub.actions[event.actionName].push(event as any);\n\n public static unsubscribeAction = (event: ActionTypes) => {\n if (PubSub.actions[event.actionName]) {\n for (let i = 0; i < PubSub.actions[event.actionName].length; i++) {\n if (PubSub.actions[event.actionName][i] === event) {\n PubSub.actions[event.actionName].splice(i, 1);\n break;\n }\n }\n }\n };\n\n public static publishAction = (eventName: ActionNames, ...args: any) => {\n if (PubSub.actions.All) {\n PubSub.events.All.forEach((event) => event.callback(eventName, args[0]));\n }\n if (PubSub.actions[eventName]) {\n PubSub.actions[eventName].forEach((event: ActionTypes) => {\n switch (eventName) {\n case 'onFilterUpdate':\n (event.callback as CallbackOnFilterUpdate)(args[0]);\n break;\n default:\n break;\n }\n });\n }\n };\n\n public static subscribe = (event: EventType) => PubSub.events[event.eventName].push(event as any);\n\n public static unsubscribe = (event: EventType) => {\n if (PubSub.events[event.eventName]) {\n for (let i = 0; i < PubSub.events[event.eventName].length; i++) {\n if (PubSub.events[event.eventName][i] === event) {\n PubSub.events[event.eventName].splice(i, 1);\n break;\n }\n }\n }\n };\n\n public static publish = (eventName: EventNames, ...args: any) => {\n if (PubSub.events.All) {\n PubSub.events.All.forEach((event) => event.callback(eventName, args[0]));\n }\n if (PubSub.events[eventName]) {\n PubSub.events[eventName].forEach((event: EventType) => {\n switch (eventName) {\n case 'View':\n (event.callback as CallbackView)(args[0]);\n break;\n case 'HashRouteChange':\n (event.callback as CallbackHashRouteChange)(args[0]);\n break;\n case 'Ecom':\n (event.callback as CallbackEcom)(args[0]);\n break;\n case 'ItemClicked':\n case 'ImagesClick':\n case 'OptionsClick':\n case 'PhonenumberVisible':\n case 'PhonenumberCall':\n case 'MailVisible':\n case 'MailClick':\n case 'LeadOpen':\n case 'LeadSent':\n case 'InsuranceInterest':\n case 'InsuranceOpen':\n case 'InsuranceClose':\n case 'FinanceOpen':\n case 'FinanceClose':\n case 'Search':\n case 'SearchClearQuery':\n case 'SearchClearAllFilters':\n case 'SearchInitiated':\n case 'SearchCompleted':\n case 'FilterApply':\n case 'FinanceInterest':\n (event.callback as CallbackItem)(args[0]);\n break;\n default:\n break;\n }\n });\n }\n };\n}\nexport default PubSub;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconChevronDown } from '../Icon';\nimport {\n Body,\n Header,\n Heading,\n Icon,\n Indicator,\n IndicatorValue,\n Item,\n Label,\n List,\n} from './wrapper';\n\nexport interface IAccordionItem {\n heading: string;\n activeCount?: number;\n children: React.ReactNode;\n isActive?: boolean;\n}\n\nexport interface IAccordion {\n children?: React.ReactNode;\n}\n\nexport const AccordionItem = ({ heading, children, activeCount, isActive }: IAccordionItem) => {\n const { t } = useTranslation();\n const [extend, setExtend] = useState(isActive || false);\n const onToggleExtend = useCallback(() => setExtend(!extend), [extend]);\n\n return (\n <Item isOpen={extend}>\n <Header onClick={onToggleExtend} title={t('common.showMore') || ''}>\n <Label>\n <Heading\n className={activeCount && activeCount > 0 ? 'wayke__theme wayke__font--bold' : ''}\n >\n {heading}\n </Heading>\n {activeCount && activeCount > 0 && (\n <Indicator>\n <IndicatorValue>{activeCount}</IndicatorValue>\n </Indicator>\n )}\n </Label>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Header>\n <Body>{children}</Body>\n </Item>\n );\n};\n\nconst Accordion = ({ children }: IAccordion) => <List>{children}</List>;\n\nexport default Accordion;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: ${size(-1)} 0;\n font-size: 1rem;\n`;\n\nexport const Header = styled(ButtonReset)`\n display: flex;\n align-items: center;\n width: 100%;\n padding: ${size(3)} 0;\n text-align: left;\n font: inherit;\n`;\n\nexport const Label = styled.div`\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n`;\n\nexport const Heading = styled.div`\n line-height: 1;\n`;\n\nexport const Indicator = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 ${size(0.375)};\n margin-left: ${size(0.5)};\n min-width: 1em;\n height: 1em;\n border-radius: 999px;\n z-index: 1;\n`;\n\nexport const IndicatorValue = styled.div`\n font-family: sans-serif; // Default font to guarantee visibility\n font-size: 0.75rem;\n font-weight: bold;\n`;\n\nexport const Icon = styled.div`\n position: relative;\n flex-shrink: 0;\n padding-left: ${size(1)};\n transition: color 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-1)};\n bottom: ${size(-1)};\n left: 0;\n right: ${size(-1)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accent};\n z-index: -1;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n ${Header}:hover & {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Body = styled.div`\n display: none;\n padding-bottom: ${size(3)};\n`;\n\ntype ItemProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLLIElement>, HTMLLIElement> & {\n isOpen?: boolean;\n};\n\nexport const Item = styled.li<ItemProps>`\n & + & {\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n\n ${({ isOpen }) =>\n isOpen &&\n css`\n ${Body} {\n display: block;\n }\n\n ${Icon} {\n svg {\n transform: rotate(180deg);\n }\n }\n `}\n`;\n", "import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { H1 } from '../Heading';\nimport { IconCancel } from '../Icon';\nimport { Portal, PortalNamespace } from '../Portal';\nimport {\n Body,\n Close,\n CloseBtn,\n Footer,\n Header,\n Heading,\n PanelWrapper,\n UiBlock,\n Wrapper,\n} from './wrapper';\n\ninterface IPanelPortal {\n id?: string | null;\n title: string | null;\n onClose: () => void;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nconst Panel = ({ id, title, footer, onClose, children }: IPanelPortal) => {\n const { t } = useTranslation();\n return (\n <Portal id={id || PortalNamespace.DefaultPortal}>\n <Wrapper>\n <UiBlock title={t('other.closePanel') || ''} onClick={onClose} />\n <PanelWrapper>\n <Header>\n <Heading>\n <H1 noMargin>{title}</H1>\n </Heading>\n <Close>\n <CloseBtn title={t('other.closePanel') || ''} onClick={onClose}>\n <IconCancel block />\n </CloseBtn>\n </Close>\n </Header>\n <Body>{children}</Body>\n {footer && <Footer>{footer}</Footer>}\n </PanelWrapper>\n </Wrapper>\n </Portal>\n );\n};\n\nexport default Panel;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype HeadingBaseProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n noMargin?: boolean;\n};\n\nconst HeadingBase = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))<HeadingBaseProps>`\n margin-top: 0;\n margin-bottom: ${size(2)};\n font-weight: normal;\n line-height: 1.2;\n\n ${({ noMargin }) =>\n noMargin &&\n css`\n margin-bottom: 0;\n `}\n`;\n\nexport const H1 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h1',\n}))`\n font-size: 1.875rem;\n`;\n\nexport const H2 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h2',\n}))`\n font-size: 1.5rem;\n`;\n\nexport const H3 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h3',\n}))`\n font-size: 1.125rem;\n`;\n\nexport const H4 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h4',\n}))`\n font-size: 1rem;\n`;\n\nexport const H5 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h5',\n}))`\n font-size: 0.875rem;\n`;\n\n/*\nexport const H6 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h6',\n}))`\n font-size: 0.67rem;\n`;\n*/\n\nexport const VisualHeading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1em;\n`;\n", "export const DefaultPortal = 'DEFAULT_PORTAL';\n", "import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface IPortal {\n id: string;\n children: React.ReactNode;\n}\n\nconst Portal = ({ id, children }: IPortal) => {\n const el = React.useRef(document.getElementById(id) || document.createElement('div'));\n if (!el.current) {\n return null;\n }\n\n const { current } = el;\n\n const [dynamic] = React.useState(!current.parentElement);\n\n React.useEffect(() => {\n if (dynamic) {\n current.id = id;\n if (document.body) {\n document.body.appendChild(current);\n }\n }\n return () => {\n if (dynamic && current.parentElement) {\n current.parentElement.removeChild(current);\n }\n };\n }, [id]);\n\n return ReactDOM.createPortal(children, current);\n};\n\nexport default React.memo<IPortal>(Portal);\n", "import * as React from 'react';\n\nexport interface IPortalElement {\n id: string;\n}\n\nconst PortalElement = ({ id }: IPortalElement) => <div id={id} />;\n\nexport default PortalElement;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { fadeIn, noTransform } from '../../layout/keyframes';\nimport { ButtonReset } from '../Button';\nimport { H1 } from '../Heading';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'dialog',\n}))`\n position: relative;\n z-index: 80;\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n 'aria-hidden': 'true',\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.35);\n animation: ${fadeIn} 200ms ease;\n`;\n\nexport const PanelWrapper = styled.article.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n width: 100%;\n background-color: ${(props) => props.theme.color.accent};\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n z-index: 1;\n animation: ${noTransform} 200ms ease forwards;\n\n ${(props) => props.theme.breakpoint.Sm} {\n max-width: 450px;\n transform: translateX(100%);\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n top: auto;\n max-height: 100%;\n transform: translateY(100%);\n }\n`;\n\nexport const Header = styled.header`\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: 45px;\n padding: ${size(3)};\n padding-bottom: 0;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: ${size(3)};\n background-image: linear-gradient(\n ${(props) => props.theme.color.accent},\n ${(props) => props.theme.color.accentTransparent}\n );\n z-index: 1;\n }\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n\n ${H1} {\n font-size: 1.5rem;\n }\n`;\n\nexport const Close = styled.div`\n flex-shrink: 0;\n margin: ${size(-2)};\n padding-left: ${size(3)};\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n position: relative;\n display: block;\n padding: ${size(2)};\n transform-origin: 50% 50%;\n transition: transform 200ms ease;\n z-index: 2;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accent};\n opacity: 0;\n transition: opacity 200ms ease;\n z-index: -1;\n }\n\n &:active {\n transform: scale(0.9);\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Body = styled.div`\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n padding: ${size(3)};\n`;\n\nexport const Footer = styled.footer`\n position: relative;\n flex-shrink: 0;\n padding: ${size(3)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n`;\n\nexport const FooterAction = styled.div.attrs(() => ({\n role: 'group',\n}))`\n display: flex;\n align-items: center;\n margin: ${size(-0.5)};\n`;\n\nexport const FooterActionItem = styled.div`\n flex: 1 1 50%;\n padding: ${size(0.5)};\n\n ${ButtonReset} {\n padding: ${size(1.75)} ${size(2)};\n }\n`;\n", "import { keyframes } from 'styled-components';\n\nexport const noTransform = keyframes`\n to {\n transform: none;\n }\n`;\n\nexport const fadeIn = keyframes`\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n`;\n\nexport const rotate = keyframes`\n to {\n transform: rotate(360deg);\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Repeat = styled.div`\n & + & {\n margin-top: ${size(3)};\n }\n`;\n\nexport const RepeatTiny = styled.div`\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const RepeatSmall = styled.div`\n & + & {\n margin-top: ${size(2)};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isRangeFilter } from '../../Gql/facets';\nimport useSettings from '../../State/Settings/useSettings';\nimport CheckListFacet from './checkListFacet';\nimport ColorSelectFacet from './colorFacet';\nimport RangeFacet from './rangeFacet';\n\ninterface FacetSelectorProps {\n id: string;\n /** The filter's title. */\n label?: string;\n}\n\nconst FacetSelector = ({ id, label }: FacetSelectorProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n\n if (id === 'colorName') return <ColorSelectFacet id={id} />;\n if (!isRangeFilter(id)) return <CheckListFacet id={id} />;\n\n switch (id) {\n case 'price':\n return <RangeFacet id={id} label={label} unit={t('currency.default')} formatValues />;\n case 'privateLease':\n case 'businessLease':\n return <RangeFacet id={id} label={label} unit={t('currency.monthly')} formatValues />;\n case 'odometer':\n return (\n <RangeFacet\n id={id}\n label={label}\n unit={t(`odometer.${marketCode === 'NO' ? 'Kilometer' : 'ScandinavianMile'}`)}\n formatValues\n />\n );\n case 'modelYear':\n return <RangeFacet id={id} label={label} unit=\"\u00E5r\" />;\n default:\n return null;\n }\n};\n\nexport default FacetSelector;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { listOptions } from '../../Gql/facets';\nimport { toggleListValue } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport Checklist from '../Checklist';\nimport OverflowBox from '../OverflowBox';\n\ninterface ChecklistFacetProps {\n id: string;\n}\n\nconst ChecklistFacet = ({ id }: ChecklistFacetProps) => {\n const { params, result, loading, error, update } = useSearch();\n // Ticks show at once, before the search answers.\n const [pending, setPending] = useState<{ [value: string]: boolean }>({});\n useEffect(() => setPending({}), [result, error]);\n\n const onClick = useCallback(\n (value: string, checked: boolean) => {\n if (loading) return;\n setPending((current) => ({ ...current, [value]: checked }));\n PubSub.publish('FilterApply', { type: 'checkbox', filter: id, value, checked });\n update(toggleListValue(params, id, value));\n },\n [loading, params, id, update]\n );\n\n return (\n <OverflowBox>\n <Checklist\n items={listOptions(id, params, result?.facets).map((option) => ({\n label: option.value,\n onClick: () => onClick(option.value, !option.selected),\n active: pending[option.value] ?? option.selected,\n }))}\n />\n </OverflowBox>\n );\n};\n\nexport default ChecklistFacet;\n", "import React from 'react';\nimport { IconCheck, IconRadio } from '../Icon';\nimport { Action, ActionIcon, ActionLabel, Item, List } from './wrapper';\n\nexport interface IChecklistItem {\n label: string;\n onClick: () => void;\n active?: boolean;\n radio?: boolean;\n}\n\nexport interface IChecklist {\n items: IChecklistItem[];\n radio?: boolean;\n}\n\nconst ChecklistItem = ({ label, onClick, active, radio }: IChecklistItem) => (\n <Item>\n <Action onClick={onClick}>\n {active && <ActionIcon>{radio ? <IconRadio block /> : <IconCheck block />}</ActionIcon>}\n <ActionLabel\n className={active ? 'wayke__theme wayke__font--bold wayke__color--primary-text' : ''}\n >\n {label}\n </ActionLabel>\n </Action>\n </Item>\n);\n\nconst Checklist = ({ items, radio }: IChecklist) => {\n if (!items?.length) {\n return null;\n }\n\n return (\n <List>\n {items.map((item) => (\n <ChecklistItem\n key={item.label}\n label={item.label}\n onClick={item.onClick}\n active={item.active}\n radio={radio}\n />\n ))}\n </List>\n );\n};\n\nexport default Checklist;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n list-style: none;\n padding: 0;\n margin: ${size(-1)} 0;\n font-size: 0.875rem;\n overflow: hidden;\n`;\n\nexport const Item = styled.li`\n ${List} {\n padding-left: ${size(5)};\n margin: 0;\n }\n`;\n\nexport const Action = styled(ButtonReset)`\n position: relative;\n display: block;\n width: 100%;\n text-align: left;\n font: inherit;\n padding: ${size(1)} 0;\n\n &:before {\n content: '';\n position: absolute;\n left: 0;\n width: ${size(2)};\n height: ${size(2)};\n border-radius: 3px;\n background-color: ${(props) => props.theme.color.accentDark};\n margin-top: 2px; // Magic number\n }\n`;\n\nexport const ActionIcon = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: absolute;\n top: ${size(1)};\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(2)};\n height: ${size(2)};\n margin-top: 2px; // Magic number\n font-size: ${size(1.5)};\n`;\n\nexport const ActionLabel = styled.div`\n padding-left: ${size(3)};\n transition: transform 150ms ease;\n\n ${Action}:hover & {\n transform: translateX(${size(0.5)});\n }\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface IProps {\n children?: React.ReactNode;\n}\n\nconst OverflowBox = ({ children }: IProps) => <Wrapper>{children}</Wrapper>;\n\nexport default OverflowBox;\n", "import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n max-height: 400px;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { listOptions } from '../../Gql/facets';\nimport { toggleListValue } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { getHexColorFromDisplayName } from '../../utils/converters';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport ColorSelect from '../ColorSelect';\n\ninterface ColorSelectFacetProps {\n id: string;\n}\n\nconst ColorSelectFacet = ({ id }: ColorSelectFacetProps) => {\n const { params, result, loading, error, update } = useSearch();\n const [pending, setPending] = useState<{ [value: string]: boolean }>({});\n useEffect(() => setPending({}), [result, error]);\n\n const onClick = useCallback(\n (value: string, checked: boolean) => {\n if (loading) return;\n setPending((current) => ({ ...current, [value]: checked }));\n PubSub.publish('FilterApply', { type: 'checkbox', filter: id, value, checked });\n update(toggleListValue(params, id, value));\n },\n [loading, params, id, update]\n );\n\n return (\n <ColorSelect\n items={listOptions(id, params, result?.facets).map((option) => ({\n label: option.value,\n onClick: () => onClick(option.value, !option.selected),\n active: pending[option.value] ?? option.selected,\n hex: [getHexColorFromDisplayName(option.value)],\n }))}\n />\n );\n};\n\nexport default ColorSelectFacet;\n", "export const MANUFACTURER = 'manufacturer';\nexport const MODEL_SERIES = 'modelSeries';\nexport const FUEL_TYPE = 'fuelType';\nexport const GEARBOX_TYPE = 'gearboxType';\nexport const BRANCH = 'branch';\nexport const COLOR = 'color';\nexport const ENVIRONMENT_CLASS = 'environmentClass';\nexport const SEGMENT = 'properties.segment';\nexport const DRIVING_WHEEL = 'drivingWheel';\nexport const PRICE = 'price';\nexport const MILEAGE = 'mileage';\nexport const MODEL_YEAR = 'modelYear';\nexport const LEASING_PRICE = 'leasingPrice';\nexport const BUSINESS_LEASING_PRICE = 'businessLeasingPrice';\nexport const ODOMETER_VALUE_AS_KM = 'odometerValueAsKm';\nexport const FUEL_TYPES = 'fuelTypes';\nexport const ENGINE_BASE_TYPE = 'engineBaseType';\nexport const ELECTRICAL_RANGE_WLTP = 'enhancedProperties.electricalRangeWLTP.value';\n\nexport const COLOR_WHITE = { displayName: 'Vit', hex: '#ffffff' };\nexport const COLOR_BLACK = { displayName: 'Svart', hex: '#000000' };\nexport const COLOR_GRAY = { displayName: 'Gr\u00E5', hex: '#808080' };\nexport const COLOR_SILVER = { displayName: 'Silver', hex: '#c0c0c0' };\nexport const COLOR_BLUE = { displayName: 'Bl\u00E5', hex: '#0000ff' };\nexport const COLOR_RED = { displayName: 'R\u00F6d', hex: '#ff0000' };\nexport const COLOR_BROWN = { displayName: 'Brun', hex: '#a52a2a' };\nexport const COLOR_GREEN = { displayName: 'Gr\u00F6n', hex: '#008000' };\nexport const COLOR_ORANGE = { displayName: 'Orange', hex: '#ffa500' };\nexport const COLOR_YELLOW = { displayName: 'Gul', hex: '#ffff00' };\nexport const COLOR_PURPLE = { displayName: 'Lila', hex: '#800080' };\nexport const COLOR_BEIGE = { displayName: 'Beige', hex: '#f5f5dc' };\n\n/*\nexport const DEFAULT_PLACEHOLDER_IMAGE =\n 'https://cdn.wayke.se/wui/images/placeholders/placeholder_product_card.jpg';\n*/\n\nexport const DEFAULT_PLACEHOLDER_IMAGE =\n 'data:image/jpeg;base64,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';\n", "import {\n COLOR_BEIGE,\n COLOR_BLACK,\n COLOR_BLUE,\n COLOR_BROWN,\n COLOR_GRAY,\n COLOR_GREEN,\n COLOR_ORANGE,\n COLOR_PURPLE,\n COLOR_RED,\n COLOR_SILVER,\n COLOR_WHITE,\n COLOR_YELLOW,\n} from './constants';\n\nexport const getHexColorFromDisplayName = (displayName: string) => {\n switch (displayName) {\n case COLOR_WHITE.displayName:\n return COLOR_WHITE.hex;\n case COLOR_BLACK.displayName:\n return COLOR_BLACK.hex;\n case COLOR_GRAY.displayName:\n return COLOR_GRAY.hex;\n case COLOR_SILVER.displayName:\n return COLOR_SILVER.hex;\n case COLOR_BLUE.displayName:\n return COLOR_BLUE.hex;\n case COLOR_RED.displayName:\n return COLOR_RED.hex;\n case COLOR_BROWN.displayName:\n return COLOR_BROWN.hex;\n case COLOR_GREEN.displayName:\n return COLOR_GREEN.hex;\n case COLOR_ORANGE.displayName:\n return COLOR_ORANGE.hex;\n case COLOR_YELLOW.displayName:\n return COLOR_YELLOW.hex;\n case COLOR_PURPLE.displayName:\n return COLOR_PURPLE.hex;\n case COLOR_BEIGE.displayName:\n return COLOR_BEIGE.hex;\n default:\n return '#fff';\n }\n};\n", "import React from 'react';\n\nimport { Action, Color, Item, Label, List } from './wrapper';\n\nexport interface ItemProps {\n label: string;\n hex: string[];\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n boxShadow?: boolean;\n}\n\nexport interface Props {\n items?: ItemProps[];\n}\n\nconst ColorSelectItem = ({ label, hex, onClick, active, disabled, boxShadow }: ItemProps) => {\n return (\n <Item>\n <Action onClick={onClick} disabled={disabled} title={label} aria-label={label}>\n <Color\n style={{\n backgroundColor: hex.length === 1 ? hex[0] : '',\n backgroundImage: hex.length > 1 ? `linear-gradient(${hex.join()})` : '',\n }}\n active={active}\n boxShadow={boxShadow}\n className={active ? 'wayke__theme wayke__color--primary-text' : ''}\n />\n <Label\n className={active ? 'wayke__theme wayke__color--primary-text wayke__font--bold' : ''}\n >\n {label}\n </Label>\n </Action>\n </Item>\n );\n};\n\nconst ColorSelect = ({ items }: Props) => {\n if (!items) {\n return null;\n }\n\n return (\n <List>\n {items.map((item) => (\n <ColorSelectItem\n key={item.label}\n label={item.label}\n hex={item.hex}\n onClick={item.onClick}\n active={item.active}\n disabled={item.disabled}\n boxShadow={item.boxShadow}\n />\n ))}\n </List>\n );\n};\n\nexport default ColorSelect;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-1.5)};\n`;\n\nexport const Item = styled.li`\n flex: 1 1 auto;\n width: 33.333%;\n max-width: 33.333%;\n padding: ${size(1.5)};\n`;\n\nexport const Action = styled(ButtonReset)`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n font: inherit;\n\n &[disabled] {\n opacity: 0.4;\n cursor: default;\n }\n`;\n\ntype ColorProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n active?: boolean;\n boxShadow?: boolean;\n};\n\nexport const Color = styled.div<ColorProps>`\n position: relative;\n width: ${size(3.75)};\n height: ${size(3.75)};\n border-radius: 50%;\n color: ${(props) => props.theme.color.border};\n\n &:before {\n content: '';\n position: absolute;\n top: -5px;\n bottom: -5px;\n left: -5px;\n right: -5px;\n border: 2px solid;\n border-radius: 50%;\n display: none;\n }\n\n ${Action}:not([disabled]):hover & {\n &::before {\n display: block;\n }\n }\n\n ${({ active }) =>\n active &&\n css`\n &::before {\n display: block;\n }\n `}\n\n ${({ boxShadow }) =>\n boxShadow &&\n css`\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);\n `}\n`;\n\nexport const Label = styled.div`\n margin-top: ${size(1.25)};\n font-size: 0.875rem;\n`;\n", "import React, { useCallback, useMemo } from 'react';\nimport { rangeSteps } from '../../Gql/facets';\nimport { canonicalParams, RangeFilter } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport RangeSlider from '../RangeSlider';\n\ninterface RangeFacetProps {\n id: RangeFilter;\n /** The filter's name, read out with the handles. */\n label?: string;\n unit?: string;\n formatValues?: boolean;\n}\n\nconst toInt = (value: string | null) => {\n const n = value === null ? Number.NaN : Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : undefined;\n};\n\nconst RangeFacet = ({ id, label, unit, formatValues }: RangeFacetProps) => {\n const { params, unfiltered, loading, update } = useSearch();\n const { marketCode } = useSettings();\n\n const steps = useMemo(() => rangeSteps(id, unfiltered, marketCode), [unfiltered, id]);\n const domain = [steps[0], steps[steps.length - 1]];\n const clamp = (n: number) => Math.min(Math.max(n, domain[0]), domain[1]);\n const values = [\n clamp(toInt(params.get(`${id}.min`)) ?? domain[0]),\n clamp(toInt(params.get(`${id}.max`)) ?? domain[1]),\n ];\n\n const onChange = useCallback(\n (next: readonly number[]) => {\n if (next[0] === values[0] && next[1] === values[1]) return;\n const query = new URLSearchParams(params);\n query.delete(`${id}.min`);\n query.delete(`${id}.max`);\n // At the edges the range is open: the top bucket means \"and above\".\n if (next[0] !== domain[0]) query.set(`${id}.min`, `${next[0]}`);\n if (next[1] !== domain[1]) query.set(`${id}.max`, `${next[1]}`);\n update(canonicalParams(query));\n PubSub.publish('FilterApply', { type: 'range', filter: id, min: next[0], max: next[1] });\n },\n [params, id, values[0], values[1], domain[0], domain[1], update]\n );\n\n if (steps.length < 2) return null;\n\n return (\n <RangeSlider\n loading={loading}\n domain={domain}\n values={values}\n maxPrefix={id === 'modelYear' ? undefined : '+'}\n label={label}\n steps={steps}\n unit={unit}\n onChange={onChange}\n formatValues={formatValues}\n />\n );\n};\n\nexport default RangeFacet;\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { numberSeparator } from '../../utils/formats';\nimport { Range, RangeSpan, RangeSpanItem, Root, Thumb, Track } from './wrapper';\n\n/** The smallest gap between two steps, so every bucket edge can be reached. */\nconst smallestStep = (steps: number[]) =>\n steps.reduce(\n (smallest, step, index) =>\n index === 0 ? smallest : Math.min(smallest, step - steps[index - 1]),\n Number.MAX_SAFE_INTEGER\n );\n\ninterface RangeSliderProps {\n loading: boolean;\n domain: number[];\n values: number[];\n steps: number[];\n /** The filter's name, read out with each handle. */\n label?: string;\n unit?: string;\n formatValues?: boolean;\n maxPrefix?: string;\n onChange: (values: readonly number[]) => void;\n}\n\nconst RangeSlider = ({\n loading,\n values,\n domain,\n steps,\n label,\n unit,\n formatValues,\n maxPrefix,\n onChange,\n}: RangeSliderProps) => {\n const { t } = useTranslation();\n // Follows the handles while they move; the search only changes when they are let go.\n const [current, setCurrent] = useState<number[]>(values);\n // The last value moved to, also before React has rendered it.\n const latest = useRef(values);\n const move = (next: number[]) => {\n latest.current = next;\n setCurrent(next);\n };\n\n useEffect(() => {\n move(values);\n }, [values[0], values[1]]);\n\n // Radix 1.6.1 compares a drag's end with stale values and never calls onValueCommit\n // for it; web-ui-v2's RangeSlider works around it the same way.\n const commitDrag = () => {\n const next = latest.current;\n if (next[0] !== values[0] || next[1] !== values[1]) onChange(next);\n };\n\n const format = (value: number) => (formatValues ? numberSeparator(value) : value);\n const suffix = unit ? ` ${unit}` : '';\n const equal = domain[0] === domain[1];\n const thumbLabel = (bound: 'min' | 'max') =>\n [label, t(`rangeSlider.${bound}`)].filter(Boolean).join(', ');\n\n return (\n <>\n {equal ? (\n // One value to pick: both handles at the ends, nothing to move.\n <Root min={0} max={1} value={[0, 1]} disabled>\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={thumbLabel('min')} />\n <Thumb aria-label={thumbLabel('max')} />\n </Root>\n ) : (\n <Root\n min={domain[0]}\n max={domain[1]}\n step={smallestStep(steps)}\n value={current}\n disabled={loading}\n onValueChange={move}\n // Keys commit here; a drag commits on pointerup, see commitDrag.\n onValueCommit={onChange}\n onPointerUp={commitDrag}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={thumbLabel('min')} />\n <Thumb aria-label={thumbLabel('max')} />\n </Root>\n )}\n <RangeSpan>\n <RangeSpanItem>{`${format(current[0])}${suffix}`}</RangeSpanItem>\n <RangeSpanItem>{`${format(current[1])}${\n maxPrefix && current[1] === domain[1] ? maxPrefix : ''\n }${suffix}`}</RangeSpanItem>\n </RangeSpan>\n </>\n );\n};\n\nexport default RangeSlider;\n", "import { format as formatFns } from 'date-fns';\nimport { nb, sv } from 'date-fns/locale';\n\n// Filter function to remove any null/undefined values.\nexport const notEmpty = <TValue>(value: TValue | null | undefined): value is TValue =>\n value !== null && value !== undefined;\n\nexport const numberSeparator = (value: number, n = 0, x = 3, s = ' ', c = '.') => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const re = `\\\\d(?=(\\\\d{${x || 3}})+${n > 0 ? '\\\\D' : '$'})`;\n const num = value.toFixed(Math.max(0, ~~n));\n\n return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), `$&${s || ','}`);\n};\n\nimport { MarketCode } from '../@types/market';\n\nexport const dateTimeFormat = {\n YearMonth: 1,\n DayMonth: 2,\n\n format: (value: string | Date, format: number, marketCode?: MarketCode) => {\n const date = new Date(value);\n const settings = { locale: marketCode === 'NO' ? nb : sv };\n switch (format) {\n case dateTimeFormat.YearMonth:\n return formatFns(date, 'MMMM yyyy', settings);\n case dateTimeFormat.DayMonth:\n return formatFns(date, 'd MMMM yyyy', settings);\n default:\n return formatFns(date, 'yyyy-MM-dd HH:mm', settings);\n }\n },\n};\n", "import * as SliderPrimitive from '@radix-ui/react-slider';\nimport styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const RangeSpan = styled.div`\n display: flex;\n align-items: center;\n margin-top: ${size(1)};\n user-select: none;\n`;\n\nexport const RangeSpanItem = styled.div`\n font-size: 0.875rem;\n color: ${(props) => props.theme.color.textDarkLighten};\n\n &:first-child {\n flex: 1 1 auto;\n }\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n\nexport const Root = styled(SliderPrimitive.Root)`\n position: relative;\n display: flex;\n align-items: center;\n height: 24px;\n margin: 10px 0;\n touch-action: none;\n user-select: none;\n\n &[data-disabled] {\n opacity: 0.6;\n }\n`;\n\nexport const Track = styled(SliderPrimitive.Track)`\n position: relative;\n flex-grow: 1;\n height: 4px;\n background-color: ${(props) => props.theme.color.accentDark};\n`;\n\nexport const Range = styled(SliderPrimitive.Range).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n position: absolute;\n height: 100%;\n`;\n\nexport const Thumb = styled(SliderPrimitive.Thumb).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n display: block;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n cursor: grab;\n transition:\n transform 150ms ease,\n box-shadow 150ms ease;\n\n &:active {\n cursor: grabbing;\n transform: scale(1.3);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n [data-disabled] > & {\n cursor: default;\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-0.5)};\n`;\n\nexport const Item = styled.li`\n padding: ${size(0.5)};\n`;\n\nexport const Action = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n padding: ${size(1.5)} ${size(3)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n font-size: 0.875rem;\n line-height: 1;\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Label = styled.div`\n z-index: 1;\n`;\n\nexport const Indicator = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 ${size(0.375)};\n margin-left: ${size(0.5)};\n background-color: currentColor;\n min-width: 1em;\n height: 1em;\n border-radius: 999px;\n z-index: 1;\n`;\n\nexport const IndicatorValue = styled.div`\n font-family: sans-serif; // Default font to guarantee visibility\n font-size: 0.75rem;\n font-weight: bold;\n color: white;\n mix-blend-mode: difference;\n`;\n", "import React from 'react';\nimport { SearchHit } from '../../Gql/types';\nimport HitCard from '../ProductCard/HitCard';\nimport { Item, List, Wrapper } from './wrapper';\n\ninterface GridProps {\n hits: SearchHit[];\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\nconst Grid = ({ hits, placeholderImage, displayBranchName }: GridProps) => (\n <Wrapper>\n <List>\n {hits.map((hit) => (\n <Item key={hit.ad.id}>\n <HitCard\n hit={hit}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n </Item>\n ))}\n </List>\n </Wrapper>\n);\n\nexport default Grid;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { hitImage, toAmount } from '../../Gql/hit';\nimport { SearchHit } from '../../Gql/types';\nimport { numberSeparator } from '../../utils/formats';\nimport ProductCard from '.';\n\ninterface HitCardProps {\n hit: SearchHit;\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\n/** A search hit as a product card: the search result and the related cars share it. */\nconst HitCard = ({ hit, placeholderImage, displayBranchName }: HitCardProps) => {\n const { t } = useTranslation();\n const { ad, iteration } = hit;\n const item = iteration?.item;\n const odometer = iteration?.logistics?.odometerReading;\n const price = toAmount(ad.pricing?.cash?.price);\n const oldPrice = toAmount(ad.pricing?.cash?.oldPrice);\n const money = (amount?: number, unit = 'currency.default') =>\n amount !== undefined ? `${numberSeparator(amount)} ${t(unit)}` : undefined;\n const usps: { title?: string | number }[] = [\n { title: item?.modelYear?.intValue },\n {\n title: odometer\n ? `${numberSeparator(odometer.value)} ${t(\n `odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`\n )}`\n : undefined,\n },\n { title: item?.attributes?.transmission?.formattedValue },\n { title: item?.driveline?.fuelTypesString?.stringValue },\n ];\n\n return (\n <ProductCard\n id={ad.id}\n title={item?.displayName || ad.salesDescription?.title || ''}\n description={ad.salesDescription?.title || undefined}\n image={hitImage(hit)}\n placeholderImage={placeholderImage}\n branch={{ id: ad.branch.id, name: ad.branch.displayName || undefined }}\n branchName={displayBranchName ? ad.branch.displayName || undefined : undefined}\n uspList={usps.filter((usp): usp is { title: string | number } => !!usp.title)}\n price={money(price)}\n oldPrice={\n price !== undefined && oldPrice !== undefined && price < oldPrice\n ? money(oldPrice)\n : undefined\n }\n leasingPrice={money(toAmount(ad.pricing?.leasing?.leasingMonthlyPayment), 'currency.monthly')}\n businessLeasingPrice={money(\n toAmount(ad.pricing?.companyLeasing?.leasingMonthlyPayment),\n 'currency.monthly'\n )}\n />\n );\n};\n\nexport default HitCard;\n", "import { Money, SearchHit } from './types';\n\n/** An amount from the API, or undefined when it is missing or not above zero. */\nexport const toAmount = (money?: Money | null) => {\n const n = money ? Number.parseFloat(money.amount) : Number.NaN;\n return Number.isFinite(n) && n > 0 ? n : undefined;\n};\n\n/** The first image of a hit, if any. */\nexport const hitImage = (hit: SearchHit) => hit.ad.media?.items?.find((i) => i?.url)?.url;\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useIsInViewport from '../../hooks/useIsInViewport';\nimport useRouter from '../../State/Router/useRouter';\nimport { DEFAULT_PLACEHOLDER_IMAGE } from '../../utils/constants';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport ResponsiveImage from '../ResponsiveImage';\nimport UspList, { ItemProps } from '../UspList';\nimport {\n Content,\n ContentBody,\n ContentFooter,\n CurrentPrice,\n Description,\n Heading,\n Image,\n Img,\n Label,\n Link,\n OldPrice,\n Picture,\n PreHeading,\n Price,\n PriceCell,\n Usp,\n Wrapper,\n} from './wrapper';\n\n// One column on phones, two on tablets, three from desktop (at most about 400 px).\nconst CARD_WIDTHS = [375, 450, 600, 750, 840];\nconst CARD_SIZES = '(min-width: 1024px) 400px, (min-width: 600px) 50vw, 100vw';\n\ninterface Props {\n id: string;\n title: string;\n /** The ad's first image (a cfit url) */\n image?: string;\n branch?: { id: string; name?: string };\n placeholderImage?: string;\n description?: string;\n uspList?: ItemProps[];\n /** Left out when the ad has no cash price (0), as on wayke.se */\n price?: string;\n leasingPrice?: string;\n oldPrice?: string;\n branchName?: string;\n businessLeasingPrice?: string;\n}\n\nconst ProductCard = ({\n id,\n title,\n image,\n placeholderImage,\n branch,\n branchName,\n description,\n uspList,\n price,\n oldPrice,\n leasingPrice,\n businessLeasingPrice,\n}: Props) => {\n const { t } = useTranslation();\n const { itemHref, onLinkClick } = useRouter();\n const href = itemHref(id);\n\n const [containerRef, isVisible] = useIsInViewport<HTMLDivElement>({\n persistVisibility: true,\n });\n\n const onClick = useCallback(\n () => PubSub.publish('ItemClicked', { id, branchId: branch?.id, branchName: branch?.name }),\n [id, branch?.id, branch?.name]\n );\n\n const onHrefClick = useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (href) onLinkClick(e, href);\n },\n [href, onLinkClick]\n );\n\n return (\n <Wrapper onClick={onClick}>\n {href && <Link onClick={onHrefClick} href={href} title={title} aria-label={title} />}\n <Image ref={containerRef}>\n {isVisible && image ? (\n <ResponsiveImage\n img={Img}\n src={image}\n widths={CARD_WIDTHS}\n sizes={CARD_SIZES}\n alt={title}\n />\n ) : (\n <Picture>\n <Img src={placeholderImage || DEFAULT_PLACEHOLDER_IMAGE} />\n </Picture>\n )}\n </Image>\n <Content>\n <ContentBody>\n {branchName && <PreHeading>{branchName}</PreHeading>}\n <Heading>{title}</Heading>\n {description && <Description>{description}</Description>}\n {uspList && (\n <Usp>\n <UspList small items={uspList} />\n </Usp>\n )}\n </ContentBody>\n <ContentFooter>\n <Price>\n {price && (\n <PriceCell>\n {oldPrice ? (\n <OldPrice>{oldPrice}</OldPrice>\n ) : (\n <Label>{t('productCard.price')}</Label>\n )}\n <CurrentPrice>{price}</CurrentPrice>\n </PriceCell>\n )}\n {leasingPrice && (\n <PriceCell>\n <Label>{t('productCard.privateLeasing')}</Label>\n <CurrentPrice>{leasingPrice}</CurrentPrice>\n </PriceCell>\n )}\n {businessLeasingPrice && (\n <PriceCell>\n <Label>{t('productCard.businessLeasing')}</Label>\n <CurrentPrice>{businessLeasingPrice}</CurrentPrice>\n </PriceCell>\n )}\n </Price>\n </ContentFooter>\n </Content>\n </Wrapper>\n );\n};\n\nexport default ProductCard;\n", "import { useEffect, useRef, useState } from 'react';\n\ninterface Options extends IntersectionObserverInit {\n persistVisibility?: boolean;\n}\n\nconst useIsInViewport = <T>(\n options?: Options\n): [React.MutableRefObject<T | null>, boolean, number] => {\n const containerRef = useRef<T | null>(null);\n\n const [isVisible, setIsVisible] = useState(false);\n const [intersectionRatio, setIntersectionRatio] = useState(0);\n\n const callbackFunction = (\n entries: IntersectionObserverEntry[],\n observer: IntersectionObserver\n ) => {\n const [entry] = entries;\n setIsVisible(entry.isIntersecting);\n setIntersectionRatio(entry.intersectionRatio);\n\n if (entry.isIntersecting && options?.persistVisibility && containerRef.current) {\n observer.unobserve(containerRef.current as unknown as HTMLElement);\n containerRef.current = null;\n }\n };\n\n useEffect(() => {\n const observer = new IntersectionObserver(callbackFunction, options);\n if (containerRef.current) observer.observe(containerRef.current as unknown as HTMLElement);\n\n return () => {\n if (containerRef.current) observer.unobserve(containerRef.current as unknown as HTMLElement);\n };\n }, [containerRef, options]);\n\n return [containerRef, isVisible, intersectionRatio];\n};\n\nexport default useIsInViewport;\n", "import { useContext } from 'react';\nimport { RouterContext } from './RouterContext';\n\nconst useRouter = () => useContext(RouterContext);\n\nexport default useRouter;\n", "import { createContext } from 'react';\n\nexport interface RouterContextProps {\n /** The vehicle that is open, from the hash or the path */\n id?: string;\n /** The query string in the address bar, without `?` */\n search: string;\n /** Link to a vehicle; undefined when routing is `none` */\n itemHref: (id: string) => string | undefined;\n /** Link back to the search from a vehicle; undefined when there is none */\n searchHref?: string;\n /** Click handler for the links above: same-site path links open without a reload */\n onLinkClick: (e: React.MouseEvent<HTMLAnchorElement>, href: string) => void;\n /** Writes the search filters to the address bar when routing.syncUrl is on */\n writeSearch: (params: URLSearchParams, replace?: boolean) => void;\n}\n\nexport const RouterContext = createContext<RouterContextProps>({\n search: '',\n itemHref: () => undefined,\n onLinkClick: () => undefined,\n writeSearch: () => undefined,\n});\n", "import React from 'react';\nimport { cfitSources, imageUrl, isCfit } from '../../utils/image';\n\ntype ImgProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\ninterface ResponsiveImageProps extends Omit<ImgProps, 'src' | 'srcSet' | 'sizes'> {\n src: string;\n /** Widths to offer; each is snapped to one the image service accepts. */\n widths: number[];\n /** How wide the image is shown, as for <img sizes>. */\n sizes: string;\n /** The styled <img> to render. */\n img?: React.ElementType<ImgProps>;\n}\n\n/**\n * An ad image in the size and format the browser needs (AVIF, WebP, else JPEG),\n * decoded off the main thread. Images from other hosts get the largest width.\n */\nconst ResponsiveImage = ({\n src,\n widths,\n sizes,\n img: Img = 'img',\n ...rest\n}: ResponsiveImageProps) => {\n const largest = Math.max(...widths);\n if (!isCfit(src)) {\n return (\n <Img src={imageUrl(src, { width: largest, height: Math.round(largest / 1.5) })} {...rest} />\n );\n }\n const sources = cfitSources(src, widths);\n return (\n <picture style={{ display: 'contents' }}>\n <source type=\"image/avif\" srcSet={sources.avif} sizes={sizes} />\n <source type=\"image/webp\" srcSet={sources.webp} sizes={sizes} />\n <Img\n src={imageUrl(src, { width: largest, height: Math.round(largest / 1.5) })}\n srcSet={sources.jpeg}\n sizes={sizes}\n decoding=\"async\"\n {...rest}\n />\n </picture>\n );\n};\n\nexport default ResponsiveImage;\n", "// Widths accepted by the cfit/v3 image worker (SUPPORTED_WIDTHS in image-transform-v3);\n// any other value makes it respond 400, and it reads only the first occurrence of\n// each query param. Legacy media URLs instead take a free-form ?spec=WxH.\nconst CFIT_WIDTHS = [\n 48, 64, 96, 128, 225, 375, 380, 450, 600, 680, 750, 770, 800, 840, 900, 1000, 1080, 1170, 1200,\n 1920, 2000, 4096, 8192,\n];\n\nexport const isCfit = (src: string) => src.includes('/cfit/');\n\nconst snapCfitWidth = (width: number) =>\n CFIT_WIDTHS.find((w) => w >= width) || CFIT_WIDTHS[CFIT_WIDTHS.length - 1];\n\nexport type ImageSpec = [width: number, height: number];\n\ninterface ImageOptions {\n width: number;\n height: number;\n webp?: boolean;\n}\n\nexport const imageUrl = (src: string, { width, height, webp }: ImageOptions) => {\n if (isCfit(src)) {\n const [base, query] = src.split('?');\n const params = new URLSearchParams(query);\n params.set('w', String(snapCfitWidth(width)));\n if (webp) {\n params.set('format', 'webp');\n }\n return `${base}?${params.toString()}`;\n }\n return `${src}?spec=${width}x${height}${webp ? '&format=webp' : ''}`;\n};\n\n/**\n * Width-limited URL for an image that may come from cfit (allowed widths only)\n * or from a host that takes a free ?w=&h= (legacy media, blob storage).\n */\nexport const imageWithWidth = (src: string, width: number, height?: number) => {\n if (isCfit(src)) return imageUrl(src, { width, height: height || width });\n return `${src}?w=${width}${height ? `&h=${height}` : ''}`;\n};\n\nexport const imageSrcSet = (src: string, specs: ImageSpec[], webp?: boolean) =>\n specs\n .map(([width, height]) => {\n const descriptor = isCfit(src) ? snapCfitWidth(width) : width;\n return `${imageUrl(src, { width, height, webp })} ${descriptor}w`;\n })\n .join(', ');\n\n/**\n * srcsets for a cfit image in AVIF, WebP and JPEG, as web-ui-v2's gallery has\n * them: the browser takes the first format it supports, in the width it needs.\n */\nexport const cfitSources = (src: string, widths: number[]) => {\n const set = (format?: 'avif' | 'webp') =>\n widths\n .map((width) => {\n const [base, query] = src.split('?');\n const params = new URLSearchParams(query);\n params.set('w', String(snapCfitWidth(width)));\n if (format) params.set('format', format);\n return `${base}?${params.toString()} ${snapCfitWidth(width)}w`;\n })\n .join(', ');\n return { avif: set('avif'), webp: set('webp'), jpeg: set() };\n};\n", "import React from 'react';\nimport { IconInfo } from '../Icon';\nimport { Action, Box, Item, ItemSection, List } from './wrapper';\n\nexport interface ItemProps {\n title: string | number | null;\n onClick?: () => void;\n}\n\nexport interface Props {\n items?: ItemProps[];\n small?: boolean;\n}\n\nconst UspItem = ({ title, onClick }: ItemProps) => {\n return (\n <Item>\n <Box>\n <ItemSection>{title}</ItemSection>\n {onClick && (\n <ItemSection>\n <Action onClick={onClick}>\n <IconInfo block />\n </Action>\n </ItemSection>\n )}\n </Box>\n </Item>\n );\n};\n\nconst UspList = ({ items, small }: Props) => {\n if (!items) {\n return null;\n }\n\n return (\n <List $isSmall={small}>\n {items.map((item, index) => (\n <UspItem key={`${item.title}-${index}`} title={item.title} onClick={item.onClick} />\n ))}\n </List>\n );\n};\n\nexport default UspList;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Item = styled.li`\n padding: ${size(0.5)};\n`;\n\nexport const Box = styled.div`\n display: flex;\n align-items: center;\n background-color: ${(props) => props.theme.color.accentDark};\n padding: ${size(1)} ${size(1.5)};\n border-radius: 3px;\n font-size: 0.875rem;\n overflow-wrap: break-word;\n hyphens: auto;\n`;\n\nexport const ItemSection = styled.div`\n & + & {\n margin-left: ${size(1)};\n }\n`;\n\nexport const Action = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const List = styled.ul<{ $isSmall?: boolean }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-0.5)};\n\n ${({ $isSmall }) =>\n $isSmall &&\n css`\n margin: ${size(-0.25)};\n\n ${Item} {\n padding: ${size(0.25)};\n }\n\n ${Box} {\n padding: ${size(0.5)} ${size(1)};\n font-size: 0.75rem;\n }\n\n ${ItemSection} {\n & + & {\n margin-left: ${size(0.5)};\n }\n }\n `}\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.article`\n position: relative;\n height: 100%;\n display: flex;\n flex-direction: column;\n cursor: pointer;\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nexport const Image = styled.div`\n flex-shrink: 0;\n position: relative;\n height: 0;\n padding-bottom: 66.666%;\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n ${Wrapper}:hover & {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Picture = styled.picture``;\n\nexport const Img = styled.img`\n position: absolute;\n width: 100%;\n height: 100%;\n object-fit: cover;\n top: auto;\n left: auto;\n border-radius: 3px;\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n margin-top: ${size(2)};\n`;\n\nexport const ContentBody = styled.div``;\n\nexport const ContentFooter = styled.div`\n margin-top: auto;\n padding-top: ${size(1)};\n`;\n\nexport const PreHeading = styled.div`\n margin-bottom: ${size(0.25)};\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.75rem;\n`;\n\nexport const Heading = styled.h1.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n font-weight: 400;\n margin: 0;\n font-size: 1rem;\n`;\n\nexport const Link = styled.a`\n position: absolute;\n inset: 0;\n z-index: 1;\n color: inherit;\n text-decoration: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Description = styled.div`\n font-size: 0.875rem;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: ${size(0.25)};\n`;\n\nexport const Usp = styled.div`\n margin-top: ${size(1)};\n`;\n\nexport const Price = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n width: 100%;\n`;\n\nexport const CurrentPrice = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n font-size: 1rem;\n margin-right: ${size(1)};\n`;\n\nexport const PriceCell = styled.div`\n flex: 1 1 auto;\n padding-right: ${size(1)};\n`;\n\nexport const OldPrice = styled.div`\n text-decoration: line-through;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n`;\n\nexport const Label = styled.label`\n color: ${(props) => props.theme.color.disabledText};\n font-size: 0.75rem;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\nexport const List = styled.ul`\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-2)} ${size(-1)};\n`;\n\nexport const Item = styled.li`\n flex: 1 1 auto;\n width: 100%;\n max-width: 100%;\n padding: ${size(2)} ${size(1)};\n\n ${(props) => props.theme.breakpoint.Sm} {\n width: 50%;\n max-width: 50%;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n width: 33.333%;\n max-width: 33.333%;\n }\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Page = styled.div``;\n\ntype PageSectionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n accent?: boolean;\n large?: boolean;\n fillSpace?: boolean;\n};\n\nexport const PageSection = styled.section<PageSectionProps>`\n margin-bottom: ${size(4)};\n\n ${({ accent }: { accent?: boolean }) =>\n accent &&\n css`\n padding: ${size(4)} 0;\n background-color: ${(props) => props.theme.color.accent};\n margin-bottom: 0;\n `}\n\n ${({ large }: { large?: boolean }) =>\n large &&\n css`\n margin-bottom: ${size(8)};\n `}\n\n ${({ accent, large }) =>\n accent &&\n large &&\n css`\n padding: ${size(8)} 0;\n margin-bottom: 0;\n `}\n\n ${({ fillSpace }: { fillSpace?: boolean }) =>\n fillSpace &&\n css`\n flex: 1 1 auto;\n `}\n`;\n", "import React, { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { DEFAULT_SORT, SORT, withSort } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { numberSeparator } from '../../utils/formats';\nimport { sortOptions } from '../../utils/sortOptions';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport Loader from '../Loader';\nimport ProgressBar from '../ProgressBar';\nimport SortSelect from '../SortSelect';\nimport {\n Body,\n Footer,\n FooterAction,\n FooterProgress,\n Header,\n HeaderCount,\n HeaderSort,\n ResultCount,\n Wrapper,\n} from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst Result = ({ children }: Props) => {\n const { t } = useTranslation();\n const { loading, loadingMore, result, params, hasMore, loadMore, update } = useSearch();\n\n const onSortOptionChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => update(withSort(params, e.currentTarget.value)),\n [params, update]\n );\n\n const numberOfDocuments = result?.hits.length || 0;\n const numberOfHits = result?.found || 0;\n const options = useMemo(() => sortOptions(), []);\n\n // A new search replaces the list; loading more keeps it and adds to it.\n if (loading && !loadingMore) {\n return <Loader />;\n }\n return (\n <Wrapper>\n <Header>\n <HeaderCount>\n <ResultCount>{`${numberSeparator(numberOfHits)} ${\n numberOfHits === 1 ? t('search.result.plural') : t('search.result.plural')\n }`}</ResultCount>\n </HeaderCount>\n <HeaderSort>\n <SortSelect\n value={params.get(SORT) || DEFAULT_SORT}\n options={options}\n onChange={onSortOptionChange}\n />\n </HeaderSort>\n </Header>\n <Body>{children}</Body>\n <Footer>\n <FooterProgress>\n <ProgressBar valueCurrent={numberOfDocuments} valueMax={numberOfHits} />\n </FooterProgress>\n {hasMore && (\n <FooterAction>\n <ButtonSecondary\n disabled={loadingMore}\n onClick={loadMore}\n title={t('search.showMore.title')}\n aria-label={t('search.showMore.text')}\n >\n <ButtonContent>{t('search.showMore.text')}</ButtonContent>\n </ButtonSecondary>\n </FooterAction>\n )}\n </Footer>\n </Wrapper>\n );\n};\n\nexport default Result;\n", "import i18n, { i18n as I18nInstance } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport { MarketCode } from '../@types/market';\n\n// Explicit type: an inferred type would reference node_modules/i18next in the emitted .d.ts (TS2883).\nexport const i18nScoped: I18nInstance = i18n.createInstance();\n\nconst getLanguage = (marketCode?: MarketCode) => {\n switch (marketCode) {\n case 'NO':\n return 'nb-NO';\n case 'SE':\n return 'sv-SE';\n default:\n return 'en-US';\n }\n};\n\nexport const initializeI18n = (marketCode: MarketCode = 'SE') => {\n return new Promise((resolve) => {\n if (i18nScoped.isInitialized) {\n resolve(true);\n return;\n }\n i18nScoped.use(initReactI18next).init(\n {\n lng: getLanguage(marketCode),\n fallbackLng: 'en-US',\n interpolation: {\n escapeValue: false,\n },\n resources: {\n 'sv-SE': {\n translation: {\n navigation: {\n backToSearch: 'Tillbaka till bils\u00F6k',\n },\n filter: {\n manufacturer: 'Tillverkare',\n model: 'Modell',\n modelSeries: 'Modell',\n fuelType: 'Drivmedel',\n gearboxType: 'V\u00E4xell\u00E5da',\n branchDisplayName: 'Anl\u00E4ggning',\n branchCity: 'Stad',\n colorName: 'F\u00E4rg',\n environmentClass: 'Milj\u00F6klass',\n segment: 'Segment',\n bodyStyle: 'Karosstyp',\n trimLevel: 'Utrustningsniv\u00E5',\n inventoryStatus: 'Lagerstatus',\n drivetrainType: 'Drivhjul',\n engineBaseType: 'Motortyp',\n price: 'Pris',\n odometer: 'Miltal',\n modelYear: 'Modell\u00E5r',\n privateLease: 'Privatleasing',\n businessLease: 'F\u00F6retagsleasa',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/m\u00E5n',\n },\n category: {\n basic: 'Basuppgifter',\n engineAndPerformance: 'Motor & Prestanda',\n },\n subCategory: {\n engine: 'Motor',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Varum\u00E4rke',\n hint: '',\n },\n modelSeries: {\n displayName: 'Modell',\n hint: '',\n },\n modelName: {\n displayName: 'Version',\n hint: 'Vilket utf\u00F6rande av bilmodellen det \u00E4r.',\n },\n modelYear: {\n displayName: 'Modell\u00E5r',\n hint: 'Modell\u00E5r s\u00E4tts av tillverkaren. Handlaren \u00E4ndrar ibland modell\u00E5ret f\u00F6r att matcha transportstyrelsens definition f\u00F6r <i>\u00E5rsmodell</i>. Definitionen f\u00F6r \u00E5rsmodell inneb\u00E4r att bilar tillverkade andra halvan av \u00E5ret f\u00E5r n\u00E4sta \u00E5rs modell\u00E5r.',\n },\n manufactureYear: {\n displayName: 'Tillverknings\u00E5r',\n hint: '\u00C5ret bilen tillverkades.',\n },\n odometer: { displayName: 'M\u00E4tarst\u00E4llning', hint: '' },\n gearboxType: { displayName: 'V\u00E4xell\u00E5da', hint: '' },\n registrationNumber: { displayName: 'Registreringsnummer', hint: '' },\n fuelType: {\n displayName: 'Br\u00E4nslegrupp',\n hint: 'Vad bilen ska tankas med och drivs av.',\n },\n enginePower: { displayName: 'Effekt', unit: 'hk' },\n color: { displayName: 'F\u00E4rg' },\n chassis: { displayName: 'Kaross' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: '\u00C5rlig fordonsskatt' },\n numberOfDoors: { displayName: 'D\u00F6rrar' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Ja',\n no: 'Nej',\n logotype: 'Logotyp',\n close: 'St\u00E4ng',\n showMore: 'Visa mer',\n readMore: 'L\u00E4s mer',\n showMoreInformation: 'Visa mer information',\n showLessInformation: 'Visa mindre information',\n choose: 'V\u00E4lj',\n address: 'Adress',\n mondayShort: 'M\u00E5n',\n tuesdayShort: 'Tis',\n wednesdayShort: 'Ons',\n thursdayShort: 'Tor',\n fridayShort: 'Fre',\n saturdayShort: 'L\u00F6r',\n sundayShort: 'S\u00F6n',\n moreInformation: 'Mer information',\n lessInformation: 'Mindre information',\n anErrorHasOccured: 'Ett fel har intr\u00E4ffat',\n opensInNewTab: '\u00D6ppnas i ny flik',\n open: '\u00D6ppna',\n imageIndex: 'Bild {{index}}',\n },\n item: {\n relatedVehicles: 'Relaterade fordon',\n latestVehicles: 'Senast inkomna',\n readMoreInNewTab: 'L\u00E4s mer (\u00F6ppnas i ny flik)',\n moreInfoAboutSubject: 'Mer information om {{subject}}',\n dataNotAvailable: 'Uppgift saknas',\n showOnGoogleMaps: 'Visa p\u00E5 Google Maps',\n googleMapsMapAlt: 'Karta',\n googleMapsPlaceholderInit: 'Visa karta',\n demoCar: 'Demobil',\n demoCarDescription:\n 'En demobil \u00E4r en bil som st\u00E5tt i utst\u00E4llning eller som p\u00E5 annat s\u00E4tt anv\u00E4nts f\u00F6r att visa upp en viss modell. Bilarna \u00E4r ofta v\u00E4lutrustade och har blivit v\u00E4l omh\u00E4ndertagna. Dessutom har de vanligtvis g\u00E5tt f\u00E5 mil och har fortfarande nybilsgarantierna kvar.',\n carData: 'Biluppgifter',\n carDataDescription: 'Information direkt fr\u00E5n Transportstyrelsen och tillverkaren.',\n equipment: 'Utrustning',\n equipmentDescription: 'Kompletterande uppgifter om bilen.',\n documents: 'Dokument',\n documentTypes: {\n tireEnergyDeclaration: 'Energideklaration f\u00F6r d\u00E4ck',\n goodsDeclaration: 'Varudeklaration',\n other: '\u00D6vriga dokument',\n },\n carIsReserved: 'Bilen \u00E4r reserverad',\n carIsReservedDescription: 'Denna bil \u00E4r reserverad av en annan k\u00F6pare.',\n carIsReservedModalBody: 'Denna bil \u00E4r reserverad av en annan k\u00F6pare.',\n centralWarehouseCar: 'Centrallagerbil',\n centralWarehouseCarDescription:\n 'Denna bil tillh\u00F6r ett centrallager och g\u00E5r att k\u00F6pa genom flera anl\u00E4ggningar. Byt anl\u00E4ggning f\u00F6r att visa kontaktuppgifter till just den anl\u00E4ggningen.',\n centralWarehouseCarDescriptionShort:\n 'Denna bil tillh\u00F6r ett centrallager och g\u00E5r att k\u00F6pa genom flera anl\u00E4ggningar.',\n clickHereToShowContactToAnotherBranch:\n ' Klicka h\u00E4r f\u00F6r att visa kontaktuppgifter till en annan anl\u00E4ggning',\n switchBranch: 'Byt anl\u00E4ggning',\n switchBranchDescription: 'V\u00E4lj den anl\u00E4ggning du vill visa kontaktuppgifter f\u00F6r.',\n chooseBranch: 'V\u00E4lj anl\u00E4ggning',\n chooseSelectedBranch: 'V\u00E4lj vald anl\u00E4ggning',\n availableFromDate: 'Tillg\u00E4nglig fr\u00E5n {{date}}',\n includingShort: 'Inkl.',\n usedWarrany: 'Begagnatgaranti',\n homeDelivery: 'Hemleverans',\n thisCarsIsLocatedAt: 'Den h\u00E4r bilen finns p\u00E5',\n thisCarIsAvailableAtOurBranch:\n 'Den h\u00E4r bilen finns p\u00E5 v\u00E5r anl\u00E4ggning i {{location}}',\n contact: 'Kontakt',\n threeSixty: {\n badge: '360\u00B0 bild',\n sphereBadge: '360\u00B0 interi\u00F6r',\n viewer: '360\u00B0 bildvisare',\n description: 'Dra eller anv\u00E4nd piltangenterna f\u00F6r att rotera bilen.',\n rotate: 'Rotera 360\u00B0',\n frame: '{{frame}} av {{total}}',\n },\n openingHoursToday: '\u00D6ppetider idag',\n closedToday: 'St\u00E4ngt idag',\n open: '\u00D6ppet',\n closed: 'St\u00E4ngt',\n addInsurance: 'V\u00E4lj till f\u00F6rs\u00E4kring',\n getInsuranceQuote: 'F\u00E5 prisf\u00F6rslag',\n insurance: 'F\u00F6rs\u00E4kring',\n readMoreAboutInsuranceInNewTab: 'L\u00E4s mer om f\u00F6rs\u00E4kringen (\u00F6ppnas i ny flik)',\n personalNumber: 'Personnummer',\n estimatedAnualMileage: 'Uppskattad k\u00F6rstr\u00E4cka per \u00E5r',\n showInsurances: 'Visa f\u00F6rs\u00E4kringar',\n savePersonalNumberOnThisDevice: 'Spara personnummer p\u00E5 denna enhet',\n savePersonalNumberOnThisDeviceHelp:\n 'Spara personnummer p\u00E5 denna dator f\u00F6r att direkt visa f\u00F6rs\u00E4kringskostnaderna i Wayke. Personnumret lagras inte hos Wayke utan finns bara sparad i din webbl\u00E4sare.',\n couldNotfetchInsurances: 'Kunde inte h\u00E4mta f\u00F6rs\u00E4kringar. V\u00E4nligen f\u00F6rs\u00F6k igen.',\n openPrePurchaseInformationInNewTab:\n 'F\u00F6rk\u00F6psinformation och villkor (\u00F6ppnas i ny flik)',\n insuranceIncludes: 'F\u00F6rs\u00E4kringen inneh\u00E5ller',\n addInsuranceHeading: 'L\u00E4gg till',\n financialOptions: {\n otherFinancialOptions: 'Andra finansieringsalternativ',\n privateLease: 'Privatleasa',\n businessLease: 'F\u00F6retagsleasa',\n monthlyCost: 'M\u00E5nadskostnad',\n bindingTime: 'Bindningstid',\n annualMileage: '\u00C5rlig k\u00F6rstr\u00E4cka',\n payInInstallments: 'Delbetala',\n payInInstallmentsDetailed: 'Delbetala {{amount}} i {{duration}} m\u00E5n',\n disclaimer: 'Ber\u00E4knat p\u00E5 {{interest}} r\u00E4nta.',\n loanOptions: 'L\u00E5nealternativ',\n downPayment: 'Kontantinsats',\n duration: 'Avbetalning',\n residual: 'Restskuld',\n interest: 'R\u00E4nta',\n effectiveinterest: 'Effektiv r\u00E4nta',\n setupFee: 'Uppl\u00E4ggningskostnad',\n administrationFee: 'Administrativa avgifter',\n totalCreditCost: 'Total kreditkostnad',\n mileagePerYear: 'mil/\u00E5r',\n months: 'm\u00E5n',\n loanOptionsDisclaimer:\n 'Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %) och en \u00E5rlig k\u00F6rstr\u00E4cka om {{mileage}} mil.',\n },\n actions: {\n emailSubject: '{{hostName}} \u2013 Jag \u00E4r intresserad av {{vehicle}}',\n emailBody: 'L\u00E4nk till bilen: {{url}}',\n openform: '\u00D6ppna formul\u00E4r',\n buyOnline: 'K\u00F6p bilen online',\n showEmail: 'Visa mailadress',\n showPhoneNumber: 'Visa telefonnummer',\n callNumber: 'Ring',\n sendEmailTo: 'Skicka ett mail till',\n },\n accessories: {\n accessories: 'Tillbeh\u00F6r',\n accessoriesDescription: 'Tillbeh\u00F6r som passar till detta fordon.',\n price: 'Kontantpris',\n oldPrice: 'Tidigare pris',\n installationCost: 'Monteringskostnad',\n articleNumberShort: 'Art. nr.',\n moreInformationAboutAccessory: 'Mer information om {{accessory}}',\n },\n },\n productCard: {\n price: 'Pris',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'F\u00F6retagsleasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sortera',\n showMore: {\n text: 'Visa fler',\n title: 'Visa fler resultat',\n },\n filterButton: {\n text: 'Filtrera',\n title: 'Visa filter',\n },\n sortButton: {\n text: 'Sortera',\n title: 'V\u00E4lj sorteringsordning',\n },\n searchResult: 'S\u00F6kresultat',\n snackbarNoSearchResults: {\n heading: 'Inga resultat',\n body: 'S\u00F6kningen gav inga resultat',\n },\n snackBarClearFreeText: {\n heading: 'Inga resultat',\n body: 'Rensa fritexten f\u00F6r att se alla filter',\n },\n sortOptions: {\n relevance: 'Relevans',\n publishedAsc: 'Publicerad (\u00E4ldst)',\n publishedDesc: 'Publicerad (senast)',\n priceAsc: 'Pris (l\u00E4gst)',\n priceDesc: 'Pris (h\u00F6gst)',\n modelAsc: '\u00C5rsmodell (\u00E4ldst)',\n modelDesc: '\u00C5rsmodell (nyast)',\n mileageAsc: 'Miltal (l\u00E4gst)',\n mileageDesc: 'Miltal (h\u00F6gst)',\n },\n clearAllFilters: {\n text: 'Rensa alla filter',\n title: 'Rensa alla filter',\n },\n showNumberOfCustomUnit: 'Visa {{count}} {{unit}}',\n result: {\n singular: 'Bil',\n plural: 'Bilar',\n },\n freeText: 'Fritext',\n from: 'Fr\u00E5n',\n to: 'Till',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'l\u00E4gsta',\n max: 'h\u00F6gsta',\n },\n searchBar: {\n title: 'S\u00F6k',\n placeholder: 'S\u00F6k din bil',\n button: {\n text: 'S\u00F6k',\n title: 'S\u00F6k',\n },\n searchResults: 'S\u00F6ktr\u00E4ffar',\n showAllRsults: 'Visa alla bilar',\n },\n lead: {\n messageFormTitle: 'Skicka meddelande',\n callFormTitle: 'Bli uppringd',\n firstName: 'F\u00F6rnamn',\n lastName: 'Efternamn',\n email: 'E-postadress',\n phoneNumber: 'Telefonnummer',\n message: 'Meddelande',\n tradeInCar: 'Inbytesbil',\n registrationNumber: 'Registreringsnummer',\n mileage: 'Miltal',\n send: 'Skicka',\n close: 'St\u00E4ng',\n error: 'Det gick inte att skicka. F\u00F6rs\u00F6k igen.',\n validationMessages: {\n requiredFirstName: 'F\u00F6rnamn kr\u00E4vs',\n requiredLastName: 'Efternamn kr\u00E4vs',\n requiredEmail: 'E-postadress kr\u00E4vs',\n invalidEmail: 'Ogiltig e-postadress',\n maxMessage: 'Meddelandet f\u00E5r inte \u00F6verstiga 500 tecken',\n requiredRegNo: 'Registreringsnummer kr\u00E4vs om du har inbytesbil',\n invalidRegNo: 'Ogiltigt registreringsnummer, ange det som t.ex. ABC123',\n requiredMileage: 'Miltal kr\u00E4vs om du har inbytesbil',\n requiredPhoneNumber: 'Telefonnummer kr\u00E4vs',\n },\n confirmationTitle: 'Tack!',\n confirmationMessage: 'Ditt meddelande har skickats. Vi kontaktar dig inom kort.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Bilder',\n loading: 'Laddar...',\n error404: '404',\n showingNumberOfResults_one: 'Visar {{current}} av {{count}} resultat',\n showingNumberOfResults_other: 'Visar {{current}} av {{count}} resultat',\n closeModal: 'St\u00E4ng modal',\n closePanel: 'St\u00E4ng panel',\n goToHeading: 'G\u00E5 till {{heading}}',\n openDocument: '\u00D6ppna {{document}}',\n previousImage: 'F\u00F6reg\u00E5ende bild',\n nextImage: 'N\u00E4sta bild',\n goToImageIndex: 'G\u00E5 till bild {{index}}',\n phoneNumber: 'Telefonnummer',\n showPhoneNumber: 'Visa telefonnummer',\n callPhoneNumber: 'Ring {{phoneNumber}}',\n price: 'Pris',\n privateLeasingPrice: 'Privatleasing',\n video: 'Video',\n playVideo: 'Spela video',\n searchResults: 'S\u00F6ktr\u00E4ffar',\n showAllCars: 'Visa alla bilar',\n },\n },\n },\n 'nb-NO': {\n translation: {\n navigation: {\n backToSearch: 'Tilbake til bils\u00F8k',\n },\n filter: {\n manufacturer: 'Produsent',\n model: 'Modell',\n modelSeries: 'Modell',\n fuelType: 'Drivstoff',\n gearboxType: 'Girkasse',\n branchDisplayName: 'Forhandler',\n branchCity: 'By',\n colorName: 'Farge',\n environmentClass: 'Milj\u00F8klasse',\n segment: 'Segment',\n bodyStyle: 'Karosseri',\n trimLevel: 'Utstyrsniv\u00E5',\n inventoryStatus: 'Lagerstatus',\n drivetrainType: 'Drivhjul',\n engineBaseType: 'Motortype',\n price: 'Pris',\n odometer: 'M\u00E5leravlesning',\n modelYear: 'Modell\u00E5r',\n privateLease: 'Leasingpris',\n businessLease: 'Bedriftsleasingpris',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/mnd',\n },\n category: {\n basic: 'Grunnopplysninger',\n engineAndPerformance: 'Motor og ytelse',\n },\n subCategory: {\n engine: 'Motor',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Produsent',\n hint: '',\n },\n modelSeries: {\n displayName: 'Modell',\n hint: '',\n },\n modelName: {\n displayName: 'Versjon',\n hint: 'Hvilken versjon av bilmodellen det er.',\n },\n modelYear: {\n displayName: '\u00C5rsmodell',\n hint: 'Modell\u00E5ret settes av produsenten. Forhandlere endrer av og til modell\u00E5ret for \u00E5 matche transportmyndighetens definisjon av modell\u00E5ret. Definisjonen av modell\u00E5ret inneb\u00E6rer at biler produsert i den siste halvdelen av \u00E5ret f\u00E5r neste \u00E5rs modell\u00E5r.',\n },\n manufactureYear: {\n displayName: 'Produksjons\u00E5r',\n hint: '\u00C5ret bilen ble produsert.',\n },\n odometer: { displayName: 'M\u00E5leravlesning', hint: '' },\n gearboxType: { displayName: 'Girkasse', hint: '' },\n registrationNumber: { displayName: 'Registreringsnummer', hint: '' },\n fuelType: {\n displayName: 'Drivstoff',\n hint: 'Hva bilen skal tankes med og drives av.',\n },\n enginePower: { displayName: 'Effekt', unit: 'hk' },\n color: { displayName: 'Farge' },\n chassis: { displayName: 'Karosseri' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: '\u00C5rsavgift' },\n numberOfDoors: { displayName: 'D\u00F8rer' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Ja',\n no: 'nei',\n logotype: 'Logotype',\n close: 'Close',\n showMore: 'Vis mer',\n readMore: 'Les mer',\n showMoreInformation: 'Vis mer informasjon',\n showLessInformation: 'Vis mindre informasjon',\n choose: 'Velg',\n address: 'Adresse',\n mondayShort: 'Mandag',\n tuesdayShort: 'Tirsdag',\n wednesdayShort: 'Onsdag',\n thursdayShort: 'Torsdag',\n fridayShort: 'Fredag',\n saturdayShort: 'L\u00F8rdag',\n sundayShort: 'S\u00F8ndag',\n moreInformation: 'Mer informasjon',\n lessInformation: 'Mindre informasjon',\n anErrorHasOccured: 'Det har oppst\u00E5tt en feil',\n opensInNewTab: '\u00C5pnes i ny fane',\n open: '\u00C5pne',\n imageIndex: 'Bilde {{index}}',\n },\n item: {\n relatedVehicles: 'Relaterte kj\u00F8ret\u00F8y',\n latestVehicles: 'Sist mottatt',\n readMoreInNewTab: 'Les mer (\u00E5pnes i ny fane)',\n moreInfoAboutSubject: 'Mer informasjon om {{subject}}',\n dataNotAvailable: 'Data ikke tilgjengelig',\n showOnGoogleMaps: 'Vis p\u00E5 Google Maps',\n googleMapsMapAlt: 'Kart',\n googleMapsPlaceholderInit: 'Vis kart',\n demoCar: 'Demo Car',\n demoCarDescription:\n 'En demobil er en bil som har v\u00E6rt utstilt eller som har blitt brukt p\u00E5 annen m\u00E5te for \u00E5 vise frem en bestemt modell. Bilene er ofte godt utstyrt og har blitt tatt godt vare p\u00E5. Dessuten har de vanligvis bare noen f\u00E5 kilometer p\u00E5 seg og har fortsatt garantien p\u00E5 nybilen.',\n carData: 'Bildata',\n carDataDescription: 'Informasjon direkte fra Statens Vegvesen og produsenten.',\n equipment: 'Utstyr',\n equipmentDescription: 'Ytterligere informasjon om bilen.',\n documents: 'Dokumenter',\n documentTypes: {\n tireEnergyDeclaration: 'Energideklarasjon for dekk',\n goodsDeclaration: 'Varedeklarasjon',\n other: 'Andre dokumenter',\n },\n carIsReserved: 'Bilen er reservert',\n carIsReservedDescription: 'Denne bilen er reservert av en annen kj\u00F8per.',\n carIsReservedModalBody: 'Denne bilen er reservert av en annen kj\u00F8per.',\n centralWarehouseCar: 'Sentrallagerbil',\n centralWarehouseCarDescription:\n 'Denne bilen tilh\u00F8rer et sentrallager og kan kj\u00F8pes gjennom flere fasiliteter. Endre forhandler for \u00E5 vise kontaktinformasjon for det bestemte forhandleren.',\n centralWarehouseCarDescriptionShort:\n 'Denne bilen tilh\u00F8rer et sentrallager og kan kj\u00F8pes gjennom flere fasiliteter.',\n clickHereToShowContactToAnotherBranch:\n 'Klikk her for \u00E5 se kontaktdetaljer for et annet forhandler',\n switchBranch: 'Switch Branch',\n switchBranchDescription: 'Velg filialen du vil vise kontaktdetaljer for.',\n selectBranch: 'Choose Branch',\n chooseSelectedBranch: 'Velg valgt gren',\n availableFromDate: 'Tilgjengelig fra {{date}}',\n includingShort: 'Inkl.',\n usedWarrany: 'Bruktgaranti',\n homeDelivery: 'Hjemlevering',\n thisCarsIsLocatedAt: 'Denne bilen er p\u00E5',\n thisCarIsAvailableAtOurBranch:\n 'Denne bilen er tilgjengelig i v\u00E5r filial i {{location}}',\n contact: 'Kontakt',\n threeSixty: {\n badge: '360\u00B0 bilde',\n sphereBadge: '360\u00B0 interi\u00F8r',\n viewer: '360\u00B0 bildeviser',\n description: 'Dra eller bruk piltastene for \u00E5 rotere bilen.',\n rotate: 'Roter 360\u00B0',\n frame: '{{frame}} av {{total}}',\n },\n openingHoursToday: '\u00C5pningstider i dag',\n closedToday: 'Stengt i dag',\n open: '\u00C5pne',\n closed: 'Stengt',\n addInsurance: 'Velg til forsikring',\n getInsuranceQuote: 'F\u00E5 tilbud',\n insurance: 'Forsikring',\n readMoreAboutInsuranceInNewTab: 'Les mer om forsikring (\u00E5pnes i ny fane)',\n personalNumber: 'Personnummer',\n estimatedAnualMileage: 'Estimert kj\u00F8relengde per \u00E5r',\n showInsurances: 'Vis forsikringer',\n savePersonalNumberOnThisDevice: 'Lagre personlig nummer p\u00E5 denne enheten',\n savePersonalNumberOnThisDeviceHelp:\n 'Lagre personnummeret p\u00E5 denne datamaskinen for \u00E5 direkte se forsikringskostnadene i Wayke. Personnummeret lagres ikke hos Wayke, men lagres kun i nettleseren din.',\n couldNotfetchInsurances:\n 'Kunne ikke hente forsikringer. V\u00E6r s\u00E5 snill, pr\u00F8v p\u00E5 nytt.',\n openPrePurchaseInformationInNewTab:\n 'Informasjon og vilk\u00E5r f\u00F8r kj\u00F8p (\u00E5pnes i ny fane)',\n insuranceIncludes: 'Forsikringen inkluderer',\n addInsuranceHeading: 'Add',\n financialOptions: {\n otherFinancialOptions: 'Andre finansieringsalternativer',\n privateLease: 'PrivateLease',\n businessLease: 'Etagslease',\n monthlyCost: 'M\u00E5nedlig kostnad',\n bindingTime: 'Bindingstid',\n annualMileage: 'Annual Mileage',\n payInInstallments: 'Betal i avdrag',\n payInInstallmentsDetailed: 'Betal delvis {{amount}} i {{duration}} m\u00E5neder',\n disclaimer: 'Beregnet til {{interest}} rente.',\n loanOptions: 'L\u00E5nealternativer',\n downPayment: 'Kontantinnskudd',\n duration: 'Avbetaling',\n residual: 'Restgjeld',\n interest: 'Nominell rente',\n effectiveinterest: 'Effektiv rente',\n setupFee: 'Oppsettskostnad',\n administrationFee: 'Administrative gebyrer',\n totalCreditCost: 'Total kredittkostnad',\n mileagePerYear: 'skandinaviske mil/\u00E5r',\n months: 'mnd',\n loanOptionsDisclaimer:\n 'Beregnet til {{interest}} % rente (effektiv {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %) og en \u00E5rlig kj\u00F8relengde p\u00E5 {{mileage}} miles.',\n },\n actions: {\n emailSubject: '{{hostName}} - Jeg er interessert i {{vehicle}}',\n emailBody: 'Lenke til bilen: {{url}}',\n openform: '\u00C5pent skjema',\n buyOnline: 'Kj\u00F8p bilen p\u00E5 nett',\n showEmail: 'Vis e-postadresse',\n showPhoneNumber: 'Vis telefonnummer',\n callNumber: 'Ring',\n sendEmailTo: 'Send en e-post til',\n },\n accessories: {\n accessories: 'Tilbeh\u00F8r',\n accessoriesDescription: 'Tilbeh\u00F8r som passer for dette kj\u00F8ret\u00F8yet.',\n price: 'Kontantpris',\n oldPrice: 'Forrige pris',\n installationCost: 'Installasjonskostnad',\n articleNumberShort: 'Art. Nei.',\n moreInformationAboutAccessory: 'Mer informasjon om {{accessory}}',\n },\n },\n productCard: {\n price: 'Pris',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'Bedriftsleasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sorter',\n showMore: {\n text: 'Vis fler',\n title: 'Vis flere resultater',\n },\n filterButton: {\n text: 'Filter',\n title: 'Vis filter',\n },\n sortButton: {\n text: 'Sorter',\n title: 'Velg sorteringsrekkef\u00F8lge',\n },\n searchResult: 'S\u00F8keresultat',\n snackbarNoSearchResults: {\n heading: 'Ingen resultater',\n body: 'S\u00F8ket ga ingen resultater',\n },\n snackBarClearFreeText: {\n heading: 'Ingen resultater',\n body: 'T\u00F8m friteksten for \u00E5 se alle filtre',\n },\n sortOptions: {\n relevance: 'Relevans',\n publishedAsc: 'Publisert (eldste)',\n publishedDesc: 'Publisert (siste)',\n priceAsc: 'Pris (laveste)',\n priceDesc: 'Pris (maksimum)',\n modelAsc: 'Modell\u00E5r (eldste)',\n modelDesc: 'Modell\u00E5r (nyeste)',\n mileageAsc: 'M\u00E5leravlesning (lavest)',\n mileageDesc: 'M\u00E5leravlesning (maksimum)',\n },\n clearAllFilters: {\n text: 'T\u00F8m alle filtre',\n title: 'T\u00F8m alle filtre',\n },\n showNumberOfCustomUnit: 'Vis {{count}} {{unit}}',\n result: {\n singular: 'Bil',\n plural: 'Biler',\n },\n freeText: 'Gratis tekst',\n from: 'Fra',\n to: 'Til',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'laveste',\n max: 'h\u00F8yeste',\n },\n searchBar: {\n title: 'S\u00F8k',\n placeholder: 'S\u00F8k i bilen din',\n button: {\n text: 'S\u00F8k',\n title: 'S\u00F8k',\n },\n searchResults: 'S\u00F8keresultater',\n showAllRsults: 'Vis alle biler',\n },\n lead: {\n messageFormTitle: 'Send melding',\n callFormTitle: 'Bli oppringt',\n firstName: 'Fornavn',\n lastName: 'Etternavn',\n email: 'E-postadresse',\n phoneNumber: 'Telefonnummer',\n message: 'Melding',\n tradeInCar: 'Innbyttebil',\n registrationNumber: 'Registreringsnummer',\n mileage: 'Kilometerstand',\n send: 'Send',\n close: 'Lukk',\n error: 'Kunne ikke sende. Pr\u00F8v igjen.',\n validationMessages: {\n requiredFirstName: 'Fornavn er p\u00E5krevd',\n requiredLastName: 'Etternavn er p\u00E5krevd',\n requiredEmail: 'E-postadresse er p\u00E5krevd',\n invalidEmail: 'Ugyldig e-postadresse',\n maxMessage: 'Meldingen kan ikke overskride 500 tegn',\n requiredRegNo: 'Registreringsnummer er p\u00E5krevd hvis du har innbyttebil',\n invalidRegNo: 'Ugyldig registreringsnummer, oppgi det som f.eks. AB12345',\n requiredMileage: 'Kilometerstand er p\u00E5krevd hvis du har innbyttebil',\n requiredPhoneNumber: 'Telefonnummer er p\u00E5krevd',\n },\n confirmationTitle: 'Takk!',\n confirmationMessage: 'Meldingen din er sendt. Vi kontakter deg snart.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Bilder',\n loading: 'Laster...',\n error404: '404',\n showingNumberOfResults_one: 'Viser {{current}} av {{count}} resultater',\n showingNumberOfResults_other: 'Viser {{current}} av {{count}} resultater',\n closeModal: 'Close Modal',\n closePanel: 'Lukk panel',\n goToHeading: 'G\u00E5 til {{heading}}',\n openDocument: '\u00C5pne {{dokument}}',\n previousImage: 'Forrige bilde',\n nextImage: 'Neste bilde',\n goToImageIndex: 'G\u00E5 til bilde {{index}}',\n phoneNumber: 'Telefonnummer',\n showPhoneNumber: 'Vis telefonnummer',\n callPhoneNumber: 'Ring {{phoneNumber}}',\n price: 'Pris',\n privateLeasingPrice: 'Privatleasing',\n video: 'Video',\n playVideo: 'Spill av video',\n searchResults: 'S\u00F8keresultater',\n showAllCars: 'Vis alle biler',\n },\n },\n },\n 'en-US': {\n translation: {\n navigation: {\n backToSearch: 'Back to car search',\n },\n filter: {\n manufacturer: 'Manufacturer',\n model: 'Model',\n modelSeries: 'Model',\n fuelType: 'Fuel Type',\n gearboxType: 'Gearbox Type',\n branchDisplayName: 'Branch',\n branchCity: 'City',\n colorName: 'Color',\n environmentClass: 'Environmental Class',\n segment: 'Segment',\n bodyStyle: 'Body style',\n trimLevel: 'Trim level',\n inventoryStatus: 'Inventory status',\n drivetrainType: 'Driving Wheel',\n engineBaseType: 'Engine type',\n price: 'Price',\n odometer: 'Mileage',\n modelYear: 'Model Year',\n privateLease: 'Private leasing',\n businessLease: 'Business leasing',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/month',\n },\n category: {\n basic: 'Basic Information',\n engineAndPerformance: 'Engine & Performance',\n },\n subCategory: {\n engine: 'Engine',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Brand',\n hint: '',\n },\n modelSeries: {\n displayName: 'Model',\n hint: '',\n },\n modelName: {\n displayName: 'Version',\n hint: 'Which version of the car model it is.',\n },\n modelYear: {\n displayName: 'Model year',\n hint: 'The model year is set by the manufacturer. Dealers sometimes change the model year to match the transport authority`s definition of the model year. The definition of the model year means that cars manufactured in the latter half of the year are given the next year`s model year.',\n },\n manufactureYear: {\n displayName: 'Manufacture year',\n hint: 'The year the car was manufactured.',\n },\n odometer: { displayName: 'Odometer reading', hint: '' },\n gearboxType: { displayName: 'Gearbox', hint: '' },\n registrationNumber: { displayName: 'Registration number', hint: '' },\n fuelType: {\n displayName: 'Fuel type',\n hint: 'What the car should be fueled with and powered by.',\n },\n enginePower: { displayName: 'Power', unit: 'hp' },\n color: { displayName: 'Color' },\n chassis: { displayName: 'Body style' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: 'Annual tax' },\n numberOfDoors: { displayName: 'Doors' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Yes',\n no: 'No',\n logotype: 'Logotype',\n close: 'Close',\n showMore: 'Show more',\n readMore: 'Read more',\n showMoreInformation: 'Show more information',\n showLessInformation: 'Show less information',\n choose: 'Choose',\n address: 'Address',\n mondayShort: 'Mon',\n tuesdayShort: 'Tues',\n wednesdayShort: 'Wednesday',\n thursdayShort: 'Thursday',\n fridayShort: 'Fri',\n saturdayShort: 'Sat',\n sundayShort: 'Sun',\n moreInformation: 'More information',\n lessInformation: 'Less information',\n anErrorHasOccured: 'An error has occurred',\n opensInNewTab: 'Opens in new tab',\n open: 'Open',\n imageIndex: 'Image {{index}}',\n },\n item: {\n relatedVehicles: 'Related Vehicles',\n latestVehicles: 'Latest received',\n readMoreInNewTab: 'Read more (opens in new tab)',\n moreInfoAboutSubject: 'More information about {{subject}}',\n dataNotAvailable: 'Data not available',\n showOnGoogleMaps: 'Show on Google Maps',\n googleMapsMapAlt: 'Map',\n googleMapsPlaceholderInit: 'Show Map',\n demoCar: 'Demo Car',\n demoCarDescription:\n 'A demo car is a car that has been on display or that has been used in some other way to show off a certain model. The cars are often well equipped and have been well looked after. Also, they usually have only a few miles on them and still have their new car warranties.',\n carData: 'Car Data',\n carDataDescription:\n 'Information directly from the Swedish Transport Agency and the manufacturer.',\n equipment: 'Equipment',\n equipmentDescription: 'Additional information about the car.',\n documents: 'Documents',\n documentTypes: {\n tireEnergyDeclaration: 'Energy declaration for tyres',\n goodsDeclaration: 'Goods declaration',\n other: 'Other documents',\n },\n carIsReserved: 'The car is reserved',\n carIsReservedDescription: 'This car is reserved by another buyer.',\n carIsReservedModalBody: 'This car is reserved by another buyer.',\n centralWarehouseCar: 'Central warehouse car',\n centralWarehouseCarDescription:\n 'This car belongs to a central warehouse and can be purchased through several facilities. Change facility to display contact information for that particular facility.',\n centralWarehouseCarDescriptionShort:\n 'This car belongs to a central warehouse and can be purchased through several facilities.',\n clickHereToShowContactToAnotherBranch:\n 'Click here to view contact details for another facility',\n switchBranch: 'Switch Branch',\n switchBranchDescription:\n 'Select the branch you want to display contact details for.',\n chooseBranch: 'Choose branch',\n chooseSelectedBranch: 'Choose selected branch',\n availableFromDate: 'Available from {{date}}',\n includingShort: 'Incl.',\n usedWarrany: 'Used Warranty',\n homeDelivery: 'Home delivery',\n thisCarsIsLocatedAt: 'This car is on',\n thisCarIsAvailableAtOurBranch:\n 'This car is available at our branch in {{location}}',\n contact: 'Contact',\n threeSixty: {\n badge: '360\u00B0 image',\n sphereBadge: '360\u00B0 interior',\n viewer: '360\u00B0 image viewer',\n description: 'Drag or use the arrow keys to rotate the car.',\n rotate: 'Rotate 360\u00B0',\n frame: '{{frame}} of {{total}}',\n },\n openingHoursToday: 'Opening hours today',\n closedToday: 'Closed today',\n open: 'Open',\n closed: 'Closed',\n addInsurance: 'Select insurance',\n getInsuranceQuote: 'Get Quote',\n insurance: 'Insurance',\n readMoreAboutInsuranceInNewTab: 'Read more about insurance (opens in new tab)',\n personalNumber: 'Personal number',\n estimatedAnnualMileage: 'Estimated mileage per year',\n showInsurances: 'Show insurances',\n savePersonalNumberOnThisDevice: 'Save personal number on this device',\n savePersonalNumberOnThisDeviceHelp:\n 'Save social security number on this computer to directly view the insurance costs in Wayke. The social security number is not stored at Wayke, but is only saved in your browser.',\n couldNotfetchInsurances: 'Could not fetch insurances. Please try again.',\n openPrePurchaseInformationInNewTab:\n 'Pre-Purchase Information and Terms (opens in new tab)',\n insuranceIncludes: 'The insurance includes',\n addInsuranceHeading: 'Add',\n financialOptions: {\n otherFinancialOptions: 'Other financing options',\n privateLease: 'PrivateLease',\n businessLease: 'Etagslease',\n monthlyCost: 'Monthly cost',\n bindingTime: 'Binding Time',\n annualMileage: 'Annual Mileage',\n payInInstallments: 'Pay In Installments',\n payInInstallmentsDetailed: 'Partially pay {{amount}} in {{duration}} months',\n disclaimer: 'Calculated at {{interest}} interest.',\n loanOptions: 'Loan Options',\n downPayment: 'Cash Deposit',\n duration: 'Instalment',\n residual: 'Residual debt',\n interest: 'Interest',\n effectiveinterest: 'Effective interest',\n setupFee: 'Setup cost',\n administrationFee: 'Administrative fees',\n totalCreditCost: 'Total Credit Cost',\n mileagePerYear: 'mil/\u00E5r',\n months: 'mnd',\n loanOptionsDisclaimer:\n 'Calculated at {{interest}} % interest (effective {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Calculated on {{interest}} % interest (effective {{effectiveInterest}} %) and an annual mileage of {{mileage}} miles.',\n },\n actions: {\n emailSubject: \"{{hostName}} - I'm interested in {{vehicle}}\",\n emailBody: 'Link to the vehicle: {{url}}',\n openform: 'Open form',\n buyOnline: 'Buy the car online',\n showEmail: 'Show email address',\n showPhoneNumber: 'Show phone number',\n callNumber: 'Call',\n sendEmailTo: 'Send an email to',\n },\n accessories: {\n accessories: 'Accessories',\n accessoriesDescription: 'Accessories suitable for this vehicle.',\n price: 'Cash price',\n oldPrice: 'Previous Price',\n installationCost: 'Installation cost',\n articleNumberShort: 'Art. no.',\n moreInformationAboutAccessory: 'More information about {{accessory}}',\n },\n },\n productCard: {\n price: 'Price',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'Business leasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sort',\n showMore: {\n text: 'Show more',\n title: 'Show more results',\n },\n filterButton: {\n text: 'Filter',\n title: 'Show filter',\n },\n sortButton: {\n text: 'Sort',\n title: 'Select sort order',\n },\n searchResult: 'Search Result',\n snackbarNoSearchResults: {\n heading: 'No results',\n body: 'The search returned no results',\n },\n snackBarClearFreeText: {\n heading: 'No results',\n body: 'Clear the free text to see all filters',\n },\n sortOptions: {\n relevance: 'Relevance',\n publishedAsc: 'Published (oldest)',\n publishedDesc: 'Published (latest)',\n priceAsc: 'Price (Lowest)',\n priceDesc: 'Price (Maximum)',\n modelAsc: 'Year model (oldest)',\n modelDesc: 'Year Model (Newest)',\n mileageAsc: 'Mileage (lowest)',\n mileageDesc: 'Mileage (maximum)',\n },\n clearAllFilters: {\n text: 'Clear all filters',\n title: 'Clear all filters',\n },\n showNumberOfCustomUnit: 'Show {{count}} {{unit}}',\n result: {\n singular: 'Car',\n plural: 'Cars',\n },\n freeText: 'Free text',\n from: 'From',\n to: 'To',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'minimum',\n max: 'maximum',\n },\n searchBar: {\n title: 'Search',\n placeholder: 'Search your car',\n button: {\n text: 'Search',\n title: 'Search',\n },\n searchResults: 'Search Results',\n showAllRsults: 'Show all cars',\n },\n lead: {\n messageFormTitle: 'Send message',\n callFormTitle: 'Get a callback',\n firstName: 'First name',\n lastName: 'Last name',\n email: 'Email address',\n phoneNumber: 'Phone number',\n message: 'Message',\n tradeInCar: 'Trade-in car',\n registrationNumber: 'Registration number',\n mileage: 'Mileage',\n send: 'Send',\n close: 'Close',\n error: 'Could not send. Please try again.',\n validationMessages: {\n requiredFirstName: 'First name is required',\n requiredLastName: 'Last name is required',\n requiredEmail: 'Email address is required',\n invalidEmail: 'Invalid email address',\n maxMessage: 'Message cannot exceed 500 characters',\n requiredRegNo: 'Registration number is required if you have a trade-in car',\n invalidRegNo: 'Invalid registration number',\n requiredMileage: 'Mileage is required if you have a trade-in car',\n requiredPhoneNumber: 'Phone number is required',\n },\n confirmationTitle: 'Thank you!',\n confirmationMessage:\n 'Your message has been sent successfully. We will contact you soon.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Images',\n loading: 'Loading...',\n error404: '404',\n showingNumberOfResults_one: 'Showing {{current}} of {{count}} results',\n showingNumberOfResults_other: 'Showing {{current}} of {{count}} results',\n closeModal: 'Close Modal',\n closePanel: 'Close panel',\n goToHeading: 'Go to {{heading}}',\n openDocument: 'Open {{document}}',\n previousImage: 'Previous Image',\n nextImage: 'Next Image',\n goToImageIndex: 'Go to image {{index}}',\n phoneNumber: 'Phone Number',\n showPhoneNumber: 'Show phone number',\n callPhoneNumber: 'Call {{phoneNumber}}',\n price: 'Price',\n privateLeasingPrice: 'Private Leasing',\n video: 'Video',\n playVideo: 'Play video',\n searchResults: 'Search Results',\n showAllCars: 'Show all cars',\n },\n },\n },\n },\n },\n () => {\n resolve(true);\n }\n );\n });\n};\n", "import { i18nScoped } from './I18n';\n\n/** The sort keys offered (searchParams.ts SORT_OPTIONS), in order, with their translation. */\nconst SORT_LABELS: Record<string, string> = {\n 'published-desc': 'search.sortOptions.publishedDesc',\n 'published-asc': 'search.sortOptions.publishedAsc',\n 'price-asc': 'search.sortOptions.priceAsc',\n 'price-desc': 'search.sortOptions.priceDesc',\n 'modelYear-desc': 'search.sortOptions.modelDesc',\n 'modelYear-asc': 'search.sortOptions.modelAsc',\n 'odometer-asc': 'search.sortOptions.mileageAsc',\n 'odometer-desc': 'search.sortOptions.mileageDesc',\n};\n\nexport const sortOptions = () =>\n Object.entries(SORT_LABELS).map(([value, label]) => ({\n value,\n displayName: i18nScoped.t(label),\n }));\n", "import * as React from 'react';\nimport { i18nScoped } from '../../utils/I18n';\nimport { SrOnly } from '../SrOnly';\nimport { Spinner, Wrapper } from './wrapper';\n\ninterface Props {\n inline?: boolean;\n center?: boolean;\n}\n\nconst Loader = ({ inline, center }: Props) => {\n return (\n <Wrapper inline={inline} center={center}>\n <Spinner aria-hidden=\"true\" />\n {i18nScoped.isInitialized && <SrOnly>{i18nScoped.t('other.loading')}</SrOnly>}\n </Wrapper>\n );\n};\n\nexport default Loader;\n", "import styled from 'styled-components';\n\n// Adds element only visible to screen readers\nexport const SrOnly = styled.div`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { rotate } from '../../layout/keyframes';\n\nexport const Spinner = styled.div`\n display: block;\n margin: 0 auto;\n width: ${size(4)};\n height: ${size(4)};\n border-radius: 50%;\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: ${rotate} 600ms linear infinite;\n`;\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n inline?: boolean;\n center?: boolean;\n};\n\nexport const Wrapper = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n role: 'status',\n}))<WrapperProps>`\n ${({ inline }) =>\n inline &&\n css`\n display: inline-block;\n vertical-align: middle;\n color: currentColor !important;\n\n ${Spinner} {\n width: 1em;\n height: 1em;\n }\n `}\n\n ${({ center }) =>\n center &&\n css`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `}\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Bar, BarActive, Description, Wrapper } from './wrapper';\n\ninterface Props {\n valueCurrent: number;\n valueMax: number;\n}\n\nconst ProgressBar = ({ valueCurrent, valueMax }: Props) => {\n const { t } = useTranslation();\n const barWidth = (valueCurrent / valueMax) * 100;\n\n return (\n <Wrapper>\n <Description>\n {t('other.showingNumberOfResults', { current: valueCurrent, count: valueMax })}\n </Description>\n <Bar>\n <BarActive\n style={{ width: `${barWidth}%` }}\n aria-valuenow={valueCurrent}\n aria-valuemin={0}\n aria-valuemax={valueMax}\n />\n </Bar>\n </Wrapper>\n );\n};\n\nexport default ProgressBar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n text-align: center;\n`;\n\nexport const Description = styled.div`\n margin-bottom: ${size(1.5)};\n font-size: 0.875rem;\n`;\n\nexport const Bar = styled.div`\n position: relative;\n width: 100%;\n height: 2px;\n background-color: ${(props) => props.theme.color.accentDark};\n`;\n\nexport const BarActive = styled.div.attrs(() => ({\n role: 'progressbar',\n}))`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background-color: ${(props) => props.theme.color.textDark};\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconChevronDown } from '../Icon';\nimport { Icon, Option, Select, Wrapper } from './wrapper';\n\nexport interface OptionProps {\n value: number | string;\n displayName?: number | string;\n}\n\ninterface SortSelectProps {\n value: string | number;\n options: OptionProps[];\n unit?: string;\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n}\n\nconst SortSelect = ({ value, options, onChange, unit }: SortSelectProps) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n <Select\n value={value}\n onChange={onChange}\n title={t('search.sortButton.text')}\n aria-label={t('search.sortButton.text')}\n >\n {options.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.displayName || option.value}\n {unit ? ` ${unit}` : ''}\n </Option>\n ))}\n </Select>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Wrapper>\n );\n};\n\nexport default SortSelect;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst iconSize = '0.875rem';\n\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const Select = styled.select.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: relative;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n text-indent: 0.01px;\n border: 0;\n padding: 0;\n padding-right: calc(${iconSize} + ${size(1)});\n background-color: transparent;\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n font-size: 16px;\n cursor: pointer;\n z-index: 1;\n\n &:focus {\n outline: none;\n text-decoration: underline;\n }\n\n ::-ms-expand {\n display: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\nexport const Option = styled.option`\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const Icon = styled.div`\n position: absolute;\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n font-size: ${iconSize};\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\nexport const Header = styled.header`\n display: flex;\n margin-bottom: ${size(4)};\n`;\n\nexport const HeaderCount = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const HeaderSort = styled.div`\n flex-shrink: 0;\n`;\n\nexport const Body = styled.div``;\n\nexport const Footer = styled.footer`\n margin-top: ${size(8)};\n text-align: center;\n`;\n\nexport const FooterProgress = styled.div`\n max-width: 175px;\n margin: 0 auto;\n`;\n\nexport const FooterAction = styled.div`\n margin-top: ${size(3)};\n`;\n\nexport const ResultCount = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n`;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FREE_TEXT, SORT } from '../../Gql/searchParams';\nimport { fetchSuggestions, suggestionParams } from '../../Gql/suggest';\nimport { Suggestion } from '../../Gql/types';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport SearchBar from '../SearchBar';\n\n/** Typeahead from search.ads(q).suggest, from two characters, after a short pause in typing. */\nconst useSuggestions = (value: string) => {\n const { publicApi } = useSettings();\n const [suggestions, setSuggestions] = useState<Suggestion[]>([]);\n const q = value.trim();\n\n useEffect(() => {\n if (q.length < 2) {\n setSuggestions([]);\n return;\n }\n let active = true;\n const timeout = setTimeout(() => {\n fetchSuggestions(publicApi, q)\n .then((next) => active && setSuggestions(next))\n .catch(() => active && setSuggestions([]));\n }, 150);\n return () => {\n active = false;\n clearTimeout(timeout);\n };\n }, [q, publicApi]);\n\n return suggestions;\n};\n\nconst SearchFilter = () => {\n const [value, setValue] = useState('');\n const { publicApi } = useSettings();\n const { params, update } = useSearch();\n const suggestions = useSuggestions(value);\n const labels = useMemo(() => suggestions.map((s) => s.label), [suggestions]);\n\n /** A suggestion's filters replace the current ones; the sort order stays. */\n const applySuggestion = useCallback(\n (suggestion: Suggestion) => {\n const next = suggestionParams(suggestion);\n const sort = params.get(SORT);\n if (sort) next.set(SORT, sort);\n update(next);\n setValue('');\n PubSub.publish('Search', { query: suggestion.label });\n },\n [params, update]\n );\n\n const onSearch = useCallback(\n async (value: string) => {\n const q = value.trim();\n if (q === (params.get(FREE_TEXT) || '')) {\n return;\n }\n\n // A free text that is exactly a suggestion (\"audi\" \u2192 Audi) becomes its\n // filters, as the legacy search rewrote such queries.\n if (q) {\n const exact = await fetchSuggestions(publicApi, q, 5)\n .then((list) =>\n list.find((s) => s.label.localeCompare(q, undefined, { sensitivity: 'base' }) === 0)\n )\n .catch(() => undefined);\n if (exact?.filters.length) {\n applySuggestion(exact);\n return;\n }\n }\n\n const next = new URLSearchParams(params);\n if (q) {\n next.set(FREE_TEXT, q);\n } else {\n next.delete(FREE_TEXT);\n }\n update(next);\n setValue('');\n PubSub.publish('Search', { query: q });\n },\n [params, update, publicApi, applySuggestion]\n );\n\n const onSelectSuggestion = useCallback(\n (index: number) => {\n const suggestion = suggestions[index];\n if (suggestion) applySuggestion(suggestion);\n },\n [suggestions, applySuggestion]\n );\n\n return (\n <SearchBar\n value={value}\n setValue={setValue}\n onSearch={onSearch}\n suggestions={labels}\n onSelectSuggestion={onSelectSuggestion}\n />\n );\n};\n\nexport default SearchFilter;\n", "// Thin client for Wayke's public GraphQL API (public-api.wayke.com). The key is\n// the site's own origin unless an explicit key is given (local development).\n// Identical queries are deduplicated and cached for the page's lifetime, so going\n// back and forth between the list and an ad does not cost another request.\n\nexport interface PublicApiConfig {\n url: string;\n apiKey?: string;\n}\n\nexport type GqlErrorKind = 'unauthorized' | 'rate-limited' | 'graphql' | 'network';\n\nexport class GqlError extends Error {\n readonly kind: GqlErrorKind;\n readonly retryAfter?: number;\n\n constructor(kind: GqlErrorKind, message: string, retryAfter?: number) {\n super(message);\n this.kind = kind;\n this.retryAfter = retryAfter;\n }\n}\n\nconst cache = new Map<string, unknown>();\nconst pending = new Map<string, Promise<unknown>>();\n\nconst resolveApiKey = (config: PublicApiConfig) => config.apiKey || window.location.origin;\n\nconst request = async <T>(\n config: PublicApiConfig,\n query: string,\n variables: Record<string, unknown>\n): Promise<T> => {\n let response: Response;\n try {\n response = await fetch(config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': resolveApiKey(config),\n },\n body: JSON.stringify({ query, variables }),\n });\n } catch (_e) {\n throw new GqlError('network', 'network');\n }\n\n if (response.status === 401) throw new GqlError('unauthorized', 'unauthorized');\n if (response.status === 429) {\n const retryAfter = Number(response.headers.get('retry-after')) || undefined;\n throw new GqlError('rate-limited', 'rate-limited', retryAfter);\n }\n\n const body = (await response.json().catch(() => null)) as {\n data?: T;\n errors?: { message: string }[];\n } | null;\n if (!response.ok || !body) throw new GqlError('network', `HTTP ${response.status}`);\n if (body.errors?.length) {\n throw new GqlError('graphql', body.errors.map((e) => e.message).join('; '));\n }\n return body.data as T;\n};\n\nexport const gqlQuery = <T>(\n config: PublicApiConfig,\n query: string,\n variables: Record<string, unknown>\n): Promise<T> => {\n const key = JSON.stringify([config.url, resolveApiKey(config), query, variables]);\n if (cache.has(key)) return Promise.resolve(cache.get(key) as T);\n const inflight = pending.get(key);\n if (inflight) return inflight as Promise<T>;\n\n const promise = request<T>(config, query, variables)\n .then((data) => {\n cache.set(key, data);\n return data;\n })\n .finally(() => pending.delete(key));\n pending.set(key, promise);\n return promise;\n};\n", "// GraphQL documents against the public API. Field selections are kept to what\n// the components render; the schema is the source of truth (public-ads-docs).\n\nexport const SEARCH_HIT_FIELDS = `\n ad {\n id\n salesDescription { title }\n pricing {\n cash { price { amount } oldPrice { amount } deductibleVat }\n leasing { leasingMonthlyPayment { amount } }\n companyLeasing { leasingMonthlyPayment { amount } }\n }\n media(limit: 1) { items { ... on AdImage { id url formats { format url } } } }\n branch { id displayName }\n channels { ... on PlatformChannel { status soldAt } }\n }\n iteration {\n logistics { odometerReading { value unit } }\n item {\n ... on Vehicle {\n displayName\n manufacturer { stringValue }\n modelSeries { stringValue }\n modelYear { intValue }\n registrationNumber { stringValue }\n driveline { fuelTypesString { stringValue } }\n attributes { transmission { formattedValue } }\n }\n }\n }\n`;\n\nexport const ADS_ARGUMENTS = `\n market: $market\n q: $q\n branchGroupId: $branchGroupId\n page: $page\n perPage: $perPage\n sort: $sort\n soldWithinDays: 0\n manufacturer: $manufacturer\n model: $model\n modelSeries: $modelSeries\n fuelType: $fuelType\n gearboxType: $gearboxType\n branchDisplayName: $branchDisplayName\n colorName: $colorName\n environmentClass: $environmentClass\n segment: $segment\n drivetrainType: $drivetrainType\n bodyStyle: $bodyStyle\n engineBaseType: $engineBaseType\n trimLevel: $trimLevel\n inventoryStatus: $inventoryStatus\n branchCity: $branchCity\n certifiedPreOwned: $certifiedPreOwned\n isDemoVersion: $isDemoVersion\n deductibleVat: $deductibleVat\n ecom: $ecom\n leasing: $leasing\n businessLeasing: $businessLeasing\n cashPriceMin: $cashPriceMin\n cashPriceMax: $cashPriceMax\n odometerReadingMin: $odometerReadingMin\n odometerReadingMax: $odometerReadingMax\n modelYearMin: $modelYearMin\n modelYearMax: $modelYearMax\n leasingPriceMin: $leasingPriceMin\n leasingPriceMax: $leasingPriceMax\n companyLeasingPriceMin: $companyLeasingPriceMin\n companyLeasingPriceMax: $companyLeasingPriceMax\n`;\n\nexport const ADS_VARIABLE_DEFINITIONS = `\n $market: [String]\n $q: String\n $branchGroupId: String\n $page: Int\n $perPage: Int\n $sort: AdsSort\n $manufacturer: [String]\n $model: [String]\n $modelSeries: [String]\n $fuelType: [String]\n $gearboxType: [String]\n $branchDisplayName: [String]\n $colorName: [String]\n $environmentClass: [String]\n $segment: [String]\n $drivetrainType: [String]\n $bodyStyle: [String]\n $engineBaseType: [String]\n $trimLevel: [String]\n $inventoryStatus: [String]\n $branchCity: [String]\n $certifiedPreOwned: Boolean\n $isDemoVersion: Boolean\n $deductibleVat: Boolean\n $ecom: Boolean\n $leasing: Boolean\n $businessLeasing: Boolean\n $cashPriceMin: Float\n $cashPriceMax: Float\n $odometerReadingMin: Int\n $odometerReadingMax: Int\n $modelYearMin: Int\n $modelYearMax: Int\n $leasingPriceMin: Float\n $leasingPriceMax: Float\n $companyLeasingPriceMin: Float\n $companyLeasingPriceMax: Float\n`;\n\n/** Alias of the facet-only search for one selected list filter, see buildSearchQuery. */\nexport const multiSelectFacetAlias = (field: string) => `facets_${field}`;\n\n/**\n * One request for the search page: the filtered list with its facets and, for\n * every list filter that has a selection, that facet counted WITHOUT its own\n * filter. The legacy search counted facets that way (\"multi-select\"), so the\n * other makes stay listed with their counts after picking one; the public API\n * counts facets on the filtered result, where only the picked make remains.\n */\nexport const buildSearchQuery = (selectedListFilters: string[]) => {\n const facetSearches = selectedListFilters\n .map((field) => {\n const args = ADS_ARGUMENTS.replace(` ${field}: $${field}\\n`, '').replace(\n 'perPage: $perPage',\n 'perPage: 0'\n );\n return `\n ${multiSelectFacetAlias(field)}: ads(${args}) @include(if: $withFacets) {\n facets { field counts { value count } }\n }`;\n })\n .join('');\n\n return `\nquery Search(\n ${ADS_VARIABLE_DEFINITIONS}\n $withFacets: Boolean!\n) {\n search {\n ads(${ADS_ARGUMENTS}) {\n found\n page\n perPage\n hits { ${SEARCH_HIT_FIELDS} }\n facets @include(if: $withFacets) { field counts { value count } }\n }${facetSearches}\n }\n}\n`;\n};\n\nexport const SEARCH_QUERY = buildSearchQuery([]);\n\n/** Unfiltered facets and histograms: the filter panel's full value lists and slider domains. */\nexport const FACETS_QUERY = `\nquery SearchFacets($market: [String], $branchGroupId: String) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, perPage: 0, soldWithinDays: 0) {\n found\n facets { field counts { value count } }\n histograms {\n price { value count }\n odometerReading { value count }\n leasingPrice { value count }\n businessLeasingPrice { value count }\n }\n }\n }\n}\n`;\n\nexport const SUGGEST_QUERY = `\nquery Suggest($market: [String], $branchGroupId: String, $q: String!, $limit: Int) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, q: $q, perPage: 0, soldWithinDays: 0) {\n suggest(limit: $limit) { label count dimension filters { field value } }\n }\n }\n}\n`;\n", "// Typeahead for the search field: `search.ads(q).suggest`. Each suggestion\n// carries the filters it stands for, applied as URL params when it is picked.\n\nimport { gqlQuery } from './client';\nimport { PublicApiSettings } from './config';\nimport { SUGGEST_QUERY } from './queries';\nimport { SuggestData, Suggestion } from './types';\n\nexport const fetchSuggestions = async (\n settings: PublicApiSettings,\n q: string,\n limit = 6\n): Promise<Suggestion[]> => {\n const data = await gqlQuery<SuggestData>(settings.api, SUGGEST_QUERY, {\n market: [settings.market],\n branchGroupId: settings.branchGroupId,\n q,\n limit,\n });\n return data.search?.ads?.suggest || [];\n};\n\n/**\n * The suggestion's filters as URL params. Built with URLSearchParams so values\n * with `+` or `&` (Bensin+El) survive the round trip.\n */\nexport const suggestionParams = (suggestion: Suggestion) =>\n new URLSearchParams(suggestion.filters.map((f) => [f.field, f.value]));\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconCancel } from '../Icon';\nimport { Clear, Query, Wrapper } from './wrapper';\n\ninterface Props {\n children: string;\n onClear?: () => void;\n clearTitle?: string;\n}\n\nconst SearchTerm = ({ children, onClear, clearTitle }: Props) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n <Query>{children}</Query>\n {onClear && (\n <Clear onClick={onClear} title={clearTitle ? clearTitle : t('search.freeText')}>\n <IconCancel block />\n </Clear>\n )}\n </Wrapper>\n );\n};\n\nexport default SearchTerm;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Query = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 2.25rem;\n min-width: 0;\n overflow-wrap: break-word;\n hyphens: auto;\n\n &:before,\n &:after {\n content: '\"';\n }\n`;\n\nexport const Clear = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(2)};\n height: ${size(2)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accentDark};\n margin-left: ${size(1)};\n font-size: ${size(1)};\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-1)};\n bottom: ${size(-1)};\n left: ${size(-1)};\n right: ${size(-1)};\n border-radius: 50%;\n }\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::after {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n", "import React from 'react';\nimport { IconCheck, IconExclamationCircle, IconExclamationTriangle, IconInfo } from '../Icon';\nimport { Content, Heading, Icon, Message, Wrapper } from './wrapper';\n\ninterface Props {\n severity?: string;\n icon?: boolean;\n heading?: string;\n children?: React.ReactNode;\n}\n\nconst Snackbar = ({ severity, icon, heading, children }: Props) => {\n let iconSelector = <IconInfo block />;\n if (severity === 'error') {\n iconSelector = <IconExclamationCircle block />;\n } else if (severity === 'warning') {\n iconSelector = <IconExclamationTriangle block />;\n } else if (severity === 'success') {\n iconSelector = <IconCheck block />;\n }\n\n return (\n <Wrapper severity={severity}>\n {icon && <Icon>{iconSelector}</Icon>}\n <Content>\n {heading && <Heading>{heading}</Heading>}\n <Message>{children}</Message>\n </Content>\n </Wrapper>\n );\n};\n\nexport default Snackbar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport theme from '../../layout/theme';\n\nconst getSnackbarBg = (severity: string | undefined): string => {\n let bg = theme.color.accent;\n\n if (severity === 'error') {\n bg = theme.color.ui.negativeLight;\n } else if (severity === 'warning') {\n bg = theme.color.ui.neutralLight;\n } else if (severity === 'info') {\n bg = theme.color.ui.infoLight;\n } else if (severity === 'success') {\n bg = theme.color.ui.positiveLight;\n }\n\n return bg;\n};\n\ninterface Wrapper {\n severity?: string;\n}\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'alert',\n}))<Wrapper>`\n display: flex;\n align-items: center;\n padding: ${size(1.5)} ${size(2)};\n background-color: ${(props): string => getSnackbarBg(props.severity)};\n color: ${(props): string => props.theme.color.textDark};\n border-radius: 3px;\n`;\n\nexport const Icon = styled.div`\n flex-shrink: 0;\n padding-right: ${size(2)};\n font-size: ${size(3)};\n\n > svg {\n display: block;\n }\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n font-size: 1rem;\n`;\n\nexport const Heading = styled.div`\n font-weight: 700;\n`;\n\nexport const Message = styled.div`\n > * {\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n`;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ConversionOption, defaultConversionOptions } from '../../@types/conversion';\nimport Blockquote from '../../components/Blockquote';\nimport { ButtonContent, ButtonInlineLight, ButtonPrimary } from '../../components/Button';\nimport Container from '../../components/Container';\nimport Content from '../../components/Content';\nimport ExtendContent from '../../components/ExtendContent';\nimport FinancialOptions from '../../components/FinancialOptions';\nimport Gallery from '../../components/Gallery';\nimport { H1, H2 } from '../../components/Heading';\nimport { IconChevronLeft } from '../../components/Icon';\nimport InsuranceOptions from '../../components/InsuranceOptions';\nimport LogoBox from '../../components/LogoBox';\nimport { Page, PageSection } from '../../components/Page';\nimport { PortalElement, PortalNamespace } from '../../components/Portal';\nimport PriceTable from '../../components/PriceTable';\nimport {\n ProductPage,\n ProductPageAside,\n ProductPageAsideSection,\n ProductPageMain,\n ProductPageMainSection,\n} from '../../components/ProductPage';\nimport { Repeat, RepeatSmall } from '../../components/Repeat';\nimport UspList, { ItemProps } from '../../components/UspList';\nimport { UtilityFontSizeSmall } from '../../components/Utility';\nimport { Ad } from '../../Gql/ad/types';\nimport useAd from '../../Gql/ad/useAd';\nimport {\n adEvent,\n contactPerson,\n discount,\n ecom,\n galleryMedia,\n leasingOffers,\n manufacturerPackage,\n packageOffers,\n price,\n publishedAt,\n} from '../../Gql/ad/view';\nimport { AdContext } from '../../State/Ad/AdContext';\nimport useRouter from '../../State/Router/useRouter';\nimport useSettings from '../../State/Settings/useSettings';\nimport { dateTimeFormat, numberSeparator } from '../../utils/formats';\nimport { i18nScoped } from '../../utils/I18n';\nimport { markdownToHtml } from '../../utils/markdown';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport AccessoriesSection from './Accessories';\nimport Branch from './Branch';\nimport CheckList from './CheckList';\nimport DemoCarModal from './DemoCarModal';\nimport Documents from './Documents';\nimport ManufacturerPackageOption from './ManufacturerPackagesOption';\nimport PackageOptions from './PackageOptions';\nimport Page404 from './Page404';\nimport PageLoading from './PageLoading';\nimport Property from './Property';\nimport Related from './Related';\nimport useEcom from './useEcom';\n\nexport interface WaykeSearchItemProps {\n /** The id of the vehicle. Older ids are resolved, and the url is updated to the new one. */\n id: string;\n /** Keeps the scroll position when the vehicle page opens. By default it scrolls to the top. */\n disableResetScrollOnInit?: boolean;\n /** Url to an image for vehicles without images. */\n placeholderImage?: string;\n /** Sets the page title to the vehicle. */\n modifyDocumentTitleItem?: boolean;\n /** Shows the branch name on related vehicles and where the vehicle is located. */\n displayBranchName?: boolean;\n /** The buttons on the vehicle page. */\n conversionOptions?: ConversionOption[];\n}\n\ntype ItemViewProps = Omit<WaykeSearchItemProps, 'id' | 'disableResetScrollOnInit'> & { ad: Ad };\n\nconst ItemView = ({\n ad,\n placeholderImage,\n modifyDocumentTitleItem,\n displayBranchName,\n conversionOptions,\n}: ItemViewProps) => {\n const { ecom: ecomSettings, marketCode } = useSettings();\n const { searchHref } = useRouter();\n const ecomContext = useEcom(ad, ecomSettings, marketCode);\n // The buy button below the gallery follows the same conversion options as the sidebar.\n const ecomOption = (conversionOptions ?? defaultConversionOptions).find(\n (option) => option.type === 'ecom'\n );\n const ecommerce = ecom(ad);\n\n const [demoCarModal, setDemoCarModal] = useState(false);\n const onToggleDemoCarModal = useCallback(() => setDemoCarModal(!demoCarModal), [demoCarModal]);\n\n const item = ad.iteration?.item;\n const title = item?.displayName || ad.iteration?.displayName || ad.salesDescription?.title || '';\n const shortDescription = ad.salesDescription?.title;\n const description = ad.salesDescription?.enriched;\n const odometer = ad.iteration?.logistics?.odometerReading;\n const fuelType = item?.driveline?.fuelTypesString?.stringValue;\n const gearboxType = item?.attributes?.transmission?.formattedValue;\n const loans = ad.iteration?.commerce.paymentDetailsList || [];\n const leasing = leasingOffers(ad);\n const insuranceProvider = ad.iteration?.commerce.insuranceProvider;\n const manufacturerOffer = manufacturerPackage(ad);\n const contact = contactPerson(ad);\n const published = publishedAt(ad);\n const media = useMemo(() => galleryMedia(ad.media.items), [ad]);\n\n useEffect(() => {\n if (modifyDocumentTitleItem) {\n document.title = [item?.registrationNumber?.stringValue, title, shortDescription]\n .filter(Boolean)\n .join(' | ');\n }\n }, [ad]);\n\n const options = useMemo(() => (ad.equipment?.items || []).map((e) => ({ title: e.name })), [ad]);\n\n const onShowMoreOptionsClick = useCallback(\n () => PubSub.publish('OptionsClick', adEvent(ad)),\n [ad]\n );\n const startEcom = useCallback(() => ecomContext.current?.start(), []);\n\n const uspList: ItemProps[] = [];\n if (item?.modelYear?.intValue) uspList.push({ title: item.modelYear.intValue });\n if (ad.packaging.isDemoVersion) {\n uspList.push({ title: i18nScoped.t('item.demoCar'), onClick: onToggleDemoCarModal });\n }\n if (odometer) {\n uspList.push({\n title: `${numberSeparator(odometer.value)} ${i18nScoped.t(\n `odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`\n )}`,\n });\n }\n if (gearboxType) uspList.push({ title: gearboxType });\n if (fuelType) uspList.push({ title: fuelType });\n\n return (\n <AdContext.Provider value={ad}>\n <Page>\n <PageSection large>\n <Container>\n <ProductPage>\n <ProductPageAside>\n <ProductPageAsideSection mobileOrder={1}>\n {searchHref && (\n <Repeat>\n <UtilityFontSizeSmall>\n <ButtonInlineLight\n as=\"a\"\n href={searchHref}\n title={i18nScoped.t('navigation.backToSearch')}\n >\n <ButtonContent>\n <IconChevronLeft block />\n </ButtonContent>\n <ButtonContent>{i18nScoped.t('navigation.backToSearch')}</ButtonContent>\n </ButtonInlineLight>\n </UtilityFontSizeSmall>\n </Repeat>\n )}\n {manufacturerOffer?.image && (\n <Repeat>\n <LogoBox\n logo={manufacturerOffer.image}\n alt={item?.manufacturer?.stringValue || manufacturerOffer.title}\n />\n </Repeat>\n )}\n <Repeat>\n <RepeatSmall>\n <H1 noMargin>{title}</H1>\n </RepeatSmall>\n {shortDescription && (\n <RepeatSmall>\n <div>{shortDescription}</div>\n </RepeatSmall>\n )}\n <RepeatSmall>\n <UspList small items={uspList} />\n </RepeatSmall>\n </Repeat>\n </ProductPageAsideSection>\n\n {/* No price at all rather than \"0 kr\", as on wayke.se: leasing-only cars have none. */}\n {price(ad) > 0 && (\n <ProductPageAsideSection mobileOrder={2}>\n <PriceTable price={price(ad)} discount={discount(ad)} />\n </ProductPageAsideSection>\n )}\n\n {(loans.length > 0 || leasing.length > 0 || insuranceProvider) && (\n <ProductPageAsideSection mobileOrder={4}>\n {(loans.length > 0 || leasing.length > 0) && (\n <FinancialOptions loans={loans} leasing={leasing} />\n )}\n {insuranceProvider && <InsuranceOptions provider={insuranceProvider} />}\n </ProductPageAsideSection>\n )}\n\n <ProductPageAsideSection mobileOrder={5}>\n <CheckList\n title={title}\n conversionOptions={conversionOptions}\n toggleEcomModal={ecomSettings ? startEcom : undefined}\n />\n </ProductPageAsideSection>\n </ProductPageAside>\n <ProductPageMain>\n <ProductPageAsideSection mobileOrder={3}>\n <Gallery media={media} placeholderImage={placeholderImage} />\n </ProductPageAsideSection>\n\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{i18nScoped.t('item.carData')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{i18nScoped.t('item.carDataDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <Property />\n </Repeat>\n </ProductPageMainSection>\n {description && (\n <ProductPageMainSection>\n <Blockquote\n author={contact?.name || null}\n date={\n published\n ? dateTimeFormat.format(published, dateTimeFormat.DayMonth, marketCode)\n : undefined\n }\n avatar={contact?.avatar}\n >\n <div dangerouslySetInnerHTML={{ __html: markdownToHtml(description) }} />\n </Blockquote>\n </ProductPageMainSection>\n )}\n\n {options.length > 0 && (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{i18nScoped.t('item.equipment')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{i18nScoped.t('item.equipmentDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <ExtendContent\n actionTitle={i18nScoped.t('common.showMore')}\n onClick={onShowMoreOptionsClick}\n >\n <UspList items={options} />\n </ExtendContent>\n </Repeat>\n </ProductPageMainSection>\n )}\n\n <Documents documents={ad.iteration?.documents.public || []} />\n\n <AccessoriesSection accessories={ad.accessories} />\n\n <ProductPageMainSection>\n <Branch branch={ad.branch} displayBranchName={displayBranchName} />\n {ecomSettings && ecomOption && ecommerce.enabled && (\n <Repeat>\n <ButtonPrimary\n disabled={ecommerce.reserved}\n title={ecomOption.name || i18nScoped.t('item.actions.buyOnline')}\n onClick={startEcom}\n >\n {ecomOption.name || i18nScoped.t('item.actions.buyOnline')}\n </ButtonPrimary>\n </Repeat>\n )}\n </ProductPageMainSection>\n\n <PackageOptions packageOptions={packageOffers(ad)} />\n <ManufacturerPackageOption packageOption={manufacturerOffer} />\n </ProductPageMain>\n </ProductPage>\n </Container>\n </PageSection>\n <Related\n adId={ad.id}\n manufacturer={item?.manufacturer?.stringValue}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n </Page>\n <PortalElement id={PortalNamespace.DefaultPortal} />\n {demoCarModal && <DemoCarModal onClose={onToggleDemoCarModal} />}\n </AdContext.Provider>\n );\n};\n\n/** The vehicle page. */\nconst WaykeSearchItem = ({ id, disableResetScrollOnInit, ...props }: WaykeSearchItemProps) => {\n const { publicApi } = useSettings();\n const { loading, ad } = useAd(id, publicApi);\n\n useEffect(() => {\n if (!disableResetScrollOnInit) {\n window.scrollTo(0, 0);\n }\n PubSub.publish('View', { type: 'item', id });\n }, []);\n\n if (loading) {\n return <PageLoading />;\n }\n\n if (!ad) {\n return <Page404 />;\n }\n\n return <ItemView ad={ad} {...props} />;\n};\n\nexport default WaykeSearchItem;\n", "/**\n * Conversion options control which call-to-action buttons are rendered on the item page,\n * in which order, and how they look. Mirrors the \"conversion_options\" concept used on\n * Wayke dealer websites, adapted to this package.\n */\nexport type ConversionOptionType =\n /** \"Buy online\" - only rendered when the vehicle has e-commerce enabled. */\n | 'ecom'\n /** Opens the \"Send message\" lead form. The lead is registered in Wayke Dealer. */\n | 'leadMessage'\n /** Opens the \"Get a callback\" lead form. The lead is registered in Wayke Dealer. */\n | 'leadCallMe'\n /** Reveal the dealer email address. Opens the mail client with a pre-populated subject. */\n | 'email'\n /** Reveal the dealer phone number. */\n | 'phone';\n\nexport interface ConversionOptionVehicle {\n id: string;\n title?: string | null;\n registrationNumber?: string | null;\n manufacturer?: string | null;\n modelSeries?: string | null;\n}\n\nexport type ConversionOptionText = string | ((vehicle: ConversionOptionVehicle) => string);\n\ninterface ConversionOptionBase {\n type: ConversionOptionType;\n /** Custom button label. Defaults to the translated label for the type. */\n name?: string;\n /** Render as primary button. Defaults to true for ecom/leadMessage/leadCallMe, false for email/phone. */\n primary?: boolean;\n}\n\nexport interface ConversionOptionEmail extends ConversionOptionBase {\n type: 'email';\n /** Mail subject. Defaults to \"<hostname> \u2013 I'm interested in <reg no>, <make> <model>\". */\n subject?: ConversionOptionText;\n /** Mail body. Defaults to a link to the current page. Pass `false` to omit the body. */\n body?: ConversionOptionText | false;\n}\n\nexport interface ConversionOptionOther extends ConversionOptionBase {\n type: Exclude<ConversionOptionType, 'email'>;\n}\n\nexport type ConversionOption = ConversionOptionEmail | ConversionOptionOther;\n\n/** Matches the behaviour before conversion options were introduced. */\nexport const defaultConversionOptions: ConversionOption[] = [\n { type: 'ecom' },\n { type: 'email' },\n { type: 'phone' },\n];\n", "import React from 'react';\nimport Avatar from '../Avatar';\nimport { Author, AvatarWrapper, Date, Info, Name, Quote, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n author?: string | null;\n avatar?: string;\n date?: string;\n}\n\nconst Blockquote = ({ children, author, avatar, date }: Props) => (\n <Wrapper>\n <Quote>{children}</Quote>\n {author && (\n <Author>\n {avatar && (\n <AvatarWrapper>\n <Avatar image={avatar} alt={`${author} avatar`} />\n </AvatarWrapper>\n )}\n <Info>\n <Name>{author}</Name>\n {date && <Date>{date}</Date>}\n </Info>\n </Author>\n )}\n </Wrapper>\n);\n\nexport default Blockquote;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n image: string;\n alt?: string;\n}\n\nconst Avatar = ({ image, alt }: Props) => <Wrapper image={image} aria-label={alt} />;\n\nexport default Avatar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface Wrapper {\n image: string;\n}\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'image',\n}))<Wrapper>`\n display: block;\n width: ${size(5)};\n height: ${size(5)};\n border-radius: 50%;\n background-image: ${(props): string => `url(${props.image})`};\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n background-color: ${(props) => props.theme.color.accent};\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.blockquote`\n display: flex;\n flex-direction: column;\n max-width: 600px;\n margin: 0 auto;\n\n ${(props) => props.theme.breakpoint.Sm} {\n align-items: center;\n }\n`;\n\nexport const Quote = styled.div`\n > * {\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n`;\n\nexport const Author = styled.footer`\n display: inline-flex;\n align-items: center;\n margin-top: ${size(3)};\n\n ${(props) => props.theme.breakpoint.Md} {\n margin-top: ${size(4)};\n }\n`;\n\nexport const AvatarWrapper = styled.div`\n flex-shrink: 0;\n padding-right: ${size(1.5)};\n`;\n\nexport const Info = styled.div`\n flex: 1 1 auto;\n font-size: 0.875rem;\n`;\n\nexport const Name = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n\nexport const Date = styled.div``;\n", "import React from 'react';\nimport { markdownToHtml, sanitizeHtml } from '../../utils/markdown';\nimport { Wrapper } from './wrapper';\n\ntype Props = {\n small?: boolean;\n children?: React.ReactNode;\n /** Dealer markdown, rendered and sanitized. */\n markdown?: string | null;\n /** Dealer HTML, sanitized. */\n html?: string | null;\n};\n\nconst Content = ({ children, small, markdown, html }: Props) => {\n if (markdown != null || html != null) {\n const __html = markdown != null ? markdownToHtml(markdown) : sanitizeHtml(html ?? '');\n return <Wrapper small={small} dangerouslySetInnerHTML={{ __html }} />;\n }\n return <Wrapper small={small}>{children}</Wrapper>;\n};\n\nexport default Content;\n", "import DOMPurify from 'dompurify';\nimport { Marked } from 'marked';\n\n/**\n * Dealer texts (descriptions, packages, accessories, leasing and insurance) are\n * markdown with raw HTML in it, shown on the dealer's own site. marked passes raw\n * HTML through, so every string that becomes HTML goes through sanitizeHtml.\n * Allowlist and marked options follow web-ui-v2's src/utils/markdown.ts (security\n * audit F03), so a text renders as on wayke.se.\n */\n\nconst escapeAttribute = (value: string) =>\n value.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n// A single newline is a <br>; bare urls, ~~text~~ and | tables | stay text, as on wayke.se.\nconst markdown = new Marked({ gfm: true, breaks: true });\nmarkdown.use({\n tokenizer: {\n url: () => undefined,\n del: () => undefined,\n table: () => undefined,\n },\n renderer: {\n link(token) {\n const title = token.title ? ` title=\"${escapeAttribute(token.title)}\"` : '';\n const text = this.parser.parseInline(token.tokens);\n return `<a href=\"${escapeAttribute(token.href)}\"${title} rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\n },\n },\n});\n\nconst ALLOWED_TAGS = [\n 'p',\n 'br',\n 'hr',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 's',\n 'del',\n 'sup',\n 'sub',\n 'a',\n 'ul',\n 'ol',\n 'li',\n 'blockquote',\n 'code',\n 'pre',\n 'img',\n 'table',\n 'thead',\n 'tbody',\n 'tr',\n 'th',\n 'td',\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'title',\n 'rel',\n 'target',\n 'src',\n 'alt',\n 'width',\n 'height',\n 'start',\n 'colspan',\n 'rowspan',\n];\n\n// http(s), mailto and tel, and protocol-relative or relative urls; no javascript: or data:.\nconst ALLOWED_URI_REGEXP = /^(?:(?:https?|mailto|tel):|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))/i;\n\n/** Only the allowlisted tags and attributes survive; event handlers and style never do. */\nexport const sanitizeHtml = (html: string): string =>\n // Without a DOM (server rendering) DOMPurify cannot sanitize, so nothing is rendered.\n DOMPurify.isSupported\n ? DOMPurify.sanitize(html, { ALLOWED_TAGS, ALLOWED_ATTR, ALLOWED_URI_REGEXP })\n : '';\n\nexport const markdownToHtml = (text: string | null | undefined): string =>\n sanitizeHtml(markdown.parse(text ?? '', { async: false }));\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n small?: boolean;\n};\n\nexport const Wrapper = styled.div<WrapperProps>`\n font-size: 1rem;\n line-height: 1.5;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: ${size(4)};\n margin-bottom: ${size(1)};\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & + p,\n & + table {\n margin-top: ${size(1)};\n }\n }\n\n p {\n margin: ${size(2)} 0;\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n img {\n display: block;\n width: 100%;\n }\n\n ${({ small }) =>\n small &&\n css`\n font-size: 0.875rem;\n `}\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Action, Extend, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n actionTitle: string;\n onClick?: () => void;\n}\n\nconst ExtendContent = ({ children, actionTitle, onClick }: Props) => {\n const [extend, setExtend] = useState(false);\n const onExtend = useCallback(() => {\n setExtend(true);\n if (onClick) {\n onClick();\n }\n }, []);\n\n const onRef = (ref: HTMLDivElement | null) => {\n const refHeight = ref?.clientHeight || 0;\n\n if (refHeight < 207) {\n setExtend(true);\n }\n };\n\n return (\n <Wrapper ref={onRef}>\n <Extend extended={extend}>{children}</Extend>\n {!extend && (\n <Action>\n <ButtonClear onClick={onExtend} title={actionTitle}>\n <ButtonContent>{actionTitle}</ButtonContent>\n </ButtonClear>\n </Action>\n )}\n </Wrapper>\n );\n};\n\nexport default ExtendContent;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\ntype ExtendProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n extended?: boolean;\n};\n\nexport const Extend = styled.div<ExtendProps>`\n position: relative;\n max-height: 175px;\n overflow: hidden;\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: ${size(6)};\n background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n }\n\n ${({ extended }) =>\n extended &&\n css`\n max-height: none;\n\n &::after {\n content: none;\n }\n `}\n`;\n\nexport const Action = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: ${size(2)};\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport { LeasingOffer } from '../../Gql/ad/view';\nimport useSettings from '../../State/Settings/useSettings';\nimport { CreditorDisclaimer } from '../CreditorDisclaimer';\nimport { VisualHeading } from '../Heading';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport Leasing from './leasing';\nimport Loan from './loan';\n\ninterface FinancialOptionsProps {\n loans: PaymentResponse[];\n leasing: LeasingOffer[];\n}\n\nconst FinancialOptions = ({ loans, leasing }: FinancialOptionsProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n\n return (\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{t('item.financialOptions.otherFinancialOptions')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n {leasing.map((offer) => (\n <Leasing key={offer.business ? 'business' : 'private'} offer={offer} />\n ))}\n {loans.map((loan) => (\n <Loan key={loan.financialOptionId} loan={loan} />\n ))}\n </RepeatTiny>\n {marketCode === 'SE' && loans.length > 0 && (\n <RepeatTiny>\n <CreditorDisclaimer />\n </RepeatTiny>\n )}\n </Repeat>\n );\n};\n\nexport default FinancialOptions;\n", "import React from 'react';\nimport { Link } from '../Link';\nimport { Body, Heading, Icon, Wrapper } from './wrapper';\n\nexport const CreditorDisclaimer = () => (\n <Wrapper role=\"status\" aria-live=\"polite\">\n <Icon aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"59\"\n height=\"53\"\n viewBox=\"0 0 59 53\"\n fill=\"none\"\n >\n <title>Varning</title>\n <path\n d=\"M29.5255 20.3569V30.5712M29.5255 40.7855H29.551M54.3173 43.3391L33.9335 7.58906C33.4891 6.80308 32.8445 6.14932 32.0657 5.69448C31.2868 5.23964 30.4015 5 29.5001 5C28.5986 5 27.7133 5.23964 26.9344 5.69448C26.1556 6.14932 25.5111 6.80308 25.0666 7.58906L4.68285 43.3391C4.23359 44.1188 3.99802 45.0038 4.00001 45.9042C4.002 46.8046 4.24148 47.6884 4.69417 48.4662C5.14687 49.244 5.79668 49.8879 6.57776 50.3329C7.35883 50.7778 8.2434 51.0079 9.14179 50.9998H49.9093C50.8034 50.9989 51.6815 50.7622 52.4554 50.3136C53.2294 49.865 53.8719 49.2202 54.3186 48.444C54.7652 47.6677 55.0002 46.7874 55 45.8913C54.9998 44.9953 54.7643 44.1151 54.3173 43.3391Z\"\n stroke=\"#A43333\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Icon>\n <Body>\n <Heading>Att l\u00E5na kostar pengar!</Heading>\n <p>\n Om du inte kan betala tillbaka skulden i tid riskerar du en betalningsanm\u00E4rkning. Det kan\n leda till sv\u00E5righeter att f\u00E5 hyra bostad, teckna abonnemang och f\u00E5 nya l\u00E5n. F\u00F6r st\u00F6d, v\u00E4nd\n dig till budget- och skuldr\u00E5dgivningen i din kommun. Kontaktuppgifter finns p\u00E5{' '}\n <Link\n href=\"https://www.konsumentverket.se/\"\n title=\"Konsumentverket\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n konsumentverket.se\n </Link>\n .\n </p>\n </Body>\n </Wrapper>\n);\n", "import styled, { css } from 'styled-components';\n\ninterface LinkProps {\n $hoverGhost?: boolean;\n}\n\nexport const Link = styled.a.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))<LinkProps>`\n text-decoration: none;\n cursor: pointer;\n text-decoration: underline;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDark};\n }\n\n &:hover {\n text-decoration: underline;\n }\n\n ${({ $hoverGhost }) =>\n $hoverGhost &&\n css`\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n `}\n`;\n", "import styled from 'styled-components';\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: ${size(2)};\n padding: ${size(2)};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n font-size: 0.875rem;\n line-height: 1.3;\n`;\n\nexport const Icon = styled.div`\n flex-shrink: 0;\n\n svg {\n display: block;\n width: auto;\n height: 3lh;\n }\n`;\n\nexport const Body = styled.div`\n flex: 1 1 20ch;\n display: flex;\n flex-direction: column;\n gap: ${size(0.25)};\n\n p {\n margin: 0;\n }\n`;\n\nexport const Heading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LeasingOffer } from '../../Gql/ad/view';\nimport { numberSeparator } from '../../utils/formats';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport DataList from '../DataList';\nimport Modal from '../Modal';\nimport { Image, ModalFoldout, ModalFoldoutBody } from '../Modal/wrapper';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport { UtilityTextPrimary } from '../Utility';\n\ninterface LeasingProps {\n offer: LeasingOffer;\n}\n\nconst Leasing = ({ offer }: LeasingProps) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => setModal(!modal), [modal]);\n\n const { image, description, monthlyCost, months, mileagePerYear, business, name } = offer;\n\n const title = business\n ? t('item.financialOptions.businessLease')\n : t('item.financialOptions.privateLease');\n\n return (\n <>\n {modal && (\n <Modal title={title} onClose={toggleModal}>\n {image && <Image src={image} alt={title} />}\n {description && <Content html={description} />}\n <ModalFoldout>\n <ModalFoldoutBody>\n <DataList\n items={[\n {\n label: t('item.financialOptions.monthlyCost'),\n value: `${numberSeparator(monthlyCost || 0)} ${t('currency.monthly')}`,\n },\n {\n label: t('item.financialOptions.bindingTime'),\n value: `${months} m\u00E5nader`,\n },\n {\n label: t('item.financialOptions.annualMileage'),\n value: `${numberSeparator(mileagePerYear || 0)} ${t(\n 'item.financialOptions.mileagePerYear'\n )}`,\n },\n ]}\n />\n </ModalFoldoutBody>\n </ModalFoldout>\n </Modal>\n )}\n <OptionBox>\n <>\n <OptionBoxHeading>{`ca ${numberSeparator(monthlyCost)} ${t(\n 'currency.monthly'\n )}`}</OptionBoxHeading>\n </>\n <OptionBoxContent>\n <p>\n {title}{' '}\n {mileagePerYear && months && (\n <>\n <UtilityTextPrimary>\n {numberSeparator(mileagePerYear)} {t('item.financialOptions.mileagePerYear')}\n </UtilityTextPrimary>{' '}\n i{' '}\n <UtilityTextPrimary>\n {months} {t('item.financialOptions.months')}\n </UtilityTextPrimary>\n .{' '}\n </>\n )}\n </p>\n {name && (\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.readMore')}</ButtonInline>\n </p>\n )}\n </OptionBoxContent>\n </OptionBox>\n </>\n );\n};\n\nexport default Leasing;\n", "import React from 'react';\n\nimport { Item, Label, List, Value } from './wrapper';\n\ninterface ItemProps {\n label: string;\n value: string;\n}\n\ninterface Props {\n items: ItemProps[];\n}\n\nconst DataList = ({ items }: Props) => (\n <List>\n {items.map((item) => (\n <Item key={item.label}>\n <Label>{item.label}</Label>\n <Value>{item.value}</Value>\n </Item>\n ))}\n </List>\n);\n\nexport default DataList;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n display: flex;\n align-items: flex-start;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Label = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Value = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n flex-shrink: 0;\n padding-left: ${size(2)};\n`;\n", "import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { H1 } from '../Heading';\nimport { IconCancel } from '../Icon';\nimport { Portal, PortalNamespace } from '../Portal';\nimport {\n Body,\n Close,\n CloseBtn,\n Content,\n Dialog,\n Header,\n Heading,\n UiBlock,\n Wrapper,\n} from './wrapper';\n\ninterface ModalProps {\n id?: string | null;\n title: string | null;\n children: React.ReactNode;\n onClose: (e: React.MouseEvent<HTMLDivElement | HTMLButtonElement, MouseEvent>) => void;\n}\n\nconst Modal = ({ id, title, onClose, children }: ModalProps) => {\n const { t } = useTranslation();\n return (\n <Portal id={id || PortalNamespace.DefaultPortal}>\n <Wrapper onClick={(e) => e.stopPropagation()}>\n <UiBlock onClick={onClose} title={t('other.closeModal') || ''} />\n <Dialog>\n <Content>\n <Header>\n <Heading>\n <H1 noMargin>{title}</H1>\n </Heading>\n <Close>\n <CloseBtn onClick={onClose} title={t('other.closeModal') || ''}>\n <IconCancel block />\n </CloseBtn>\n </Close>\n </Header>\n <Body>{children}</Body>\n </Content>\n </Dialog>\n </Wrapper>\n </Portal>\n );\n};\n\nexport default Modal;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { fadeIn, noTransform } from '../../layout/keyframes';\n\nimport { ButtonReset } from '../Button';\nimport { H1 } from '../Heading';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'dialog',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n width: 100%;\n white-space: normal;\n text-align: left;\n z-index: 90;\n display: flex;\n align-items: center;\n justify-content: center;\n\n ${(props) => props.theme.breakpoint.Sm} {\n padding: ${size(2)};\n }\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n 'aria-hidden': 'true',\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.35);\n z-index: -1;\n\n ${(props) => props.theme.breakpoint.LtMd} {\n animation: ${fadeIn} 300ms ease forwards;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n animation: ${fadeIn} 400ms ease forwards;\n }\n`;\n\nexport const Dialog = styled.article.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n display: flex;\n flex-direction: column;\n background-color: ${(props) => props.theme.color.bg};\n z-index: 1;\n width: 100%;\n max-width: 680px;\n max-height: 100%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n align-self: flex-end;\n transform: translateY(100%);\n animation: ${noTransform} 300ms ease forwards;\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n transform: translateY(${size(2)});\n animation:\n ${fadeIn} 400ms ease,\n ${noTransform} 400ms ease forwards;\n }\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const Header = styled.header`\n display: flex;\n align-items: center;\n min-height: 60px;\n padding: ${size(3)};\n padding-bottom: 0;\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n\n ${H1} {\n font-size: 1.5rem;\n }\n`;\n\nexport const Close = styled.div`\n flex-shrink: 0;\n margin: ${size(-2)};\n padding-left: ${size(3)};\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n display: block;\n padding: ${size(2)};\n`;\n\nexport const Body = styled.div`\n padding: ${size(3)};\n`;\n\nexport const Image = styled.img`\n display: block;\n width: calc(100% + ${size(6)});\n margin-left: ${size(-3)};\n margin-bottom: ${size(3)};\n`;\n\nexport const ModalFoldout = styled.div`\n background-color: ${(props) => props.theme.color.accent};\n margin-top: ${size(3)};\n padding: ${size(2)};\n border-radius: 3px;\n`;\n\nexport const ModalFoldoutBody = styled.div``;\n", "import * as React from 'react';\n\nimport { Content, Logo, LogoImg, Wrapper } from './wrapper';\n\ninterface IOptionBox {\n logo?: string;\n logo2x?: string;\n logoAlt?: string;\n children: React.ReactNode;\n}\n\nconst OptionBox = ({ logo, logo2x, logoAlt, children }: IOptionBox) => (\n <Wrapper>\n {logo && (\n <Logo>\n <LogoImg src={logo} srcSet={logo2x} alt={logoAlt} />\n </Logo>\n )}\n <Content>{children}</Content>\n </Wrapper>\n);\n\nexport default OptionBox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n padding: ${size(1)};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Logo = styled.div`\n position: relative;\n flex-shrink: 0;\n margin-right: ${size(1)};\n width: ${size(9.5)};\n height: ${size(6)};\n`;\n\nexport const LogoImg = styled.img`\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: auto;\n bottom: 0;\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n text-align: right;\n line-height: 1.4;\n`;\n\nexport const OptionBoxHeading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1rem;\n`;\n\nexport const OptionBoxContent = styled.div`\n margin-top: ${size(0.5)};\n font-size: 0.875rem;\n\n p {\n margin: 0;\n }\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport useLoanCalculation from '../../Gql/ad/useLoanCalculation';\nimport { adEvent, num } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport LoanModal from './LoanModal';\n\ninterface LoanProps {\n loan: PaymentResponse;\n}\n\nconst Loan = ({ loan }: LoanProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi } = useSettings();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'FinanceClose' : 'FinanceOpen', adEvent(ad));\n }, [modal, ad]);\n\n // The list gives the defaults; the calculation gives the monthly cost for them.\n const { payment } = useLoanCalculation(publicApi, ad.id, {\n financialOptionId: loan.financialOptionId,\n duration: num(loan.duration?.current),\n downPayment: num(loan.downPayment?.current),\n residual: num(loan.residual?.current),\n });\n\n const interest = num(payment?.interest);\n const duration = num(payment?.duration?.current);\n const monthlyCost = num(payment?.monthlyCost);\n const loanAmount = num(loan.loanAmount);\n const logo = loan.imageUrl || undefined;\n\n if (interest === undefined || duration === undefined || monthlyCost === undefined) {\n return (\n <OptionBox logo={logo} logoAlt={t('common.logotype')}>\n <OptionBoxHeading>{t('other.loading')}</OptionBoxHeading>\n <OptionBoxContent>\n <p>{t('other.loading')}</p>\n </OptionBoxContent>\n </OptionBox>\n );\n }\n\n return (\n <>\n {modal && <LoanModal loan={loan} onClose={toggleModal} />}\n <OptionBox logo={logo} logoAlt={t('common.logotype')}>\n <>\n <OptionBoxHeading>{`${numberSeparator(monthlyCost)} ${t(\n 'currency.monthly'\n )}*`}</OptionBoxHeading>\n\n <OptionBoxContent>\n <p>\n {loanAmount && duration\n ? t('item.financialOptions.payInInstallmentsDetailed', {\n amount: `${numberSeparator(loanAmount)} kr`,\n duration,\n })\n : t('item.financialOptions.payInInstallments')}\n </p>\n\n <p>\n *\n {t('item.financialOptions.disclaimer', {\n interest: `${(interest * 100).toFixed(2)}%`,\n })}{' '}\n <ButtonInline onClick={toggleModal}>{t('common.readMore')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </>\n </OptionBox>\n </>\n );\n};\n\nexport default Loan;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { CALCULATE_PAYMENT_QUERY } from './queries';\nimport { CalculatePaymentData, PaymentResponse } from './types';\n\nexport interface LoanVariables {\n financialOptionId?: string | null;\n duration?: number;\n downPayment?: number;\n residual?: number;\n}\n\n/** A recalculated loan through iteration.commerce.calculatePayment. */\nconst useLoanCalculation = (\n settings: PublicApiSettings,\n adId: string,\n { financialOptionId, duration, downPayment, residual }: LoanVariables\n) => {\n const [payment, setPayment] = useState<PaymentResponse>();\n const [loading, setLoading] = useState(false);\n const skip = duration === undefined || downPayment === undefined;\n\n useEffect(() => {\n if (skip) return;\n let active = true;\n setLoading(true);\n gqlQuery<CalculatePaymentData>(settings.api, CALCULATE_PAYMENT_QUERY, {\n id: adId,\n config: {\n financialOptionId: financialOptionId || undefined,\n duration: Math.round(duration),\n downPayment: Math.round(downPayment),\n residual: residual || 0,\n },\n })\n .then((data) => {\n const next = data.ads?.byAdId?.iteration?.commerce.calculatePayment;\n if (active && next) setPayment(next);\n })\n .catch(() => undefined)\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [skip, adId, financialOptionId, duration, downPayment, residual]);\n\n return { loading, payment };\n};\n\nexport default useLoanCalculation;\n", "// GraphQL documents for the ad page against the public API.\n\nimport { SEARCH_HIT_FIELDS } from '../queries';\n\nconst WARRANTY_CONTENT = `content { __typename ... on AdSpecificText { text } ... on StandardText { text } ... on StructuredWarranty { text } }`;\n\nexport const AD_QUERY = `\nquery Ad($id: ID!) {\n ads {\n byAdId(ID: $id) {\n id\n branchId\n createdAt\n salesDescription { title enriched }\n packaging {\n isDemoVersion\n certifiedPreOwned\n selectedPackaging { id title description imageUrl ctaUrl ctaName }\n }\n channels {\n __typename\n ... on PlatformChannel {\n status\n inventoryStatus\n publishedAt\n soldAt\n deliveryTime { __typename ... on DeliveryDate { date } ... on DeliveryInterval { from to unit } }\n }\n }\n pricing {\n primaryPriceType\n cash { price { amount } oldPrice { amount } deductibleVat }\n leasing { issuer leasingMonthlyPayment { amount } contractMonthsRemaining contractKilometersRemaining }\n companyLeasing { issuer leasingMonthlyPayment { amount } contractMonthsRemaining contractKilometersRemaining }\n }\n leasingPromos { id title description image periodMonths mileagePerYear isBusinessLeasing link { url name } }\n media(limit: 60) {\n totalCount\n items {\n __typename\n ... on AdImage { id url sortOrder mediaType formats { format url } }\n ... on Ad360ImageGroup { id sortOrder images { id url } }\n ... on AdEmbeddedVideo { id externalUrl sortOrder }\n }\n }\n equipment { items { name } }\n accessories {\n id name price salePrice assemblyPrice shortDescription longDescription logoUrl\n productPageLink productPageLinkText articleNumber manufacturer model\n media { url sortOrder }\n }\n warrantyInfo { ${WARRANTY_CONTENT} }\n offerings {\n warranties {\n included\n text\n definition { id name description logoUrl externalUrl usps }\n }\n }\n exchangePolicy { enabled }\n contactOption {\n __typename\n ... on Branch { id displayName }\n ... on AdDefaultContactOptions { displayName telephone email title }\n ... on AssignedUser { displayName telephone email title }\n ... on Editorial { displayName phone email title }\n }\n branch {\n id displayName description street zip city latitude longitude homePage logo market\n contactInformation { telephone email }\n adDefaultContactOptions { displayName telephone email title avatarUrl }\n weekOpeningHours { openingHours { dayOfWeek openFrom openTo } }\n isAutomotiveAssociationVerified\n promos { id title description image link { url name } }\n }\n authorizedResellerForManufacturer\n iteration {\n id\n displayName\n item {\n __typename\n ... on Vehicle {\n displayName\n registrationNumber { stringValue }\n vin { formattedValue }\n manufacturer { stringValue }\n modelSeries { stringValue }\n modelName { stringValue }\n modelVariant { stringValue }\n modelYear { intValue }\n manufactureYear { intValue }\n salesName { stringValue }\n driveline { fuelTypesString { stringValue } }\n attributes {\n transmission { formattedValue }\n enginePower { intValue formattedValue }\n exteriorColor { formattedValue }\n doorsCount { formattedValue }\n chassisType { formattedValue }\n vehicleClassification { formattedValue }\n byCategory {\n categoryId displayName\n values { __typename key label formattedValue }\n categories { categoryId displayName values { __typename key label formattedValue } }\n }\n }\n authority {\n segment { stringValue }\n chassis { stringValue }\n annualTax { intValue formattedValue }\n }\n }\n }\n logistics { odometerReading { value unit } }\n commerce {\n enabled disabledOnWayke allowTradeIn homeDelivery reserved\n insuranceProvider {\n institute identifier logo title description longDescription url\n insuranceHeader ecomInsuranceText requiresPersonalNumber requiresDistance\n }\n paymentDetailsList {\n financialOptionId name description financialInstitution monthlyCost interest effectiveInterest\n setupFee administrationFee totalCreditCost totalResidualValue loanAmount imageUrl link linkText\n duration { min max step default current }\n downPayment { min max step default current }\n residual { min max step default current }\n }\n }\n documents { public { id name contentType uri category sortOrder } }\n }\n }\n }\n}\n`;\n\n/**\n * Older ads carry a legacy id that differs from ad.id. ads.byIterationId accepts a\n * bare GUID and resolves it to the ad, with the same visibility rules as byAdId.\n */\nexport const AD_ID_BY_LEGACY_ID_QUERY = `\nquery AdIdByLegacyId($id: ID!) {\n ads { byIterationId(iterationId: $id) { ads { id } } }\n}\n`;\n\nexport const CALCULATE_PAYMENT_QUERY = `\nquery CalculatePayment($id: ID!, $config: PaymentDetailsInput!) {\n ads {\n byAdId(ID: $id) {\n iteration {\n commerce {\n calculatePayment(config: $config) {\n financialOptionId monthlyCost interest effectiveInterest setupFee administrationFee\n totalCreditCost totalResidualValue loanAmount\n duration { min max step default current }\n downPayment { min max step default current }\n residual { min max step default current }\n }\n }\n }\n }\n }\n}\n`;\n\nexport const INSURANCE_INQUIRY_QUERY = `\nquery InsuranceInquiry($id: ID!, $socialId: String!, $drivingDistance: DrivingDistance!) {\n ads {\n byAdId(ID: $id) {\n iteration {\n commerce {\n insuranceInquiry(socialId: $socialId, drivingDistance: $drivingDistance) {\n insurances {\n name price unit description branding legalUrl legalDescription\n details { institute logo terms }\n insuranceItems { name description }\n addons { id title price description exclude }\n }\n }\n }\n }\n }\n }\n}\n`;\n\nexport const RELATED_ADS_QUERY = `\nquery RelatedAds($market: [String], $branchGroupId: String, $manufacturer: [String], $perPage: Int) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, manufacturer: $manufacturer, perPage: $perPage, soldWithinDays: 0, sort: { field: publishedAt, direction: desc }) {\n found\n hits { ${SEARCH_HIT_FIELDS} }\n }\n }\n}\n`;\n", "// An ad carries two ids. ad.id (UUID v7) is what the public API and the ad\n// page's URL use. The legacy waykeId is the vehicle id from before ads-service,\n// and the services that predate it are still keyed on it: commerce/ecom (the\n// order flow 404s on ad.id) and ev-calculation. The two are equal for ads\n// created after the migration and differ for older ones.\n//\n// The public API does not expose the waykeId, but iteration.id is shaped\n// <branchId>@<waykeId>@<vehicleCode>.<hash>. Same as web-ui-v2's\n// utils/ads/legacyWaykeId.ts.\n\nexport const legacyWaykeIdFromIterationId = (\n iterationId: string | null | undefined,\n fallback: string\n): string => {\n if (!iterationId) return fallback;\n const firstAt = iterationId.indexOf('@');\n const secondAt = firstAt === -1 ? -1 : iterationId.indexOf('@', firstAt + 1);\n if (firstAt === -1 || secondAt === -1) return fallback;\n return iterationId.slice(firstAt + 1, secondAt) || fallback;\n};\n", "// Small readers over an Ad that several parts of the ad page share. They take\n// the API's shape as it is and tolerate missing data.\n\nimport { legacyWaykeIdFromIterationId } from './legacyWaykeId';\nimport { Ad, AdAccessory, AdMediaItem, LeasingPrice, PaymentRange } from './types';\n\n/** A number from the API, which sends some amounts as strings. */\nexport const num = (value: string | number | null | undefined) => {\n if (value === null || value === undefined || value === '') return undefined;\n const n = typeof value === 'number' ? value : Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n};\n\nexport const str = (value: string | null | undefined) => value || undefined;\n\n/** What every ad page event carries. */\nexport const adEvent = (ad: Ad) => ({\n id: ad.id,\n branchId: ad.branch.id,\n branchName: str(ad.branch.displayName),\n});\n\n/** Ecom and ev-calculation are keyed on the legacy waykeId, not on ad.id. */\nexport const waykeId = (ad: Ad) => legacyWaykeIdFromIterationId(ad.iteration?.id, ad.id);\n\nexport const platformChannel = (ad: Ad) =>\n ad.channels.find((c) => c.__typename === 'PlatformChannel');\n\nexport const price = (ad: Ad) => num(ad.pricing?.cash?.price?.amount) ?? 0;\n\n/** How much the price was lowered, when it was. */\nexport const discount = (ad: Ad) => {\n const oldPrice = num(ad.pricing?.cash?.oldPrice?.amount);\n const current = price(ad);\n return oldPrice && oldPrice > current ? oldPrice - current : undefined;\n};\n\n/** The delivery date of a car that is not in stock yet. */\nexport const availableFrom = (ad: Ad) => {\n const channel = platformChannel(ad);\n return channel?.inventoryStatus !== 'InStock' &&\n channel?.deliveryTime?.__typename === 'DeliveryDate' &&\n channel.deliveryTime.date\n ? new Date(channel.deliveryTime.date)\n : undefined;\n};\n\nexport const publishedAt = (ad: Ad) => {\n const at = platformChannel(ad)?.publishedAt;\n return at ? new Date(at) : undefined;\n};\n\n/** Buy online is offered when the branch has it, unless it is switched off for Wayke. */\nexport const ecom = (ad: Ad) => {\n const commerce = ad.iteration?.commerce;\n return {\n enabled: !!commerce?.enabled && !commerce.disabledOnWayke,\n reserved: !!commerce?.reserved,\n };\n};\n\nexport interface ContactPerson {\n name?: string;\n email?: string;\n phone?: string;\n avatar?: string;\n}\n\n/**\n * The person to contact about the ad: the assigned salesperson or the ad's own\n * contact (Editorial), else the branch's default.\n */\nexport const contactPerson = (ad: Ad): ContactPerson | undefined => {\n const c = ad.contactOption;\n if (c.__typename === 'AssignedUser' || c.__typename === 'AdDefaultContactOptions') {\n return { name: str(c.displayName), email: str(c.email), phone: str(c.telephone) };\n }\n if (c.__typename === 'Editorial') {\n return { name: str(c.displayName), email: str(c.email), phone: str(c.phone) };\n }\n const d = ad.branch.adDefaultContactOptions;\n if (d && (d.email || d.telephone)) {\n return {\n name: str(d.displayName),\n email: str(d.email),\n phone: str(d.telephone),\n avatar: str(d.avatarUrl),\n };\n }\n return undefined;\n};\n\nexport type DayKey =\n | 'monday'\n | 'tuesday'\n | 'wednesday'\n | 'thursday'\n | 'friday'\n | 'saturday'\n | 'sunday';\n\nexport type WeekOpeningHours = Partial<Record<DayKey, { from: string; until: string } | null>>;\n\nexport const openingHours = (branch: Ad['branch']): WeekOpeningHours | undefined => {\n const hours = branch.weekOpeningHours?.openingHours;\n if (!hours?.length) return undefined;\n const week: WeekOpeningHours = {};\n hours.forEach((h) => {\n if (!h) return;\n const key = h.dayOfWeek.toLowerCase() as DayKey;\n week[key] = h.openFrom && h.openTo ? { from: h.openFrom, until: h.openTo } : null;\n });\n return week;\n};\n\nexport const position = (branch: Ad['branch']) =>\n branch.latitude !== null && branch.longitude !== null\n ? { latitude: branch.latitude, longitude: branch.longitude }\n : undefined;\n\nexport type MediaType = 'image' | 'sphere' | 'threesixty' | 'embedded';\n\n/** One slide of the gallery: an image, a panorama, a 360 spin of several images, or a video. */\nexport interface GalleryMedia {\n type: MediaType;\n urls: string[];\n}\n\nexport const galleryMedia = (items: AdMediaItem[]): GalleryMedia[] =>\n [...items]\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .map<GalleryMedia | undefined>((m) => {\n if (m.__typename === 'AdImage' && m.url) {\n return { type: m.mediaType === 'SPHERE' ? 'sphere' : 'image', urls: [m.url] };\n }\n if (m.__typename === 'Ad360ImageGroup' && m.images?.length) {\n return { type: 'threesixty', urls: m.images.map((i) => i.url) };\n }\n if (m.__typename === 'AdEmbeddedVideo' && m.externalUrl) {\n return { type: 'embedded', urls: [m.externalUrl] };\n }\n return undefined;\n })\n .filter((m): m is GalleryMedia => !!m);\n\nexport interface Range {\n current: number;\n min: number;\n max: number;\n step: number;\n}\n\nexport const range = (r: PaymentRange | null | undefined): Range | undefined =>\n r\n ? {\n current: num(r.current) ?? 0,\n min: num(r.min) ?? 0,\n max: num(r.max) ?? 0,\n step: num(r.step) ?? 0,\n }\n : undefined;\n\nexport interface LeasingOffer {\n business: boolean;\n monthlyCost: number;\n months?: number;\n mileagePerYear?: number;\n name?: string;\n description?: string;\n image?: string;\n}\n\n/** Private and business leasing, with the dealer's promo text when there is one. */\nexport const leasingOffers = (ad: Ad): LeasingOffer[] => {\n const pairs: [LeasingPrice | null | undefined, boolean][] = [\n [ad.pricing?.leasing, false],\n [ad.pricing?.companyLeasing, true],\n ];\n return pairs.flatMap(([leasing, business]) => {\n const monthlyCost = num(leasing?.leasingMonthlyPayment?.amount);\n if (!leasing || !monthlyCost) return [];\n const promo = ad.leasingPromos.find((lp) => lp.isBusinessLeasing === business);\n return [\n {\n business,\n monthlyCost,\n months: promo?.periodMonths || leasing.contractMonthsRemaining || undefined,\n mileagePerYear: promo?.mileagePerYear || undefined,\n name: str(promo?.title) || str(leasing.issuer),\n description: str(promo?.description),\n image: str(promo?.image),\n },\n ];\n });\n};\n\nexport interface PackageOffer {\n title: string;\n description?: string;\n image?: string;\n link?: { url: string; title?: string };\n}\n\nexport const packageOffers = (ad: Ad): PackageOffer[] =>\n ad.packaging.selectedPackaging.map((p) => ({\n title: p.title,\n description: str(p.description),\n image: str(p.imageUrl),\n link: p.ctaUrl ? { url: p.ctaUrl, title: str(p.ctaName) } : undefined,\n }));\n\n/** The manufacturer's warranty package of a certified pre-owned car. */\nexport const manufacturerPackage = (ad: Ad): PackageOffer | undefined => {\n if (!ad.packaging.certifiedPreOwned) return undefined;\n const warranty = ad.offerings.warranties.find((w) => w.included) || ad.offerings.warranties[0];\n if (!warranty) return undefined;\n const { definition } = warranty;\n return {\n title: definition.name,\n description: str(definition.description) || str(warranty.text),\n image: str(definition.logoUrl),\n link: definition.externalUrl ? { url: definition.externalUrl } : undefined,\n };\n};\n\n/** An accessory's images, in their order. */\nexport const accessoryImages = (accessory: AdAccessory) =>\n [...accessory.media].sort((a, b) => a.sortOrder - b.sortOrder).map((m) => m.url);\n", "import { createContext, useContext } from 'react';\nimport { Ad } from '../../Gql/ad/types';\n\n/** The ad the page shows, for the parts of the page that need more than their props. */\nexport const AdContext = createContext<Ad | undefined>(undefined);\n\nconst useAdContext = () => {\n const ad = useContext(AdContext);\n if (!ad) throw new Error('Wayke: used outside an ad page');\n return ad;\n};\n\nexport default useAdContext;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport useLoanCalculation from '../../Gql/ad/useLoanCalculation';\nimport { adEvent, num, range } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport Content from '../Content';\nimport { ContentLogo, ContentLogoMedia, ContentLogoText } from '../ContentLogo';\nimport { CreditorDisclaimer } from '../CreditorDisclaimer';\nimport DataList from '../DataList';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { ModalFoldout, ModalFoldoutBody } from '../Modal/wrapper';\nimport SliderWithLabel from '../RangeSlider/SliderWithLabel';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\n\nconst stepGenerator = (\n step: number,\n max: number,\n steps: number[] = [],\n current?: number\n): number[] => {\n if (step === 0 && current === undefined) return steps;\n\n if (current !== undefined && current >= max && step !== 0) {\n return steps;\n }\n\n const nextCurrent = current ? step + current : step;\n steps.push(nextCurrent);\n return stepGenerator(step, max, steps, nextCurrent);\n};\n\ninterface LoanModalProps {\n loan: PaymentResponse;\n onClose: () => void;\n}\n\nconst LoanModal = ({ loan: option, onClose }: LoanModalProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi, marketCode } = useSettings();\n const [extend, setExtend] = React.useState(false);\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n\n const onToggleExtend = React.useCallback(() => {\n if (!extend) {\n PubSub.publish('FinanceInterest', trackPayload);\n }\n setExtend(!extend);\n }, [extend]);\n\n const [variables, setVariables] = useState({\n duration: num(option.duration?.current),\n downPayment: num(option.downPayment?.current),\n residual: num(option.residual?.current),\n });\n\n const { loading, payment } = useLoanCalculation(publicApi, ad.id, {\n financialOptionId: option.financialOptionId,\n ...variables,\n });\n\n // The API snaps the values to its steps; the sliders follow what it settled on.\n useEffect(() => {\n if (payment) {\n setVariables({\n duration: num(payment.duration?.current) || 0,\n downPayment: num(payment.downPayment?.current) || 0,\n residual: num(payment.residual?.current) || 0,\n });\n }\n }, [payment]);\n\n const { residual } = variables;\n const downPayment = range(payment?.downPayment);\n const downPaymentCurrent = downPayment?.current || 0;\n const downPaymentMin = downPayment?.min || 0;\n const downPaymentMax = downPayment?.max || 0;\n const downPaymentSteps = stepGenerator(downPayment?.step || 0, downPaymentMax);\n const onDownPaymentChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, downPayment: values[0] });\n },\n [variables, trackPayload]\n );\n\n const duration = range(payment?.duration);\n const durationCurrent = duration?.current || 0;\n const durationMin = duration?.min || 0;\n const durationMax = duration?.max || 0;\n const durationSteps = stepGenerator(duration?.step || 0, durationMax);\n const onDurationChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, duration: values[0] });\n },\n [variables, trackPayload]\n );\n\n const residualRange = range(payment?.residual);\n const residualCurrent = (residualRange?.current || 0) * 100;\n const residualMin = (residualRange?.min || 0) * 100;\n const residualMax = (residualRange?.max || 0) * 100;\n const residualSteps = stepGenerator((residualRange?.step || 0) * 100, residualMax);\n const onResidualChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, residual: values[0] / 100 });\n },\n [variables, trackPayload]\n );\n\n const interestText = ((num(payment?.interest) || 0) * 100).toFixed(2);\n const effectiveInterestText = ((num(payment?.effectiveInterest) || 0) * 100).toFixed(2);\n const monthlyCost = num(payment?.monthlyCost);\n const image = option.imageUrl || undefined;\n const name = option.name || option.financialInstitution;\n\n return (\n <Modal title={t('item.financialOptions.loanOptions')} onClose={onClose}>\n {option.description ? (\n <Repeat>\n <ContentLogo>\n <ContentLogoText>\n <Content>\n <p>{option.description}</p>\n </Content>\n </ContentLogoText>\n {image && (\n <ContentLogoMedia>\n <LogoBox logo={image} alt={name || t('common.logotype')} wide />\n </ContentLogoMedia>\n )}\n </ContentLogo>\n </Repeat>\n ) : (\n <>\n {image && (\n <Repeat>\n <LogoBox logo={image} alt={name || t('common.logotype')} wide />\n </Repeat>\n )}\n </>\n )}\n <Repeat>\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.downPayment')}\n values={[downPaymentCurrent]}\n domain={[downPaymentMin, downPaymentMax]}\n steps={downPaymentSteps}\n unit={t('currency.default')}\n loading={loading}\n onChange={onDownPaymentChange}\n />\n </RepeatSmall>\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.duration')}\n values={[durationCurrent]}\n domain={[durationMin, durationMax]}\n steps={durationSteps}\n unit={t('item.financialOptions.months')}\n loading={loading}\n onChange={onDurationChange}\n />\n </RepeatSmall>\n {residual !== undefined && residualMax !== 0 && (\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.residual')}\n values={[residualCurrent]}\n domain={[residualMin, residualMax]}\n steps={residualSteps}\n unit=\"%\"\n loading={loading}\n onChange={onResidualChange}\n />\n </RepeatSmall>\n )}\n <RepeatSmall>\n <RepeatTiny>\n {monthlyCost !== null && monthlyCost !== undefined && (\n <Content>{`${numberSeparator(monthlyCost)} ${t('currency.monthly')}*`}</Content>\n )}\n <Content small>\n <p>\n *\n {t('item.financialOptions.loanOptionsDisclaimer', {\n interest: interestText,\n effectiveInterest: effectiveInterestText,\n })}\n </p>\n </Content>\n </RepeatTiny>\n </RepeatSmall>\n\n <RepeatSmall>\n <ButtonClear\n onClick={onToggleExtend}\n title={\n extend ? t('common.showLessInformation') || '' : t('common.showMoreInformation') || ''\n }\n >\n <ButtonContent>\n {extend ? t('common.lessInformation') : t('common.showMoreInformation')}\n </ButtonContent>\n </ButtonClear>\n </RepeatSmall>\n <>\n {extend && (\n <ModalFoldout>\n <ModalFoldoutBody>\n <DataList\n items={[\n {\n label: t('item.financialOptions.interest'),\n value: `${interestText} %`,\n },\n {\n label: t('item.financialOptions.effectiveinterest'),\n value: `${effectiveInterestText} %`,\n },\n {\n label: t('item.financialOptions.setupFee'),\n value: `${numberSeparator(num(option.setupFee) || 0)} ${t(\n 'currency.default'\n )}`,\n },\n {\n label: t('item.financialOptions.administrationFee'),\n value: `${numberSeparator(num(option.administrationFee) || 0)} ${t(\n 'currency.monthly'\n )}`,\n },\n {\n label: t('item.financialOptions.totalCreditCost'),\n value: `${numberSeparator(num(payment?.totalCreditCost) || 0)} ${t(\n 'currency.default'\n )}`,\n },\n ]}\n />\n </ModalFoldoutBody>\n </ModalFoldout>\n )}\n </>\n </Repeat>\n {marketCode === 'SE' && (\n <Repeat>\n <CreditorDisclaimer />\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default LoanModal;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const ContentLogo = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n display: flex;\n align-items: flex-start;\n }\n`;\n\nexport const ContentLogoText = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n flex: 1 1 auto;\n }\n`;\n\nexport const ContentLogoMedia = styled.div`\n ${(props) => props.theme.breakpoint.LtSm} {\n margin-top: ${size(2)};\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n flex-shrink: 0;\n padding-left: ${size(4)};\n }\n`;\n", "import * as React from 'react';\n\nimport { Logo } from './wrapper';\n\ninterface ILogoBox {\n logo: string;\n logo2x?: string | null;\n alt?: string;\n wide?: boolean;\n}\n\nconst LogoBox = ({ logo, logo2x, alt, wide }: ILogoBox) => {\n let logoRetina = logo;\n\n if (logo2x) {\n logoRetina = `${logo2x} 2x`;\n }\n\n return <Logo src={logo} srcSet={logoRetina} alt={alt} wide={wide} />;\n};\n\nexport default LogoBox;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype LogoProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n wide?: boolean;\n};\n\nexport const Logo = styled.img<LogoProps>`\n display: block;\n max-width: ${size(9.5)};\n max-height: ${size(6)};\n\n ${({ wide }) =>\n wide &&\n css`\n max-width: ${size(20)};\n `}\n`;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { numberSeparator } from '../../utils/formats';\nimport RangeSliderLabel from '../RangeSliderLabel';\nimport { RepeatTiny } from '../Repeat';\nimport RangeSliderSimple from './RangeSliderSimple';\n\ninterface SliderWithLabelProps {\n label: string;\n values: number[];\n domain: number[];\n steps: number[];\n loading: boolean;\n unit: string;\n onChange: (values: readonly number[]) => void;\n}\n\nconst SliderWithLabel = ({\n label,\n values,\n domain,\n steps,\n loading,\n unit,\n onChange,\n}: SliderWithLabelProps) => {\n const [local, setLocal] = useState<number[] | undefined>(undefined);\n\n const onUpdate = useCallback((nextValues: readonly number[]) => {\n setLocal([...nextValues]);\n }, []);\n\n useEffect(() => {\n if (!loading) setLocal(undefined);\n }, [loading]);\n\n return (\n <>\n <RepeatTiny>\n <RangeSliderLabel\n label={label}\n value={`${numberSeparator(local?.[0] || values[0])}${unit ? ` ${unit}` : ''}`}\n />\n </RepeatTiny>\n <RepeatTiny>\n <RangeSliderSimple\n loading={loading}\n values={values}\n domain={domain}\n steps={steps}\n onChange={onChange}\n onUpdate={onUpdate}\n label={label}\n />\n </RepeatTiny>\n </>\n );\n};\n\nexport default SliderWithLabel;\n", "import React from 'react';\n\nimport { Label, Value, Wrapper } from './wrapper';\n\ninterface Props {\n label: string;\n value?: React.ReactNode;\n highlight?: boolean;\n}\n\nconst RangeSliderLabel = ({ label, value, highlight }: Props) => (\n <Wrapper>\n <Label>{label}</Label>\n {value && <Value isHighlighted={highlight}>{value}</Value>}\n </Wrapper>\n);\n\nexport default RangeSliderLabel;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: flex-end;\n`;\n\nexport const Label = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n flex: 1 1 auto;\n`;\n\ntype ValueProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n isHighlighted?: boolean;\n};\n\nexport const Value = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold wayke__color--primary-text',\n}))<ValueProps>`\n flex-shrink: 0;\n padding-left: ${size(2)};\n font-size: 1.125rem;\n\n ${({ isHighlighted }) =>\n isHighlighted &&\n css`\n font-size: 1.375rem;\n color: ${(props) => props.theme.color.textDark} !important;\n `}\n`;\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { Range, Root, Thumb, Track } from './wrapper';\n\ninterface RangeSliderProps {\n loading: boolean;\n domain: number[];\n values: number[];\n steps: number[];\n /** Read out with the handle. */\n label: string;\n onChange: (values: readonly number[]) => void;\n onUpdate?: (values: readonly number[]) => void;\n}\n\n/** One handle, for a single value such as the down payment. */\nconst RangeSliderSimple = ({\n loading,\n values,\n domain,\n steps,\n label,\n onChange,\n onUpdate,\n}: RangeSliderProps) => {\n const [current, setCurrent] = useState<number[]>(values);\n const latest = useRef(values);\n\n useEffect(() => {\n latest.current = values;\n setCurrent(values);\n }, [values[0]]);\n\n if (steps.length < 2) {\n return null;\n }\n\n return (\n <Root\n min={domain[0]}\n max={domain[1]}\n step={steps[1] - steps[0]}\n value={current}\n disabled={loading}\n onValueChange={(next) => {\n latest.current = next;\n setCurrent(next);\n onUpdate?.(next);\n }}\n onValueCommit={onChange}\n // A drag commits here, see RangeSlider's commitDrag.\n onPointerUp={() => {\n if (latest.current[0] !== values[0]) onChange(latest.current);\n }}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={label} />\n </Root>\n );\n};\n\nexport default RangeSliderSimple;\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { adEvent, GalleryMedia } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport { DEFAULT_PLACEHOLDER_IMAGE } from '../../utils/constants';\nimport { imageUrl } from '../../utils/image';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { IconChevronLeft, IconChevronRight } from '../Icon';\nimport Lightbox from '../Lightbox';\nimport { NavButton } from '../NavButton';\nimport ResponsiveImage from '../ResponsiveImage';\nimport Sphere from '../Sphere/Sphere';\nimport ThreeSixty from '../ThreeSixty/ThreeSixty';\nimport EmbededVideo from '../Video/EmbededVideo';\nimport QuickNavEmbeded from '../Video/QuickNavEmbeded';\nimport {\n Alt,\n ArrowLeft,\n ArrowRight,\n Image,\n Item,\n Main,\n QuickNav,\n QuickNavBtn,\n QuickNavImg,\n QuickNavItem,\n Track,\n Wrapper,\n} from './wrapper';\n\n// The gallery is at most about 800 px wide, the full width less the thumbnails\n// on tablets and 95% of the screen on phones; the browser picks by pixel density.\nconst GALLERY_WIDTHS = [375, 600, 750, 1000, 1200];\nconst GALLERY_SIZES = '(min-width: 1200px) 800px, (min-width: 768px) calc(100vw - 180px), 95vw';\nconst THUMBNAIL_WIDTHS = [96, 128, 225];\n\ninterface GalleryProps {\n media: GalleryMedia[];\n placeholderImage?: string;\n}\n\nconst scrollBehavior = (): ScrollBehavior =>\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\n\n/** Scrolls the thumbnail list, and only it, so that the item is visible. */\nconst revealInList = (list: HTMLElement, item: HTMLElement) => {\n if (item.offsetTop < list.scrollTop) {\n list.scrollTop = item.offsetTop;\n } else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n};\n\nconst Gallery = ({ media, placeholderImage }: GalleryProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const trackRef = useRef<HTMLUListElement>(null);\n const quickNavRef = useRef<HTMLUListElement>(null);\n const [index, setIndex] = useState(0);\n const [lightbox, setLightbox] = useState(false);\n\n const mediaLength = media?.length || 0;\n const placeholder = useMemo(\n () => placeholderImage || DEFAULT_PLACEHOLDER_IMAGE,\n [placeholderImage]\n );\n\n const goTo = useCallback(\n (target: number) => {\n const track = trackRef.current;\n if (!track || mediaLength === 0) return;\n // The arrows wrap around, from the last slide to the first and back.\n const next = (target + mediaLength) % mediaLength;\n const slide = track.children[next] as HTMLElement | undefined;\n if (slide) track.scrollTo({ left: slide.offsetLeft, behavior: scrollBehavior() });\n },\n [mediaLength]\n );\n\n // The slide in view decides the index, however the track was scrolled.\n const onScroll = useCallback(() => {\n const track = trackRef.current;\n const first = track?.children[0] as HTMLElement | undefined;\n if (!track || !first?.offsetWidth) return;\n setIndex(Math.min(mediaLength - 1, Math.round(track.scrollLeft / first.offsetWidth)));\n }, [mediaLength]);\n\n useEffect(() => {\n const list = quickNavRef.current;\n const item = list?.children[index] as HTMLElement | undefined;\n if (list && item) revealInList(list, item);\n }, [index]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n goTo(index + (e.key === 'ArrowLeft' ? -1 : 1));\n }\n },\n [goTo, index]\n );\n\n const onClick = useCallback(() => {\n PubSub.publish('ImagesClick', adEvent(ad));\n // 360 and sphere images are turned in the lightbox, already started, as on wayke.se.\n if (mediaLength) setLightbox(true);\n }, [ad, mediaLength]);\n\n const onToggleLightbox = useCallback(() => setLightbox(!lightbox), [lightbox]);\n\n return (\n <>\n <Wrapper>\n <Main>\n <Track\n ref={trackRef}\n onScroll={onScroll}\n onKeyDown={onKeyDown}\n onClick={onClick}\n tabIndex={0}\n aria-label={t('other.gallery')}\n >\n {mediaLength ? (\n media.map((m, i) => (\n <Item\n key={m.urls[0] || i}\n aria-label={t('common.imageIndex', { index: i + 1 })}\n aria-current={i === index || undefined}\n >\n {m.type === 'image' && (\n <ResponsiveImage\n img={Image}\n src={m.urls[0]}\n widths={GALLERY_WIDTHS}\n sizes={GALLERY_SIZES}\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n // The first image is in view at once; the rest load as they come near.\n loading={i === 0 ? 'eager' : 'lazy'}\n draggable={false}\n />\n )}\n {m.type === 'threesixty' && <ThreeSixty urls={m.urls} />}\n {m.type === 'embedded' && <EmbededVideo src={m.urls[0]} index={i} />}\n {m.type === 'sphere' && <Sphere url={m.urls[0]} />}\n </Item>\n ))\n ) : (\n <Item key={placeholder}>\n <Image src={placeholder} alt={t('common.imageIndex', { index: 1 }) || ''} />\n </Item>\n )}\n </Track>\n {mediaLength > 1 && (\n <>\n <ArrowLeft>\n <NavButton onClick={() => goTo(index - 1)} title={t('other.previousImage') || ''}>\n <IconChevronLeft block />\n </NavButton>\n </ArrowLeft>\n <ArrowRight>\n <NavButton onClick={() => goTo(index + 1)} title={t('other.nextImage') || ''}>\n <IconChevronRight block />\n </NavButton>\n </ArrowRight>\n </>\n )}\n </Main>\n <Alt>\n <QuickNav ref={quickNavRef}>\n {mediaLength ? (\n media.map((m, i) => {\n const src =\n m.type === 'embedded'\n ? m.urls[0]\n : imageUrl(m.urls[0], { width: 225, height: 150 });\n return (\n <QuickNavItem key={src || i} $active={index === i}>\n <QuickNavBtn\n onClick={() => goTo(i)}\n title={t('other.goToImageIndex', { index: i + 1 }) || ''}\n aria-current={index === i || undefined}\n >\n {m.type === 'embedded' ? (\n <QuickNavEmbeded src={src} index={i} />\n ) : (\n <ResponsiveImage\n img={QuickNavImg}\n src={m.urls[0]}\n widths={THUMBNAIL_WIDTHS}\n sizes=\"75px\"\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n loading=\"lazy\"\n />\n )}\n </QuickNavBtn>\n </QuickNavItem>\n );\n })\n ) : (\n <QuickNavItem key={placeholder} $active>\n <QuickNavBtn\n onClick={() => goTo(0)}\n title={t('other.goToImageIndex', { index: 1 }) || ''}\n >\n <QuickNavImg src={placeholder} alt={t('common.imageIndex', { index: 1 }) || ''} />\n </QuickNavBtn>\n </QuickNavItem>\n )}\n </QuickNav>\n </Alt>\n </Wrapper>\n {lightbox && !!mediaLength && (\n <Lightbox media={media} index={index} onClose={onToggleLightbox} />\n )}\n </>\n );\n};\n\nexport default Gallery;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { GalleryMedia } from '../../Gql/ad/view';\nimport { IconCancel } from '../Icon';\nimport ResponsiveImage from '../ResponsiveImage';\nimport SphereLightbox from '../Sphere/SphereLightbox';\nimport ThreeSixtyLightbox from '../ThreeSixty/ThreeSixtLightbox';\nimport EmbeddedVideoLightbox from '../Video/EmbeddedVideoLightbox';\nimport { CloseBtn, Img, Item, UiBlock, Wrapper } from './wrapper';\n\ninterface LightboxProps {\n index: number;\n media: GalleryMedia[];\n onClose: () => void;\n}\n\nconst Lightbox = ({ index, media, onClose }: LightboxProps) => {\n const { t } = useTranslation();\n const onRef = (ref: HTMLDivElement | null) => {\n if (ref) {\n setTimeout(() => {\n ref.scrollIntoView();\n }, 300);\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode === 27) {\n onClose();\n }\n };\n\n return (\n <Wrapper ref={(ref) => ref?.focus()} onKeyDown={onKeyDown} tabIndex={0}>\n <UiBlock onClick={onClose} aria-hidden />\n {media.map((m, i) => (\n <Item key={i} ref={index === i ? onRef : undefined}>\n {m.type === 'image' && (\n <ResponsiveImage\n img={Img}\n id={`lightbox-image-${i}`}\n src={m.urls[0]}\n widths={[750, 1080, 1200, 1920]}\n // As wide as the screen, or as the screen is high for a 3:2 image.\n sizes=\"(min-aspect-ratio: 3/2) 150vh, 100vw\"\n // Reserves the 3:2 box, so only the images near the one opened load.\n width={1200}\n height={800}\n loading=\"lazy\"\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n />\n )}\n {m.type === 'threesixty' && <ThreeSixtyLightbox urls={m.urls} />}\n {m.type === 'sphere' && <SphereLightbox url={m.urls[0]} />}\n {m.type === 'embedded' && <EmbeddedVideoLightbox url={m.urls[0]} />}\n </Item>\n ))}\n <CloseBtn onClick={onClose} title={t('common.close') || ''}>\n <IconCancel block />\n </CloseBtn>\n </Wrapper>\n );\n};\n\nexport default Lightbox;\n", "import React from 'react';\nimport SphereViewer from './SphereViewer';\n\ntype PropsType = {\n url: string;\n};\n\nconst SphereLightbox = ({ url }: PropsType) => <SphereViewer id={url} src={url} interactive />;\n\nexport default SphereLightbox;\n", "import { Viewer } from '@photo-sphere-viewer/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Loader from '../Loader';\nimport { Wrapper } from '../Sphere/wrapper';\nimport { Badge } from '../ThreeSixty/wrapper';\n\ntype PropsType = {\n id: string;\n src: string;\n interactive?: boolean;\n};\n\nconst isWebgl2Supported = (): boolean => {\n try {\n return !!document.createElement('canvas').getContext('webgl2');\n } catch {\n return false;\n }\n};\n\nconst SphereViewer = ({ id, src, interactive }: PropsType) => {\n const { t } = useTranslation();\n const container = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<Viewer | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n if (!container.current) return;\n if (!isWebgl2Supported()) return;\n\n let viewer: Viewer;\n try {\n viewer = new Viewer({\n container: container.current,\n panorama: src,\n navbar: ['zoom', 'fullscreen'],\n defaultYaw: 0,\n defaultPitch: 0,\n mousewheel: false,\n touchmoveTwoFingers: true,\n minFov: 30,\n maxFov: 90,\n });\n } catch {\n setLoading(false);\n return;\n }\n viewerRef.current = viewer;\n\n const handleReady = () => setLoading(false);\n viewer.addEventListener('ready', handleReady);\n\n return () => {\n viewer.removeEventListener('ready', handleReady);\n viewer.destroy();\n viewerRef.current = null;\n };\n }, [src]);\n\n const fillStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n };\n\n return (\n <Wrapper $started={!!interactive}>\n <div\n id={`a-${id}`}\n ref={container}\n style={{ ...fillStyle, pointerEvents: interactive ? 'auto' : 'none' }}\n />\n {loading && <Loader />}\n {/* In the gallery: marked as 360; a click opens it in the lightbox, ready to turn. */}\n {!loading && !interactive && <Badge>{t('item.threeSixty.sphereBadge')}</Badge>}\n </Wrapper>\n );\n};\n\nexport default SphereViewer;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst compassSize = size(4);\nconst controlBtnSize = size(4);\n\nexport const Wrapper = styled.div<{ $started?: boolean }>`\n position: relative;\n aspect-ratio: 3 / 2;\n ${(p) =>\n p.$started\n ? `\n // As large as the lightbox's images: the full width, or 3:2 of the screen's height.\n width: min(100%, calc((100vh - ${size(6)}) * 1.5));\n margin: 0 auto;\n `\n : `\n width: 100%;\n `}\n\n .psv-navbar {\n display: ${(p) => (p.$started ? 'flex' : 'none')};\n }\n\n .pnlm-container {\n background-image: none;\n background-color: ${(props) => props.theme.color.accentDark};\n }\n\n // Compass\n\n .pnlm-compass {\n width: ${compassSize};\n height: ${compassSize};\n border-radius: 50%;\n bottom: ${size(2)};\n left: ${size(2)};\n right: auto;\n margin-top: 0;\n border: 5px solid transparent;\n border-top-color: ${(props) => props.theme.color.textLight};\n background-color: rgba(255, 255, 255, 0.4);\n background-image: none;\n backdrop-filter: blur(5px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n box-sizing: border-box;\n\n &:hover {\n background-color: red;\n }\n }\n\n // Controls (zoom & fullscreen button)\n\n .pnlm-grab,\n .pnlm-grabbing {\n .pnlm-controls-container {\n display: block;\n }\n }\n\n .pnlm-controls-container {\n display: none;\n top: ${size(2)};\n left: ${size(2)};\n }\n\n .pnlm-controls {\n margin-top: 0;\n\n & + .pnlm-controls {\n margin-top: ${size(1)};\n }\n }\n\n // Fullscreen button\n\n .pnlm-fullscreen-toggle-button {\n display: none;\n position: relative;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-image: none;\n background-color: rgba(255, 255, 255, 0.4);\n backdrop-filter: blur(5px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n color: ${(props) => props.theme.color.textDark};\n border: 0;\n border-radius: 50%;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.6);\n }\n\n &:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.875rem;\n }\n }\n\n .pnlm-fullscreen-toggle-button-inactive {\n &:before {\n content: '\u2922';\n }\n\n &.pnlm-fullscreen-toggle-button-active {\n &:before {\n content: '\u2922';\n }\n }\n }\n\n // Gyroscope (Orientation)\n\n .pnlm-orientation-button {\n background-image: none;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n border: 0;\n border-radius: 999px;\n\n &:hover {\n background-color: red;\n }\n\n &:before {\n content: 'A';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.875rem;\n }\n\n &.pnlm-orientation-button-active {\n background-color: green;\n\n &:hover {\n background-color: pink;\n }\n }\n }\n\n // Zoom controls\n\n .pnlm-zoom-controls {\n display: none;\n height: auto;\n width: auto;\n background-color: transparent;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 0;\n border-radius: 999px;\n\n > * {\n &:first-child {\n border-top-left-radius: 999px;\n border-top-right-radius: 999px;\n }\n\n &:last-child {\n border-bottom-left-radius: 999px;\n border-bottom-right-radius: 999px;\n }\n }\n }\n\n .pnlm-zoom-in,\n .pnlm-zoom-out {\n position: relative;\n display: block;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-image: none;\n background-color: rgba(255, 255, 255, 0.4);\n backdrop-filter: blur(5px);\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n\n &:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.6);\n }\n }\n\n .pnlm-zoom-in {\n top: auto;\n\n &:before {\n content: '+';\n }\n }\n\n .pnlm-zoom-out {\n bottom: auto;\n border-top: 1px solid ${(props) => props.theme.color.textDark};\n\n &:before {\n content: '-';\n }\n }\n\n // Load Button\n\n .pnlm-load-button {\n top: auto;\n bottom: ${size(2)};\n transform: translateX(-50%);\n width: auto;\n height: auto;\n padding: ${size(1.75)} ${size(2)};\n border-radius: 3px;\n margin: 0;\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n line-height: 1.1;\n user-select: none;\n\n &:hover {\n background-color: ${(props) => props.theme.color.accentDark};\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n // Load box\n\n .pnlm-load-box {\n background-color: transparent;\n height: auto;\n margin: 0;\n width: 150px;\n transform: translate(-50%, -50%);\n\n > p {\n display: none;\n }\n }\n\n // Load bar\n\n .pnlm-lbar {\n width: 100%;\n background-color: rgba(255, 255, 255, 0.4);\n border: 0;\n }\n\n .pnlm-lbar-fill {\n background-color: ${(props) => props.theme.color.textLight};\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\n// As wide as the image, so the badge and the slider sit on it.\nexport const Figure = styled.figure`\n position: relative;\n width: fit-content;\n max-width: 100%;\n margin: 0 auto;\n cursor: grab;\n user-select: none;\n // Vertical scrolling stays with the page; horizontal moves rotate the car.\n touch-action: pan-y;\n\n &:active {\n cursor: grabbing;\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Badge = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg wayke__font--bold',\n}))`\n position: absolute;\n top: ${size(2)};\n left: ${size(2)};\n // Above the lightbox image, which has z-index 1.\n z-index: 2;\n padding: ${size(0.5)} ${size(1)};\n border-radius: 3px;\n font-size: 0.75rem;\n pointer-events: none;\n`;\n\nexport const SliderBar = styled.div`\n position: absolute;\n left: ${size(1)};\n right: ${size(1)};\n bottom: ${size(1)};\n // Above the lightbox image, which has z-index 1.\n z-index: 2;\n display: flex;\n align-items: center;\n gap: ${size(2)};\n padding: 0 ${size(2)};\n border-radius: 3px;\n background-color: rgba(255, 255, 255, 0.9);\n cursor: default;\n\n // The slider takes the room the value text leaves.\n > :first-child {\n flex: 1 1 auto;\n }\n`;\n\nexport const SliderValue = styled.span`\n flex-shrink: 0;\n font-size: 0.875rem;\n`;\n\nexport const VisuallyHidden = styled.span`\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n`;\n", "import React from 'react';\nimport { Img } from '../Lightbox/wrapper';\nimport Rotation from './Rotation';\n\n// As the lightbox's own images.\nconst WIDTHS = [750, 1080, 1200, 1920];\nconst SIZES = '(min-aspect-ratio: 3/2) 150vh, 100vw';\n\ntype PropsType = {\n urls: string[];\n};\n\n/** A 360 image in the lightbox, ready to turn. */\nconst ThreeSixtyLightbox = ({ urls }: PropsType) => (\n <Rotation urls={urls} img={Img} widths={WIDTHS} sizes={SIZES} />\n);\n\nexport default ThreeSixtyLightbox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n padding: ${size(3)};\n z-index: 90;\n overflow: auto;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: ${size(2)};\n }\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.3);\n z-index: -1;\n`;\n\nexport const Item = styled.div`\n position: relative;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Img = styled.img`\n position: relative;\n display: block;\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: calc(100vh - ${size(6)});\n object-fit: contain;\n margin: 0 auto;\n z-index: 1;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n max-height: calc(100vh - ${size(4)});\n }\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n top: ${size(2)};\n right: ${size(2)};\n width: ${size(5)};\n height: ${size(5)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.bg};\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transform-origin: 50% 50%;\n transition:\n 200ms ease,\n transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n z-index: 1;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.97);\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n top: ${size(1)};\n right: ${size(1)};\n }\n`;\n", "import React, { useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Range, Root, Thumb, Track } from '../RangeSlider/wrapper';\nimport ResponsiveImage from '../ResponsiveImage';\nimport { Badge, Figure, SliderBar, SliderValue, VisuallyHidden } from './wrapper';\n\ntype ImgProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\ninterface RotationProps {\n urls: string[];\n /** The styled <img> of the surrounding gallery or lightbox. */\n img: React.ElementType<ImgProps>;\n widths: number[];\n sizes: string;\n}\n\nconst wrap = (value: number, length: number) => ((value % length) + length) % length;\n\n/**\n * A 360 image: drag, the arrow keys or the slider turn the car, as web-ui-v2's\n * 360 viewer does. The slider spans two turns and starts in the middle, so it\n * can be pulled either way; a drag across the whole image is one turn. Every\n * frame loads at once, so turning never waits for an image.\n */\nconst Rotation = ({ urls, img, widths, sizes }: RotationProps) => {\n const { t } = useTranslation();\n const count = urls.length;\n const [position, setPosition] = useState(count);\n const frame = position % count;\n const drag = useRef<{ x: number; position: number; width: number } | undefined>(undefined);\n const label = (i: number) => t('item.threeSixty.frame', { frame: i + 1, total: count });\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if ((e.target as HTMLElement).closest('[data-rotate-slider]')) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n drag.current = { x: e.clientX, position, width: e.currentTarget.offsetWidth || 1 };\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>) => {\n const start = drag.current;\n if (!start) return;\n const delta = Math.round(((e.clientX - start.x) / start.width) * count);\n setPosition(wrap(start.position + delta, count * 2));\n };\n\n // The release can come at a new position without a move before it.\n const onPointerUp = (e: React.PointerEvent<HTMLElement>) => {\n onPointerMove(e);\n drag.current = undefined;\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n const next: Record<string, number> = {\n ArrowLeft: position - 1,\n ArrowRight: position + 1,\n Home: 0,\n End: count * 2 - 1,\n };\n if (e.key in next) {\n e.preventDefault();\n setPosition(wrap(next[e.key], count * 2));\n }\n };\n\n return (\n <Figure\n tabIndex={0}\n aria-label={t('item.threeSixty.viewer')}\n aria-roledescription=\"360\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={() => {\n drag.current = undefined;\n }}\n onKeyDown={onKeyDown}\n onClick={(e) => e.stopPropagation()}\n >\n <VisuallyHidden>{t('item.threeSixty.description')}</VisuallyHidden>\n <VisuallyHidden aria-live=\"polite\">{label(frame)}</VisuallyHidden>\n <Badge aria-hidden>{t('item.threeSixty.badge')}</Badge>\n {urls.map((url, i) => (\n <ResponsiveImage\n key={url}\n img={img}\n src={url}\n widths={widths}\n sizes={sizes}\n alt={label(i)}\n draggable={false}\n style={{ display: i === frame ? 'block' : 'none' }}\n />\n ))}\n <SliderBar data-rotate-slider>\n <Root\n min={0}\n max={count * 2 - 1}\n step={1}\n value={[position]}\n onValueChange={([next]) => setPosition(next)}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={t('item.threeSixty.rotate')} aria-valuetext={label(frame)} />\n </Root>\n <SliderValue aria-hidden>{label(frame)}</SliderValue>\n </SliderBar>\n </Figure>\n );\n};\n\nexport default Rotation;\n", "import React from 'react';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport VimeoPlayer from './VimeoPlayer';\nimport YouTubePlayer from './YoutubePlayer';\n\nconst ytNames = ['youtube.com', 'youtu.be'];\nconst isYouTubeVideo = (url: string): boolean =>\n ytNames.some((host: string): boolean => url.indexOf(host) >= 0);\n\nconst vNames = ['vimeo.com'];\nconst isVimeoVideo = (url: string): boolean =>\n vNames.some((host: string): boolean => url.indexOf(host) >= 0);\n\ntype PropsType = {\n url: string;\n autoplay?: boolean;\n controls?: boolean;\n};\n\nconst VideoPlayer = ({ url, autoplay = false, controls = true }: PropsType) => {\n if (!url) return null;\n\n if (isYouTubeVideo(url)) return <YouTubePlayer url={url} autoplay={autoplay} />;\n\n if (isVimeoVideo(url)) return <VimeoPlayer url={url} autoplay={autoplay} />;\n\n return <CustomPlayer ratio=\"56.25%\" controls={controls} url={url} />;\n};\n\nexport default VideoPlayer;\n", "import React from 'react';\nimport Video from './Video';\nimport { Wrapper } from './wrapper';\n\ntype PropsType = {\n url?: string;\n modal?: boolean;\n controls?: boolean;\n ratio?: string;\n isPreview?: boolean;\n};\n\nconst CustomPlayer = ({ url, controls, modal, ratio = '56.25%', isPreview }: PropsType) => {\n return (\n <Wrapper ratio={ratio} isPreview={isPreview}>\n <Video\n key={url}\n modal={modal}\n preload=\"metadata\"\n controls={controls}\n width=\"100%\"\n height=\"100%\"\n src={url}\n />\n </Wrapper>\n );\n};\nexport default CustomPlayer;\n", "import React from 'react';\nimport styled from 'styled-components';\n\ntype VideoProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLVideoElement>,\n HTMLVideoElement\n> & {\n modal?: boolean;\n};\n\nconst Video = styled.video<VideoProps>`\n position: absolute;\n top: 0;\n left: 0;\n object-fit: ${({ modal }) => (modal ? 'contain' : 'cover')};\n`;\n\nexport default Video;\n", "import styled from 'styled-components';\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n ratio?: string;\n isPreview?: boolean;\n};\n\nexport const Wrapper = styled.div<WrapperProps>`\n position: relative;\n width: 100%;\n height: ${(props) => (props.isPreview ? '100%' : 0)};\n padding-bottom: ${(props): string => (props.ratio ? props.ratio : '56.25%')};\n`;\n\nexport const Iframe = styled.iframe.attrs(() => ({\n width: '100%',\n height: '100%',\n allowFullScreen: true,\n frameBorder: '0',\n}))`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n`;\n", "import React from 'react';\nimport { getVimeoId } from './utils';\n\nimport { Iframe, Wrapper } from './wrapper';\n\ntype PropsType = {\n url: string;\n autoplay: boolean;\n};\n\nconst VimeoPlayer = ({ url, autoplay }: PropsType) => (\n <Wrapper>\n <Iframe\n src={`https://player.vimeo.com/video/${getVimeoId(url)}?${\n autoplay ? '&autoplay=1' : ''\n }&loop=0&autopause=0`}\n />\n </Wrapper>\n);\n\nexport default VimeoPlayer;\n", "export const getVimeoId = (url: string): string => {\n const regExp = /\\/(\\d+)/;\n const match = url.match(regExp);\n return match && match[1].length > 3 ? match[1] : '';\n};\n\nexport const getYouTubeId = (url: string): string => {\n const regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\n const match = url.match(regExp);\n return match && match[7].length === 11 ? match[7] : '';\n};\n\nconst youtubeBase = 'https://img.youtube.com/vi/';\nexport const getYoutubeThumbnail = (url: string) => {\n const id = getYouTubeId(url);\n if (!id) {\n return undefined;\n }\n return {\n maxresdefault: `${youtubeBase}${id}/maxresdefault.jpg`,\n hqdefault: `${youtubeBase}${id}/hqdefault.jpg`,\n mqdefault: `${youtubeBase}${id}/mqdefault.jpg`,\n };\n};\n\nexport const onImageLoad = (\n e: React.SyntheticEvent<HTMLImageElement, Event>,\n thumbnail?: string[]\n) => {\n if (\n thumbnail?.length === 2 &&\n e.currentTarget.src === thumbnail[0] &&\n e.currentTarget.naturalWidth === 120 &&\n e.currentTarget.naturalHeight === 90\n ) {\n e.currentTarget.src = thumbnail[1];\n }\n};\n\nexport const onImageError = (\n e: React.SyntheticEvent<HTMLImageElement, Event>,\n thumbnail?: string[]\n) => {\n if (thumbnail?.length === 2) {\n e.currentTarget.src = thumbnail[1];\n }\n};\n", "import React from 'react';\nimport { getYouTubeId } from './utils';\n\nimport { Iframe, Wrapper } from './wrapper';\n\ntype PropsType = {\n url: string;\n autoplay: boolean;\n};\n\nconst YouTubePlayer = ({ url, autoplay }: PropsType) => (\n <Wrapper>\n <Iframe\n src={`https://www.youtube.com/embed/${getYouTubeId(url)}?&enablejsapi=1&?rel=0${\n autoplay ? '&autoplay=1' : ''\n }`}\n />\n </Wrapper>\n);\n\nexport default YouTubePlayer;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const NavButton = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(4)};\n height: ${size(4)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.bg};\n color: ${(props) => props.theme.color.textDark};\n font-size: 0.75rem;\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);\n transition: transform 200ms ease;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n border-radius: 50%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n &:enabled {\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n", "import React from 'react';\nimport SphereViewer from './SphereViewer';\n\ntype PropsType = {\n url: string;\n};\n\nconst Sphere = ({ url }: PropsType) => <SphereViewer id={url} src={url} />;\n\nexport default Sphere;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Image } from '../Gallery/wrapper';\nimport ResponsiveImage from '../ResponsiveImage';\nimport { Badge } from './wrapper';\n\n// As the gallery's own images.\nconst WIDTHS = [375, 600, 750, 1000, 1200];\nconst SIZES = '(min-width: 1200px) 800px, (min-width: 768px) calc(100vw - 180px), 95vw';\n\ntype PropsType = {\n urls: string[];\n};\n\n/**\n * A 360 image in the gallery: its first frame, marked as 360. A click opens the\n * lightbox, where it turns at once, as on wayke.se; turning it here would take\n * the swipe away from the gallery.\n */\nconst ThreeSixty = ({ urls }: PropsType) => {\n const { t } = useTranslation();\n return (\n <>\n <Badge>{t('item.threeSixty.badge')}</Badge>\n <ResponsiveImage\n img={Image}\n src={urls[0]}\n widths={WIDTHS}\n sizes={SIZES}\n alt={t('item.threeSixty.badge')}\n loading=\"lazy\"\n draggable={false}\n />\n </>\n );\n};\n\nexport default ThreeSixty;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\nimport { Wrapper as Container } from '../Container/wrapper';\n\nconst quickNavWidth = 83; // 75px + 8px\n\nexport const Wrapper = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n ${Container} & {\n margin-left: ${size(-3)};\n margin-right: ${size(-3)};\n }\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n ${Container} & {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n position: relative;\n padding-right: ${quickNavWidth}px;\n }\n`;\n\nexport const Main = styled.div`\n position: relative;\n height: 0;\n padding-bottom: 66.66666667%;\n`;\n\nexport const Alt = styled.div`\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: ${quickNavWidth}px;\n padding-left: ${size(1)};\n\n ${(props) => props.theme.breakpoint.LtMd} {\n display: none;\n }\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: ${size(2.5)};\n background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n pointer-events: none;\n }\n`;\n\n/** The slides side by side; swiping and the arrows scroll it, each slide snaps in place. */\nexport const Track = styled.ul`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Item = styled.li`\n position: relative;\n flex: 0 0 100%;\n height: 100%;\n overflow: hidden;\n scroll-snap-align: start;\n scroll-snap-stop: always;\n\n // On small screens the next slide peeks in, as a hint that there are more.\n ${(props) => props.theme.breakpoint.LtMd} {\n flex-basis: 95%;\n border-right: ${size(1)} solid ${(props) => props.theme.color.bg};\n }\n`;\n\nexport const Image = styled.img`\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: cover;\n cursor: pointer;\n`;\n\nexport const ImageFull = styled.img`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\n// Arrow Nav\n\nconst Arrow = styled.div`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n ${(props) => props.theme.breakpoint.LtSm} {\n display: none;\n }\n`;\n\nexport const ArrowLeft = styled(Arrow)`\n left: ${size(2)};\n`;\n\nexport const ArrowRight = styled(Arrow)`\n right: ${size(2)};\n`;\n\n// Quick Nav\n\nexport const QuickNav = styled.ul`\n position: relative;\n max-height: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n\ntype QuickNavItemProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLLIElement>,\n HTMLLIElement\n> & {\n $active?: boolean;\n};\n\nexport const QuickNavItem = styled.li.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))<QuickNavItemProps>`\n position: relative;\n\n & + & {\n margin-top: ${size(1)};\n }\n\n ${({ $active }) =>\n $active &&\n css`\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 3px solid currentColor;\n z-index: 2;\n }\n `}\n`;\n\nexport const QuickNavBtn = styled(ButtonReset)`\n position: relative;\n display: block;\n width: 100%;\n height: 0;\n padding-bottom: 66.66666667%; // 3:2\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.15);\n opacity: 0;\n z-index: 1;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const QuickNavImg = styled.img`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\n// Media Button\n\nexport const MediaButtonWrapper = styled.div`\n position: absolute;\n bottom: ${size(2)};\n left: 50%;\n transform: translateX(-50%);\n z-index: 1;\n cursor: pointer;\n`;\n\n// Sphere Close Button\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MediaButton from '../Gallery/MediaButton';\nimport { ImageFull } from '../Gallery/wrapper';\nimport Modal from '../Modal';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport VideoPlayer from './EmbeddedVideoLightbox';\nimport useThumbnail from './useThumbnail';\nimport { onImageError, onImageLoad } from './utils';\n\ninterface GalleryEmbed {\n src: string;\n index: number;\n controls?: boolean;\n}\n\nconst GalleryEmbed = ({ src, index }: GalleryEmbed) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState<string>();\n const thumbnail = useThumbnail(src);\n\n const onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.stopPropagation();\n setModal(src);\n };\n\n const onCloseModal = (e: React.MouseEvent<HTMLButtonElement | HTMLDivElement, MouseEvent>) => {\n e.stopPropagation();\n setModal(undefined);\n };\n\n const onError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),\n [thumbnail]\n );\n\n const onLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),\n [thumbnail]\n );\n\n const customVideo = src.toLowerCase().endsWith('.mp4');\n\n if (thumbnail?.length && !customVideo) {\n return (\n <>\n <ImageFull\n onLoad={onLoad}\n src={thumbnail[0]}\n onError={onError}\n alt={t('common.imageIndex', { index: index + 1 }) || ''}\n />\n <MediaButton text={t('other.playVideo')} onClick={onClick} />\n {modal && (\n <Modal title={t('other.video')} onClose={onCloseModal}>\n <VideoPlayer url={modal} />\n </Modal>\n )}\n </>\n );\n }\n\n if (customVideo)\n return (\n <>\n <CustomPlayer ratio=\"66.66%\" isPreview controls={false} url={src} />\n <MediaButton text={t('other.playVideo')} onClick={onClick} />\n {modal && (\n <Modal title={t('other.video')} onClose={onCloseModal}>\n <VideoPlayer url={modal} />\n </Modal>\n )}\n </>\n );\n return null;\n};\n\nexport default GalleryEmbed;\n", "import React from 'react';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport { MediaButtonWrapper } from './wrapper';\n\ninterface MediaButtonProps {\n text: string;\n onClick: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n}\n\nconst MediaButton = ({ text, onClick }: MediaButtonProps) => (\n <MediaButtonWrapper>\n <ButtonSecondary onClick={onClick} title={text}>\n <ButtonContent>{text}</ButtonContent>\n </ButtonSecondary>\n </MediaButtonWrapper>\n);\n\nexport default MediaButton;\n", "import { useEffect, useState } from 'react';\nimport useVimeoThumbnail from '../../hooks/useVimeoThumbnail';\nimport { getVimeoId, getYoutubeThumbnail } from './utils';\n\nconst useThumbnail = (url?: string | null, small?: boolean) => {\n if (url?.toLowerCase().endsWith('.mp4')) return;\n\n const [thumbnail, setThumbnail] = useState<string[]>();\n const vimeoId = url ? getVimeoId(url) : undefined;\n const vimeoThumbnail = useVimeoThumbnail(vimeoId, small);\n\n useEffect(() => {\n if (url) {\n const youtubeThumbnail = getYoutubeThumbnail(url);\n if (youtubeThumbnail) {\n if (small) {\n setThumbnail([youtubeThumbnail.mqdefault]);\n } else {\n setThumbnail([youtubeThumbnail.maxresdefault, youtubeThumbnail.hqdefault]);\n }\n }\n }\n }, [url]);\n\n return vimeoThumbnail ? [vimeoThumbnail] : thumbnail;\n};\n\nexport default useThumbnail;\n", "import { useEffect, useState } from 'react';\nimport useFetch from './useFetch';\n\ninterface VimeoItem {\n thumbnail_large: string;\n thumbnail_small: string;\n}\n\nconst useVimeoThumbnail = (id?: string, small?: boolean) => {\n const [thumbnail, setThumbnail] = useState<string>();\n const { data } = useFetch<VimeoItem[]>(\n `http://vimeo.com/api/v2/video/${id}.json`,\n {},\n !id || !!thumbnail,\n true\n );\n\n useEffect(() => {\n if (data?.[0]) {\n if (small && data[0].thumbnail_small) {\n setThumbnail(data[0].thumbnail_small);\n } else if (data[0].thumbnail_large) {\n setThumbnail(data[0].thumbnail_large);\n }\n }\n }, [data]);\n\n return thumbnail;\n};\n\nexport default useVimeoThumbnail;\n", "import { useCallback, useEffect, useState } from 'react';\n\nconst cache: { [key: string]: unknown | undefined } = {};\n\nconst getCachedResult = <T>(key: string) => (cache?.[key] as T) || undefined;\nconst setCachedResult = <T>(key: string, value: T) => {\n cache[key] = value;\n};\n\n/**\n * Reusing already fired request by attaching to same promise.\n * Usefull if multiple request is fetching from same endpoint, while\n * the first request has not been finished (so no cache exist yet).\n */\n\nlet pendingPromise: { [key: string]: Promise<globalThis.Response> } = {};\nconst isPendingPromise = (url: string) => !!pendingPromise[url];\nconst setPendingPromise = (url: string, promise: Promise<globalThis.Response>) => {\n pendingPromise = {\n ...pendingPromise,\n [url]: promise,\n };\n};\nconst clearPendingPromise = (url: string) => {\n delete pendingPromise[url];\n};\n\ninterface Response<T> {\n loading: boolean;\n data?: T;\n error: boolean;\n}\n\nconst useFetch = <T>(\n path: RequestInfo,\n options?: RequestInit,\n skip?: boolean,\n promiseCache?: boolean\n): Response<T> => {\n const [data, setData] = useState<T | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n const doFetch = useCallback(async () => {\n const key = path.toString();\n const cached = getCachedResult<T>(key);\n setError(false);\n if (cached) {\n setData(cached);\n return;\n }\n setLoading(true);\n try {\n const reusePromise = promiseCache && isPendingPromise(key);\n const request = reusePromise ? pendingPromise[key] : fetch(path, options);\n if (promiseCache) {\n setPendingPromise(key, request);\n }\n\n const result = await request;\n if (result.ok) {\n const json = await result.clone().json();\n setCachedResult(key, json);\n setData(json);\n }\n } catch {\n setError(true);\n } finally {\n setLoading(false);\n clearPendingPromise(key);\n }\n return;\n }, [path, options]);\n\n useEffect(() => {\n if (!skip) {\n doFetch();\n }\n }, [path, skip]);\n\n return {\n loading,\n data,\n error,\n };\n};\n\nexport default useFetch;\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { QuickNavImg } from '../Gallery/wrapper';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport useThumbnail from './useThumbnail';\nimport { onImageError, onImageLoad } from './utils';\n\ninterface QuickNavEmbededProps {\n src?: string;\n index: number;\n}\n\nconst QuickNavEmbeded = ({ src, index }: QuickNavEmbededProps) => {\n const { t } = useTranslation();\n const thumbnail = useThumbnail(src);\n const onError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),\n [thumbnail]\n );\n\n const onLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),\n [thumbnail]\n );\n\n const customVideo = src?.toLowerCase().endsWith('.mp4');\n\n if (thumbnail?.length && !customVideo)\n return (\n <QuickNavImg\n onLoad={onLoad}\n src={thumbnail[0]}\n onError={onError}\n alt={t('common.imageIndex', { index: index + 1 }) || ''}\n />\n );\n if (customVideo) return <CustomPlayer key={index} url={src} ratio=\"66.66%\" />;\n return null;\n};\n\nexport default QuickNavEmbeded;\n", "import React from 'react';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport Insurance from './Insurance';\nimport InsuranceFree from './InsuranceFree';\n\ninterface InsuranceOptionsProps {\n provider: InsuranceProvider;\n}\n\n/** A quote needs a personal number and a distance; without them the offer is just described. */\nconst InsuranceOptions = ({ provider }: InsuranceOptionsProps) =>\n provider.requiresDistance && provider.requiresPersonalNumber ? (\n <Insurance provider={provider} />\n ) : (\n <InsuranceFree provider={provider} />\n );\n\nexport default InsuranceOptions;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { adEvent } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport { VisualHeading } from '../Heading';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport InsuranceModal from './InsuranceModal';\n\ninterface InsuranceProps {\n provider: InsuranceProvider;\n}\n\nconst Insurance = ({ provider }: InsuranceProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'InsuranceClose' : 'InsuranceOpen', adEvent(ad));\n }, [modal, ad]);\n\n return (\n <>\n {modal && <InsuranceModal onClose={toggleModal} provider={provider} />}\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{t('item.addInsurance')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n <OptionBox\n logo={provider.logo || undefined}\n logoAlt={provider.title || t('common.logotype')}\n >\n <OptionBoxHeading>{t('item.getInsuranceQuote')}</OptionBoxHeading>\n <OptionBoxContent>\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.moreInformation')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </OptionBox>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default Insurance;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport useInsuranceInquiry, { DrivingDistance } from '../../Gql/ad/useInsuranceInquiry';\nimport { adEvent, str } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ssnIsValid } from '../../utils/ssn';\nimport { ButtonContent, ButtonInline, ButtonPrimary } from '../Button';\nimport { ColumnRow, ColumnRowItem } from '../ColumnRow';\nimport Content from '../Content';\nimport { ContentLogo, ContentLogoMedia, ContentLogoText } from '../ContentLogo';\nimport DetailBox from '../DetailBox';\nimport ExtendInfo from '../ExtendInfo';\nimport { H4 } from '../Heading';\nimport { InputGroup, InputGroupColumn } from '../InputGroup';\nimport InputLabel from '../InputLabel';\nimport InputSelect, { OptionProps } from '../InputSelect';\nimport InputText from '../InputText';\nimport Loader from '../Loader';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\nimport Snackbar from '../Snackbar';\nimport { UtilityTextBold } from '../Utility';\n\ninterface FormData {\n ssn: string;\n drivingDistance: DrivingDistance;\n}\n\ninterface InsuranceModalProps {\n onClose: () => void;\n provider: InsuranceProvider;\n}\n\nconst InsuranceModal = ({ onClose, provider }: InsuranceModalProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi } = useSettings();\n const [form, setForm] = useState<FormData>({\n ssn: '',\n drivingDistance: 'BETWEEN_0_AND_1000',\n });\n const [payload, setPayload] = useState<FormData>();\n const { loading, insurances, error } = useInsuranceInquiry(\n publicApi,\n ad.id,\n ssnIsValid(payload?.ssn) ? payload?.ssn : undefined,\n payload?.drivingDistance\n );\n\n const onChangeSsn = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => setForm({ ...form, ssn: e.currentTarget.value }),\n [form]\n );\n\n const onChangeDrivingDistance = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) =>\n setForm({ ...form, drivingDistance: e.currentTarget.value as DrivingDistance }),\n [form]\n );\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n\n const onShowInsurances = useCallback(() => {\n PubSub.publish('InsuranceInterest', trackPayload);\n setPayload(form);\n }, [form, trackPayload]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode === 13 && ssnIsValid(form.ssn) && !loading) {\n onShowInsurances();\n }\n },\n [form]\n );\n\n const options: OptionProps[] = [\n { value: 'BETWEEN_0_AND_1000', displayName: '0 - 1000' },\n { value: 'BETWEEN_1000_AND_1500', displayName: '1000 - 1500' },\n { value: 'BETWEEN_1500_AND_2000', displayName: '1500 - 2000' },\n { value: 'BETWEEN_2000_AND_2500', displayName: '2000 - 2500' },\n { value: 'OVER_2500', displayName: '2500+' },\n ];\n\n return (\n <Modal title={t('item.insurance')} onClose={onClose}>\n {(provider.description || provider.logo) && (\n <Repeat>\n {provider.description ? (\n <ContentLogo>\n <ContentLogoText>\n <Content>\n <p>{provider.description}</p>\n </Content>\n </ContentLogoText>\n {provider.logo && (\n <ContentLogoMedia>\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n </ContentLogoMedia>\n )}\n </ContentLogo>\n ) : (\n <>\n {provider.logo && (\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n )}\n </>\n )}\n </Repeat>\n )}\n\n <Repeat>\n <RepeatSmall>\n <RepeatTiny>\n <InputGroup>\n <InputGroupColumn>\n <InputLabel htmlFor=\"input-insurance-personalnumber\">\n {t('item.personalNumber')}\n </InputLabel>\n <InputText\n placeholder=\"\u00C5\u00C5\u00C5\u00C5MMDD-XXXX\"\n label={t('item.personalNumber')}\n value={form.ssn}\n onChange={onChangeSsn}\n onKeyDown={onKeyDown}\n id=\"input-insurance-personalnumber\"\n />\n </InputGroupColumn>\n <InputGroupColumn>\n <InputLabel htmlFor=\"input-insurance-mileage\">\n {t('item.estimatedAnualMileage')}\n </InputLabel>\n <InputSelect\n value={form.drivingDistance}\n onChange={onChangeDrivingDistance}\n options={options}\n unit=\"mil\"\n title={t('item.estimatedAnualMileage')}\n />\n </InputGroupColumn>\n </InputGroup>\n </RepeatTiny>\n <RepeatTiny>\n <ButtonPrimary\n fullWidth\n disabled={!ssnIsValid(form.ssn) || loading}\n onClick={onShowInsurances}\n >\n <ButtonContent>{t('item.showInsurances')}</ButtonContent>\n </ButtonPrimary>\n </RepeatTiny>\n </RepeatSmall>\n <RepeatSmall>\n <Content small>\n <p>{t('item.savePersonalNumberOnThisDeviceHelp')}</p>\n </Content>\n </RepeatSmall>\n </Repeat>\n\n {loading && (\n <Repeat>\n <Loader />\n </Repeat>\n )}\n\n {error && (\n <Repeat>\n <Snackbar severity=\"error\" icon heading={t('common.anErrorHasOccured') || undefined}>\n {t('item.couldNotfetchInsurances')}\n </Snackbar>\n </Repeat>\n )}\n\n <>\n {insurances && (\n <Repeat>\n {insurances.map((insurance) => (\n <Repeat key={insurance.name}>\n <DetailBox\n heading={`${numberSeparator(insurance.price)} ${insurance.unit}`}\n description={insurance.name}\n >\n <Repeat>\n <>\n {insurance.description && (\n <RepeatTiny>\n <Content>\n <p>{insurance.description}</p>\n </Content>\n </RepeatTiny>\n )}\n </>\n <>\n {str(insurance.details?.terms) && (\n <RepeatTiny>\n <ButtonInline\n as=\"a\"\n href={insurance.details.terms || ''}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n title={t('item.openPrePurchaseInformationInNewTab') || ''}\n >\n {t('item.openPrePurchaseInformationInNewTab')}\n </ButtonInline>\n </RepeatTiny>\n )}\n </>\n </Repeat>\n {insurance.insuranceItems.length > 0 && (\n <Repeat>\n <H4>{t('item.insuranceIncludes')}</H4>\n {insurance.insuranceItems.map((item) => (\n <RepeatSmall key={item.name || ''}>\n <ExtendInfo title={item.name || ''}>{item.description}</ExtendInfo>\n </RepeatSmall>\n ))}\n </Repeat>\n )}\n {insurance.addons && insurance.addons.length > 0 && (\n <Repeat>\n <H4>{t('item.addInsuranceHeading')}</H4>\n {insurance.addons.map((addon) => (\n <RepeatSmall key={addon.title || ''}>\n <ColumnRow>\n <ColumnRowItem>\n <ExtendInfo title={addon.title || ''}>{addon.description}</ExtendInfo>\n </ColumnRowItem>\n <ColumnRowItem>\n <UtilityTextBold>\n +{addon.price} {insurance.unit}\n </UtilityTextBold>\n </ColumnRowItem>\n </ColumnRow>\n </RepeatSmall>\n ))}\n </Repeat>\n )}\n </DetailBox>\n </Repeat>\n ))}\n </Repeat>\n )}\n </>\n </Modal>\n );\n};\n\nexport default InsuranceModal;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { INSURANCE_INQUIRY_QUERY } from './queries';\nimport { InsuranceInquiryData, InsuranceInquiryInsurance } from './types';\n\n/** Yearly driving distance in Swedish mil, as the public API's DrivingDistance enum. */\nexport type DrivingDistance =\n | 'BETWEEN_0_AND_1000'\n | 'BETWEEN_1000_AND_1500'\n | 'BETWEEN_1500_AND_2000'\n | 'BETWEEN_2000_AND_2500'\n | 'OVER_2500';\n\n/** Insurance quotes through iteration.commerce.insuranceInquiry. */\nconst useInsuranceInquiry = (\n settings: PublicApiSettings,\n adId: string,\n personalNumber?: string,\n drivingDistance?: DrivingDistance\n) => {\n const [insurances, setInsurances] = useState<InsuranceInquiryInsurance[]>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const skip = !personalNumber || !drivingDistance;\n\n useEffect(() => {\n if (skip) return;\n let active = true;\n setLoading(true);\n setError(false);\n gqlQuery<InsuranceInquiryData>(settings.api, INSURANCE_INQUIRY_QUERY, {\n id: adId,\n socialId: personalNumber,\n drivingDistance,\n })\n .then((data) => {\n const list = data.ads?.byAdId?.iteration?.commerce.insuranceInquiry?.insurances || [];\n if (active) setInsurances(list.filter((i): i is InsuranceInquiryInsurance => !!i));\n })\n .catch(() => active && setError(true))\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [skip, adId, personalNumber, drivingDistance]);\n\n return { loading, error, insurances };\n};\n\nexport default useInsuranceInquiry;\n", "export const ssnIsValid = (s?: string) => (s ? /^\\d{2,4}\\d{2}\\d{2}-?\\d{4}$/.test(s) : false);\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const ColumnRow = styled.div`\n display: flex;\n align-items: flex-start;\n`;\n\nexport const ColumnRowItem = styled.div`\n flex: 1 1 auto;\n\n &:last-child:not(:only-child) {\n flex: 0 0 auto;\n }\n\n & + & {\n padding-left: ${size(2)};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Description, Foldout, Footer, Heading, Main, Wrapper } from './wrapper';\n\ninterface Props {\n heading: string;\n description?: string;\n children: React.ReactNode;\n}\n\nconst DetailBox = ({ heading, description, children }: Props) => {\n const { t } = useTranslation();\n const [extend, setExtend] = React.useState(false);\n const onToggleExtend = React.useCallback(() => setExtend(!extend), [extend]);\n\n const extendBtnText = extend ? t('common.lessInformation') : t('common.moreInformation');\n\n return (\n <Wrapper>\n <Main>\n <Heading>{heading}</Heading>\n {description && <Description>{description}</Description>}\n <Footer>\n <ButtonClear onClick={onToggleExtend}>\n <ButtonContent>{extendBtnText}</ButtonContent>\n </ButtonClear>\n </Footer>\n </Main>\n {extend && <Foldout>{children}</Foldout>}\n </Wrapper>\n );\n};\n\nexport default DetailBox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { H2 } from '../Heading';\n\nexport const Wrapper = styled.article`\n box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n overflow: hidden;\n`;\n\nexport const Main = styled.div`\n padding: ${size(2.5)};\n`;\n\nexport const Heading = styled(H2).attrs(() => ({\n as: 'h1',\n}))`\n margin-bottom: 0;\n`;\n\nexport const Description = styled.div`\n margin-top: ${size(1)};\n`;\n\nexport const Footer = styled.div`\n margin-top: ${size(1)};\n color: red;\n`;\n\nexport const Foldout = styled.div`\n background-color: ${(props) => props.theme.color.accent};\n padding: ${size(2.5)};\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconInfo } from '../Icon';\nimport { Extend, Header, Info, InfoBtn, Title, Wrapper } from './wrapper';\n\ninterface Props {\n title: string;\n children?: React.ReactNode;\n}\n\nconst ExtendInfo = ({ title, children }: Props) => {\n const { t } = useTranslation();\n const [extend, setExtend] = useState(false);\n const onToggleExtend = useCallback(() => setExtend(!extend), [extend]);\n\n return (\n <Wrapper>\n <Header>\n <Title>{title}</Title>\n {children && (\n <Info>\n <InfoBtn onClick={onToggleExtend} title={t('common.moreInformation') || ''}>\n <IconInfo block />\n </InfoBtn>\n </Info>\n )}\n </Header>\n {extend && <Extend>{children}</Extend>}\n </Wrapper>\n );\n};\n\nexport default ExtendInfo;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div``;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Title = styled.div``;\n\nexport const Info = styled.div`\n margin-left: ${size(1)};\n`;\n\nexport const InfoBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n font: inherit;\n font-size: 1em;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Extend = styled.div`\n padding-top: ${size(1)};\n margin-top: ${size(1)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n font-size: 0.875em;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const InputGroup = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n display: flex;\n align-items: flex-start;\n margin: ${size(-0.5)};\n }\n`;\n\nexport const InputGroupColumn = styled.div`\n ${(props) => props.theme.breakpoint.LtSm} {\n & + & {\n margin-top: ${size(1)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n flex: 1 1 50%;\n padding: ${size(0.5)};\n }\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n children: string;\n htmlFor?: string;\n}\n\nconst InputLabel = ({ children, htmlFor }: Props) => (\n <Wrapper htmlFor={htmlFor}>{children}</Wrapper>\n);\n\nexport default InputLabel;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.label.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n margin-bottom: ${size(0.5)};\n font-size: 0.875rem;\n`;\n", "import React from 'react';\nimport { IconChevronDown } from '../Icon';\nimport { Icon, Option, Select, Wrapper } from './wrapper';\n\nexport interface OptionProps {\n value: number | string;\n displayName?: number | string | null;\n}\n\ninterface Props {\n value?: string | number;\n options?: OptionProps[];\n unit?: string;\n title: string;\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n}\n\nconst InputSelect = ({ value, options, onChange, unit, title }: Props) => (\n <Wrapper>\n <Select value={value} onChange={onChange} title={title} aria-label={title}>\n {options?.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.displayName || option.value}\n {unit ? ` ${unit}` : ''}\n </Option>\n ))}\n </Select>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Wrapper>\n);\n\nexport default InputSelect;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst iconSize = '0.875rem';\nconst selectPadding = size(2);\n\nexport const Wrapper = styled.div`\n position: relative;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Select = styled.select.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: relative;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n text-indent: 0.01px;\n border: 0;\n padding: 0 ${selectPadding};\n padding-right: calc(${iconSize} + ${selectPadding});\n background-color: transparent;\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n font-size: 16px;\n cursor: pointer;\n z-index: 1;\n\n &:focus {\n outline: none;\n }\n\n ::-ms-expand {\n display: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\nexport const Option = styled.option`\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const Icon = styled.div`\n position: absolute;\n top: 50%;\n right: ${selectPadding};\n transform: translateY(-50%);\n font-size: ${iconSize};\n`;\n", "import React from 'react';\n\nimport { Input, Wrapper } from './wrapper';\n\ntype Props = React.InputHTMLAttributes<HTMLInputElement> & {\n value: string;\n label: string;\n};\n\nconst InputText = ({ label, ...props }: Props) => (\n <Wrapper>\n <Input aria-label={label} {...props} />\n </Wrapper>\n);\n\nexport default InputText;\n", "import type React from 'react';\nimport styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Input = styled.input.attrs<React.InputHTMLAttributes<HTMLInputElement>>((props) => ({\n type: props.type || 'text',\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n padding: 0 ${size(2)};\n background-color: transparent;\n font-size: 16px;\n border: none;\n border-radius: 0;\n box-shadow: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::-webkit-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &::-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-ms-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { adEvent } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport { VisualHeading } from '../Heading';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent } from '../OptionBox/wrapper';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport InsuranceFreeModal from './InsuranceFreeModal';\n\ninterface InsuranceFreeProps {\n provider: InsuranceProvider;\n}\n\nconst InsuranceFree = ({ provider }: InsuranceFreeProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'InsuranceClose' : 'InsuranceOpen', adEvent(ad));\n }, [modal, ad]);\n\n return (\n <>\n {modal && <InsuranceFreeModal onClose={toggleModal} provider={provider} />}\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{provider.insuranceHeader ?? t('item.insurance')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n <OptionBox\n logo={provider.logo || undefined}\n logoAlt={provider.title || t('common.logotype')}\n >\n {provider.description && <Content markdown={provider.description} />}\n <OptionBoxContent>\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.moreInformation')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </OptionBox>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default InsuranceFree;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { Repeat } from '../Repeat';\n\ninterface InsuranceFreeModalProps {\n onClose: () => void;\n provider: InsuranceProvider;\n}\n\nconst InsuranceFreeModal = ({ onClose, provider }: InsuranceFreeModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={provider.insuranceHeader ?? t('item.insurance')} onClose={onClose}>\n {provider.longDescription && (\n <Repeat>\n <Content markdown={provider.longDescription} />\n </Repeat>\n )}\n {provider.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={provider.url}\n title={t('item.readMoreAboutInsuranceInNewTab') || ''}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t('item.readMoreAboutInsuranceInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {provider.logo && (\n <Repeat>\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default InsuranceFreeModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { numberSeparator } from '../../utils/formats';\nimport { VisualHeading } from '../Heading';\nimport { OldPrice, Price } from '../Price';\nimport { Item, Label, List, Value } from './wrapper';\n\ninterface PriceTableProps {\n price: number;\n discount?: number;\n}\n\nconst PriceTable = ({ price, discount }: PriceTableProps) => {\n const { t } = useTranslation();\n return (\n <List>\n <Item>\n <Label>\n <VisualHeading>{t('other.price')}</VisualHeading>\n </Label>\n <Value>\n <Price>\n {numberSeparator(price)} {t('currency.default')}\n </Price>\n </Value>\n </Item>\n {discount !== undefined && (\n <Item>\n <Label />\n <Value>\n <OldPrice>\n {numberSeparator(price + discount)} {t('currency.default')}\n </OldPrice>\n </Value>\n </Item>\n )}\n </List>\n );\n};\n\nexport default PriceTable;\n", "import styled from 'styled-components';\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n font-size: 1.375rem;\n`;\n\nexport const OldPrice = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n text-decoration: line-through;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n display: flex;\n align-items: flex-end;\n line-height: 1;\n\n & + & {\n margin-top: ${size(0.5)};\n }\n`;\n\nexport const Label = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Value = styled.div`\n flex-shrink: 0;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { Wrapper as Container } from '../Container/wrapper';\n\nexport const ProductPage = styled.div`\n display: flex;\n flex-direction: column;\n\n ${(props) => props.theme.breakpoint.Md} {\n flex-direction: row;\n }\n`;\n\nexport const ProductPageAside = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: contents;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n flex-shrink: 0;\n width: calc(375px + ${size(2)});\n padding-right: ${size(2)};\n }\n`;\n\nexport const ProductPageMain = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: contents;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n flex: 1 1 100%;\n min-width: 0;\n padding-left: ${size(2)};\n }\n`;\n\ntype ProductPageAsideSectionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n mobileOrder?: number;\n};\n\nexport const ProductPageAsideSection = styled.div<ProductPageAsideSectionProps>`\n ${(props) => props.theme.breakpoint.LtMd} {\n order: ${(props) => props.mobileOrder};\n\n & + & {\n margin-top: ${size(2)};\n }\n\n &:last-child {\n margin-bottom: ${size(4)};\n }\n\n ${ProductPageMain} & {\n margin-top: ${size(2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n & + & {\n margin-top: ${size(4)};\n }\n\n ${ProductPageMain} & {\n margin-bottom: ${size(8)};\n }\n }\n`;\n\nexport const ProductPageMainSection = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n order: 99;\n padding: ${size(4)} 0;\n border-top: ${size(1)} solid ${(props) => props.theme.color.accent};\n\n ${Container} & {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n padding-left: ${size(2)};\n padding-right: ${size(2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n & + & {\n margin-top: ${size(8)};\n padding-top: ${size(8)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n }\n`;\n\nexport const ProductPageContentLimit = styled.div`\n max-width: 420px;\n`;\n", "// The ad page's data from the public API. Older links carry a legacy id that\n// differs from ad.id: when byAdId finds nothing the id is resolved through\n// byIterationId and the address bar is rewritten to ad.id, as web-ui-v2 does.\n\nimport { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { AD_ID_BY_LEGACY_ID_QUERY, AD_QUERY } from './queries';\nimport { Ad, AdData, AdIdByLegacyIdData } from './types';\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst fetchAd = async (settings: PublicApiSettings, id: string): Promise<Ad | null> => {\n const data = await gqlQuery<AdData>(settings.api, AD_QUERY, { id });\n return data.ads?.byAdId || null;\n};\n\nconst resolveLegacyId = async (settings: PublicApiSettings, id: string) => {\n if (!UUID.test(id)) return null;\n try {\n const data = await gqlQuery<AdIdByLegacyIdData>(settings.api, AD_ID_BY_LEGACY_ID_QUERY, {\n id,\n });\n return data.ads?.byIterationId?.ads?.[0]?.id || null;\n } catch (_e) {\n return null;\n }\n};\n\nconst replaceIdInUrl = (from: string, to: string) => {\n const { pathname, search, hash } = window.location;\n if (pathname.includes(from) || hash.includes(from)) {\n history.replaceState(\n history.state,\n '',\n `${pathname.replace(from, to)}${search}${hash.replace(from, to)}`\n );\n }\n};\n\nconst useAd = (id: string, settings: PublicApiSettings) => {\n const [ad, setAd] = useState<Ad>();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n let active = true;\n setLoading(true);\n setError(false);\n (async () => {\n let next = await fetchAd(settings, id);\n if (!next) {\n const adId = await resolveLegacyId(settings, id);\n if (adId && adId !== id) {\n next = await fetchAd(settings, adId);\n if (next) replaceIdInUrl(id, adId);\n }\n }\n if (active) setAd(next || undefined);\n })()\n .catch(() => active && setError(true))\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [id, settings.api.url, settings.api.apiKey]);\n\n return { loading, error, ad };\n};\n\nexport default useAd;\n", "import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport AccessoryCard from '../../../components/AccessoryCard';\nimport Content from '../../../components/Content';\nimport { H2 } from '../../../components/Heading';\nimport OverflowGrid from '../../../components/OverflowGrid';\nimport { ProductPageMainSection } from '../../../components/ProductPage';\nimport { Repeat } from '../../../components/Repeat';\nimport { AdAccessory } from '../../../Gql/ad/types';\nimport { accessoryImages } from '../../../Gql/ad/view';\nimport { numberSeparator } from '../../../utils/formats';\nimport AccesoryModal from './AccessoryModal';\n\ninterface AccessoriesSectionProps {\n accessories: AdAccessory[];\n}\n\nconst AccessoriesSection = ({ accessories }: AccessoriesSectionProps) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState<AdAccessory | undefined>();\n\n const onOpenModal = (accessory: AdAccessory) => setModal(accessory);\n const onCloseModal = () => setModal(undefined);\n\n if (!accessories?.length) return null;\n\n return (\n <>\n {modal && <AccesoryModal accessory={modal} onClose={onCloseModal} />}\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{t('item.accessories.accessories')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{t('item.accessories.accessoriesDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <OverflowGrid\n columns={1.05}\n columnsSm={2.1}\n columnsMd={2}\n spacing={2}\n items={accessories.map((accessory) => (\n <AccessoryCard\n key={accessory.id}\n title={accessory.name}\n image={\n accessoryImages(accessory)[0]\n ? {\n src: `${accessoryImages(accessory)[0]}?w=539&h=303`,\n alt: accessory.name,\n }\n : undefined\n }\n price={`${numberSeparator(accessory.price ?? 0)} ${t('currency.default')}`}\n preamble={accessory.shortDescription}\n readMoreCta={() => onOpenModal(accessory)}\n />\n ))}\n />\n </Repeat>\n </ProductPageMainSection>\n </>\n );\n};\n\nexport default AccessoriesSection;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconImage } from '../Icon';\nimport {\n Body,\n Branding,\n Heading,\n Image,\n ImageaPlaceholder,\n Preamble,\n Price,\n ReadMoreBtn,\n Title,\n Wrapper,\n} from './wrapper';\n\ninterface AccessoryCardImageProps {\n src: string;\n srcSet?: string;\n alt: string;\n}\n\ninterface AccessoryCardProps {\n title: string;\n image?: AccessoryCardImageProps;\n branding?: AccessoryCardImageProps;\n price?: string;\n preamble?: string;\n readMoreCta?: () => void;\n}\n\nconst AccessoryCard = ({\n title,\n image,\n branding,\n price,\n preamble,\n readMoreCta,\n}: AccessoryCardProps) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n {image ? (\n <Image src={image.src} srcSet={image.srcSet} alt={image.alt} />\n ) : (\n <ImageaPlaceholder>\n <IconImage />\n </ImageaPlaceholder>\n )}\n <Body>\n <Heading>\n <Title>{title}</Title>\n {branding && <Branding src={branding.src} srcSet={branding.srcSet} alt={branding.alt} />}\n </Heading>\n {price && <Price>{price}</Price>}\n {preamble && <Preamble>{preamble}</Preamble>}\n {readMoreCta && (\n <ReadMoreBtn onClick={readMoreCta} title={t('common.readMore') || ''}>\n {t('common.readMore')}\n </ReadMoreBtn>\n )}\n </Body>\n </Wrapper>\n );\n};\n\nexport default AccessoryCard;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${size(2)};\n height: 100%;\n`;\n\nconst imageBaseStyling = css`\n flex-shrink: 0;\n aspect-ratio: 16 / 9;\n border-radius: 3px;\n`;\n\nexport const Image = styled.img`\n ${imageBaseStyling};\n display: block;\n width: 100%;\n object-fit: cover;\n`;\n\nexport const ImageaPlaceholder = styled.div`\n ${imageBaseStyling};\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 2rem;\n background-color: ${(props) => props.theme.color.accent};\n`;\n\nexport const Body = styled.div`\n flex: 1 1 auto;\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n gap: ${size(1)};\n`;\n\nexport const Heading = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${size(2)};\n`;\n\nexport const Title = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1.125rem;\n`;\n\nexport const Branding = styled.img`\n display: block;\n`;\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n\nexport const Preamble = styled.div`\n --preamble-max-height: ${size(6)};\n --preamble-gradient-height: calc(var(--preamble-max-height) / 2);\n\n position: relative;\n max-height: var(--preamble-max-height);\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n white-space: pre-wrap;\n\n &::before {\n content: '';\n position: absolute;\n top: var(--preamble-max-height);\n left: 0;\n width: 100%;\n height: var(--preamble-gradient-height);\n transform: translateY(-100%); // Only visible if Preamble reaches max height\n color: ${(props) => props.theme.color.bg};\n mask-image: ${(props) => props.theme.mask.gradient.toTop};\n pointer-events: none;\n }\n`;\n\nexport const ReadMoreBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__font--bold wayke__color--primary-text',\n}))`\n margin-top: auto;\n display: block;\n color: ${(props) => props.theme.color.link};\n font-size: 0.875rem;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n", "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { IconChevronLeft, IconChevronRight } from '../Icon';\nimport { NavButton } from '../NavButton';\nimport { Item, List, ListWrapper, NextBtn, PrevBtn, Wrapper } from './wrapper';\n\nexport interface IOverflowGrid {\n items: React.ReactNode[];\n itemKeyBase?: string;\n spacing?: number;\n columns?: number;\n columnsSm?: number;\n columnsMd?: number;\n accentBg?: boolean;\n}\n\nconst OverflowGrid = ({\n items,\n itemKeyBase,\n spacing,\n columns,\n columnsSm,\n columnsMd,\n accentBg,\n}: IOverflowGrid) => {\n const overflowElement = useRef<HTMLUListElement | null>(null);\n\n const onPrev = useCallback(() => {\n const itemWidth = overflowElement.current?.children[0].clientWidth || 0;\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n\n if (scrollLeft > 0) {\n overflowElement.current?.scroll({\n left: scrollLeft - itemWidth,\n behavior: 'smooth',\n });\n }\n }, []);\n\n const onNext = useCallback(() => {\n const itemWidth = overflowElement.current?.children[0].clientWidth || 0;\n const scrollWidth = overflowElement.current?.scrollWidth || 0;\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n const overflowElementWidth = overflowElement.current?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n\n if (overflowElementScrollWidth !== scrollLeft) {\n overflowElement.current?.scroll({\n left: scrollLeft + itemWidth,\n behavior: 'smooth',\n });\n }\n }, []);\n\n // Hide navigation buttons depending on scroll position\n const [hidePrevNav, setHidePrevNav] = useState(true);\n const [hideNextNav, setHideNextNav] = useState(true);\n\n const onScroll = () => {\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n const scrollWidth = overflowElement.current?.scrollWidth || 0;\n const overflowElementWidth = overflowElement.current?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n\n setHidePrevNav(scrollLeft == 0 ? true : false);\n setHideNextNav(overflowElementScrollWidth == scrollLeft ? true : false);\n };\n\n useEffect(() => {\n onScroll();\n overflowElement.current?.addEventListener('scroll', onScroll);\n return () => overflowElement.current?.removeEventListener('scroll', onScroll);\n }, []);\n\n return (\n <Wrapper $accentBg={accentBg}>\n <ListWrapper $spacing={spacing}>\n <List\n ref={overflowElement}\n $columns={columns}\n $columnsSm={columnsSm}\n $columnsMd={columnsMd}\n >\n {items.map((item, i) => (\n <Item key={itemKeyBase ? `${itemKeyBase}-${i}` : `overflow-grid-item-${i}`}>\n {item}\n </Item>\n ))}\n </List>\n </ListWrapper>\n {!hidePrevNav && (\n <PrevBtn>\n <NavButton onClick={onPrev} title=\"Previous\">\n <IconChevronLeft />\n </NavButton>\n </PrevBtn>\n )}\n {!hideNextNav && (\n <NextBtn>\n <NavButton onClick={onNext} title=\"Next\">\n <IconChevronRight />\n </NavButton>\n </NextBtn>\n )}\n </Wrapper>\n );\n};\n\nexport default OverflowGrid;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface WrapperProps {\n $accentBg?: boolean;\n}\n\nexport const Wrapper = styled.div<WrapperProps>`\n --container-gutter: ${size(2)};\n --bg: ${(props) => props.theme.color.bg};\n\n ${(props) => props.theme.breakpoint.Sm} {\n --container-gutter: ${size(3)};\n }\n\n position: relative;\n\n ${({ $accentBg }) =>\n $accentBg &&\n css`\n --bg: ${(props) => props.theme.color.accent};\n `}\n`;\n\nexport const Item = styled.li`\n flex: 1 0 auto;\n width: 100%;\n max-width: 100%;\n scroll-snap-align: start;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n &:is(:only-child, #important) {\n width: 100%;\n max-width: 100%;\n }\n }\n`;\n\ninterface ListProps {\n $columns?: number;\n $columnsSm?: number;\n $columnsMd?: number;\n}\n\nexport const List = styled.ul<ListProps>`\n display: flex;\n align-items: stretch;\n list-style: none;\n padding: 0 var(--container-gutter);\n margin: 0;\n overflow: auto;\n scroll-snap-type: x mandatory;\n scroll-padding-left: var(--container-gutter);\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n ${({ $columns }) =>\n $columns &&\n css`\n ${Item} {\n width: ${100 / $columns}%;\n max-width: ${100 / $columns}%;\n }\n `}\n\n ${({ $columnsSm }) =>\n $columnsSm &&\n css`\n ${(props) => props.theme.breakpoint.Sm} {\n ${Item} {\n width: ${100 / $columnsSm}%;\n max-width: ${100 / $columnsSm}%;\n }\n }\n `}\n\n ${({ $columnsMd }) =>\n $columnsMd &&\n css`\n ${(props) => props.theme.breakpoint.Md} {\n ${Item} {\n width: ${100 / $columnsMd}%;\n max-width: ${100 / $columnsMd}%;\n }\n }\n `}\n`;\n\ninterface ListWrapperProps {\n $spacing?: number;\n}\n\nexport const ListWrapper = styled.div<ListWrapperProps>`\n position: relative;\n overflow: hidden;\n margin: 0 calc(var(--container-gutter) * -1);\n\n ${(props) => props.theme.breakpoint.Md} {\n &::before,\n &::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--container-gutter);\n background-color: var(--bg);\n z-index: 1;\n }\n\n &::before {\n left: 0;\n\n ${({ $spacing }) =>\n $spacing\n ? css`\n mask-image: linear-gradient(to right, #000 ${size($spacing)}, transparent);\n `\n : css`\n mask-image: ${(props) => props.theme.mask.gradient.toRight};\n `}\n }\n\n &::after {\n right: 0;\n\n ${({ $spacing }) =>\n $spacing\n ? css`\n mask-image: linear-gradient(to left, #000 ${size($spacing)}, transparent);\n `\n : css`\n mask-image: ${(props) => props.theme.mask.gradient.toLeft};\n `}\n }\n }\n\n ${({ $spacing }) =>\n $spacing &&\n css`\n ${List} {\n margin: 0 -${size($spacing / 2)};\n }\n\n ${Item} {\n padding: 0 ${size($spacing / 2)};\n }\n `}\n`;\n\nconst NavBtn = styled.div`\n position: absolute;\n top: 50%;\n z-index: 2;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n display: none;\n }\n`;\n\nexport const PrevBtn = styled(NavBtn)`\n left: 0;\n transform: translate(-50%, -50%);\n`;\n\nexport const NextBtn = styled(NavBtn)`\n right: 0;\n transform: translate(50%, -50%);\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Content from '../../../components/Content';\nimport { Image } from '../../../components/Image';\nimport { Link } from '../../../components/Link';\nimport LogoBox from '../../../components/LogoBox';\nimport Modal from '../../../components/Modal';\nimport PriceBox from '../../../components/PriceBox';\nimport { Repeat } from '../../../components/Repeat';\nimport { UtilityTextBold } from '../../../components/Utility';\nimport { AdAccessory } from '../../../Gql/ad/types';\nimport { accessoryImages } from '../../../Gql/ad/view';\nimport { numberSeparator } from '../../../utils/formats';\n\ninterface AccesoryModalProps {\n accessory: AdAccessory;\n onClose: () => void;\n}\n\nconst AccesoryModal = ({ accessory, onClose }: AccesoryModalProps) => {\n const { t } = useTranslation();\n const image = accessoryImages(accessory)[0];\n const priceList = [\n {\n label: t('item.accessories.price'),\n price: `${numberSeparator(accessory.price ?? 0)} ${t('currency.default')}`,\n oldPrice: false,\n },\n ];\n\n if (accessory.salePrice) {\n priceList.push({\n label: t('item.accessories.oldPrice'),\n price: `${numberSeparator(accessory.salePrice)} ${t('currency.default')}`,\n oldPrice: true,\n });\n }\n\n if (accessory.assemblyPrice) {\n priceList.push({\n label: t('item.accessories.installationCost'),\n price: `${numberSeparator(accessory.assemblyPrice)} ${t('currency.default')}`,\n oldPrice: false,\n });\n }\n\n return (\n <Modal title={accessory.name} onClose={onClose}>\n {image && (\n <Repeat>\n <Image src={`${image}?w=632`} alt={`${accessory.name}`} />\n </Repeat>\n )}\n {accessory.logoUrl && (\n <Repeat>\n <LogoBox\n logo={`${accessory.logoUrl}?w=160`}\n logo2x={`${accessory.logoUrl}?w=320`}\n alt={accessory.manufacturer || t('common.logotype') || ''}\n wide\n />\n </Repeat>\n )}\n <Repeat>\n <PriceBox prices={priceList} />\n </Repeat>\n\n <Repeat>\n <Content markdown={accessory.longDescription || ''} />\n </Repeat>\n {accessory.articleNumber && (\n <Repeat>\n <UtilityTextBold as=\"div\">{t('item.accessories.articleNumberShort')}</UtilityTextBold>\n <div>{accessory.articleNumber}</div>\n </Repeat>\n )}\n {accessory.productPageLink && (\n <Repeat>\n <Link\n href={accessory.productPageLink}\n title={\n t('item.accessories.moreInformationAboutAccessory', {\n accessory: accessory.name,\n }) || ''\n }\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n {accessory.productPageLinkText || t('common.readMore')} ({t('common.opensInNewTab')})\n </Link>\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default AccesoryModal;\n", "import styled from 'styled-components';\n\nexport const Image = styled.img`\n display: block;\n width: 100%;\n`;\n", "import React from 'react';\n\nimport { Label, Price, Row, Wrapper } from './wrapper';\n\ninterface PriceBoxItemProps {\n label: string;\n price: string;\n oldPrice?: boolean;\n}\n\ninterface PriceBoxProps {\n prices: PriceBoxItemProps[];\n}\n\nconst PriceBox = ({ prices }: PriceBoxProps) => (\n <Wrapper>\n {prices?.map((item, i) => (\n <Row key={`${item.label}-${i}`} $oldPrice={item.oldPrice}>\n <Label>{item.label}</Label>\n <Price>{item.price}</Price>\n </Row>\n ))}\n </Wrapper>\n);\n\nexport default PriceBox;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.ul`\n --price-box-gutter: ${size(2)};\n\n list-style: none;\n padding: var(--price-box-gutter);\n margin: 0;\n border: 1px solid ${(props) => props.theme.color.border};\n`;\n\ninterface RowProps {\n $oldPrice?: boolean;\n}\n\nexport const Row = styled.li<RowProps>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--price-box-gutter);\n\n & + & {\n margin-top: calc(var(--price-box-gutter) / 4);\n }\n\n ${({ $oldPrice }) =>\n $oldPrice &&\n css`\n --price-text-decoration: line-through;\n\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n `}\n`;\n\nexport const Label = styled.div``;\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n text-decoration: var(--price-text-decoration);\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonInlineBold } from '../../components/Button';\nimport { H2 } from '../../components/Heading';\nimport Map from '../../components/Map';\nimport OpeningHours from '../../components/OpeningHours';\nimport PhoneNumber from '../../components/PhoneNumber';\nimport { ProductPageContentLimit } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { TableColumn, TableColumnCell, TableColumnRow } from '../../components/TableColumn';\nimport { Ad } from '../../Gql/ad/types';\nimport { openingHours, position } from '../../Gql/ad/view';\nimport { formatPhonenumber } from '../../utils/phonenumbers';\n\ninterface BranchProps {\n branch: Ad['branch'];\n displayBranchName?: boolean;\n}\n\nconst Branch = ({ branch, displayBranchName }: BranchProps) => {\n const { t } = useTranslation();\n const hours = openingHours(branch);\n const phone = branch.contactInformation?.telephone;\n\n return (\n <>\n <Repeat>\n <H2 noMargin>\n {displayBranchName\n ? `${t('item.thisCarsIsLocatedAt')} ${branch.displayName}`\n : branch.city\n ? t('item.thisCarIsAvailableAtOurBranch', { location: branch.city })\n : t('item.contact')}\n </H2>\n </Repeat>\n <Repeat>\n <Map position={position(branch)} />\n </Repeat>\n <Repeat>\n <ProductPageContentLimit>\n <Repeat>\n <TableColumn>\n {branch.street && branch.city && (\n <TableColumnRow>\n <TableColumnCell>{t('common.address')}</TableColumnCell>\n <TableColumnCell>\n <ButtonInlineBold>\n <ButtonContent>{`${branch.street}, ${branch.city}`}</ButtonContent>\n </ButtonInlineBold>\n </TableColumnCell>\n </TableColumnRow>\n )}\n {phone && <PhoneNumber phoneNumber={formatPhonenumber(phone)} />}\n </TableColumn>\n </Repeat>\n {hours && (\n <Repeat>\n <OpeningHours openingHours={hours} />\n </Repeat>\n )}\n </ProductPageContentLimit>\n </Repeat>\n </>\n );\n};\n\nexport default Branch;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useSettings from '../../State/Settings/useSettings';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport { Image, Placeholder, PlaceholderAction, Wrapper } from './wrapper';\n\ninterface StaticMapProps {\n position?: { latitude: number; longitude: number };\n}\n\nconst StaticMap = ({ position }: StaticMapProps) => {\n const { t } = useTranslation();\n const { googleMapsApiKey, googleMapsMarker } = useSettings();\n const [visible, setVisible] = useState(false);\n\n const onShowMap = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (googleMapsApiKey) {\n e.preventDefault();\n setVisible(true);\n }\n }, []);\n\n if (!position) {\n return null;\n }\n\n const { latitude, longitude } = position;\n\n if (visible && googleMapsApiKey) {\n return (\n <Wrapper\n href={`https://maps.google.com/maps?q=${latitude},${longitude}`}\n title={t('item.showOnGoogleMaps')}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >\n <Image\n src={`https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=10&size=640x280&maptype=roadmap&markers=${\n googleMapsMarker ? `icon:${encodeURIComponent(googleMapsMarker)}` : ''\n }%7C${latitude},${longitude}&key=${googleMapsApiKey}`}\n alt={t('item.googleMapsMapAlt')}\n />\n </Wrapper>\n );\n }\n return (\n <Placeholder\n href={`https://maps.google.com/maps?q=${latitude},${longitude}`}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n onClick={onShowMap}\n >\n <PlaceholderAction>\n <ButtonSecondary as=\"div\">\n <ButtonContent>{t('item.googleMapsPlaceholderInit')}</ButtonContent>\n </ButtonSecondary>\n </PlaceholderAction>\n </Placeholder>\n );\n};\n\nexport default StaticMap;\n", "import styled from 'styled-components';\n\nexport const Wrapper = styled.a`\n display: block;\n`;\n\nexport const Image = styled.img`\n display: block;\n width: 100%;\n border-radius: 3px;\n`;\n\nexport const Placeholder = styled.a`\n display: block;\n position: relative;\n width: 100%;\n height: 0;\n padding-bottom: 43.75%; // Proportions of Google Static Map (640x280)\n background-image: linear-gradient(-15deg, #dfe4ce, #c1d6ea, #dfe4ce);\n border-radius: 3px;\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const PlaceholderAction = styled.div`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n", "import { TFunction } from 'i18next';\nimport React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { DayKey, WeekOpeningHours } from '../../Gql/ad/view';\nimport Badge from '../Badge';\nimport { RepeatSmall } from '../Repeat';\nimport { TableColumn, TableColumnCell, TableColumnRow } from '../TableColumn';\nimport { UtilityTextBold } from '../Utility';\n\ntype KeyType = DayKey;\nconst KeyOrder: KeyType[] = [\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n];\n\nconst TranslateWeekDays = (t: TFunction<'translation', undefined>, d: KeyType) => {\n switch (d) {\n case 'monday':\n return t('common.mondayShort');\n case 'tuesday':\n return t('common.tuesdayShort');\n case 'wednesday':\n return t('common.wednesdayShort');\n case 'thursday':\n return t('common.thursdayShort');\n case 'friday':\n return t('common.fridayShort');\n case 'saturday':\n return t('common.saturdayShort');\n case 'sunday':\n return t('common.sundayShort');\n }\n};\n\ninterface OpeningHoursSample {\n titleFrom: string;\n titleTo?: string;\n from?: string | null;\n until?: string | null;\n}\n\nconst arr: OpeningHoursSample[] = [];\n\nconst GetOpeningHours = (t: TFunction<'translation', undefined>, o: WeekOpeningHours) =>\n KeyOrder.reduce((prev, current) => {\n const title = TranslateWeekDays(t, current);\n const item = o[current];\n const previous = prev?.[prev.length - 1];\n if (previous && previous.from == item?.from && previous.until === item?.until) {\n prev[prev.length - 1].titleTo = title;\n } else {\n prev.push({\n titleFrom: title,\n from: item?.from,\n until: item?.until,\n });\n }\n\n return prev;\n }, arr.slice());\n\nconst GetOpeningHoursToday = (t: TFunction<'translation', undefined>, o: WeekOpeningHours) => {\n const dayNumber = new Date().getDay();\n const day = KeyOrder[dayNumber === 0 ? 6 : dayNumber - 1] as KeyType;\n const current = o[day];\n return {\n title: current ? t('item.openingHoursToday') : t('item.closedToday'),\n from: current?.from,\n until: current?.until,\n };\n};\n\nconst valuOfDateString = (s: string) => {\n const splitted = s.split(':').map((x) => parseInt(x, 10));\n return new Date().setHours(splitted[0], splitted[1]).valueOf();\n};\n\ninterface OpeningHoursProps {\n openingHours?: WeekOpeningHours;\n}\n\nconst OpeningHours = ({ openingHours }: OpeningHoursProps) => {\n const { t } = useTranslation();\n const today = useMemo(\n () => (openingHours ? GetOpeningHoursToday(t, openingHours) : null),\n [openingHours]\n );\n\n const currentlyOpen = useMemo(() => {\n try {\n if (today?.from && today?.until) {\n const currentDate = new Date().valueOf();\n const from = valuOfDateString(today.from);\n const until = valuOfDateString(today.until);\n return currentDate >= from && currentDate <= until;\n }\n } catch {\n return false;\n }\n }, [today]);\n\n const oh = useMemo(\n () => (openingHours ? GetOpeningHours(t, openingHours) : null),\n [openingHours]\n );\n if (!oh) {\n return null;\n }\n\n return (\n <>\n <RepeatSmall>\n <Badge\n label={currentlyOpen ? t('item.open') : t('item.closed')}\n severity={currentlyOpen ? 'positive' : 'negative'}\n />\n </RepeatSmall>\n <RepeatSmall>\n <TableColumn>\n <TableColumnRow>\n <TableColumnCell>\n <UtilityTextBold>{today?.title}</UtilityTextBold>\n </TableColumnCell>\n <TableColumnCell>\n <UtilityTextBold>\n {today?.from ? `${today.from} - ${today.until}` : t('item.closed')}\n </UtilityTextBold>\n </TableColumnCell>\n </TableColumnRow>\n {oh.map((o) => (\n <TableColumnRow key={o.titleFrom}>\n <TableColumnCell>\n {o.titleTo ? `${o.titleFrom} - ${o.titleTo}` : o.titleFrom}\n </TableColumnCell>\n <TableColumnCell>\n {o.from ? `${o.from} - ${o.until}` : t('item.closed')}\n </TableColumnCell>\n </TableColumnRow>\n ))}\n </TableColumn>\n </RepeatSmall>\n </>\n );\n};\n\nexport default OpeningHours;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n label: string;\n severity?: 'positive' | 'negative';\n}\n\nconst Badge = ({ label, severity }: Props) => <Wrapper severity={severity}>{label}</Wrapper>;\n\nexport default Badge;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport theme from '../../layout/theme';\n\nconst getBg = (severity: string | undefined): string => {\n let bg = theme.color.textDark;\n\n if (severity === 'positive') {\n bg = theme.color.ui.positive;\n } else if (severity === 'negative') {\n bg = theme.color.ui.negative;\n }\n\n return bg;\n};\n\ninterface Wrapper {\n severity?: string;\n}\n\nexport const Wrapper = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))<Wrapper>`\n display: inline-block;\n background-color: ${(props): string => getBg(props.severity)};\n padding: ${size(0.75)} ${size(1.5)};\n color: ${(props) => props.theme.color.textLight};\n border-radius: 3px;\n font-size: 0.75rem;\n line-height: 1.2;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const TableColumn = styled.div`\n line-height: 1.2;\n`;\n\nexport const TableColumnRow = styled.div`\n display: flex;\n align-items: flex-start;\n margin: ${size(-1)};\n`;\n\nexport const TableColumnCell = styled.div`\n flex: 1 0 50%;\n padding: ${size(1)};\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonInlineBold } from '../Button';\nimport { TableColumnCell, TableColumnRow } from '../TableColumn';\n\ninterface PhoneNumberProps {\n phoneNumber: string;\n}\n\nconst PhoneNumber = ({ phoneNumber }: PhoneNumberProps) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n const onClick = useCallback(() => !visible && setVisible(true), [visible]);\n\n return (\n <TableColumnRow>\n <TableColumnCell>{t('other.phoneNumber')}</TableColumnCell>\n <TableColumnCell>\n {visible ? (\n <ButtonInlineBold\n as=\"a\"\n href={`tel:${phoneNumber}`}\n title={t('other.callPhoneNumber', { phoneNumber }) || ''}\n >\n <ButtonContent>{phoneNumber}</ButtonContent>\n </ButtonInlineBold>\n ) : (\n <ButtonInlineBold onClick={onClick} title={t('other.showPhoneNumber') || ''}>\n <ButtonContent>{t('other.showPhoneNumber')}</ButtonContent>\n </ButtonInlineBold>\n )}\n </TableColumnCell>\n </TableColumnRow>\n );\n};\n\nexport default PhoneNumber;\n", "import { MetadataJson, parsePhoneNumberFromString } from 'libphonenumber-js/core';\n\nimport _metadata from './metadata.min.json';\n\nconst metadata = _metadata as unknown as MetadataJson;\n\nconst typedMetadata = metadata as unknown as MetadataJson;\n\nexport const formatPhonenumber = (text: string) => {\n try {\n const parsed = parsePhoneNumberFromString(\n text.replace('-', '').replace(/ /g, ''),\n typedMetadata\n );\n return parsed?.formatNational() || text;\n } catch {\n return text;\n }\n};\n", "{\"version\":4,\"country_calling_codes\":{\"46\":[\"SE\"],\"47\":[\"NO\"]},\"countries\":{\"NO\":[\"47\",\"00\",\"(?:0|[2-9]\\\\d{3})\\\\d{4}\",[5,8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-79]\"]]],0,0,0,0,0,\"[02-689]|7[0-8]\",[[\"(?:2[1-4]|3[1-3578]|5[1-35-7]|6[1-4679]|7[0-8])\\\\d{6}\",[8]],[\"(?:4[015-8]|9\\\\d)\\\\d{6}\",[8]],[\"80[01]\\\\d{5}\",[8]],[\"82[09]\\\\d{5}\",[8]],[\"880\\\\d{5}\",[8]],0,[\"(?:0[2-9]|81(?:0(?:0[7-9]|1\\\\d)|5\\\\d\\\\d))\\\\d{3}\"],0,[\"85[0-5]\\\\d{5}\",[8]],[\"810(?:0[0-6]|[2-8]\\\\d)\\\\d{3}\",[8]]]],\"SE\":[\"46\",\"00\",\"(?:[26]\\\\d\\\\d|9)\\\\d{9}|[1-9]\\\\d{8}|[1-689]\\\\d{7}|[1-4689]\\\\d{6}|2\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"20\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"9(?:00|39|44|9)\"],\"0$1\",0,\"$1 $2\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3\",[\"[12][136]|3[356]|4[0246]|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d)(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{3})\",\"$1-$2 $3\",[\"9(?:00|39|44)\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"10|7\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1-$2 $3 $4\",[\"9\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4 $5\",[\"[26]\"],\"0$1\",0,\"$1 $2 $3 $4 $5\"]],\"0\",0,0,0,0,0,[[\"(?:(?:[12][136]|3[356]|4[0246]|6[03]|8\\\\d)\\\\d|90[1-9])\\\\d{4,6}|(?:1(?:2[0-35]|4[0-4]|5[0-25-9]|7[13-6]|[89]\\\\d)|2(?:2[0-7]|4[0136-8]|5[0138]|7[018]|8[01]|9[0-57])|3(?:0[0-4]|1\\\\d|2[0-25]|4[056]|7[0-2]|8[0-3]|9[023])|4(?:1[013-8]|3[0135]|5[14-79]|7[0-246-9]|8[0156]|9[0-689])|5(?:0[0-6]|[15][0-5]|2[0-68]|3[0-4]|4\\\\d|6[03-5]|7[013]|8[0-79]|9[01])|6(?:1[1-3]|2[0-4]|4[02-57]|5[0-37]|6[0-3]|7[0-2]|8[0247]|9[0-356])|9(?:1[0-68]|2\\\\d|3[02-5]|4[0-3]|5[0-4]|[68][01]|7[0135-8]))\\\\d{5,6}\",[7,8,9]],[\"7[02369]\\\\d{7}\",[9]],[\"20\\\\d{4,7}\",[6,7,8,9]],[\"649\\\\d{6}|99[1-59]\\\\d{4}(?:\\\\d{3})?|9(?:00|39|44)[1-8]\\\\d{3,6}\",[7,8,9,10]],[\"75[1-8]\\\\d{6}\",[9]],0,[\"10[1-8]\\\\d{6}\",[9]],[\"74[02-9]\\\\d{6}\",[9]],0,[\"77[0-7]\\\\d{6}\",[9]]]]},\"nonGeographic\":{}}", "import { format } from 'date-fns';\nimport { nb, sv } from 'date-fns/locale';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConversionOption } from '../../@types/conversion';\nimport ActionList from '../../components/ActionList';\nimport { ButtonInline } from '../../components/Button';\nimport CheckMarkList, { CheckMarkListItem } from '../../components/CheckMarkList';\nimport { Column, Columns } from '../../components/Columns';\nimport Content from '../../components/Content';\nimport { Repeat, RepeatTiny } from '../../components/Repeat';\nimport { StateIndicator } from '../../components/StateIndicator';\nimport SwitchBar from '../../components/SwitchBar';\nimport { UtilityFontSizeSmall } from '../../components/Utility';\nimport {\n availableFrom as adAvailableFrom,\n ecom,\n manufacturerPackage,\n packageOffers,\n} from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport PackageOptionModal, { PackageOptionModalData } from './PackageOptionModal';\n\ninterface CheckListProps {\n title: string;\n conversionOptions?: ConversionOption[];\n // Undefined when the site turns buy online off, which hides the buy button.\n toggleEcomModal?: () => void;\n}\n\nconst CheckList = ({ title, conversionOptions, toggleEcomModal }: CheckListProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { marketCode } = useSettings();\n const ecommerce = ecom(ad);\n const availableFrom = adAvailableFrom(ad);\n const packageOption = manufacturerPackage(ad);\n const packageOptions = packageOffers(ad);\n\n const [modal, setModal] = useState<PackageOptionModalData>();\n const onOpen = useCallback((nextModal: PackageOptionModalData) => setModal(nextModal), []);\n const onClose = useCallback(() => setModal(undefined), []);\n\n return (\n <>\n {modal && <PackageOptionModal packageOption={modal} onClose={onClose} />}\n <Repeat>\n <ActionList\n title={title}\n conversionOptions={conversionOptions}\n toggleEcomModal={toggleEcomModal}\n />\n {ecommerce.enabled && ecommerce.reserved && (\n <RepeatTiny>\n <SwitchBar\n title={t('item.carIsReserved')}\n body={t('item.carIsReservedDescription') || undefined}\n >\n <Content>\n <p>{t('item.carIsReservedModalBody')}</p>\n </Content>\n </SwitchBar>\n </RepeatTiny>\n )}\n </Repeat>\n <Repeat>\n {availableFrom && new Date(availableFrom).valueOf() > new Date().valueOf() && (\n <RepeatTiny>\n <Columns $spacing={1} valign=\"center\">\n <Column noShrink>\n <StateIndicator $tone=\"pending\" />\n </Column>\n <Column>\n <UtilityFontSizeSmall>\n {t('item.availableFromDate', {\n date: format(new Date(availableFrom), 'dd MMMM yyyy', {\n locale: marketCode === 'NO' ? nb : sv,\n }),\n })}\n </UtilityFontSizeSmall>\n </Column>\n </Columns>\n </RepeatTiny>\n )}\n <RepeatTiny>\n <CheckMarkList>\n {packageOption?.title && (\n <CheckMarkListItem>\n <>\n {t('item.includingShort')}{' '}\n <ButtonInline onClick={() => onOpen(packageOption)}>\n {packageOption.title}\n </ButtonInline>{' '}\n {t('item.usedWarrany').toLowerCase()}\n </>\n </CheckMarkListItem>\n )}\n {packageOptions?.map((packageOption, index) => (\n <CheckMarkListItem key={packageOption.title || index}>\n <>\n {t('item.includingShort')}{' '}\n <ButtonInline onClick={() => onOpen(packageOption)}>\n {packageOption.title}\n </ButtonInline>\n </>\n </CheckMarkListItem>\n ))}\n {ecommerce.enabled && ad.iteration?.commerce.homeDelivery && (\n <CheckMarkListItem>{t('item.homeDelivery')}</CheckMarkListItem>\n )}\n </CheckMarkList>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default CheckList;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n ConversionOption,\n ConversionOptionEmail,\n ConversionOptionText,\n ConversionOptionVehicle,\n defaultConversionOptions,\n} from '../../@types/conversion';\nimport { adEvent, contactPerson, ecom } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport { formatPhonenumber } from '../../utils/phonenumbers';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport LeadForm, { LeadCommunication } from '../LeadForm';\nimport { RepeatTiny } from '../Repeat';\nimport ToggleItem from './toggle-item';\n\ninterface ActionListProps {\n title: string;\n conversionOptions?: ConversionOption[];\n /** Undefined when the site turns buy online off, which hides the buy button. */\n toggleEcomModal?: () => void;\n}\n\nconst resolveText = (text: ConversionOptionText, vehicle: ConversionOptionVehicle) =>\n typeof text === 'function' ? text(vehicle) : text;\n\nconst ActionList = ({\n title,\n conversionOptions = defaultConversionOptions,\n toggleEcomModal,\n}: ActionListProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const contact = contactPerson(ad);\n const email = contact?.email || ad.branch.contactInformation?.email;\n const phonenumber = contact?.phone || ad.branch.contactInformation?.telephone;\n const ecommerce = ecom(ad);\n\n const vehicle = useMemo<ConversionOptionVehicle>(() => {\n const item = ad.iteration?.item;\n return {\n id: ad.id,\n title,\n registrationNumber: item?.registrationNumber?.stringValue,\n manufacturer: item?.manufacturer?.stringValue,\n modelSeries: item?.modelSeries?.stringValue,\n };\n }, [ad, title]);\n\n // Pre-populated subject/body gives the dealer a way to tell these leads apart from\n // other inbound mail, and tells them which site and vehicle the request concerns.\n const emailHref = useCallback(\n (option: ConversionOptionEmail) => {\n if (!email) return undefined;\n const vehicleLabel = [\n vehicle.registrationNumber,\n [vehicle.manufacturer, vehicle.modelSeries].filter(Boolean).join(' '),\n ]\n .filter(Boolean)\n .join(', ');\n const subject = option.subject\n ? resolveText(option.subject, vehicle)\n : t('item.actions.emailSubject', {\n hostName: window.location.hostname,\n vehicle: vehicleLabel,\n });\n const params = new URLSearchParams({ subject });\n if (option.body !== false) {\n params.set(\n 'body',\n option.body\n ? resolveText(option.body, vehicle)\n : t('item.actions.emailBody', { url: window.location.href })\n );\n }\n // URLSearchParams encodes spaces as \"+\", which mail clients render literally.\n return `${email}?${params.toString().replace(/\\+/g, '%20')}`;\n },\n [email, vehicle, t]\n );\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n const onClickMailVisible = useCallback(\n () => PubSub.publish('MailVisible', trackPayload),\n [trackPayload]\n );\n const onClickMailValue = useCallback(\n () => PubSub.publish('MailClick', trackPayload),\n [trackPayload]\n );\n const onClickPhoneVisible = useCallback(\n () => PubSub.publish('PhonenumberVisible', trackPayload),\n [trackPayload]\n );\n const onClickPhoneValue = useCallback(\n () => PubSub.publish('PhonenumberCall', trackPayload),\n [trackPayload]\n );\n\n const [leadCommunication, setLeadCommunication] = useState<LeadCommunication>();\n const openLeadForm = useCallback(\n (communication: LeadCommunication) => {\n setLeadCommunication(communication);\n PubSub.publish('LeadOpen', { ...trackPayload, communication });\n },\n [trackPayload]\n );\n const closeLeadForm = useCallback(() => setLeadCommunication(undefined), []);\n\n const renderButton = (\n key: string,\n label: string,\n primary: boolean,\n onClick: () => void,\n disabled?: boolean\n ) => {\n const Button = primary ? ButtonPrimary : ButtonSecondary;\n return (\n <RepeatTiny key={key}>\n <Button fullWidth disabled={disabled} onClick={onClick} title={label}>\n <ButtonContent>{label}</ButtonContent>\n </Button>\n </RepeatTiny>\n );\n };\n\n const buttons = conversionOptions.map((option, index) => {\n const key = `${option.type}-${index}`;\n switch (option.type) {\n case 'ecom':\n if (!ecommerce.enabled || !toggleEcomModal) return null;\n return renderButton(\n key,\n option.name || t('item.actions.buyOnline'),\n option.primary ?? true,\n toggleEcomModal,\n !!ecommerce.reserved\n );\n case 'leadMessage':\n return renderButton(\n key,\n option.name || t('lead.messageFormTitle'),\n option.primary ?? true,\n () => openLeadForm('email')\n );\n case 'leadCallMe':\n return renderButton(\n key,\n option.name || t('lead.callFormTitle'),\n option.primary ?? true,\n () => openLeadForm('callme')\n );\n case 'email':\n if (!email) return null;\n return (\n <ToggleItem\n key={key}\n onClickVisible={onClickMailVisible}\n onClickValue={onClickMailValue}\n title={option.name || t('item.actions.showEmail')}\n value={email}\n href={emailHref(option)}\n type=\"mailto\"\n primary={option.primary ?? false}\n />\n );\n case 'phone':\n if (!phonenumber) return null;\n return (\n <ToggleItem\n key={key}\n title={option.name || t('item.actions.showPhoneNumber')}\n value={formatPhonenumber(phonenumber)}\n type=\"tel\"\n onClickVisible={onClickPhoneVisible}\n onClickValue={onClickPhoneValue}\n primary={option.primary ?? false}\n />\n );\n default:\n return null;\n }\n });\n\n return (\n <>\n {leadCommunication && <LeadForm communication={leadCommunication} onClose={closeLeadForm} />}\n {buttons}\n </>\n );\n};\n\nexport default ActionList;\n", "import React, { useCallback, useId, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarketCode } from '../../@types/market';\nimport { adEvent } from '../../Gql/ad/view';\nimport useSubmitLead, { LeadCommunication } from '../../hooks/useSubmitLead';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport Content from '../Content';\nimport InputCheckbox from '../InputCheckbox';\nimport InputError from '../InputError';\nimport InputLabel from '../InputLabel';\nimport InputText from '../InputText';\nimport InputTextarea from '../InputTextarea';\nimport Modal from '../Modal';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\nimport { Field } from './wrapper';\n\nexport type { LeadCommunication };\n\ninterface LeadFormProps {\n communication: LeadCommunication;\n onClose: () => void;\n}\n\ninterface FormValues {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n message: string;\n tradeInCar: boolean;\n tradeInCarRegNo: string;\n tradeInCarMileage: string;\n}\n\ntype FormErrors = Partial<Record<keyof FormValues, string>>;\n\nconst initialValues: FormValues = {\n firstName: '',\n lastName: '',\n email: '',\n phoneNumber: '',\n message: '',\n tradeInCar: false,\n tradeInCarRegNo: '',\n tradeInCarMileage: '',\n};\n\nconst MAX_MESSAGE_LENGTH = 500;\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n// Swedish plates: three letters, two digits and a final digit or letter (I, Q and V are unused).\n// Norwegian plates: two letters followed by five digits.\nconst registrationNumberPatterns: Partial<Record<MarketCode, RegExp>> = {\n SE: /^[A-HJ-PR-UW-Z]{3}[0-9]{2}[0-9A-HJ-PR-UW-Z]$/,\n NO: /^[A-Z]{2}[0-9]{5}$/,\n};\n\nexport const normalizeRegistrationNumber = (value: string) =>\n value.replace(/[\\s-]/g, '').toUpperCase();\n\nconst isValidRegistrationNumber = (value: string, marketCode: MarketCode) => {\n const pattern = registrationNumberPatterns[marketCode];\n return !pattern || pattern.test(normalizeRegistrationNumber(value));\n};\n\nconst LeadForm = ({ communication, onClose }: LeadFormProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { leadUrl, marketCode } = useSettings();\n const { submitLead, isLoading } = useSubmitLead(leadUrl, marketCode);\n const [values, setValues] = useState<FormValues>(initialValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [submitError, setSubmitError] = useState(false);\n const [sent, setSent] = useState(false);\n\n const formId = useId();\n const fieldId = (name: keyof FormValues) => `${formId}-${name}`;\n const errorId = (name: keyof FormValues) => `${formId}-${name}-error`;\n\n const title = communication === 'email' ? t('lead.messageFormTitle') : t('lead.callFormTitle');\n\n const trackPayload = useMemo(() => ({ ...adEvent(ad), communication }), [ad, communication]);\n\n const setValue = useCallback(<K extends keyof FormValues>(name: K, value: FormValues[K]) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n setErrors((prev) => (prev[name] ? { ...prev, [name]: undefined } : prev));\n }, []);\n\n const validate = useCallback(\n (v: FormValues): FormErrors => {\n const next: FormErrors = {};\n if (!v.firstName.trim()) next.firstName = t('lead.validationMessages.requiredFirstName');\n if (!v.lastName.trim()) next.lastName = t('lead.validationMessages.requiredLastName');\n if (communication === 'email') {\n if (!v.email.trim()) next.email = t('lead.validationMessages.requiredEmail');\n else if (!EMAIL_PATTERN.test(v.email.trim()))\n next.email = t('lead.validationMessages.invalidEmail');\n }\n if (communication === 'callme' && !v.phoneNumber.trim()) {\n next.phoneNumber = t('lead.validationMessages.requiredPhoneNumber');\n }\n if (v.message.length > MAX_MESSAGE_LENGTH) {\n next.message = t('lead.validationMessages.maxMessage');\n }\n if (v.tradeInCar) {\n if (!v.tradeInCarRegNo.trim()) {\n next.tradeInCarRegNo = t('lead.validationMessages.requiredRegNo');\n } else if (!isValidRegistrationNumber(v.tradeInCarRegNo, marketCode)) {\n next.tradeInCarRegNo = t('lead.validationMessages.invalidRegNo');\n }\n if (!v.tradeInCarMileage.trim()) {\n next.tradeInCarMileage = t('lead.validationMessages.requiredMileage');\n }\n }\n return next;\n },\n [communication, marketCode, t]\n );\n\n const onSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault();\n if (isLoading) return;\n\n const nextErrors = validate(values);\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) return;\n\n setSubmitError(false);\n try {\n await submitLead({\n itemId: ad.id,\n branchId: ad.branchId,\n communication,\n firstName: values.firstName.trim(),\n lastName: values.lastName.trim(),\n email: communication === 'email' ? values.email.trim() : undefined,\n phoneNumber: communication === 'callme' ? values.phoneNumber.trim() : undefined,\n message: values.message.trim(),\n tradeInCarRegNo: values.tradeInCar\n ? normalizeRegistrationNumber(values.tradeInCarRegNo)\n : undefined,\n tradeInCarMileage: values.tradeInCar ? values.tradeInCarMileage.trim() : undefined,\n });\n PubSub.publish('LeadSent', trackPayload);\n setSent(true);\n } catch {\n setSubmitError(true);\n }\n },\n [ad, communication, values, validate, submitLead, isLoading, trackPayload]\n );\n\n if (sent) {\n return (\n <Modal title={t('lead.confirmationTitle')} onClose={onClose}>\n <Repeat>\n <Content>\n <p>{t('lead.confirmationMessage')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <ButtonPrimary onClick={onClose}>\n <ButtonContent>{t('lead.confirmationClose')}</ButtonContent>\n </ButtonPrimary>\n </Repeat>\n </Modal>\n );\n }\n\n const textField = (\n name:\n | 'firstName'\n | 'lastName'\n | 'email'\n | 'phoneNumber'\n | 'tradeInCarRegNo'\n | 'tradeInCarMileage',\n label: string,\n inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>\n ) => (\n <RepeatTiny>\n <Field>\n <InputLabel htmlFor={fieldId(name)}>{label}</InputLabel>\n <InputText\n id={fieldId(name)}\n label={label}\n value={values[name]}\n onChange={(e) => setValue(name, e.currentTarget.value)}\n disabled={isLoading}\n aria-required\n aria-invalid={!!errors[name]}\n aria-describedby={errors[name] ? errorId(name) : undefined}\n {...inputProps}\n />\n {errors[name] && <InputError id={errorId(name)}>{errors[name]}</InputError>}\n </Field>\n </RepeatTiny>\n );\n\n return (\n <Modal title={title} onClose={onClose}>\n <form onSubmit={onSubmit} noValidate>\n <Repeat>\n <RepeatSmall>\n {textField('firstName', t('lead.firstName'), { autoComplete: 'given-name' })}\n {textField('lastName', t('lead.lastName'), { autoComplete: 'family-name' })}\n {communication === 'email' &&\n textField('email', t('lead.email'), { type: 'email', autoComplete: 'email' })}\n {communication === 'callme' &&\n textField('phoneNumber', t('lead.phoneNumber'), { type: 'tel', autoComplete: 'tel' })}\n <RepeatTiny>\n <Field>\n <InputLabel htmlFor={fieldId('message')}>{t('lead.message')}</InputLabel>\n <InputTextarea\n id={fieldId('message')}\n label={t('lead.message')}\n value={values.message}\n maxLength={MAX_MESSAGE_LENGTH}\n onChange={(e) => setValue('message', e.currentTarget.value)}\n disabled={isLoading}\n aria-invalid={!!errors.message}\n aria-describedby={errors.message ? errorId('message') : undefined}\n />\n {errors.message && (\n <InputError id={errorId('message')}>{errors.message}</InputError>\n )}\n </Field>\n </RepeatTiny>\n <RepeatTiny>\n <InputCheckbox\n id={fieldId('tradeInCar')}\n checked={values.tradeInCar}\n disabled={isLoading}\n onChange={(e) => setValue('tradeInCar', e.currentTarget.checked)}\n >\n {t('lead.tradeInCar')}\n </InputCheckbox>\n </RepeatTiny>\n {values.tradeInCar && (\n <>\n {textField('tradeInCarRegNo', t('lead.registrationNumber'), {\n autoCapitalize: 'characters',\n })}\n {textField('tradeInCarMileage', t('lead.mileage'), { inputMode: 'numeric' })}\n </>\n )}\n </RepeatSmall>\n {submitError && (\n <RepeatSmall>\n <InputError>{t('lead.error')}</InputError>\n </RepeatSmall>\n )}\n <RepeatSmall>\n <ButtonPrimary type=\"submit\" disabled={isLoading} onClick={() => onSubmit()}>\n <ButtonContent>{t('lead.send')}</ButtonContent>\n </ButtonPrimary>{' '}\n <ButtonSecondary onClick={onClose} disabled={isLoading}>\n <ButtonContent>{t('lead.close')}</ButtonContent>\n </ButtonSecondary>\n </RepeatSmall>\n </Repeat>\n </form>\n </Modal>\n );\n};\n\nexport default LeadForm;\n", "import { useCallback, useState } from 'react';\nimport packageJson from '../../package.json';\nimport { MarketCode } from '../@types/market';\n\nexport type LeadCommunication = 'email' | 'callme';\n\ninterface LeadMetaData {\n key: string;\n value: string;\n}\n\ninterface LeadPayload {\n firstName: string;\n lastName: string;\n type: string;\n phoneNumber?: string;\n branchId: string;\n email?: string;\n metaData: LeadMetaData[];\n}\n\nexport interface LeadResponse {\n id?: string;\n branchId?: string;\n}\n\nexport interface SubmitLeadProps {\n itemId: string;\n branchId: string;\n communication: LeadCommunication;\n firstName: string;\n lastName: string;\n phoneNumber?: string;\n email?: string;\n message?: string;\n tradeInCarRegNo?: string;\n tradeInCarMileage?: string;\n}\n\n/**\n * Posts a lead straight to lead-service, same contract and metadata keys as\n * website-components-react so leads from any Wayke-powered site look the same in Dealer.\n * `source` (hostname) + `sourceMechanism` is what gives the dealer traceability.\n */\nconst useSubmitLead = (leadUrl: string, marketCode: MarketCode = 'SE') => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submitLead = useCallback(\n async ({\n itemId,\n branchId,\n communication,\n firstName,\n lastName,\n phoneNumber,\n email,\n message,\n tradeInCarRegNo,\n tradeInCarMileage,\n }: SubmitLeadProps): Promise<LeadResponse> => {\n setIsLoading(true);\n setError(null);\n\n const payload: LeadPayload = {\n firstName,\n lastName,\n phoneNumber,\n email,\n branchId,\n type: 'registrationOfInterestToBuy',\n metaData: [\n { key: 'source', value: window.location.hostname.replace(/^www\\./, '') },\n { key: 'sourceMechanism', value: `cta.${communication}` },\n // Lets Wayke tell leads from this package apart from dealer sites and wayke.se.\n { key: 'client', value: 'components-react' },\n { key: 'clientVersion', value: packageJson.version },\n { key: 'itemForSaleId', value: itemId },\n ...(tradeInCarRegNo ? [{ key: 'registrationNumber', value: tradeInCarRegNo }] : []),\n // readingUnit describes the unit of tradeInCarMileage, so it only travels with it.\n ...(tradeInCarMileage\n ? [\n { key: 'tradeInCarMileage', value: tradeInCarMileage },\n {\n key: 'readingUnit',\n value: marketCode === 'NO' ? 'Kilometer' : 'ScandinavianMile',\n },\n ]\n : []),\n { key: 'message', value: message || '' },\n ],\n };\n\n try {\n const response = await fetch(leadUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n return (await response.json()) as LeadResponse;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Something went wrong');\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [leadUrl, marketCode]\n );\n\n return { isLoading, error, submitLead };\n};\n\nexport default useSubmitLead;\n", "{\n \"name\": \"@wayke-se/components-react\",\n \"version\": \"6.0.0-beta.4\",\n \"description\": \"\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./style.css\": \"./dist/style.css\",\n \"./package.json\": \"./package.json\"\n },\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"npm run clean\",\n \"test\": \"npm run lint && npm run typecheck\",\n \"lint\": \"npx @biomejs/biome check\",\n \"lint:fix\": \"npx @biomejs/biome check --write\",\n \"typecheck\": \"tsc --noEmit --skipLibCheck\",\n \"generate-libphonenumber-metadata\": \"libphonenumber-metadata-generator src/utils/metadata.min.json --countries SE,NO --extended\",\n \"prepare\": \"husky\",\n \"start\": \"node ./esbuild/start.js\",\n \"build\": \"npm run clean && node ./esbuild/lib.js && node ./esbuild/cdn.js\",\n \"clean\": \"rimraf build && rimraf dist && rimraf dist-cdn\",\n \"build:types\": \"tsc --project tsconfig.build.json\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/wayke-se/components-react.git\"\n },\n \"author\": \"Ourstudio\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\",\n \"styled-components\": \"^6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.6.3\",\n \"@types/node\": \"^24.19.2\",\n \"@types/react\": \"^19.3.0\",\n \"@types/react-dom\": \"^19.3.0\",\n \"dotenv\": \"^18.0.9\",\n \"esbuild\": \"^0.28.2\",\n \"husky\": \"^9.1.7\",\n \"libphonenumber-metadata-generator\": \"^2.0.6\",\n \"lint-staged\": \"^17.6.0\",\n \"react\": \"^19.3.1\",\n \"react-dom\": \"^19.3.1\",\n \"react-router-dom\": \"^7.18.5\",\n \"rimraf\": \"^6.1.3\",\n \"styled-components\": \"^6.6.0\",\n \"typescript\": \"^7.0.2\"\n },\n \"dependencies\": {\n \"@emotion/is-prop-valid\": \"^1.4.0\",\n \"@photo-sphere-viewer/core\": \"^5.15.1\",\n \"@radix-ui/react-slider\": \"^1.6.1\",\n \"@wayke-se/ecom-web\": \"^2.1.1\",\n \"date-fns\": \"^4.4.0\",\n \"dompurify\": \"^3.4.17\",\n \"i18next\": \"^26.5.11\",\n \"libphonenumber-js\": \"^1.13.15\",\n \"marked\": \"^18.1.2\",\n \"react-i18next\": \"^17.1.9\"\n },\n \"allowScripts\": {\n \"esbuild\": true,\n \"fsevents\": false\n }\n}\n", "import * as React from 'react';\n\nimport { Input, Label, LabelText, Wrapper } from './wrapper';\n\ntype Props = React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n> & {\n id: string;\n children: React.ReactNode;\n};\n\nconst InputCheckbox = ({ children, ...props }: Props) => {\n const { id } = props;\n return (\n <Wrapper aria-labelledby={id ? `${id}-label` : undefined}>\n <Input\n {...(props as React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n >)}\n />\n <Label id={`${id}-label`} htmlFor={id}>\n <LabelText>{children}</LabelText>\n </Label>\n </Wrapper>\n );\n};\n\nexport default InputCheckbox;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Label = styled.label.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: flex;\n align-items: flex-start;\n font-size: 1rem;\n line-height: 1.2;\n cursor: pointer;\n\n &:before {\n content: '';\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: ${size(2.5)};\n height: ${size(2.5)};\n margin-right: ${size(1)};\n background-color: ${(props) => props.theme.color.accent};\n color: currentColor;\n border: none;\n box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.07);\n text-align: center;\n font-size: 15px;\n cursor: pointer;\n border-radius: 3px;\n margin-top: -2px;\n }\n`;\n\nexport const Wrapper = styled(\n (\n props: React.HTMLAttributes<HTMLDivElement> & {\n type?: string;\n checked?: boolean;\n error?: boolean;\n }\n ) => <div {...props} />\n).attrs(({ type, checked }) => ({\n role: type || 'checkbox',\n 'aria-checked': checked,\n}))`\n ${({ error }) =>\n error &&\n css`\n ${Label} {\n color: ${(props) => props.theme.color.ui.negative};\n\n &::before {\n background-color: ${(props) => props.theme.color.ui.negativeLight};\n }\n }\n `}\n`;\n\nexport const Input = styled((props: React.InputHTMLAttributes<HTMLInputElement>) => (\n <input {...props} className={`${props.checked ? 'checked' : undefined} ${props.className}`} />\n)).attrs(({ type, checked }) => ({\n checked,\n type: type || 'checkbox',\n}))`\n position: fixed;\n left: -9999px;\n opacity: 0;\n\n &[disabled] {\n & + ${Label} {\n color: ${(props) => props.theme.color.disabledText};\n\n &:before {\n background-color: ${(props) => props.theme.color.disabledBg};\n cursor: not-allowed;\n }\n }\n }\n\n &:checked,\n &.checked {\n & + ${Label} {\n &::before {\n content: '\u2713';\n }\n }\n }\n`;\n\nexport const LabelText = styled.div`\n color: ${(props) => props.theme.color.textDark};\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n id?: string;\n children: React.ReactNode;\n}\n\nconst InputError = ({ id, children }: Props) => (\n <Wrapper id={id} role=\"alert\" aria-live=\"polite\">\n {children}\n </Wrapper>\n);\n\nexport default InputError;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n margin-top: ${size(0.5)};\n font-size: 0.875rem;\n color: ${(props) => props.theme.color.ui.negative};\n`;\n", "import React from 'react';\n\nimport { Textarea, Wrapper } from './wrapper';\n\ntype Props = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n value: string;\n label: string;\n};\n\nconst InputTextarea = ({ label, ...props }: Props) => (\n <Wrapper>\n <Textarea aria-label={label} {...props} />\n </Wrapper>\n);\n\nexport default InputTextarea;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Textarea = styled.textarea.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n min-height: calc(${(props) => props.theme.distances.inputHeight} * 2.5);\n padding: ${size(1.5)} ${size(2)};\n background-color: transparent;\n font-family: inherit;\n font-size: 16px;\n line-height: 1.4;\n border: none;\n border-radius: 0;\n box-shadow: none;\n resize: vertical;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "import styled from 'styled-components';\n\nexport const Field = styled.div`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport { RepeatTiny } from '../Repeat';\n\ninterface ToggleItemProps {\n title: string;\n value: string;\n type: 'tel' | 'mailto';\n /** Overrides the href target (without the `mailto:`/`tel:` scheme). Defaults to `value`. */\n href?: string;\n primary?: boolean;\n onClickVisible?: () => void;\n onClickValue?: () => void;\n}\n\nconst ToggleItem = ({\n title,\n value,\n type,\n href,\n primary,\n onClickVisible,\n onClickValue,\n}: ToggleItemProps) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n const _onClickValue = useCallback(() => {\n if (onClickValue) {\n onClickValue();\n }\n }, [onClickValue]);\n\n const onClick = useCallback(() => {\n if (!visible) {\n setVisible(true);\n if (onClickVisible) {\n onClickVisible();\n }\n }\n }, [visible, onClickVisible]);\n\n const visibleTitle =\n type === 'tel'\n ? t('item.actions.callNumber')\n : type === 'mailto'\n ? t('item.actions.sendEmailTo')\n : '';\n\n const Button = primary ? ButtonPrimary : ButtonSecondary;\n\n return (\n <RepeatTiny>\n {visible ? (\n <Button\n onClick={_onClickValue}\n as=\"a\"\n href={`${type}:${href || value}`}\n title={`${visibleTitle} ${value}`}\n fullWidth\n >\n <ButtonContent>{value}</ButtonContent>\n </Button>\n ) : (\n <Button onClick={onClick} title={title} fullWidth>\n <ButtonContent>{title}</ButtonContent>\n </Button>\n )}\n </RepeatTiny>\n );\n};\n\nexport default ToggleItem;\n", "import React from 'react';\nimport { IconCheck } from '../Icon';\nimport { Icon, Item, Label, List } from './wrapper';\n\nexport interface ICheckMarkList {\n children: React.ReactNode;\n}\n\nexport const CheckMarkListItem = ({ children }: ICheckMarkList) => (\n <Item>\n <Icon>\n <IconCheck block />\n </Icon>\n <Label>{children}</Label>\n </Item>\n);\n\nconst CheckMarkList = ({ children }: ICheckMarkList) => <List>{children}</List>;\n\nexport default CheckMarkList;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n position: relative;\n font-size: 0.875rem;\n\n & + & {\n margin-top: ${size(0.5)};\n }\n`;\n\nexport const Icon = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: absolute;\n left: 0;\n top: 4px; // Magic number\n font-size: 0.875em;\n`;\n\nexport const Label = styled.div`\n padding-left: calc(1em + ${size(1)});\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface IColumn {\n grow?: boolean;\n noShrink?: boolean;\n}\n\nexport const Column = styled.div<IColumn>`\n flex: 0 1 auto;\n\n ${({ grow }) =>\n grow &&\n css`\n flex-grow: 1;\n `}\n\n ${({ noShrink }) =>\n noShrink &&\n css`\n flex-shrink: 0;\n `}\n`;\n\ninterface IColumns {\n $spacing?: number;\n flexWrap?: boolean;\n flexInline?: boolean;\n valign?: 'start' | 'center' | 'end';\n align?: 'start' | 'center' | 'end';\n clearLtSm?: boolean;\n clearLtMd?: boolean;\n}\n\nexport const Columns = styled.div<IColumns>`\n display: flex;\n align-items: flex-start;\n\n ${({ valign }) =>\n valign === 'end'\n ? css`\n align-items: flex-end;\n `\n : valign === 'center'\n ? css`\n align-items: center;\n `\n : css`\n align-items: flex-start;\n `}\n\n ${({ align }) =>\n align === 'end'\n ? css`\n justify-content: flex-end;\n `\n : align === 'center'\n ? css`\n justify-content: center;\n `\n : css`\n justify-content: flex-start;\n `}\n\n ${({ $spacing }) =>\n $spacing &&\n css`\n margin: ${size($spacing / -2)};\n\n & > ${Column} {\n padding: ${size($spacing / 2)};\n }\n `}\n\n ${({ flexWrap }) =>\n flexWrap &&\n css`\n flex-wrap: wrap;\n `}\n\n ${({ flexInline }) =>\n flexInline &&\n css`\n display: inline-flex;\n `}\n\n ${({ clearLtSm }) =>\n clearLtSm &&\n css`\n ${(props) => props.theme.breakpoint.LtSm} {\n display: block;\n }\n `}\n\n ${({ clearLtMd }) =>\n clearLtMd &&\n css`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: block;\n }\n `}\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface StateIndicatorProps {\n $tone?: 'success' | 'pending' | 'error';\n}\n\nexport const StateIndicator = styled.div<StateIndicatorProps>`\n width: ${size(1)};\n height: ${size(1)};\n border-radius: 50%;\n\n ${({ $tone }) =>\n $tone === 'success'\n ? css`\n background-color: ${(props) => props.theme.color.ui.positive};\n `\n : $tone === 'pending'\n ? css`\n background-color: ${(props) => props.theme.color.ui.neutral};\n `\n : $tone === 'error'\n ? css`\n background-color: ${(props) => props.theme.color.ui.negative};\n `\n : css`\n background-color: ${(props) => props.theme.color.textDarkLighten};\n `}\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../Button';\nimport { IconInfo } from '../Icon';\nimport Modal from '../Modal';\nimport { Action, Body, Header, Info, InfoBtn, InfoContent, Title, Wrapper } from './wrapper';\n\ninterface Props {\n title: string;\n body?: string;\n actionTitle?: string;\n children: React.ReactNode;\n onClick?: () => void;\n}\n\nconst SwitchBar = ({ title, body, actionTitle, children, onClick }: Props) => {\n const { t } = useTranslation();\n const [info, setInfo] = useState(false);\n const onToggleInfo = useCallback(() => setInfo(!info), [info]);\n\n return (\n <>\n <Wrapper>\n <Header>\n <Info>\n <InfoContent>\n <Title>{title}</Title>\n </InfoContent>\n {children && (\n <InfoContent>\n <InfoBtn onClick={onToggleInfo} title={t('common.moreInformation') || ''}>\n <IconInfo block />\n </InfoBtn>\n </InfoContent>\n )}\n </Info>\n {actionTitle && (\n <Action>\n <ButtonInline onClick={onClick} title={actionTitle}>\n {actionTitle}\n </ButtonInline>\n </Action>\n )}\n </Header>\n {body && <Body>{body}</Body>}\n </Wrapper>\n {info && (\n <Modal title={title} onClose={onToggleInfo}>\n {children}\n </Modal>\n )}\n </>\n );\n};\n\nexport default SwitchBar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n padding: ${size(1.5)} ${size(2)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n font-size: 0.875rem;\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Body = styled.div`\n font-size: 0.875rem;\n margin-top: ${size(1)};\n`;\n\nexport const Info = styled.div`\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n padding-left: ${size(1.5)};\n font-size: 0.875rem;\n`;\n\nexport const InfoContent = styled.div`\n & + & {\n margin-left: ${size(0.75)};\n }\n`;\n\nexport const InfoBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Title = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1rem;\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport LogoBox from '../../components/LogoBox';\nimport Modal from '../../components/Modal';\nimport { Repeat } from '../../components/Repeat';\n\ninterface ModelLink {\n url?: string | null;\n title?: string | null;\n}\n\nexport interface PackageOptionModalData {\n title?: string | null;\n image?: string | null;\n description?: string | null;\n link?: ModelLink | null;\n}\n\ninterface PackageOptionsModalProps {\n packageOption: PackageOptionModalData;\n onClose: () => void;\n}\n\nconst PackageOptionModal = ({ packageOption, onClose }: PackageOptionsModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={packageOption.title || ''} onClose={onClose}>\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={packageOption.title || undefined} wide />\n </Repeat>\n )}\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default PackageOptionModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Content from '../../components/Content';\nimport Modal from '../../components/Modal';\n\ninterface DemoCarModalProps {\n onClose: () => void;\n}\n\nconst DemoCarModal = ({ onClose }: DemoCarModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={t('item.demoCar')} onClose={onClose}>\n <Content>\n <p>{t('item.demoCarDescription')}</p>\n </Content>\n </Modal>\n );\n};\n\nexport default DemoCarModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport DocumentList from '../../components/DocumentList';\nimport ExtendContent from '../../components/ExtendContent';\nimport { H2, H3 } from '../../components/Heading';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { AdDocument } from '../../Gql/ad/types';\n\nconst SortOrder = {\n 'tyre-label': 2,\n 'content declaration': 1,\n other: 3,\n};\n\ntype CategoryType = keyof typeof SortOrder;\n\ninterface DocumentCategory {\n category: string;\n sortOrder: number;\n documents: AdDocument[];\n}\n\ninterface DocumentsProps {\n documents: AdDocument[];\n}\n\nconst Documents = ({ documents }: DocumentsProps) => {\n const { t } = useTranslation();\n\n const Translation = {\n 'tyre-label': t('item.documentTypes.tireEnergyDeclaration'),\n 'content declaration': t('item.documentTypes.goodsDeclaration'),\n other: t('item.documentTypes.other'),\n };\n\n const categorised = documents\n .reduce((prev, curr) => {\n const index = prev.findIndex((x) => x.category === (curr.category || 'others'));\n if (index > -1) {\n prev[index].documents.push(curr);\n } else {\n const category = curr.category || 'others';\n prev.push({\n category,\n documents: [curr],\n sortOrder: SortOrder?.[category as CategoryType] ?? 99,\n });\n }\n\n return prev;\n }, [] as DocumentCategory[])\n .sort((a, b) => a.sortOrder - b.sortOrder);\n\n if (!documents.length) return null;\n\n const manyCategories = categorised.length > 1;\n\n return (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{t('item.documents')}</H2>\n </Repeat>\n <Repeat>\n <ExtendContent actionTitle={t('common.showMore')}>\n {categorised.map((group) => (\n <Repeat key={group.category}>\n {manyCategories && (\n <H3>{Translation?.[group.category as CategoryType] || Translation.other}</H3>\n )}\n <DocumentList documents={group.documents} />\n </Repeat>\n ))}\n </ExtendContent>\n </Repeat>\n </ProductPageMainSection>\n );\n};\n\nexport default Documents;\n", "import React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdDocument } from '../../Gql/ad/types';\nimport {\n List,\n PdfColumn,\n PdfLink,\n PdfListInner,\n PdfListItem,\n PdfSubtitle,\n PdfTitle,\n} from './wrapper';\n\ninterface PdfDownloadItemProps {\n document: AdDocument;\n}\n\nconst translateContentType = (document: AdDocument) => {\n switch (document.contentType) {\n case 'application/pdf':\n return 'PDF';\n default: {\n const formattedContentType =\n document.uri && document.uri.includes('.') ? document.uri.split('.').pop() : '';\n return formattedContentType;\n }\n }\n};\n\nexport const PdfDownloadItem = ({ document }: PdfDownloadItemProps) => {\n const { t } = useTranslation();\n const contentType = useMemo(() => translateContentType(document), [document]);\n return (\n <PdfListItem>\n <PdfListInner>\n <PdfColumn>\n <PdfTitle>{document.name}</PdfTitle>\n <PdfSubtitle>{contentType}</PdfSubtitle>\n </PdfColumn>\n <PdfColumn>\n <PdfLink\n href={document.uri}\n rel=\"noopener noreferrer nofollow\"\n target=\"_blank\"\n title={t('other.openDocument', { document: document.name })}\n >\n {t('common.open')}\n </PdfLink>\n </PdfColumn>\n </PdfListInner>\n </PdfListItem>\n );\n};\n\ninterface IDocumentList {\n documents: AdDocument[];\n}\n\nexport const DocumentList = ({ documents }: IDocumentList) => (\n <List>\n {documents.map((document, i) => (\n <PdfDownloadItem key={`${document.uri}-${i}`} document={document} />\n ))}\n </List>\n);\n\nexport default DocumentList;\n", "import styled from 'styled-components';\nimport { size } from '../../layout/helpers';\n\nexport const PdfListItem = styled.li.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n flex: 0 0 50%;\n padding: ${size(1)};\n\n ${({ theme }) => theme.breakpoint.LtSm} {\n flex: 0 0 100%;\n }\n`;\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n margin: ${size(-1)};\n`;\n\nexport const PdfLink = styled.a.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n text-decoration: none;\n font-size: 0.875rem;\n &:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n`;\n\nexport const PdfTitle = styled.div`\n color: ${(props) => props.theme.color.textDark};\n`;\nexport const PdfSubtitle = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n`;\n\nexport const PdfColumn = styled.div`\n flex: 0 0 auto;\n &:first-child {\n flex: 1 1 auto;\n }\n`;\n\nexport const PdfListInner = styled.div`\n position: relative;\n border: 1px solid ${(props) => props.theme.color.border};\n padding: ${size(1.5)};\n display: flex;\n align-items: center;\n &:hover {\n background-color: ${(props) => props.theme.color.hoverOverlay};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { H2 } from '../../components/Heading';\nimport LogoBox from '../../components/LogoBox';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { PackageOffer } from '../../Gql/ad/view';\n\ninterface ManufacturerPackageOption {\n packageOption?: PackageOffer;\n}\n\nconst ManufacturerPackageOption = ({ packageOption }: ManufacturerPackageOption) => {\n const { t } = useTranslation();\n if (!packageOption) {\n return null;\n }\n\n return (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{packageOption.title}</H2>\n </Repeat>\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={t('common.logotype') || ''} wide />\n </Repeat>\n )}\n </ProductPageMainSection>\n );\n};\n\nexport default ManufacturerPackageOption;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { H2 } from '../../components/Heading';\nimport LogoBox from '../../components/LogoBox';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { PackageOffer } from '../../Gql/ad/view';\n\ninterface PackageOptionsProps {\n packageOptions: PackageOffer[];\n}\n\nconst PackageOptions = ({ packageOptions }: PackageOptionsProps) => {\n const { t } = useTranslation();\n return (\n <>\n {packageOptions.map((packageOption, index) => (\n <ProductPageMainSection key={packageOption.title || index}>\n <Repeat>\n <H2 noMargin>{packageOption.title}</H2>\n </Repeat>\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={t('common.logotype') || ''} wide />\n </Repeat>\n )}\n </ProductPageMainSection>\n ))}\n </>\n );\n};\n\nexport default PackageOptions;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Container from '../../components/Container';\nimport { H1 } from '../../components/Heading';\nimport { Page, PageSection } from '../../components/Page';\n\nconst Page404 = () => {\n const { t } = useTranslation();\n return (\n <Page>\n <PageSection large>\n <Container>\n <H1 noMargin>{t('other.error404')}</H1>\n </Container>\n </PageSection>\n </Page>\n );\n};\n\nexport default Page404;\n", "import React from 'react';\n\nimport Container from '../../components/Container';\nimport Loader from '../../components/Loader';\nimport { Page, PageSection } from '../../components/Page';\n\nconst PageLoading = () => (\n <Page>\n <PageSection large>\n <Container>\n <Loader />\n </Container>\n </PageSection>\n </Page>\n);\n\nexport default PageLoading;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Category, Property } from '../../@types/vehicle-properties';\nimport { H5 } from '../../components/Heading';\nimport { Repeat } from '../../components/Repeat';\nimport { TableList } from '../../components/TableList';\nimport Tabs from '../../components/Tabs';\nimport propertyTree from '../../Gql/ad/propertyTree';\nimport useAdContext from '../../State/Ad/AdContext';\nimport MetadataItem from './MetadataItem';\n\ninterface MetadataSubCategoryProps {\n name: string;\n properties: Property[];\n}\n\nconst MetadataSubCategory = ({ name, properties }: MetadataSubCategoryProps) => (\n <Repeat>\n <H5 as=\"h3\">{name}</H5>\n <TableList>\n {!!properties.length &&\n properties.map((property, index) => (\n <MetadataItem\n name={property.name}\n hint={property.hint}\n value={property.value}\n unit={property.unit}\n key={`${property.name}-${index}`}\n />\n ))}\n </TableList>\n </Repeat>\n);\n\ninterface MetadataCaregoryProps {\n properties: Property[];\n subCategories: Category[];\n}\n\nconst MetadataCategory = ({ properties, subCategories }: MetadataCaregoryProps) => (\n <div className=\"tab-section\">\n {!!properties.length && (\n <Repeat>\n <TableList>\n {properties.map((property, index) => (\n <MetadataItem\n name={property.name}\n hint={property.hint}\n value={property.value}\n unit={property.unit}\n key={`${property.name}-${index}`}\n />\n ))}\n </TableList>\n </Repeat>\n )}\n {!!subCategories.length &&\n subCategories.map((subCategory, index) => (\n <MetadataSubCategory\n name={subCategory.name}\n properties={subCategory.properties}\n key={`${subCategory.name}-${index}`}\n />\n ))}\n </div>\n);\n\nconst PropertySet = () => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [activeCategoryId, setActiveCategoryId] = useState(-1);\n const mappedProperties = useMemo(() => propertyTree(ad, t), [ad, t]);\n\n useEffect(() => {\n const categories =\n mappedProperties?.categories?.length !== undefined ? mappedProperties?.categories : undefined;\n\n if (activeCategoryId < 0 && categories !== undefined && categories.length > 0) {\n setActiveCategoryId(categories[0].id);\n }\n }, [mappedProperties]);\n\n const onTab = useCallback((id: string) => setActiveCategoryId(parseInt(id, 10)), []);\n\n const activeCategory = mappedProperties?.categories?.find(\n (category) => category.id === activeCategoryId\n );\n\n return (\n <>\n <Repeat>\n <Tabs\n tabs={\n mappedProperties?.categories?.map((category) => ({\n name: `${category.id}`,\n displayName: category.name,\n })) || []\n }\n active={`${activeCategoryId}`}\n onClick={onTab}\n />\n </Repeat>\n {activeCategory && (\n <Repeat>\n <MetadataCategory\n properties={activeCategory.properties}\n subCategories={activeCategory.subCategories}\n />\n </Repeat>\n )}\n </>\n );\n};\n\nexport default PropertySet;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const TableList = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n border-top: 1px solid ${(props) => props.theme.color.border};\n border-bottom: 1px solid ${(props) => props.theme.color.border};\n font-size: 0.875rem;\n`;\n\nexport const TableListItem = styled.li`\n display: flex;\n align-items: center;\n padding: ${size(1)} 0;\n\n & + & {\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n`;\n\nexport const TableListKey = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const TableListValue = styled.div`\n flex-shrink: 0;\n padding-left: ${size(1)};\n`;\n\nexport const TableListBooleanPos = styled.div`\n color: ${(props) => props.theme.color.ui.positive};\n`;\n\nexport const TableListBooleanNeg = styled.div`\n color: ${(props) => props.theme.color.ui.negative};\n`;\n", "import * as React from 'react';\n\nimport { Action, Item, List, Wrapper } from './wrapper';\n\nexport interface ITabItem {\n name: string;\n displayName: string;\n}\n\nexport interface ITabInterface<T> {\n tabs: ITabItem[];\n active: string;\n onClick?: (name: T) => void;\n}\n\nconst Tabs = <T extends {}>({ tabs, active, onClick }: ITabInterface<T>) => (\n <Wrapper>\n <List>\n {tabs.map((tab) => (\n <Item key={tab.name}>\n <Action\n title={tab.displayName}\n onClick={onClick ? () => onClick(tab.name as unknown as T) : undefined}\n active={tab.name === active ? 'true' : undefined}\n >\n {tab.displayName}\n </Action>\n </Item>\n ))}\n </List>\n </Wrapper>\n);\n\nexport default Tabs;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n overflow: hidden;\n margin-top: ${size(-1)};\n margin-left: ${size(-1)};\n margin-right: ${size(-1)};\n\n ${(props) => props.theme.breakpoint.LtSm} {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n }\n`;\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n white-space: nowrap;\n font-size: 0;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding-left: ${size(1)};\n padding-right: ${size(1)};\n }\n`;\n\nexport const Item = styled.li`\n display: inline-block;\n vertical-align: bottom;\n font-size: 1rem;\n`;\n\ntype ActionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n active?: boolean | string;\n};\n\nexport const Action = styled(ButtonReset).attrs(() => ({\n role: 'tab',\n className: 'wayke__theme wayke__font--bold',\n}))<ActionProps>`\n position: relative;\n display: block;\n padding: ${size(1)};\n color: ${(props) => props.theme.color.textDarkLighten};\n\n &:hover {\n color: ${(props) => props.theme.color.textDark};\n }\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: ${size(1)};\n right: ${size(1)};\n height: 2px;\n background-color: ${(props) => props.theme.color.textDark};\n transform: scaleY(0);\n transition: transform 200ms ease;\n z-index: 1;\n }\n\n ${(props) =>\n props.active &&\n css`\n color: ${(props) => props.theme.color.textDark};\n\n &::after {\n transform: scaleY(1);\n }\n `}\n`;\n", "// The \"Fordonsdata\" tabs: the vehicle's attributes by category, with the basics\n// first, as web-ui-v2 shows them.\n\nimport { TFunction } from 'i18next';\nimport { Category, Property, Tree } from '../../@types/vehicle-properties';\nimport { Ad, AttributeCategory, AttributeValue } from './types';\n\nconst toProperty = (v: AttributeValue): Property => {\n const isBoolean =\n v.__typename === 'BooleanProperty' ||\n v.formattedValue === 'true' ||\n v.formattedValue === 'false';\n return {\n name: v.label,\n type: isBoolean ? 'boolean' : 'text',\n value: isBoolean ? v.formattedValue === 'true' : v.formattedValue,\n unit: null,\n hint: null,\n };\n};\n\nconst toCategory = (c: AttributeCategory, id: number): Category => ({\n id,\n name: c.displayName,\n properties: c.values.map(toProperty),\n subCategories: (c.categories || [])\n .filter((s) => s.values.length)\n .map((s, i) => toCategory(s, id * 100 + i + 1)),\n});\n\nconst propertyTree = (ad: Ad, t: TFunction): Tree => {\n const item = ad.iteration?.item;\n const odometer = ad.iteration?.logistics?.odometerReading;\n const basic: Property[] = [];\n const add = (key: string, value?: string | number | null, unit?: string, withHint?: boolean) => {\n if (value !== undefined && value !== null && value !== '') {\n basic.push({\n name: t(`customProperty.${key}.displayName`),\n value,\n type: typeof value === 'number' ? 'number' : 'text',\n unit: unit || null,\n hint: withHint ? t(`customProperty.${key}.hint`) : null,\n });\n }\n };\n const attributes = item?.attributes;\n const modelSeries = item?.modelSeries?.stringValue;\n // As web-ui-v2: the version is modelVariant; modelName only when it says more than the model.\n const modelName = item?.modelName?.stringValue;\n const version =\n item?.modelVariant?.stringValue || (modelName !== modelSeries ? modelName : undefined);\n\n add('manufacturer', item?.manufacturer?.stringValue);\n add('modelSeries', modelSeries);\n add('modelName', version, undefined, true);\n add('modelYear', item?.modelYear?.intValue, undefined, true);\n add('manufactureYear', item?.manufactureYear?.intValue, undefined, true);\n if (odometer) {\n add(\n 'odometer',\n odometer.value,\n t(`odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`)\n );\n }\n add('gearboxType', attributes?.transmission?.formattedValue);\n add('color', attributes?.exteriorColor?.formattedValue);\n add('registrationNumber', item?.registrationNumber?.stringValue);\n add('chassis', item?.authority?.chassis?.stringValue || attributes?.chassisType?.formattedValue);\n add(\n 'segment',\n item?.authority?.segment?.stringValue || attributes?.vehicleClassification?.formattedValue\n );\n add('annualTax', item?.authority?.annualTax?.formattedValue);\n add('numberOfDoors', attributes?.doorsCount?.formattedValue);\n add('fuelType', item?.driveline?.fuelTypesString?.stringValue, undefined, true);\n add('enginePower', attributes?.enginePower?.formattedValue);\n\n const categories = (item?.attributes?.byCategory || [])\n .map((c, i) => toCategory(c, i + 1))\n .filter((c) => c.properties.length || c.subCategories.length);\n\n // The API's own basic category takes the basics above in front of its values.\n const basicIndex = categories.findIndex((c) => c.name === t('category.basic'));\n if (basicIndex > -1) {\n const [existing] = categories.splice(basicIndex, 1);\n categories.unshift({ ...existing, properties: [...basic, ...existing.properties] });\n } else {\n categories.unshift({\n id: 1000,\n name: t('category.basic'),\n properties: basic,\n subCategories: [],\n });\n }\n return { categories };\n};\n\nexport default propertyTree;\n", "import { TFunction } from 'i18next';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Property } from '../../@types/vehicle-properties';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { IconCancel, IconCheck } from '../../components/Icon';\nimport Modal from '../../components/Modal';\nimport { SrOnly } from '../../components/SrOnly';\nimport {\n TableListBooleanNeg,\n TableListBooleanPos,\n TableListItem,\n TableListKey,\n TableListValue,\n} from '../../components/TableList';\n\nconst formatValue = (\n t: TFunction<'translation', undefined>,\n value: Property['value'],\n unit: Property['unit']\n) => {\n if (typeof value === 'boolean') {\n return value ? (\n <TableListBooleanPos title={t('common.yes') || ''}>\n <SrOnly>{t('common.yes')}</SrOnly>\n <IconCheck block />\n </TableListBooleanPos>\n ) : (\n <TableListBooleanNeg title={t('common.no') || ''}>\n <SrOnly>{t('common.no')}</SrOnly>\n <IconCancel block />\n </TableListBooleanNeg>\n );\n }\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n if (!!value && !!unit) {\n return `${value} ${unit}`;\n }\n return value;\n};\n\ninterface MetadataItemProps {\n name: string;\n hint?: string | null | undefined;\n value: Property['value'];\n unit: Property['unit'];\n}\n\nconst MetadataItem = ({ name, hint, value, unit }: MetadataItemProps) => {\n const { t } = useTranslation();\n const [foldout, setFoldout] = useState(false);\n const onToggleFoldout = useCallback(() => setFoldout(!foldout), [foldout]);\n\n const presentedValue = formatValue(t, value, unit);\n\n return (\n <TableListItem>\n <TableListKey>\n {hint ? (\n <ButtonInline\n onClick={onToggleFoldout}\n title={t('item.moreInfoAboutSubject', { subject: name }) || ''}\n >\n {name}\n </ButtonInline>\n ) : (\n name\n )}\n </TableListKey>\n <TableListValue>\n {value !== undefined ? presentedValue : t('item.dataNotAvailable')}\n </TableListValue>\n {hint && foldout && (\n <Modal title={name} onClose={onToggleFoldout}>\n <Content html={hint} />\n </Modal>\n )}\n </TableListItem>\n );\n};\n\nexport default MetadataItem;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Container from '../../components/Container';\nimport { H2 } from '../../components/Heading';\nimport OverflowGrid from '../../components/OverflowGrid';\nimport { PageSection } from '../../components/Page';\nimport HitCard from '../../components/ProductCard/HitCard';\nimport { Repeat } from '../../components/Repeat';\nimport SectionHeader from '../../components/SectionHeader';\nimport useRelatedAds from '../../Gql/ad/useRelatedAds';\nimport useSettings from '../../State/Settings/useSettings';\n\ninterface RelatedProps {\n adId: string;\n manufacturer?: string;\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\n/** The latest cars of the same make, then of other makes. */\nconst Related = ({ adId, manufacturer, placeholderImage, displayBranchName }: RelatedProps) => {\n const { t } = useTranslation();\n const { publicApi } = useSettings();\n const { hits } = useRelatedAds(publicApi, adId, manufacturer);\n\n if (!hits?.length) {\n return null;\n }\n\n return (\n <PageSection accent large className=\"wayke__theme wayke__color--accent-bg\">\n <Container>\n <Repeat>\n <SectionHeader>\n <H2 noMargin>{t('item.relatedVehicles')}</H2>\n </SectionHeader>\n </Repeat>\n <Repeat>\n <OverflowGrid\n accentBg\n columns={1.05}\n columnsSm={2.1}\n columnsMd={3}\n spacing={2}\n items={hits.map((hit) => (\n <HitCard\n key={hit.ad.id}\n hit={hit}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n ))}\n />\n </Repeat>\n </Container>\n </PageSection>\n );\n};\n\nexport default Related;\n", "import React from 'react';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Action, Heading, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n onClick?: () => void;\n actionTitle?: string;\n}\n\nconst SectionHeader = ({ children, onClick, actionTitle }: Props) => (\n <Wrapper>\n <Heading>{children}</Heading>\n {onClick && actionTitle && (\n <Action>\n <ButtonClear as=\"a\" href=\"#\" onClick={onClick}>\n <ButtonContent>{actionTitle}</ButtonContent>\n </ButtonClear>\n </Action>\n )}\n </Wrapper>\n);\n\nexport default SectionHeader;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n padding-left: ${size(2)};\n`;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { SearchData, SearchHit } from '../types';\nimport { RELATED_ADS_QUERY } from './queries';\n\n/**\n * \"Fler bilar\" on the ad page: the latest cars of the same make, the current\n * ad excluded, filled up with the latest of other makes when the make has too\n * few, so a site with one car of a make still shows related cars as 5.x did.\n * There is no more-like-this in the public API.\n */\nconst useRelatedAds = (\n settings: PublicApiSettings,\n adId: string,\n manufacturer?: string,\n limit = 3\n) => {\n const [hits, setHits] = useState<SearchHit[]>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n let active = true;\n const latest = (make: string | undefined, perPage: number) =>\n gqlQuery<SearchData>(settings.api, RELATED_ADS_QUERY, {\n market: [settings.market],\n branchGroupId: settings.branchGroupId,\n manufacturer: make ? [make] : undefined,\n perPage,\n }).then((data) => (data.search?.ads?.hits || []).filter((h) => h.ad.id !== adId));\n\n setLoading(true);\n latest(manufacturer, limit + 1)\n .then(async (sameMake) => {\n if (sameMake.length >= limit || !manufacturer) return sameMake;\n const taken = new Set(sameMake.map((h) => h.ad.id));\n // Enough to skip the current ad and the ones already taken.\n const others = (await latest(undefined, limit * 2 + 1)).filter((h) => !taken.has(h.ad.id));\n return [...sameMake, ...others];\n })\n .then((related) => active && setHits(related.slice(0, limit)))\n .catch(() => undefined)\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [settings.api.url, settings.branchGroupId, adId, manufacturer, limit]);\n\n return { loading, hits };\n};\n\nexport default useRelatedAds;\n", "import { useEffect, useRef } from 'react';\nimport { Ad } from '../../Gql/ad/types';\nimport { adEvent, waykeId } from '../../Gql/ad/view';\nimport { Settings } from '../../State/Settings/settings';\nimport PubSub from '../../utils/pubsub/pubsub';\n\ninterface EcomWeb {\n start: () => void;\n destroy: () => void;\n}\n\n/**\n * Buy online. ecom-web is keyed on the legacy waykeId: the commerce order flow\n * answers 404 on ad.id for ads from before ads-service.\n */\nfunction useEcom(ad: Ad, ecom: Settings['ecom'], marketCode: Settings['marketCode']) {\n const ecomContext = useRef<EcomWeb | undefined>(undefined);\n const id = waykeId(ad);\n\n useEffect(() => {\n if (!ecom) return;\n let destroyed = false;\n import('@wayke-se/ecom-web')\n .then((module) => {\n if (destroyed) return;\n ecomContext.current = new module.default({\n id,\n ecomSdkConfig: {\n api: {\n address: ecom.url,\n },\n bankIdThumbprint: ecom.bankIdThumbprint,\n },\n logo: ecom.serviceLogotypeUrl,\n logoX2: ecom.serviceLogotypeUrl,\n // Language, and Drive's look in Norway\n marketCode,\n onEvent: (view, event, currentStep?, data?) => {\n PubSub.publish('Ecom', { ...adEvent(ad), view, event, currentStep, data });\n },\n });\n })\n .catch(() => undefined);\n return () => {\n destroyed = true;\n ecomContext.current?.destroy();\n ecomContext.current = undefined;\n };\n }, [id]);\n\n return ecomContext;\n}\n\nexport default useEcom;\n", "import React from 'react';\n\nimport WaykeProvider, { WaykeProviderProps } from '../providers/WaykeProvider';\nimport WaykeComposite, { WaykeCompositeProps } from './WaykeComposite';\n\nexport interface WaykeCompositeWithProviderProps {\n provider?: WaykeProviderProps;\n composite?: WaykeCompositeProps;\n}\n\nconst WaykeCompositeWithProvider = ({ provider, composite }: WaykeCompositeWithProviderProps) => (\n <WaykeProvider {...provider}>\n <WaykeComposite {...composite} />\n </WaykeProvider>\n);\n\nexport default WaykeCompositeWithProvider;\n", "import React, { useMemo } from 'react';\n\nimport packageJson from '../../package.json';\nimport Root from '../components/Root';\nimport useInitializeTranslation from '../hooks/useInitializeTranslation';\nimport RouterProvider from '../State/Router/RouterProvider';\nimport SearchProvider from '../State/Search/SearchProvider';\nimport { SettingsContext } from '../State/Settings/SettingsContext';\nimport { resolveSettings, WaykeProviderSettings } from '../State/Settings/settings';\nimport Theme from './themeProvider';\n\nexport type { EcomSettings, WaykeProviderSettings } from '../State/Settings/settings';\n\nexport type WaykeProviderProps = WaykeProviderSettings & {\n children?: React.ReactNode;\n};\n\n/**\n * Settings, routing, the search state and the theme for every Wayke component\n * under it. Place it close to the root of the app, so its cache is kept.\n */\nconst WaykeProvider = ({ children, ...settings }: WaykeProviderProps) => {\n // Settings arrive as a new object on every render of the parent; only their content matters.\n const key = JSON.stringify(settings);\n const resolved = useMemo(() => resolveSettings(settings), [key]);\n const initialized = useInitializeTranslation(resolved.marketCode);\n\n return (\n <SettingsContext.Provider value={resolved}>\n <RouterProvider>\n <SearchProvider>\n <Theme>\n <Root data-version={packageJson.version}>{initialized ? children : null}</Root>\n </Theme>\n </SearchProvider>\n </RouterProvider>\n </SettingsContext.Provider>\n );\n};\n\nexport default WaykeProvider;\n", "import styled from 'styled-components';\n\nconst Root = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n background-color: ${(props) => props.theme.color.bg};\n color: ${(props) => props.theme.color.textDark};\n font-size: 1rem;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n\n a img {\n border: 0;\n }\n`;\n\nexport default Root;\n", "import { useCallback, useEffect, useState } from 'react';\nimport { MarketCode } from '../@types/market';\nimport { i18nScoped, initializeI18n } from '../utils/I18n';\n\nconst useInitializeTranslation = (marketCode?: MarketCode) => {\n const [initialized, setInitialized] = useState(() => !!i18nScoped.isInitialized);\n\n const initialize = useCallback(async (m?: MarketCode) => {\n await initializeI18n(m);\n setInitialized(true);\n }, []);\n\n useEffect(() => {\n if (!i18nScoped.isInitialized) {\n initialize(marketCode);\n }\n }, []);\n\n return initialized;\n};\n\nexport default useInitializeTranslation;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport useSettings from '../Settings/useSettings';\nimport { RouterContext, RouterContextProps } from './RouterContext';\n\n// Any UUID version: ads from the public API have UUID v7 ids.\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst snapshot = () => ({\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n});\n\n/** A hash that is not a vehicle id (`#content` from a skip link) leaves the search showing. */\nconst idFromHash = (hash: string) => {\n const value = hash.slice(1);\n return UUID.test(value) ? value : undefined;\n};\n\n/** The vehicle id is a whole path segment, so a slug after it (`/<id>/volvo-v60`) is fine. */\nconst idFromPath = (pathname: string) =>\n pathname\n .split('/')\n .filter((s) => UUID.test(s))\n .pop();\n\ninterface RouterProviderProps {\n children: React.ReactNode;\n}\n\nconst RouterProvider = ({ children }: RouterProviderProps) => {\n const { routing } = useSettings();\n const [location, setLocation] = useState(snapshot);\n\n useEffect(() => {\n const update = () => setLocation(snapshot());\n window.addEventListener('popstate', update);\n window.addEventListener('hashchange', update);\n return () => {\n window.removeEventListener('popstate', update);\n window.removeEventListener('hashchange', update);\n };\n }, []);\n\n // Resolved once, from the page the components were mounted on, like a relative link.\n const base = useMemo(\n () =>\n routing.mode === 'path' && routing.basePath\n ? new URL(routing.basePath.replace(/\\/+$/, ''), window.location.href)\n : undefined,\n [routing.mode, routing.basePath]\n );\n\n const id =\n routing.mode === 'hash'\n ? idFromHash(location.hash)\n : routing.mode === 'path'\n ? idFromPath(location.pathname)\n : undefined;\n\n const itemHref = useCallback(\n (itemId: string) => {\n if (routing.mode === 'hash') return `#${itemId}`;\n if (base) {\n return base.origin === window.location.origin\n ? `${base.pathname}/${itemId}`\n : `${base.href}/${itemId}`;\n }\n return undefined;\n },\n [routing.mode, base]\n );\n\n const onLinkClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n // A new tab, a hash or another site: the browser does it.\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n if (href.startsWith('#')) return;\n const url = new URL(href, window.location.href);\n if (url.origin !== window.location.origin) return;\n e.preventDefault();\n history.pushState(null, '', `${url.pathname}${url.search}${url.hash}`);\n setLocation(snapshot());\n }, []);\n\n const writeSearch = useCallback(\n (params: URLSearchParams, replace?: boolean) => {\n if (!routing.syncUrl) return;\n const query = params.toString();\n const next = query ? `?${query}` : '';\n if (next === window.location.search) return;\n const url = `${window.location.pathname}${next}${window.location.hash}`;\n if (replace) {\n history.replaceState(history.state, '', url);\n } else {\n history.pushState(null, '', url);\n }\n setLocation(snapshot());\n },\n [routing.syncUrl]\n );\n\n const value = useMemo<RouterContextProps>(\n () => ({\n id,\n search: location.search.replace(/^\\?/, ''),\n itemHref,\n // Hash routing keeps the search on the same page: an empty hash goes back to it\n // without a reload, and the filters in the query string stay.\n searchHref: routing.mode === 'hash' ? '#' : undefined,\n onLinkClick,\n writeSearch,\n }),\n [id, location, itemHref, onLinkClick, writeSearch, routing.mode]\n );\n\n return <RouterContext.Provider value={value}>{children}</RouterContext.Provider>;\n};\n\nexport default RouterProvider;\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { hasLegacyParams, migrateLegacyParams } from '../../Gql/legacyParams';\nimport { canonicalParams } from '../../Gql/searchParams';\nimport useAdsSearch from '../../Gql/useAdsSearch';\nimport { ActionOnFilterUpdate } from '../../utils/pubsub/Actions';\nimport WaykePubSub from '../../utils/pubsub/pubsub';\nimport useRouter from '../Router/useRouter';\nimport useSettings from '../Settings/useSettings';\nimport { SearchContext, SearchContextProps } from './SearchContext';\n\n/** Any input \u2192 the canonical new grammar, with a hint when a site still sends the old one. */\nconst toParams = (input: URLSearchParams | string, source: string) => {\n const params = typeof input === 'string' ? new URLSearchParams(input) : input;\n if (hasLegacyParams(params)) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(\n `Wayke: ${source} uses filter names from before 6.0 (${params}); they are translated, see the README for the new names`\n );\n return migrateLegacyParams(params);\n }\n return canonicalParams(params);\n};\n\ninterface SearchProviderProps {\n children: React.ReactNode;\n}\n\nconst SearchProvider = ({ children }: SearchProviderProps) => {\n const { publicApi, routing } = useSettings();\n const { search, writeSearch } = useRouter();\n // Undefined until a search component initializes it, so a vehicle page alone costs no search.\n const [params, setParams] = useState<URLSearchParams>();\n const lastWritten = useRef<string | undefined>(undefined);\n\n const { unfiltered, result, loading, loadingMore, error, hasMore, loadMore } = useAdsSearch(\n params,\n publicApi\n );\n\n const apply = useCallback(\n (next: URLSearchParams, replace?: boolean) => {\n lastWritten.current = next.toString();\n setParams(next);\n writeSearch(next, replace);\n },\n [writeSearch]\n );\n\n const initialize = useCallback(\n (initialQueryParams?: URLSearchParams) => {\n if (params) return;\n let next = initialQueryParams\n ? toParams(initialQueryParams, 'initialQueryParams')\n : undefined;\n if (routing.syncUrl) {\n // The url wins; initialQueryParams only adds what the url does not have.\n const fromUrl = toParams(search, 'The url');\n next?.forEach((value, key) => {\n if (!fromUrl.getAll(key).includes(value)) fromUrl.append(key, value);\n });\n next = canonicalParams(fromUrl);\n }\n apply(next || new URLSearchParams(), true);\n },\n [params, routing.syncUrl, search, apply]\n );\n\n const update = useCallback(\n (next: URLSearchParams | string) => apply(toParams(next, 'onFilterUpdate')),\n [apply]\n );\n\n // Back and forward in the browser: the url's filters, unless we wrote them ourselves.\n useEffect(() => {\n if (!params || !routing.syncUrl) return;\n const fromUrl = toParams(search, 'The url');\n if (fromUrl.toString() !== lastWritten.current) {\n lastWritten.current = fromUrl.toString();\n setParams(fromUrl);\n }\n }, [search]);\n\n useEffect(() => {\n const action: ActionOnFilterUpdate = { actionName: 'onFilterUpdate', callback: update };\n WaykePubSub.subscribeAction(action);\n return () => WaykePubSub.unsubscribeAction(action);\n }, [update]);\n\n const value = useMemo<SearchContextProps>(\n () => ({\n params: params || new URLSearchParams(),\n result,\n unfiltered,\n loading: loading || !result,\n loadingMore,\n error,\n hasMore,\n update,\n loadMore,\n initialize,\n }),\n [params, result, unfiltered, loading, loadingMore, error, hasMore, update, loadMore, initialize]\n );\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n", "// Translates the query strings sites have produced over the years into\n// the grammar in searchParams.ts, so that old links, bookmarks and the queries\n// dealers saved in the CMS keep applying the same filters:\n//\n// 1. `qf=<base64 of a query string>` from the filter panel and the product\n// grid's \"show all\" link, and the older `qf=<base64 of {\"cars\": <base64 of\n// a query string>}>` from the search before that. `f=` was the same idea in\n// the waykeComposite era.\n// 2. Key renames where the value is unchanged (Elastic \u2192 public API naming).\n// 3. `query` \u2192 `q`, legacy sort tokens \u2192 sort keys, `offset` \u2192 `page`;\n// `hits`, `campaign` and other dead keys are dropped.\n//\n// Mirrors web-ui-v2's legacyParams.ts, trimmed to the keys dealer sites used.\n\nimport { canonicalParams, DEFAULT_SORT, isKnownKey } from './searchParams';\n\nconst SCALAR_ALIASES: Record<string, string> = {\n query: 'q',\n branch: 'branchDisplayName',\n branches: 'branchDisplayName',\n color: 'colorName',\n drivingWheel: 'drivetrainType',\n 'properties.segment': 'segment',\n chassis: 'bodyStyle',\n fuelTypes: 'fuelType',\n hasManufacturerPackaging: 'certifiedPreOwned',\n};\n\nconst RANGE_BASE_ALIASES: Record<string, string> = {\n mileage: 'odometer',\n odometerValueAsKm: 'odometer',\n leasingPrice: 'privateLease',\n businessLeasingPrice: 'businessLease',\n};\n\n/** Legacy `sort=` tokens from the external search API; null = the default order. */\nconst SORT_ALIASES: Record<string, string | null> = {\n relevance: null,\n itemSortDesc: null,\n 'published-desc': DEFAULT_SORT,\n 'published-asc': 'published-asc',\n 'price-asc': 'price-asc',\n 'price-desc': 'price-desc',\n 'modelyear-asc': 'modelYear-asc',\n 'modelyear-desc': 'modelYear-desc',\n 'model-asc': 'modelYear-asc',\n 'model-desc': 'modelYear-desc',\n 'mileage-asc': 'odometer-asc',\n 'mileage-desc': 'odometer-desc',\n // wayke.se v1 tokens, in case a dealer copied a link from there\n priceDefaultAsc: 'price-asc',\n priceDefaultDesc: 'price-desc',\n priceDefaultSortAsc: 'price-asc',\n priceDefaultSortDesc: 'price-desc',\n modelYearAsc: 'modelYear-asc',\n modelYearDesc: 'modelYear-desc',\n mileageAsc: 'odometer-asc',\n mileageDesc: 'odometer-desc',\n leasingDefaultSortAsc: 'leasing-asc',\n leasingDefaultSortDesc: 'leasing-desc',\n businessLeasingDefaultSortAsc: 'companyLeasing-asc',\n businessLeasingDefaultSortDesc: 'companyLeasing-desc',\n};\n\nconst FUEL_TYPE_VALUE_ALIASES: Record<string, string> = {\n 'Bensin/E85': 'E85+Bensin',\n 'Bensin+E85': 'E85+Bensin',\n 'Bensin+Etanol': 'E85+Bensin',\n 'Bensin, El': 'Bensin+El',\n 'El, Bensin': 'Bensin+El',\n 'Diesel, Naturgas': 'Diesel+Naturgas',\n 'El+Etanol': 'E85+El',\n Etanol: 'E85',\n};\n\nconst DROPPED_KEYS = new Set(['hits', 'offset', 'campaign', 'priceType', 'qf', 'f']);\n\nconst LEGACY_PER_PAGE = 25;\n\nconst decodeBase64 = (value: string) => {\n try {\n return atob(value.replace(/-/g, '+').replace(/_/g, '/'));\n } catch (_e) {\n return undefined;\n }\n};\n\n/** Unpacks `qf`/`f`: a base64 query string, or base64 JSON whose `cars` is one. */\nconst unpackPacked = (value: string): URLSearchParams | undefined => {\n const decoded = decodeBase64(value);\n if (decoded === undefined) return undefined;\n try {\n const json = JSON.parse(decoded) as { cars?: string };\n if (json && typeof json === 'object' && typeof json.cars === 'string') {\n const inner = decodeBase64(json.cars);\n return new URLSearchParams(inner !== undefined ? inner : json.cars);\n }\n } catch (_e) {\n // not JSON: a plain packed query string\n }\n return new URLSearchParams(decoded);\n};\n\n/** True when the params carry anything that is not already in the new grammar. */\nexport const hasLegacyParams = (params: URLSearchParams) => {\n for (const [key, value] of params.entries()) {\n if (DROPPED_KEYS.has(key)) return true;\n if (key in SCALAR_ALIASES) return true;\n const base = key.replace(/\\.(min|max)$/, '');\n if (base in RANGE_BASE_ALIASES) return true;\n if (key === 'sort' && value in SORT_ALIASES && SORT_ALIASES[value] !== value) return true;\n }\n return false;\n};\n\n/**\n * Legacy params \u2192 canonical new-grammar params. Idempotent: params already in\n * the new grammar come back unchanged (apart from canonical ordering).\n */\nexport const migrateLegacyParams = (input: URLSearchParams): URLSearchParams => {\n // 1. Unpack the packed forms and merge them with whatever is on the top level.\n const merged = new URLSearchParams();\n for (const packedKey of ['qf', 'f']) {\n const packed = input.get(packedKey);\n if (packed) {\n unpackPacked(packed)?.forEach((value, key) => merged.append(key, value));\n }\n }\n input.forEach((value, key) => {\n if (key !== 'qf' && key !== 'f') merged.append(key, value);\n });\n\n // 2. Rename keys and values.\n const out = new URLSearchParams();\n let page: number | undefined;\n merged.forEach((value, key) => {\n if (key === 'offset') {\n const offset = Number.parseInt(value, 10);\n if (Number.isFinite(offset) && offset > 0) {\n page = Math.floor(offset / LEGACY_PER_PAGE) + 1;\n }\n return;\n }\n if (DROPPED_KEYS.has(key)) return;\n\n if (key === 'sort') {\n const mapped = value in SORT_ALIASES ? SORT_ALIASES[value] : value;\n if (mapped) out.append('sort', mapped);\n return;\n }\n\n const rangeMatch = key.match(/^(.+)\\.(min|max)$/);\n if (rangeMatch) {\n const base = RANGE_BASE_ALIASES[rangeMatch[1]] || rangeMatch[1];\n out.append(`${base}.${rangeMatch[2]}`, value);\n return;\n }\n\n const nextKey = SCALAR_ALIASES[key] || key;\n let nextValue = value;\n if (nextKey === 'fuelType' && value in FUEL_TYPE_VALUE_ALIASES) {\n nextValue = FUEL_TYPE_VALUE_ALIASES[value];\n }\n if (isKnownKey(nextKey)) out.append(nextKey, nextValue);\n });\n\n if (page !== undefined && page > 1 && !out.has('page')) out.set('page', String(page));\n return canonicalParams(out);\n};\n", "// The search page's data: one request per filter change for the list and its\n// facets, plus one unfiltered request for the panel's full value lists and\n// slider domains. Responses that arrive after the filters changed are dropped.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { gqlQuery } from './client';\nimport { PublicApiSettings } from './config';\nimport { buildSearchQuery, FACETS_QUERY, multiSelectFacetAlias, SEARCH_QUERY } from './queries';\nimport { LIST_FILTERS, toSearchVariables } from './searchParams';\nimport { AdsResult, Facet, FacetsData, SearchData, SearchHit } from './types';\n\nexport interface AdsSearchResult {\n found: number;\n page: number;\n perPage: number;\n /** Every page loaded so far */\n hits: SearchHit[];\n /** List facets of the filtered result, each selected one counted without its own filter */\n facets: Facet[];\n}\n\n/** The facets of the filtered result, with every selected list filter's facet counted without its own filter. */\nconst withMultiSelectFacets = (data: SearchData, ads: AdsResult, selected: string[]): Facet[] =>\n (ads.facets || []).map((facet) => {\n if (!selected.includes(facet.field)) return facet;\n const alias = data.search?.[multiSelectFacetAlias(facet.field)] as\n | { facets?: Facet[] | null }\n | undefined;\n return alias?.facets?.find((f) => f.field === facet.field) || facet;\n });\n\nconst useAdsSearch = (params: URLSearchParams | undefined, settings: PublicApiSettings) => {\n const [unfiltered, setUnfiltered] = useState<AdsResult>();\n const [result, setResult] = useState<AdsSearchResult>();\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState(false);\n const requestIndex = useRef(0);\n\n const paramsKey = params?.toString();\n const { api, market, branchGroupId } = settings;\n\n const variables = useCallback(\n (page: number) => ({\n ...toSearchVariables(params || new URLSearchParams(), market, { page }),\n branchGroupId,\n }),\n [paramsKey, market, branchGroupId]\n );\n\n const started = !!params;\n\n useEffect(() => {\n if (!started) return;\n gqlQuery<FacetsData>(api, FACETS_QUERY, { market: [market], branchGroupId })\n .then((data) => setUnfiltered(data.search?.ads || undefined))\n .catch(() => setError(true));\n }, [started, api.url, api.apiKey, market, branchGroupId]);\n\n useEffect(() => {\n // No params until the provider has read the initial filters.\n if (!params) return;\n const index = ++requestIndex.current;\n setLoading(true);\n setError(false);\n const selected = LIST_FILTERS.filter((field) => params.getAll(field).length > 0);\n gqlQuery<SearchData>(api, buildSearchQuery(selected), { ...variables(1), withFacets: true })\n .then((data) => {\n if (index !== requestIndex.current) return;\n const ads = data.search?.ads;\n setResult(\n ads\n ? {\n found: ads.found,\n page: ads.page,\n perPage: ads.perPage,\n hits: ads.hits,\n facets: withMultiSelectFacets(data, ads, selected),\n }\n : undefined\n );\n })\n .catch(() => {\n if (index === requestIndex.current) setError(true);\n })\n .finally(() => {\n if (index === requestIndex.current) setLoading(false);\n });\n }, [paramsKey, variables, api.url, api.apiKey]);\n\n const hasMore = !!result && result.page * result.perPage < result.found;\n\n const loadMore = useCallback(async () => {\n if (!result || !hasMore || loadingMore) return;\n const index = requestIndex.current;\n setLoadingMore(true);\n setError(false);\n try {\n const data = await gqlQuery<SearchData>(api, SEARCH_QUERY, {\n ...variables(result.page + 1),\n withFacets: false,\n });\n // The filters changed while this page was loading: it belongs to the old list.\n if (index !== requestIndex.current) return;\n const ads = data.search?.ads;\n if (ads) {\n setResult((current) =>\n current\n ? { ...current, page: ads.page, found: ads.found, hits: [...current.hits, ...ads.hits] }\n : current\n );\n }\n } catch (_e) {\n if (index === requestIndex.current) setError(true);\n } finally {\n setLoadingMore(false);\n }\n }, [result, hasMore, loadingMore, variables, api.url, api.apiKey]);\n\n return { unfiltered, result, loading, loadingMore, error, hasMore, loadMore };\n};\n\nexport default useAdsSearch;\n", "import isPropValid from '@emotion/is-prop-valid';\nimport React from 'react';\nimport { StyleSheetManager, ThemeProvider as ThemeProviderBase } from 'styled-components';\n\nimport theme from '../layout/theme';\n\ninterface ThemeProps {\n children: React.ReactNode;\n}\n\n// Restore styled-components v5 behavior: filter out non-standard props so\n// they are not forwarded to DOM elements (custom components still receive all props)\nconst shouldForwardProp = (propName: string, target: unknown) =>\n typeof target === 'string' ? isPropValid(propName) : true;\n\nconst ThemeProvider = ({ children }: ThemeProps) => (\n <StyleSheetManager shouldForwardProp={shouldForwardProp}>\n <ThemeProviderBase theme={theme}>{children}</ThemeProviderBase>\n </StyleSheetManager>\n);\n\nexport default ThemeProvider;\n", "import React, { useEffect } from 'react';\nimport useRouter from '../State/Router/useRouter';\nimport useSettings from '../State/Settings/useSettings';\nimport PubSub from '../utils/pubsub/pubsub';\nimport WaykeSearch, { WaykeSearchProps } from './search';\nimport WaykeSearchItem, { WaykeSearchItemProps } from './searchItem';\n\nexport type WaykeCompositeProps = WaykeSearchProps & Omit<WaykeSearchItemProps, 'id'>;\n\n/** The search, switching to the vehicle page when a vehicle is opened. */\nconst WaykeComposite = ({\n filterList,\n initialQueryParams,\n removeSearchBar,\n removeFilterOptions,\n disableResetScrollOnInit,\n placeholderImage,\n modifyDocumentTitleItem,\n modifyDocumentTitleSearch,\n displayBranchName,\n conversionOptions,\n}: WaykeCompositeProps) => {\n const { id } = useRouter();\n const { routing } = useSettings();\n\n useEffect(() => {\n if (routing.mode === 'hash') {\n PubSub.publish('HashRouteChange', { id });\n }\n }, [id]);\n\n return id ? (\n <WaykeSearchItem\n key={id}\n id={id}\n disableResetScrollOnInit={disableResetScrollOnInit}\n placeholderImage={placeholderImage}\n modifyDocumentTitleItem={modifyDocumentTitleItem}\n displayBranchName={displayBranchName}\n conversionOptions={conversionOptions}\n />\n ) : (\n <WaykeSearch\n filterList={filterList}\n initialQueryParams={initialQueryParams}\n removeSearchBar={removeSearchBar}\n placeholderImage={placeholderImage}\n removeFilterOptions={removeFilterOptions}\n modifyDocumentTitleSearch={modifyDocumentTitleSearch}\n displayBranchName={displayBranchName}\n />\n );\n};\n\nexport default WaykeComposite;\n", "import type {\n ConversionOption,\n ConversionOptionType,\n ConversionOptionVehicle,\n} from './@types/conversion';\nimport type { SearchFilterNameTypes, SearchFilterTypes } from './@types/filter';\nimport type { MarketCode } from './@types/market';\nimport SearchBar from './components/SearchBar';\nimport WaykeSearch, { WaykeSearchProps } from './layouts/search';\nimport WaykeSearchItem, { WaykeSearchItemProps } from './layouts/searchItem';\nimport WaykeComposite, {\n WaykeCompositeWithProviderProps,\n} from './layouts/WaykeCompositeWithProvider';\nimport WaykeThemeProvider from './providers/themeProvider';\nimport WaykeProvider, { EcomSettings, WaykeProviderSettings } from './providers/WaykeProvider';\nimport type { Environment, RoutingMode, RoutingSettings } from './State/Settings/settings';\nimport WaykePubSub, { EventSubscriptions } from './utils/pubsub/pubsub';\n\nexport {\n ConversionOption,\n ConversionOptionType,\n ConversionOptionVehicle,\n EcomSettings,\n Environment,\n EventSubscriptions,\n MarketCode,\n RoutingMode,\n RoutingSettings,\n SearchBar,\n SearchFilterNameTypes,\n SearchFilterTypes,\n WaykeCompositeWithProviderProps,\n WaykeProvider,\n WaykeProviderSettings,\n WaykePubSub,\n WaykeSearch,\n WaykeSearchItem,\n WaykeSearchItemProps,\n WaykeSearchProps,\n WaykeThemeProvider,\n};\n\nexport default WaykeComposite;\n\n// Every event and its data, for typing subscriptions.\nexport type * from './utils/pubsub/Events';\n"],
5
- "mappings": "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",
6
- "names": ["React", "useCallback", "useEffect", "useId", "useRef", "useState", "useTranslation", "useEffect", "useOutsideClick", "ref", "callback", "handleClick", "e", "useOutsideClick_default", "React", "React", "styled", "css", "Icon", "block", "IconInfo", "IconCancel", "IconChevronDown", "IconChevronLeft", "IconChevronRight", "IconCheck", "IconRadio", "IconSearch", "IconExclamationCircle", "IconExclamationTriangle", "IconImage", "styled", "_colors", "theme", "theme_default", "size", "multiplier", "baseUnit", "theme_default", "styled", "css", "styled", "UtilityTextRight", "UtilityFontSizeSmall", "UtilityTextPrimary", "UtilityTextBold", "ButtonReset", "styled", "ButtonBase", "size", "props", "fullWidth", "css", "inputHeight", "ButtonPrimary", "ButtonSecondary", "ButtonContent", "ButtonClear", "UtilityTextRight", "ButtonInline", "inline", "ButtonInlineBold", "ButtonInlineLight", "ButtonInlinePrimary", "Wrapper", "styled", "Label", "Search", "props", "Action", "ActionBtn", "ButtonReset", "Input", "size", "InputSearch", "React", "placeholder", "label", "value", "id", "onSearch", "onChange", "onKeyDown", "children", "aria", "ref", "Wrapper", "Label", "Search", "Input", "Action", "ActionBtn", "IconSearch", "InputSearch_default", "styled", "Suggestions", "styled", "size", "props", "Suggestion", "SearchBar", "value", "setValue", "onSearch", "suggestions", "onSelectSuggestion", "t", "useTranslation", "ref", "useRef", "listId", "useId", "active", "setActive", "useState", "open", "useEffect", "onChange", "useCallback", "e", "useOutsideClick_default", "_onSearch", "onKeyDown", "last", "i", "React", "InputSearch_default", "Suggestions", "label", "index", "Suggestion", "SearchBar_default", "React", "useCallback", "useEffect", "React", "styled", "Wrapper", "styled", "props", "size", "Container", "children", "React", "Wrapper", "Container_default", "React", "useCallback", "useMemo", "useState", "useTranslation", "LEGACY_FILTER_NAMES", "DEFAULT_FILTER_LIST", "resolveFilterList", "filterList", "legacy", "f", "seen", "FREE_TEXT", "SORT", "PAGE", "LIST_FILTERS", "RANGE_FILTERS", "BOOLEAN_FILTERS", "SORT_OPTIONS", "DEFAULT_SORT", "pageSize", "_params", "KNOWN_KEYS", "k", "isKnownKey", "key", "kmPerOdometerUnit", "market", "toInt", "value", "n", "toSearchVariables", "params", "options", "variables", "q", "values", "scale", "min", "max", "sort", "canonicalParams", "next", "toggleListValue", "current", "v", "withSort", "sortKey", "listOptions", "field", "params", "facets", "selected", "counts", "f", "options", "c", "value", "a", "b", "isRangeFilter", "key", "RANGE_FILTERS", "histogram", "unfiltered", "market", "h", "scale", "kmPerOdometerUnit", "rangeValues", "selectedCount", "averageDelta", "values", "toSteps", "fromZero", "delta", "max", "_", "i", "rangeSteps", "useContext", "createContext", "SearchContext", "useSearch", "useContext", "SearchContext", "useSearch_default", "useContext", "createContext", "ENVIRONMENTS", "REMOVED_SETTINGS", "warnRemovedSettings", "settings", "key", "resolveEcom", "enabled", "url", "ecom", "environmentUrl", "resolveSettings", "environment", "marketCode", "mode", "SettingsContext", "createContext", "resolveSettings", "useSettings", "useContext", "SettingsContext", "useSettings_default", "React", "useCallback", "useTranslation", "PubSub", "_PubSub", "event", "i", "eventName", "args", "pubsub_default", "React", "useCallback", "useState", "useTranslation", "styled", "css", "List", "styled", "size", "Header", "ButtonReset", "Label", "Heading", "Indicator", "IndicatorValue", "Icon", "props", "Body", "Item", "isOpen", "css", "AccordionItem", "heading", "children", "activeCount", "isActive", "t", "useTranslation", "extend", "setExtend", "useState", "onToggleExtend", "useCallback", "React", "Item", "Header", "Label", "Heading", "Indicator", "IndicatorValue", "Icon", "IconChevronDown", "Body", "Accordion", "List", "Accordion_default", "React", "useTranslation", "styled", "css", "HeadingBase", "styled", "size", "noMargin", "css", "H1", "props", "H2", "H3", "H4", "H5", "VisualHeading", "portal_namespace_exports", "__export", "DefaultPortal", "React", "ReactDOM", "Portal", "id", "children", "el", "current", "dynamic", "portal_default", "React", "PortalElement", "id", "portal_element_default", "styled", "keyframes", "noTransform", "fadeIn", "rotate", "Wrapper", "styled", "UiBlock", "fadeIn", "PanelWrapper", "props", "noTransform", "Header", "size", "Heading", "H1", "Close", "CloseBtn", "ButtonReset", "Body", "Footer", "FooterAction", "FooterActionItem", "Panel", "id", "title", "footer", "onClose", "children", "t", "useTranslation", "portal_default", "portal_namespace_exports", "Wrapper", "UiBlock", "PanelWrapper", "Header", "Heading", "H1", "Close", "CloseBtn", "IconCancel", "Body", "Footer", "Panel_default", "styled", "Repeat", "styled", "size", "RepeatTiny", "RepeatSmall", "React", "useTranslation", "React", "useCallback", "useEffect", "useState", "React", "styled", "List", "styled", "size", "Item", "Action", "ButtonReset", "props", "ActionIcon", "ActionLabel", "ChecklistItem", "label", "onClick", "active", "radio", "React", "Item", "Action", "ActionIcon", "IconRadio", "IconCheck", "ActionLabel", "Checklist", "items", "List", "item", "Checklist_default", "React", "styled", "Wrapper", "OverflowBox", "children", "React", "Wrapper", "OverflowBox_default", "ChecklistFacet", "id", "params", "result", "loading", "error", "update", "useSearch_default", "pending", "setPending", "useState", "useEffect", "onClick", "useCallback", "value", "checked", "current", "pubsub_default", "toggleListValue", "React", "OverflowBox_default", "Checklist_default", "listOptions", "option", "checkListFacet_default", "React", "useCallback", "useEffect", "useState", "COLOR_WHITE", "COLOR_BLACK", "COLOR_GRAY", "COLOR_SILVER", "COLOR_BLUE", "COLOR_RED", "COLOR_BROWN", "COLOR_GREEN", "COLOR_ORANGE", "COLOR_YELLOW", "COLOR_PURPLE", "COLOR_BEIGE", "DEFAULT_PLACEHOLDER_IMAGE", "getHexColorFromDisplayName", "displayName", "COLOR_WHITE", "COLOR_BLACK", "COLOR_GRAY", "COLOR_SILVER", "COLOR_BLUE", "COLOR_RED", "COLOR_BROWN", "COLOR_GREEN", "COLOR_ORANGE", "COLOR_YELLOW", "COLOR_PURPLE", "COLOR_BEIGE", "React", "styled", "css", "List", "styled", "size", "Item", "Action", "ButtonReset", "Color", "props", "active", "css", "boxShadow", "Label", "ColorSelectItem", "label", "hex", "onClick", "active", "disabled", "boxShadow", "React", "Item", "Action", "Color", "Label", "ColorSelect", "items", "List", "item", "ColorSelect_default", "ColorSelectFacet", "id", "params", "result", "loading", "error", "update", "useSearch_default", "pending", "setPending", "useState", "useEffect", "onClick", "useCallback", "value", "checked", "current", "pubsub_default", "toggleListValue", "React", "ColorSelect_default", "listOptions", "option", "getHexColorFromDisplayName", "colorFacet_default", "React", "useCallback", "useMemo", "React", "useEffect", "useRef", "useState", "useTranslation", "formatFns", "nb", "sv", "numberSeparator", "value", "n", "x", "s", "c", "re", "num", "dateTimeFormat", "format", "marketCode", "date", "settings", "nb", "sv", "formatFns", "SliderPrimitive", "styled", "RangeSpan", "styled", "size", "RangeSpanItem", "props", "Root", "Track", "Range", "Thumb", "smallestStep", "steps", "smallest", "step", "index", "RangeSlider", "loading", "values", "domain", "label", "unit", "formatValues", "maxPrefix", "onChange", "t", "useTranslation", "current", "setCurrent", "useState", "latest", "useRef", "move", "next", "useEffect", "commitDrag", "format", "value", "numberSeparator", "suffix", "equal", "thumbLabel", "bound", "React", "Root", "Track", "Range", "Thumb", "RangeSpan", "RangeSpanItem", "RangeSlider_default", "toInt", "value", "n", "RangeFacet", "id", "label", "unit", "formatValues", "params", "unfiltered", "loading", "update", "useSearch_default", "marketCode", "useSettings_default", "steps", "useMemo", "rangeSteps", "domain", "clamp", "values", "onChange", "useCallback", "next", "query", "canonicalParams", "pubsub_default", "React", "RangeSlider_default", "rangeFacet_default", "FacetSelector", "id", "label", "t", "useTranslation", "marketCode", "useSettings_default", "React", "colorFacet_default", "isRangeFilter", "checkListFacet_default", "rangeFacet_default", "faceSelector_default", "FilterPanel", "filters", "open", "onClose", "t", "useTranslation", "params", "result", "loading", "update", "useSearch_default", "found", "onClearFilters", "useCallback", "pubsub_default", "next", "sort", "SORT", "React", "Panel_default", "FooterAction", "FooterActionItem", "ButtonSecondary", "ButtonContent", "ButtonPrimary", "Accordion_default", "f", "AccordionItem", "Repeat", "faceSelector_default", "FilterPanel_default", "styled", "List", "styled", "size", "Item", "Action", "ButtonReset", "props", "Label", "Indicator", "IndicatorValue", "Filter", "filterList", "useTranslation", "marketCode", "useSettings_default", "params", "result", "unfiltered", "useSearch_default", "open", "setOpen", "useState", "onClose", "useCallback", "filters", "useMemo", "resolveFilterList", "f", "isRangeFilter", "rangeSteps", "listOptions", "React", "FilterPanel_default", "List", "selected", "selectedCount", "Item", "Action", "Label", "Indicator", "IndicatorValue", "Filter_default", "React", "React", "useTranslation", "toAmount", "money", "n", "hitImage", "hit", "i", "React", "useCallback", "useTranslation", "useEffect", "useRef", "useState", "useIsInViewport", "options", "containerRef", "isVisible", "setIsVisible", "intersectionRatio", "setIntersectionRatio", "callbackFunction", "entries", "observer", "entry", "useIsInViewport_default", "useContext", "createContext", "RouterContext", "useRouter", "useContext", "RouterContext", "useRouter_default", "React", "CFIT_WIDTHS", "isCfit", "src", "snapCfitWidth", "width", "w", "imageUrl", "height", "webp", "base", "query", "params", "cfitSources", "src", "widths", "set", "format", "width", "base", "query", "params", "snapCfitWidth", "ResponsiveImage", "src", "widths", "sizes", "Img", "rest", "largest", "isCfit", "React", "imageUrl", "sources", "cfitSources", "ResponsiveImage_default", "React", "styled", "css", "Item", "styled", "size", "Box", "props", "ItemSection", "Action", "ButtonReset", "List", "$isSmall", "css", "UspItem", "title", "onClick", "React", "Item", "Box", "ItemSection", "Action", "IconInfo", "UspList", "items", "small", "List", "item", "index", "UspList_default", "styled", "Wrapper", "styled", "Image", "props", "Picture", "Img", "Content", "size", "ContentBody", "ContentFooter", "PreHeading", "Heading", "Link", "Description", "Usp", "Price", "CurrentPrice", "PriceCell", "OldPrice", "Label", "CARD_WIDTHS", "CARD_SIZES", "ProductCard", "id", "title", "image", "placeholderImage", "branch", "branchName", "description", "uspList", "price", "oldPrice", "leasingPrice", "businessLeasingPrice", "t", "useTranslation", "itemHref", "onLinkClick", "useRouter_default", "href", "containerRef", "isVisible", "useIsInViewport_default", "onClick", "useCallback", "pubsub_default", "onHrefClick", "e", "React", "Wrapper", "Link", "Image", "ResponsiveImage_default", "Img", "Picture", "DEFAULT_PLACEHOLDER_IMAGE", "Content", "ContentBody", "PreHeading", "Heading", "Description", "Usp", "UspList_default", "ContentFooter", "Price", "PriceCell", "OldPrice", "Label", "CurrentPrice", "ProductCard_default", "HitCard", "hit", "placeholderImage", "displayBranchName", "t", "useTranslation", "ad", "iteration", "item", "odometer", "price", "toAmount", "oldPrice", "money", "amount", "unit", "numberSeparator", "usps", "React", "ProductCard_default", "hitImage", "usp", "HitCard_default", "styled", "Wrapper", "styled", "List", "size", "Item", "props", "Grid", "hits", "placeholderImage", "displayBranchName", "React", "Wrapper", "List", "hit", "Item", "HitCard_default", "Grid_default", "styled", "css", "Page", "styled", "PageSection", "size", "accent", "css", "props", "large", "fillSpace", "React", "useCallback", "useMemo", "useTranslation", "i18n", "initReactI18next", "i18nScoped", "getLanguage", "marketCode", "initializeI18n", "resolve", "SORT_LABELS", "sortOptions", "value", "label", "i18nScoped", "React", "styled", "SrOnly", "styled", "css", "Spinner", "styled", "size", "rotate", "Wrapper", "inline", "css", "center", "Loader", "inline", "center", "Wrapper", "Spinner", "i18nScoped", "SrOnly", "Loader_default", "React", "useTranslation", "styled", "Wrapper", "styled", "Description", "size", "Bar", "props", "BarActive", "ProgressBar", "valueCurrent", "valueMax", "t", "useTranslation", "barWidth", "React", "Wrapper", "Description", "Bar", "BarActive", "ProgressBar_default", "React", "useTranslation", "styled", "iconSize", "Wrapper", "styled", "Select", "size", "props", "Option", "Icon", "SortSelect", "value", "options", "onChange", "unit", "t", "useTranslation", "React", "Wrapper", "Select", "option", "Option", "Icon", "IconChevronDown", "SortSelect_default", "styled", "Wrapper", "styled", "Header", "size", "HeaderCount", "HeaderSort", "Body", "Footer", "FooterProgress", "FooterAction", "ResultCount", "props", "Result", "children", "useTranslation", "loading", "loadingMore", "result", "params", "hasMore", "loadMore", "update", "useSearch_default", "onSortOptionChange", "useCallback", "e", "withSort", "numberOfDocuments", "numberOfHits", "options", "useMemo", "sortOptions", "React", "Loader_default", "Wrapper", "Header", "HeaderCount", "ResultCount", "numberSeparator", "HeaderSort", "SortSelect_default", "SORT", "DEFAULT_SORT", "Body", "Footer", "FooterProgress", "ProgressBar_default", "FooterAction", "ButtonSecondary", "ButtonContent", "Result_default", "React", "useCallback", "useEffect", "useMemo", "useState", "GqlError", "kind", "message", "retryAfter", "cache", "pending", "resolveApiKey", "config", "request", "query", "variables", "response", "body", "e", "gqlQuery", "key", "inflight", "promise", "data", "SEARCH_HIT_FIELDS", "ADS_ARGUMENTS", "ADS_VARIABLE_DEFINITIONS", "multiSelectFacetAlias", "field", "buildSearchQuery", "selectedListFilters", "facetSearches", "args", "SEARCH_QUERY", "FACETS_QUERY", "SUGGEST_QUERY", "fetchSuggestions", "settings", "q", "limit", "gqlQuery", "SUGGEST_QUERY", "suggestionParams", "suggestion", "f", "useSuggestions", "value", "publicApi", "useSettings_default", "suggestions", "setSuggestions", "useState", "q", "useEffect", "active", "timeout", "fetchSuggestions", "next", "SearchFilter", "setValue", "params", "update", "useSearch_default", "labels", "useMemo", "s", "applySuggestion", "useCallback", "suggestion", "suggestionParams", "sort", "SORT", "pubsub_default", "onSearch", "FREE_TEXT", "exact", "list", "onSelectSuggestion", "index", "React", "SearchBar_default", "SearchFilter_default", "React", "useTranslation", "styled", "Wrapper", "styled", "Query", "Clear", "ButtonReset", "size", "props", "SearchTerm", "children", "onClear", "clearTitle", "t", "useTranslation", "React", "Wrapper", "Query", "Clear", "IconCancel", "SearchTerm_default", "React", "styled", "getSnackbarBg", "severity", "bg", "theme_default", "Wrapper", "styled", "size", "props", "Icon", "Content", "Heading", "Message", "Snackbar", "severity", "icon", "heading", "children", "iconSelector", "React", "IconInfo", "IconExclamationCircle", "IconExclamationTriangle", "IconCheck", "Wrapper", "Icon", "Content", "Heading", "Message", "Snackbar_default", "WaykeSearch", "filterList", "initialQueryParams", "removeSearchBar", "placeholderImage", "removeFilterOptions", "modifyDocumentTitleSearch", "displayBranchName", "error", "result", "params", "update", "initialize", "useSearch_default", "query", "useEffect", "pubsub_default", "onClearQuery", "useCallback", "next", "FREE_TEXT", "searchQuery", "React", "Page", "PageSection", "Container_default", "SearchFilter_default", "SearchTerm_default", "Filter_default", "Result_default", "Snackbar_default", "Grid_default", "i18nScoped", "portal_element_default", "portal_namespace_exports", "search_default", "React", "useCallback", "useEffect", "useMemo", "useState", "defaultConversionOptions", "React", "React", "styled", "Wrapper", "styled", "size", "props", "Avatar", "image", "alt", "React", "Wrapper", "Avatar_default", "styled", "Wrapper", "styled", "props", "Quote", "Author", "size", "AvatarWrapper", "Info", "Name", "Date", "Blockquote", "children", "author", "avatar", "date", "React", "Wrapper", "Quote", "Author", "AvatarWrapper", "Avatar_default", "Info", "Name", "Date", "Blockquote_default", "React", "DOMPurify", "Marked", "escapeAttribute", "value", "markdown", "token", "title", "text", "ALLOWED_TAGS", "ALLOWED_ATTR", "ALLOWED_URI_REGEXP", "sanitizeHtml", "html", "markdownToHtml", "styled", "css", "Wrapper", "styled", "size", "small", "css", "Content", "children", "small", "markdown", "html", "__html", "markdownToHtml", "sanitizeHtml", "React", "Wrapper", "Content_default", "React", "useCallback", "useState", "styled", "css", "Wrapper", "styled", "Extend", "size", "extended", "css", "Action", "ExtendContent", "children", "actionTitle", "onClick", "extend", "setExtend", "useState", "onExtend", "useCallback", "React", "Wrapper", "ref", "Extend", "Action", "ButtonClear", "ButtonContent", "ExtendContent_default", "React", "useTranslation", "React", "styled", "css", "Link", "props", "$hoverGhost", "styled", "Wrapper", "styled", "size", "props", "Icon", "Body", "Heading", "CreditorDisclaimer", "React", "Wrapper", "Icon", "Body", "Heading", "Link", "React", "useCallback", "useState", "useTranslation", "React", "styled", "List", "styled", "Item", "size", "Label", "Value", "DataList", "items", "React", "List", "item", "Item", "Label", "Value", "DataList_default", "React", "useTranslation", "styled", "Wrapper", "styled", "props", "size", "UiBlock", "fadeIn", "Dialog", "noTransform", "Content", "Header", "Heading", "H1", "Close", "CloseBtn", "ButtonReset", "Body", "Image", "ModalFoldout", "ModalFoldoutBody", "Modal", "id", "title", "onClose", "children", "t", "useTranslation", "portal_default", "portal_namespace_exports", "Wrapper", "e", "UiBlock", "Dialog", "Content", "Header", "Heading", "H1", "Close", "CloseBtn", "IconCancel", "Body", "Modal_default", "React", "styled", "Wrapper", "styled", "size", "props", "Logo", "LogoImg", "Content", "OptionBoxHeading", "OptionBoxContent", "OptionBox", "logo", "logo2x", "logoAlt", "children", "Wrapper", "Logo", "LogoImg", "Content", "OptionBox_default", "Leasing", "offer", "useTranslation", "modal", "setModal", "useState", "toggleModal", "useCallback", "image", "description", "monthlyCost", "months", "mileagePerYear", "business", "name", "title", "React", "Modal_default", "Image", "Content_default", "ModalFoldout", "ModalFoldoutBody", "DataList_default", "numberSeparator", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "UtilityTextPrimary", "ButtonInline", "leasing_default", "React", "useCallback", "useState", "useTranslation", "useEffect", "useState", "WARRANTY_CONTENT", "AD_QUERY", "AD_ID_BY_LEGACY_ID_QUERY", "CALCULATE_PAYMENT_QUERY", "INSURANCE_INQUIRY_QUERY", "RELATED_ADS_QUERY", "SEARCH_HIT_FIELDS", "useLoanCalculation", "settings", "adId", "financialOptionId", "duration", "downPayment", "residual", "payment", "setPayment", "useState", "loading", "setLoading", "skip", "useEffect", "active", "gqlQuery", "CALCULATE_PAYMENT_QUERY", "data", "next", "useLoanCalculation_default", "legacyWaykeIdFromIterationId", "iterationId", "fallback", "firstAt", "secondAt", "num", "value", "n", "str", "adEvent", "ad", "waykeId", "legacyWaykeIdFromIterationId", "platformChannel", "c", "price", "discount", "oldPrice", "current", "availableFrom", "channel", "publishedAt", "at", "ecom", "commerce", "contactPerson", "d", "openingHours", "branch", "hours", "week", "h", "key", "position", "galleryMedia", "items", "a", "b", "m", "i", "range", "r", "leasingOffers", "leasing", "business", "monthlyCost", "promo", "lp", "packageOffers", "p", "manufacturerPackage", "warranty", "w", "definition", "accessoryImages", "accessory", "createContext", "useContext", "AdContext", "useAdContext", "ad", "AdContext_default", "React", "useCallback", "useEffect", "useMemo", "useState", "useTranslation", "styled", "ContentLogo", "styled", "props", "ContentLogoText", "ContentLogoMedia", "size", "React", "styled", "css", "Logo", "styled", "size", "wide", "css", "LogoBox", "logo", "logo2x", "alt", "wide", "logoRetina", "Logo", "LogoBox_default", "React", "useCallback", "useEffect", "useState", "React", "styled", "css", "Wrapper", "styled", "Label", "Value", "size", "isHighlighted", "css", "props", "RangeSliderLabel", "label", "value", "highlight", "React", "Wrapper", "Label", "Value", "RangeSliderLabel_default", "React", "useEffect", "useRef", "useState", "RangeSliderSimple", "loading", "values", "domain", "steps", "label", "onChange", "onUpdate", "current", "setCurrent", "useState", "latest", "useRef", "useEffect", "React", "Root", "next", "Track", "Range", "Thumb", "RangeSliderSimple_default", "SliderWithLabel", "label", "values", "domain", "steps", "loading", "unit", "onChange", "local", "setLocal", "useState", "onUpdate", "useCallback", "nextValues", "useEffect", "React", "RepeatTiny", "RangeSliderLabel_default", "numberSeparator", "RangeSliderSimple_default", "SliderWithLabel_default", "stepGenerator", "step", "max", "steps", "current", "nextCurrent", "LoanModal", "option", "onClose", "t", "useTranslation", "ad", "AdContext_default", "publicApi", "marketCode", "useSettings_default", "extend", "setExtend", "React", "trackPayload", "useMemo", "adEvent", "onToggleExtend", "pubsub_default", "variables", "setVariables", "useState", "num", "loading", "payment", "useLoanCalculation_default", "useEffect", "residual", "downPayment", "range", "downPaymentCurrent", "downPaymentMin", "downPaymentMax", "downPaymentSteps", "onDownPaymentChange", "useCallback", "values", "duration", "durationCurrent", "durationMin", "durationMax", "durationSteps", "onDurationChange", "residualRange", "residualCurrent", "residualMin", "residualMax", "residualSteps", "onResidualChange", "interestText", "effectiveInterestText", "monthlyCost", "image", "name", "Modal_default", "Repeat", "ContentLogo", "ContentLogoText", "Content_default", "ContentLogoMedia", "LogoBox_default", "RepeatSmall", "SliderWithLabel_default", "RepeatTiny", "numberSeparator", "ButtonClear", "ButtonContent", "ModalFoldout", "ModalFoldoutBody", "DataList_default", "CreditorDisclaimer", "LoanModal_default", "Loan", "loan", "useTranslation", "ad", "AdContext_default", "publicApi", "useSettings_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "payment", "useLoanCalculation_default", "num", "interest", "duration", "monthlyCost", "loanAmount", "logo", "React", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "LoanModal_default", "numberSeparator", "ButtonInline", "loan_default", "FinancialOptions", "loans", "leasing", "t", "useTranslation", "marketCode", "useSettings_default", "React", "Repeat", "RepeatTiny", "VisualHeading", "offer", "leasing_default", "loan", "loan_default", "CreditorDisclaimer", "FinancialOptions_default", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useTranslation", "React", "useTranslation", "React", "Viewer", "React", "useEffect", "useRef", "useState", "useTranslation", "styled", "compassSize", "size", "controlBtnSize", "Wrapper", "styled", "p", "props", "styled", "Figure", "styled", "Badge", "size", "SliderBar", "SliderValue", "VisuallyHidden", "isWebgl2Supported", "SphereViewer", "id", "src", "interactive", "t", "useTranslation", "container", "useRef", "viewerRef", "loading", "setLoading", "useState", "useEffect", "viewer", "Viewer", "handleReady", "fillStyle", "React", "Wrapper", "Loader_default", "Badge", "SphereViewer_default", "SphereLightbox", "url", "React", "SphereViewer_default", "SphereLightbox_default", "React", "styled", "Wrapper", "styled", "size", "props", "UiBlock", "Item", "Img", "CloseBtn", "ButtonReset", "React", "useRef", "useState", "useTranslation", "wrap", "value", "length", "Rotation", "urls", "img", "widths", "sizes", "t", "useTranslation", "count", "position", "setPosition", "useState", "frame", "drag", "useRef", "label", "i", "onPointerDown", "e", "onPointerMove", "start", "delta", "onPointerUp", "onKeyDown", "next", "React", "Figure", "VisuallyHidden", "Badge", "url", "ResponsiveImage_default", "SliderBar", "Root", "Track", "Range", "Thumb", "SliderValue", "Rotation_default", "WIDTHS", "SIZES", "ThreeSixtyLightbox", "urls", "React", "Rotation_default", "Img", "ThreeSixtLightbox_default", "React", "React", "styled", "Video", "modal", "Video_default", "styled", "Wrapper", "props", "Iframe", "CustomPlayer", "url", "controls", "modal", "ratio", "isPreview", "React", "Wrapper", "Video_default", "CustomPlayer_default", "React", "getVimeoId", "url", "regExp", "match", "getYouTubeId", "youtubeBase", "getYoutubeThumbnail", "id", "onImageLoad", "thumbnail", "onImageError", "VimeoPlayer", "url", "autoplay", "React", "Wrapper", "Iframe", "getVimeoId", "VimeoPlayer_default", "React", "YouTubePlayer", "url", "autoplay", "React", "Wrapper", "Iframe", "getYouTubeId", "YoutubePlayer_default", "ytNames", "isYouTubeVideo", "url", "host", "vNames", "isVimeoVideo", "VideoPlayer", "autoplay", "controls", "React", "YoutubePlayer_default", "VimeoPlayer_default", "CustomPlayer_default", "EmbeddedVideoLightbox_default", "Lightbox", "index", "media", "onClose", "t", "useTranslation", "onRef", "ref", "React", "Wrapper", "e", "UiBlock", "m", "i", "Item", "ResponsiveImage_default", "Img", "ThreeSixtLightbox_default", "SphereLightbox_default", "EmbeddedVideoLightbox_default", "CloseBtn", "IconCancel", "Lightbox_default", "styled", "NavButton", "styled", "ButtonReset", "size", "props", "React", "Sphere", "url", "React", "SphereViewer_default", "Sphere_default", "React", "useTranslation", "styled", "css", "quickNavWidth", "Wrapper", "styled", "props", "size", "Main", "Alt", "Track", "Item", "Image", "ImageFull", "Arrow", "ArrowLeft", "ArrowRight", "QuickNav", "QuickNavItem", "$active", "css", "QuickNavBtn", "ButtonReset", "QuickNavImg", "MediaButtonWrapper", "WIDTHS", "SIZES", "ThreeSixty", "urls", "useTranslation", "React", "Badge", "ResponsiveImage_default", "Image", "ThreeSixty_default", "React", "useCallback", "useState", "useTranslation", "React", "MediaButton", "text", "onClick", "React", "MediaButtonWrapper", "ButtonSecondary", "ButtonContent", "MediaButton_default", "useEffect", "useState", "useEffect", "useState", "useCallback", "useEffect", "useState", "cache", "getCachedResult", "key", "setCachedResult", "value", "pendingPromise", "isPendingPromise", "url", "setPendingPromise", "promise", "clearPendingPromise", "useFetch", "path", "options", "skip", "promiseCache", "data", "setData", "loading", "setLoading", "error", "setError", "doFetch", "cached", "request", "result", "json", "useFetch_default", "useVimeoThumbnail", "id", "small", "thumbnail", "setThumbnail", "useState", "data", "useFetch_default", "useEffect", "useVimeoThumbnail_default", "useThumbnail", "url", "small", "thumbnail", "setThumbnail", "useState", "vimeoId", "getVimeoId", "vimeoThumbnail", "useVimeoThumbnail_default", "useEffect", "youtubeThumbnail", "getYoutubeThumbnail", "useThumbnail_default", "GalleryEmbed", "src", "index", "t", "useTranslation", "modal", "setModal", "useState", "thumbnail", "useThumbnail_default", "onClick", "e", "onCloseModal", "onError", "useCallback", "onImageError", "onLoad", "onImageLoad", "customVideo", "React", "ImageFull", "MediaButton_default", "Modal_default", "EmbeddedVideoLightbox_default", "CustomPlayer_default", "EmbededVideo_default", "React", "useCallback", "useTranslation", "QuickNavEmbeded", "src", "index", "t", "useTranslation", "thumbnail", "useThumbnail_default", "onError", "useCallback", "e", "onImageError", "onLoad", "onImageLoad", "customVideo", "React", "QuickNavImg", "CustomPlayer_default", "QuickNavEmbeded_default", "GALLERY_WIDTHS", "GALLERY_SIZES", "THUMBNAIL_WIDTHS", "scrollBehavior", "revealInList", "list", "item", "Gallery", "media", "placeholderImage", "t", "useTranslation", "ad", "AdContext_default", "trackRef", "useRef", "quickNavRef", "index", "setIndex", "useState", "lightbox", "setLightbox", "mediaLength", "placeholder", "useMemo", "DEFAULT_PLACEHOLDER_IMAGE", "goTo", "useCallback", "target", "track", "next", "slide", "onScroll", "first", "useEffect", "onKeyDown", "e", "onClick", "pubsub_default", "adEvent", "onToggleLightbox", "React", "Wrapper", "Main", "Track", "m", "i", "Item", "ResponsiveImage_default", "Image", "ThreeSixty_default", "EmbededVideo_default", "Sphere_default", "ArrowLeft", "NavButton", "IconChevronLeft", "ArrowRight", "IconChevronRight", "Alt", "QuickNav", "src", "imageUrl", "QuickNavItem", "QuickNavBtn", "QuickNavEmbeded_default", "QuickNavImg", "Lightbox_default", "Gallery_default", "React", "React", "useCallback", "useState", "useTranslation", "React", "useCallback", "useMemo", "useState", "useTranslation", "useEffect", "useState", "useInsuranceInquiry", "settings", "adId", "personalNumber", "drivingDistance", "insurances", "setInsurances", "useState", "loading", "setLoading", "error", "setError", "skip", "useEffect", "active", "gqlQuery", "INSURANCE_INQUIRY_QUERY", "data", "list", "i", "useInsuranceInquiry_default", "ssnIsValid", "s", "styled", "ColumnRow", "styled", "ColumnRowItem", "size", "React", "useTranslation", "styled", "Wrapper", "styled", "Main", "size", "Heading", "H2", "Description", "Footer", "Foldout", "props", "DetailBox", "heading", "description", "children", "t", "useTranslation", "extend", "setExtend", "React", "onToggleExtend", "extendBtnText", "Wrapper", "Main", "Heading", "Description", "Footer", "ButtonClear", "ButtonContent", "Foldout", "DetailBox_default", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "styled", "Header", "Title", "Info", "size", "InfoBtn", "ButtonReset", "props", "Extend", "ExtendInfo", "title", "children", "t", "useTranslation", "extend", "setExtend", "useState", "onToggleExtend", "useCallback", "React", "Wrapper", "Header", "Title", "Info", "InfoBtn", "IconInfo", "Extend", "ExtendInfo_default", "styled", "InputGroup", "styled", "props", "size", "InputGroupColumn", "React", "styled", "Wrapper", "styled", "size", "InputLabel", "children", "htmlFor", "React", "Wrapper", "InputLabel_default", "React", "styled", "iconSize", "selectPadding", "size", "Wrapper", "styled", "props", "Select", "Option", "Icon", "InputSelect", "value", "options", "onChange", "unit", "title", "React", "Wrapper", "Select", "option", "Option", "Icon", "IconChevronDown", "InputSelect_default", "React", "styled", "Wrapper", "styled", "props", "Input", "size", "InputText", "label", "props", "React", "Wrapper", "Input", "InputText_default", "InsuranceModal", "onClose", "provider", "t", "useTranslation", "ad", "AdContext_default", "publicApi", "useSettings_default", "form", "setForm", "useState", "payload", "setPayload", "loading", "insurances", "error", "useInsuranceInquiry_default", "ssnIsValid", "onChangeSsn", "useCallback", "e", "onChangeDrivingDistance", "trackPayload", "useMemo", "adEvent", "onShowInsurances", "pubsub_default", "onKeyDown", "options", "React", "Modal_default", "Repeat", "ContentLogo", "ContentLogoText", "Content_default", "ContentLogoMedia", "LogoBox_default", "RepeatSmall", "RepeatTiny", "InputGroup", "InputGroupColumn", "InputLabel_default", "InputText_default", "InputSelect_default", "ButtonPrimary", "ButtonContent", "Loader_default", "Snackbar_default", "insurance", "DetailBox_default", "numberSeparator", "str", "ButtonInline", "H4", "item", "ExtendInfo_default", "addon", "ColumnRow", "ColumnRowItem", "UtilityTextBold", "InsuranceModal_default", "Insurance", "provider", "useTranslation", "ad", "AdContext_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "React", "InsuranceModal_default", "Repeat", "RepeatTiny", "VisualHeading", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "ButtonInline", "Insurance_default", "React", "useCallback", "useState", "useTranslation", "React", "useTranslation", "InsuranceFreeModal", "onClose", "provider", "t", "useTranslation", "React", "Modal_default", "Repeat", "Content_default", "ButtonInline", "LogoBox_default", "InsuranceFreeModal_default", "InsuranceFree", "provider", "useTranslation", "ad", "AdContext_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "React", "InsuranceFreeModal_default", "Repeat", "RepeatTiny", "VisualHeading", "OptionBox_default", "Content_default", "OptionBoxContent", "ButtonInline", "InsuranceFree_default", "InsuranceOptions", "provider", "React", "Insurance_default", "InsuranceFree_default", "InsuranceOptions_default", "React", "useTranslation", "styled", "Price", "OldPrice", "props", "styled", "List", "styled", "Item", "size", "Label", "Value", "PriceTable", "price", "discount", "t", "useTranslation", "React", "List", "Item", "Label", "VisualHeading", "Value", "Price", "numberSeparator", "OldPrice", "PriceTable_default", "styled", "ProductPage", "styled", "props", "ProductPageAside", "size", "ProductPageMain", "ProductPageAsideSection", "ProductPageMainSection", "Wrapper", "ProductPageContentLimit", "useEffect", "useState", "UUID", "fetchAd", "settings", "id", "gqlQuery", "AD_QUERY", "resolveLegacyId", "AD_ID_BY_LEGACY_ID_QUERY", "replaceIdInUrl", "from", "to", "pathname", "search", "hash", "useAd", "ad", "setAd", "useState", "loading", "setLoading", "error", "setError", "useEffect", "active", "next", "adId", "useAd_default", "React", "useState", "useTranslation", "React", "useTranslation", "styled", "css", "Wrapper", "styled", "size", "imageBaseStyling", "css", "Image", "ImageaPlaceholder", "props", "Body", "Heading", "Title", "Branding", "Price", "Preamble", "ReadMoreBtn", "ButtonReset", "AccessoryCard", "title", "image", "branding", "price", "preamble", "readMoreCta", "t", "useTranslation", "React", "Wrapper", "Image", "ImageaPlaceholder", "IconImage", "Body", "Heading", "Title", "Branding", "Price", "Preamble", "ReadMoreBtn", "AccessoryCard_default", "React", "useCallback", "useEffect", "useRef", "useState", "styled", "css", "Wrapper", "styled", "size", "props", "$accentBg", "css", "Item", "List", "$columns", "$columnsSm", "$columnsMd", "ListWrapper", "$spacing", "NavBtn", "PrevBtn", "NextBtn", "OverflowGrid", "items", "itemKeyBase", "spacing", "columns", "columnsSm", "columnsMd", "accentBg", "overflowElement", "useRef", "onPrev", "useCallback", "itemWidth", "scrollLeft", "onNext", "scrollWidth", "overflowElementWidth", "hidePrevNav", "setHidePrevNav", "useState", "hideNextNav", "setHideNextNav", "onScroll", "overflowElementScrollWidth", "useEffect", "React", "Wrapper", "ListWrapper", "List", "item", "i", "Item", "PrevBtn", "NavButton", "IconChevronLeft", "NextBtn", "IconChevronRight", "OverflowGrid_default", "React", "useTranslation", "styled", "Image", "React", "styled", "css", "Wrapper", "styled", "size", "props", "Row", "$oldPrice", "css", "Label", "Price", "PriceBox", "prices", "React", "Wrapper", "item", "i", "Row", "Label", "Price", "PriceBox_default", "AccesoryModal", "accessory", "onClose", "t", "useTranslation", "image", "accessoryImages", "priceList", "numberSeparator", "React", "Modal_default", "Repeat", "Image", "LogoBox_default", "PriceBox_default", "Content_default", "UtilityTextBold", "Link", "AccessoryModal_default", "AccessoriesSection", "accessories", "useTranslation", "modal", "setModal", "useState", "onOpenModal", "accessory", "onCloseModal", "React", "AccessoryModal_default", "ProductPageMainSection", "Repeat", "H2", "Content_default", "OverflowGrid_default", "AccessoryCard_default", "accessoryImages", "numberSeparator", "Accessories_default", "React", "useTranslation", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "Image", "Placeholder", "props", "PlaceholderAction", "StaticMap", "position", "useTranslation", "googleMapsApiKey", "googleMapsMarker", "useSettings_default", "visible", "setVisible", "useState", "onShowMap", "useCallback", "e", "latitude", "longitude", "React", "Wrapper", "Image", "Placeholder", "PlaceholderAction", "ButtonSecondary", "ButtonContent", "Map_default", "React", "useMemo", "useTranslation", "React", "styled", "getBg", "severity", "bg", "theme_default", "Wrapper", "styled", "props", "size", "Badge", "label", "severity", "React", "Wrapper", "Badge_default", "styled", "TableColumn", "styled", "TableColumnRow", "size", "TableColumnCell", "KeyOrder", "TranslateWeekDays", "t", "d", "arr", "GetOpeningHours", "o", "prev", "current", "title", "item", "previous", "GetOpeningHoursToday", "dayNumber", "day", "valuOfDateString", "s", "splitted", "x", "OpeningHours", "openingHours", "useTranslation", "today", "useMemo", "currentlyOpen", "currentDate", "from", "until", "oh", "React", "RepeatSmall", "Badge_default", "TableColumn", "TableColumnRow", "TableColumnCell", "UtilityTextBold", "OpeningHours_default", "React", "useCallback", "useState", "useTranslation", "PhoneNumber", "phoneNumber", "useTranslation", "visible", "setVisible", "useState", "onClick", "useCallback", "React", "TableColumnRow", "TableColumnCell", "ButtonInlineBold", "ButtonContent", "PhoneNumber_default", "parsePhoneNumberFromString", "metadata_min_default", "metadata", "metadata_min_default", "typedMetadata", "formatPhonenumber", "text", "parsePhoneNumberFromString", "Branch", "branch", "displayBranchName", "t", "useTranslation", "hours", "openingHours", "phone", "React", "Repeat", "H2", "Map_default", "position", "ProductPageContentLimit", "TableColumn", "TableColumnRow", "TableColumnCell", "ButtonInlineBold", "ButtonContent", "PhoneNumber_default", "formatPhonenumber", "OpeningHours_default", "Branch_default", "format", "nb", "sv", "React", "useCallback", "useState", "useTranslation", "React", "useCallback", "useMemo", "useState", "useTranslation", "React", "useCallback", "useId", "useMemo", "useState", "useTranslation", "useCallback", "useState", "package_default", "useSubmitLead", "leadUrl", "marketCode", "isLoading", "setIsLoading", "useState", "error", "setError", "submitLead", "useCallback", "itemId", "branchId", "communication", "firstName", "lastName", "phoneNumber", "email", "message", "tradeInCarRegNo", "tradeInCarMileage", "payload", "package_default", "response", "err", "useSubmitLead_default", "React", "React", "styled", "css", "Label", "styled", "size", "props", "Wrapper", "type", "checked", "error", "css", "Input", "LabelText", "InputCheckbox", "children", "props", "id", "Wrapper", "Input", "Label", "LabelText", "InputCheckbox_default", "React", "styled", "Wrapper", "styled", "size", "props", "InputError", "id", "children", "React", "Wrapper", "InputError_default", "React", "styled", "Wrapper", "styled", "props", "Textarea", "size", "InputTextarea", "label", "props", "React", "Wrapper", "Textarea", "InputTextarea_default", "styled", "Field", "initialValues", "MAX_MESSAGE_LENGTH", "EMAIL_PATTERN", "registrationNumberPatterns", "normalizeRegistrationNumber", "value", "isValidRegistrationNumber", "marketCode", "pattern", "LeadForm", "communication", "onClose", "t", "useTranslation", "ad", "AdContext_default", "leadUrl", "useSettings_default", "submitLead", "isLoading", "useSubmitLead_default", "values", "setValues", "useState", "errors", "setErrors", "submitError", "setSubmitError", "sent", "setSent", "formId", "useId", "fieldId", "name", "errorId", "title", "trackPayload", "useMemo", "adEvent", "setValue", "useCallback", "prev", "validate", "v", "next", "onSubmit", "e", "nextErrors", "pubsub_default", "React", "Modal_default", "Repeat", "Content_default", "ButtonPrimary", "ButtonContent", "textField", "label", "inputProps", "RepeatTiny", "Field", "InputLabel_default", "InputText_default", "InputError_default", "RepeatSmall", "InputTextarea_default", "InputCheckbox_default", "ButtonSecondary", "LeadForm_default", "React", "useCallback", "useState", "useTranslation", "ToggleItem", "title", "value", "type", "href", "primary", "onClickVisible", "onClickValue", "t", "useTranslation", "visible", "setVisible", "useState", "_onClickValue", "useCallback", "onClick", "visibleTitle", "Button", "ButtonPrimary", "ButtonSecondary", "React", "RepeatTiny", "ButtonContent", "toggle_item_default", "resolveText", "text", "vehicle", "ActionList", "title", "conversionOptions", "defaultConversionOptions", "toggleEcomModal", "t", "useTranslation", "ad", "AdContext_default", "contact", "contactPerson", "email", "phonenumber", "ecommerce", "ecom", "useMemo", "item", "emailHref", "useCallback", "option", "vehicleLabel", "subject", "params", "trackPayload", "adEvent", "onClickMailVisible", "pubsub_default", "onClickMailValue", "onClickPhoneVisible", "onClickPhoneValue", "leadCommunication", "setLeadCommunication", "useState", "openLeadForm", "communication", "closeLeadForm", "renderButton", "key", "label", "primary", "onClick", "disabled", "React", "RepeatTiny", "ButtonPrimary", "ButtonSecondary", "ButtonContent", "buttons", "index", "toggle_item_default", "formatPhonenumber", "LeadForm_default", "ActionList_default", "React", "styled", "List", "styled", "Item", "size", "Icon", "Label", "CheckMarkListItem", "children", "React", "Item", "Icon", "IconCheck", "Label", "CheckMarkList", "List", "CheckMarkList_default", "styled", "css", "Column", "styled", "grow", "css", "noShrink", "Columns", "valign", "align", "$spacing", "size", "flexWrap", "flexInline", "clearLtSm", "props", "clearLtMd", "styled", "css", "StateIndicator", "styled", "size", "$tone", "css", "props", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "styled", "size", "props", "Header", "Body", "Info", "Action", "InfoContent", "InfoBtn", "ButtonReset", "Title", "SwitchBar", "title", "body", "actionTitle", "children", "onClick", "t", "useTranslation", "info", "setInfo", "useState", "onToggleInfo", "useCallback", "React", "Wrapper", "Header", "Info", "InfoContent", "Title", "InfoBtn", "IconInfo", "Action", "ButtonInline", "Body", "Modal_default", "SwitchBar_default", "React", "useTranslation", "PackageOptionModal", "packageOption", "onClose", "t", "useTranslation", "React", "Modal_default", "Repeat", "LogoBox_default", "Content_default", "ButtonInline", "PackageOptionModal_default", "CheckList", "title", "conversionOptions", "toggleEcomModal", "t", "useTranslation", "ad", "AdContext_default", "marketCode", "useSettings_default", "ecommerce", "ecom", "availableFrom", "packageOption", "manufacturerPackage", "packageOptions", "packageOffers", "modal", "setModal", "useState", "onOpen", "useCallback", "nextModal", "onClose", "React", "PackageOptionModal_default", "Repeat", "ActionList_default", "RepeatTiny", "SwitchBar_default", "Content_default", "Columns", "Column", "StateIndicator", "UtilityFontSizeSmall", "format", "nb", "sv", "CheckMarkList_default", "CheckMarkListItem", "ButtonInline", "index", "CheckList_default", "React", "useTranslation", "DemoCarModal", "onClose", "useTranslation", "React", "Modal_default", "Content_default", "DemoCarModal_default", "React", "useTranslation", "React", "useMemo", "useTranslation", "styled", "PdfListItem", "styled", "size", "theme", "List", "PdfLink", "PdfTitle", "props", "PdfSubtitle", "PdfColumn", "PdfListInner", "translateContentType", "document", "PdfDownloadItem", "useTranslation", "contentType", "useMemo", "React", "PdfListItem", "PdfListInner", "PdfColumn", "PdfTitle", "PdfSubtitle", "PdfLink", "DocumentList", "documents", "List", "i", "DocumentList_default", "SortOrder", "Documents", "documents", "useTranslation", "Translation", "categorised", "prev", "curr", "index", "x", "category", "b", "manyCategories", "React", "ProductPageMainSection", "Repeat", "H2", "ExtendContent_default", "group", "H3", "DocumentList_default", "Documents_default", "React", "useTranslation", "ManufacturerPackageOption", "packageOption", "useTranslation", "React", "ProductPageMainSection", "Repeat", "H2", "Content_default", "ButtonInline", "LogoBox_default", "ManufacturerPackagesOption_default", "React", "useTranslation", "PackageOptions", "packageOptions", "useTranslation", "React", "packageOption", "index", "ProductPageMainSection", "Repeat", "H2", "Content_default", "ButtonInline", "LogoBox_default", "PackageOptions_default", "React", "useTranslation", "Page404", "t", "useTranslation", "React", "Page", "PageSection", "Container_default", "H1", "Page404_default", "React", "PageLoading", "React", "Page", "PageSection", "Container_default", "Loader_default", "PageLoading_default", "React", "useCallback", "useEffect", "useMemo", "useState", "useTranslation", "styled", "TableList", "styled", "props", "TableListItem", "size", "TableListKey", "TableListValue", "TableListBooleanPos", "TableListBooleanNeg", "React", "styled", "css", "Wrapper", "styled", "size", "props", "List", "Item", "Action", "ButtonReset", "css", "Tabs", "tabs", "active", "onClick", "Wrapper", "List", "tab", "Item", "Action", "Tabs_default", "toProperty", "v", "isBoolean", "toCategory", "c", "id", "s", "i", "propertyTree", "ad", "item", "odometer", "basic", "add", "key", "value", "unit", "withHint", "attributes", "modelSeries", "modelName", "version", "categories", "basicIndex", "existing", "propertyTree_default", "React", "useCallback", "useState", "useTranslation", "formatValue", "t", "value", "unit", "React", "TableListBooleanPos", "SrOnly", "IconCheck", "TableListBooleanNeg", "IconCancel", "MetadataItem", "name", "hint", "useTranslation", "foldout", "setFoldout", "useState", "onToggleFoldout", "useCallback", "presentedValue", "TableListItem", "TableListKey", "ButtonInline", "TableListValue", "Modal_default", "Content_default", "MetadataItem_default", "MetadataSubCategory", "name", "properties", "React", "Repeat", "H5", "TableList", "property", "index", "MetadataItem_default", "MetadataCategory", "subCategories", "subCategory", "PropertySet", "t", "useTranslation", "ad", "AdContext_default", "activeCategoryId", "setActiveCategoryId", "useState", "mappedProperties", "useMemo", "propertyTree_default", "useEffect", "categories", "onTab", "useCallback", "id", "activeCategory", "category", "Tabs_default", "Property_default", "React", "useTranslation", "React", "styled", "Wrapper", "styled", "Heading", "Action", "size", "SectionHeader", "children", "onClick", "actionTitle", "React", "Wrapper", "Heading", "Action", "ButtonClear", "ButtonContent", "SectionHeader_default", "useEffect", "useState", "useRelatedAds", "settings", "adId", "manufacturer", "limit", "hits", "setHits", "useState", "loading", "setLoading", "useEffect", "active", "latest", "make", "perPage", "gqlQuery", "RELATED_ADS_QUERY", "data", "h", "sameMake", "taken", "others", "related", "useRelatedAds_default", "Related", "adId", "manufacturer", "placeholderImage", "displayBranchName", "t", "useTranslation", "publicApi", "useSettings_default", "hits", "useRelatedAds_default", "React", "PageSection", "Container_default", "Repeat", "SectionHeader_default", "H2", "OverflowGrid_default", "hit", "HitCard_default", "Related_default", "useEffect", "useRef", "useEcom", "ad", "ecom", "marketCode", "ecomContext", "useRef", "id", "waykeId", "useEffect", "destroyed", "module", "view", "event", "currentStep", "data", "pubsub_default", "adEvent", "useEcom_default", "ItemView", "ad", "placeholderImage", "modifyDocumentTitleItem", "displayBranchName", "conversionOptions", "ecomSettings", "marketCode", "useSettings_default", "searchHref", "useRouter_default", "ecomContext", "useEcom_default", "ecomOption", "defaultConversionOptions", "option", "ecommerce", "ecom", "demoCarModal", "setDemoCarModal", "useState", "onToggleDemoCarModal", "useCallback", "item", "title", "shortDescription", "description", "odometer", "fuelType", "gearboxType", "loans", "leasing", "leasingOffers", "insuranceProvider", "manufacturerOffer", "manufacturerPackage", "contact", "contactPerson", "published", "publishedAt", "media", "useMemo", "galleryMedia", "useEffect", "options", "e", "onShowMoreOptionsClick", "pubsub_default", "adEvent", "startEcom", "uspList", "i18nScoped", "numberSeparator", "React", "AdContext", "Page", "PageSection", "Container_default", "ProductPage", "ProductPageAside", "ProductPageAsideSection", "Repeat", "UtilityFontSizeSmall", "ButtonInlineLight", "ButtonContent", "IconChevronLeft", "LogoBox_default", "RepeatSmall", "H1", "UspList_default", "price", "PriceTable_default", "discount", "FinancialOptions_default", "InsuranceOptions_default", "CheckList_default", "ProductPageMain", "Gallery_default", "ProductPageMainSection", "H2", "Content_default", "Property_default", "Blockquote_default", "dateTimeFormat", "markdownToHtml", "ExtendContent_default", "Documents_default", "Accessories_default", "Branch_default", "ButtonPrimary", "PackageOptions_default", "packageOffers", "ManufacturerPackagesOption_default", "Related_default", "portal_element_default", "portal_namespace_exports", "DemoCarModal_default", "WaykeSearchItem", "id", "disableResetScrollOnInit", "props", "publicApi", "loading", "useAd_default", "PageLoading_default", "Page404_default", "searchItem_default", "React", "React", "useMemo", "styled", "Root", "props", "Root_default", "useCallback", "useEffect", "useState", "useInitializeTranslation", "marketCode", "initialized", "setInitialized", "useState", "i18nScoped", "initialize", "useCallback", "m", "initializeI18n", "useEffect", "useInitializeTranslation_default", "React", "useCallback", "useEffect", "useMemo", "useState", "UUID", "snapshot", "idFromHash", "hash", "value", "idFromPath", "pathname", "s", "RouterProvider", "children", "routing", "useSettings_default", "location", "setLocation", "useState", "useEffect", "update", "base", "useMemo", "id", "itemHref", "useCallback", "itemId", "onLinkClick", "e", "href", "url", "writeSearch", "params", "replace", "query", "next", "React", "RouterContext", "RouterProvider_default", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "SCALAR_ALIASES", "RANGE_BASE_ALIASES", "SORT_ALIASES", "DEFAULT_SORT", "FUEL_TYPE_VALUE_ALIASES", "DROPPED_KEYS", "LEGACY_PER_PAGE", "decodeBase64", "value", "unpackPacked", "decoded", "json", "inner", "hasLegacyParams", "params", "key", "migrateLegacyParams", "input", "merged", "packedKey", "packed", "out", "page", "offset", "mapped", "rangeMatch", "base", "nextKey", "nextValue", "isKnownKey", "canonicalParams", "useCallback", "useEffect", "useRef", "useState", "withMultiSelectFacets", "data", "ads", "selected", "facet", "multiSelectFacetAlias", "f", "useAdsSearch", "params", "settings", "unfiltered", "setUnfiltered", "useState", "result", "setResult", "loading", "setLoading", "loadingMore", "setLoadingMore", "error", "setError", "requestIndex", "useRef", "paramsKey", "api", "market", "branchGroupId", "variables", "useCallback", "page", "toSearchVariables", "started", "useEffect", "gqlQuery", "FACETS_QUERY", "index", "LIST_FILTERS", "field", "buildSearchQuery", "hasMore", "loadMore", "SEARCH_QUERY", "current", "useAdsSearch_default", "toParams", "input", "source", "params", "hasLegacyParams", "migrateLegacyParams", "canonicalParams", "SearchProvider", "children", "publicApi", "routing", "useSettings_default", "search", "writeSearch", "useRouter_default", "setParams", "useState", "lastWritten", "useRef", "unfiltered", "result", "loading", "loadingMore", "error", "hasMore", "loadMore", "useAdsSearch_default", "apply", "useCallback", "next", "replace", "initialize", "initialQueryParams", "fromUrl", "value", "key", "update", "useEffect", "action", "pubsub_default", "useMemo", "React", "SearchContext", "SearchProvider_default", "isPropValid", "React", "StyleSheetManager", "ThemeProviderBase", "shouldForwardProp", "propName", "target", "isPropValid", "ThemeProvider", "children", "React", "StyleSheetManager", "ThemeProviderBase", "theme_default", "themeProvider_default", "WaykeProvider", "children", "settings", "key", "resolved", "useMemo", "resolveSettings", "initialized", "useInitializeTranslation_default", "React", "SettingsContext", "RouterProvider_default", "SearchProvider_default", "themeProvider_default", "Root_default", "package_default", "WaykeProvider_default", "React", "useEffect", "WaykeComposite", "filterList", "initialQueryParams", "removeSearchBar", "removeFilterOptions", "disableResetScrollOnInit", "placeholderImage", "modifyDocumentTitleItem", "modifyDocumentTitleSearch", "displayBranchName", "conversionOptions", "id", "useRouter_default", "routing", "useSettings_default", "useEffect", "pubsub_default", "React", "searchItem_default", "search_default", "WaykeComposite_default", "WaykeCompositeWithProvider", "provider", "composite", "React", "WaykeProvider_default", "WaykeComposite_default", "WaykeCompositeWithProvider_default", "src_default", "WaykeCompositeWithProvider_default"]
3
+ "sources": ["../src/components/SearchBar/index.tsx", "../src/hooks/useOutsideClick.ts", "../src/components/InputSearch/index.tsx", "../src/components/Icon/index.tsx", "../src/components/InputSearch/wrapper.tsx", "../src/layout/theme.ts", "../src/layout/helpers.tsx", "../src/components/Button/index.tsx", "../src/components/Utility/index.tsx", "../src/components/SearchBar/wrapper.tsx", "../src/layouts/search/index.tsx", "../src/components/Container/index.tsx", "../src/components/Container/wrapper.tsx", "../src/components/Filter/index.tsx", "../src/@types/filter.ts", "../src/Gql/searchParams.ts", "../src/Gql/facets.ts", "../src/State/Search/useSearch.ts", "../src/State/Search/SearchContext.ts", "../src/State/Settings/useSettings.ts", "../src/State/Settings/SettingsContext.ts", "../src/State/Settings/settings.ts", "../src/components/FilterPanel/index.tsx", "../src/utils/pubsub/pubsub.ts", "../src/components/Accordion/index.tsx", "../src/components/Accordion/wrapper.tsx", "../src/components/Panel/index.tsx", "../src/components/Heading/index.tsx", "../src/components/Portal/portal-namespace.ts", "../src/components/Portal/portal.tsx", "../src/components/Portal/portal-element.tsx", "../src/components/Panel/wrapper.tsx", "../src/layout/keyframes.tsx", "../src/components/Repeat/index.tsx", "../src/components/FilterPanel/faceSelector.tsx", "../src/components/FilterPanel/checkListFacet.tsx", "../src/components/Checklist/index.tsx", "../src/components/Checklist/wrapper.tsx", "../src/components/OverflowBox/index.tsx", "../src/components/OverflowBox/wrapper.tsx", "../src/components/FilterPanel/colorFacet.tsx", "../src/utils/constants.ts", "../src/utils/converters.ts", "../src/components/ColorSelect/index.tsx", "../src/components/ColorSelect/wrapper.tsx", "../src/components/FilterPanel/rangeFacet.tsx", "../src/components/RangeSlider/index.tsx", "../src/utils/formats.ts", "../src/components/RangeSlider/wrapper.tsx", "../src/components/Filter/wrapper.tsx", "../src/components/Grid/index.tsx", "../src/components/ProductCard/HitCard.tsx", "../src/Gql/hit.ts", "../src/components/ProductCard/index.tsx", "../src/hooks/useIsInViewport.ts", "../src/State/Router/useRouter.ts", "../src/State/Router/RouterContext.ts", "../src/components/ResponsiveImage/index.tsx", "../src/utils/image.ts", "../src/components/UspList/index.tsx", "../src/components/UspList/wrapper.tsx", "../src/components/ProductCard/wrapper.tsx", "../src/components/Grid/wrapper.tsx", "../src/components/Page/index.tsx", "../src/components/Result/index.tsx", "../src/utils/I18n.ts", "../src/utils/sortOptions.ts", "../src/components/Loader/index.tsx", "../src/components/SrOnly/index.tsx", "../src/components/Loader/wrapper.tsx", "../src/components/ProgressBar/index.tsx", "../src/components/ProgressBar/wrapper.tsx", "../src/components/SortSelect/index.tsx", "../src/components/SortSelect/wrapper.tsx", "../src/components/Result/wrapper.tsx", "../src/components/SearchFilter/index.tsx", "../package.json", "../src/Gql/client.ts", "../src/Gql/queries.ts", "../src/Gql/suggest.ts", "../src/components/SearchTerm/index.tsx", "../src/components/SearchTerm/wrapper.tsx", "../src/components/Snackbar/index.tsx", "../src/components/Snackbar/wrapper.tsx", "../src/layouts/searchItem/index.tsx", "../src/@types/conversion.ts", "../src/components/Blockquote/index.tsx", "../src/components/Avatar/index.tsx", "../src/components/Avatar/wrapper.tsx", "../src/components/Blockquote/wrapper.tsx", "../src/components/Content/index.tsx", "../src/utils/markdown.ts", "../src/components/Content/wrapper.tsx", "../src/components/ExtendContent/index.tsx", "../src/components/ExtendContent/wrapper.tsx", "../src/components/FinancialOptions/index.tsx", "../src/components/CreditorDisclaimer/index.tsx", "../src/components/Link/index.tsx", "../src/components/CreditorDisclaimer/wrapper.tsx", "../src/components/FinancialOptions/leasing.tsx", "../src/components/DataList/index.tsx", "../src/components/DataList/wrapper.tsx", "../src/components/Modal/index.tsx", "../src/components/Modal/wrapper.tsx", "../src/components/OptionBox/index.tsx", "../src/components/OptionBox/wrapper.tsx", "../src/components/FinancialOptions/loan.tsx", "../src/Gql/ad/useLoanCalculation.ts", "../src/Gql/ad/queries.ts", "../src/Gql/ad/legacyWaykeId.ts", "../src/Gql/ad/view.ts", "../src/State/Ad/AdContext.ts", "../src/components/FinancialOptions/LoanModal.tsx", "../src/components/ContentLogo/index.tsx", "../src/components/LogoBox/index.tsx", "../src/components/LogoBox/wrapper.tsx", "../src/components/RangeSlider/SliderWithLabel.tsx", "../src/components/RangeSliderLabel/index.tsx", "../src/components/RangeSliderLabel/wrapper.tsx", "../src/components/RangeSlider/RangeSliderSimple.tsx", "../src/components/Gallery/index.tsx", "../src/components/Lightbox/index.tsx", "../src/components/Sphere/SphereLightbox.tsx", "../src/components/Sphere/SphereViewer.tsx", "../src/components/Sphere/wrapper.tsx", "../src/components/ThreeSixty/wrapper.tsx", "../src/components/ThreeSixty/ThreeSixtLightbox.tsx", "../src/components/Lightbox/wrapper.tsx", "../src/components/ThreeSixty/Rotation.tsx", "../src/components/Video/EmbeddedVideoLightbox.tsx", "../src/components/Video/CustomPlayer.tsx", "../src/components/Video/Video.tsx", "../src/components/Video/wrapper.tsx", "../src/components/Video/VimeoPlayer.tsx", "../src/components/Video/utils.ts", "../src/components/Video/YoutubePlayer.tsx", "../src/components/NavButton/index.tsx", "../src/components/Sphere/Sphere.tsx", "../src/components/ThreeSixty/ThreeSixty.tsx", "../src/components/Gallery/wrapper.tsx", "../src/components/Video/EmbededVideo.tsx", "../src/components/Gallery/MediaButton.tsx", "../src/components/Video/useThumbnail.ts", "../src/hooks/useVimeoThumbnail.ts", "../src/hooks/useFetch.ts", "../src/components/Video/QuickNavEmbeded.tsx", "../src/components/InsuranceOptions/index.tsx", "../src/components/InsuranceOptions/Insurance.tsx", "../src/components/InsuranceOptions/InsuranceModal.tsx", "../src/Gql/ad/useInsuranceInquiry.ts", "../src/utils/ssn.ts", "../src/components/ColumnRow/index.tsx", "../src/components/DetailBox/index.tsx", "../src/components/DetailBox/wrapper.tsx", "../src/components/ExtendInfo/index.tsx", "../src/components/ExtendInfo/wrapper.tsx", "../src/components/InputGroup/index.tsx", "../src/components/InputLabel/index.tsx", "../src/components/InputLabel/wrapper.tsx", "../src/components/InputSelect/index.tsx", "../src/components/InputSelect/wrapper.tsx", "../src/components/InputText/index.tsx", "../src/components/InputText/wrapper.tsx", "../src/components/InsuranceOptions/InsuranceFree.tsx", "../src/components/InsuranceOptions/InsuranceFreeModal.tsx", "../src/components/PriceTable/index.tsx", "../src/components/Price/index.tsx", "../src/components/PriceTable/wrapper.tsx", "../src/components/ProductPage/index.tsx", "../src/Gql/ad/useAd.ts", "../src/layouts/searchItem/Accessories/index.tsx", "../src/components/AccessoryCard/index.tsx", "../src/components/AccessoryCard/wrapper.tsx", "../src/components/OverflowGrid/index.tsx", "../src/components/OverflowGrid/wrapper.tsx", "../src/layouts/searchItem/Accessories/AccessoryModal.tsx", "../src/components/Image/index.tsx", "../src/components/PriceBox/index.tsx", "../src/components/PriceBox/wrapper.tsx", "../src/layouts/searchItem/Branch.tsx", "../src/components/Map/index.tsx", "../src/components/Map/wrapper.tsx", "../src/components/OpeningHours/index.tsx", "../src/components/Badge/index.tsx", "../src/components/Badge/wrapper.tsx", "../src/components/TableColumn/index.tsx", "../src/components/PhoneNumber/index.tsx", "../src/utils/phonenumbers.ts", "../src/utils/metadata.min.json", "../src/layouts/searchItem/CheckList.tsx", "../src/components/ActionList/index.tsx", "../src/components/LeadForm/index.tsx", "../src/hooks/useSubmitLead.ts", "../src/components/InputCheckbox/index.tsx", "../src/components/InputCheckbox/wrapper.tsx", "../src/components/InputError/index.tsx", "../src/components/InputError/wrapper.ts", "../src/components/InputTextarea/index.tsx", "../src/components/InputTextarea/wrapper.ts", "../src/components/LeadForm/wrapper.ts", "../src/components/ActionList/toggle-item.tsx", "../src/components/CheckMarkList/index.tsx", "../src/components/CheckMarkList/wrapper.tsx", "../src/components/Columns/index.tsx", "../src/components/StateIndicator/index.tsx", "../src/components/SwitchBar/index.tsx", "../src/components/SwitchBar/wrapper.tsx", "../src/layouts/searchItem/PackageOptionModal.tsx", "../src/layouts/searchItem/DemoCarModal.tsx", "../src/layouts/searchItem/Documents.tsx", "../src/components/DocumentList/index.tsx", "../src/components/DocumentList/wrapper.tsx", "../src/layouts/searchItem/ManufacturerPackagesOption.tsx", "../src/layouts/searchItem/PackageOptions.tsx", "../src/layouts/searchItem/Page404.tsx", "../src/layouts/searchItem/PageLoading.tsx", "../src/layouts/searchItem/Property.tsx", "../src/components/TableList/index.tsx", "../src/components/Tabs/index.tsx", "../src/components/Tabs/wrapper.tsx", "../src/Gql/ad/propertyTree.ts", "../src/layouts/searchItem/MetadataItem.tsx", "../src/layouts/searchItem/Related.tsx", "../src/components/SectionHeader/index.tsx", "../src/components/SectionHeader/wrapper.tsx", "../src/Gql/ad/useRelatedAds.ts", "../src/layouts/searchItem/useEcom.ts", "../src/layouts/WaykeCompositeWithProvider.tsx", "../src/providers/WaykeProvider.tsx", "../src/components/Root/index.tsx", "../src/hooks/useInitializeTranslation.ts", "../src/State/Router/RouterProvider.tsx", "../src/State/Search/SearchProvider.tsx", "../src/Gql/legacyParams.ts", "../src/Gql/useAdsSearch.ts", "../src/providers/themeProvider.tsx", "../src/layouts/WaykeComposite.tsx", "../src/index.ts"],
4
+ "sourcesContent": ["import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useOutsideClick from '../../hooks/useOutsideClick';\nimport InputSearch from '../InputSearch';\nimport { Suggestion, Suggestions } from './wrapper';\n\ninterface SearchBarProps {\n value: string;\n setValue: (value: string) => void;\n onSearch: (value: string) => void;\n /** Typeahead labels shown under the field */\n suggestions?: string[];\n onSelectSuggestion?: (index: number) => void;\n}\n\nconst SearchBar = ({\n value,\n setValue,\n onSearch,\n suggestions = [],\n onSelectSuggestion,\n}: SearchBarProps) => {\n const { t } = useTranslation();\n const ref = useRef<HTMLDivElement>(null);\n const listId = useId();\n const [active, setActive] = useState(-1);\n const open = suggestions.length > 0 && !!onSelectSuggestion;\n\n useEffect(() => setActive(-1), [suggestions]);\n\n const onChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => setValue(e.currentTarget.value),\n [setValue]\n );\n\n useOutsideClick(ref, () => setValue(''));\n\n const _onSearch = useCallback(() => {\n onSearch(value);\n }, [value, onSearch]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (open && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n const last = suggestions.length - 1;\n setActive((i) => (e.key === 'ArrowDown' ? Math.min(i + 1, last) : Math.max(i - 1, -1)));\n } else if (e.key === 'Escape') {\n setValue('');\n } else if (e.key === 'Enter') {\n if (open && active > -1) {\n onSelectSuggestion?.(active);\n } else {\n _onSearch();\n }\n }\n },\n [open, active, suggestions, onSelectSuggestion, _onSearch, setValue]\n );\n\n return (\n <InputSearch\n ref={ref}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onSearch={_onSearch}\n placeholder={t('searchBar.placeholder')}\n label={t('searchBar.placeholder')}\n id=\"main-search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={open && active > -1 ? `${listId}-${active}` : undefined}\n >\n {open && (\n <Suggestions id={listId} role=\"listbox\" aria-label={t('searchBar.searchResults')}>\n {suggestions.map((label, index) => (\n <Suggestion\n key={label}\n id={`${listId}-${index}`}\n role=\"option\"\n aria-selected={index === active}\n $active={index === active}\n // mousedown, so the pick lands before the field loses focus\n onMouseDown={(e) => {\n e.preventDefault();\n onSelectSuggestion?.(index);\n }}\n >\n {label}\n </Suggestion>\n ))}\n </Suggestions>\n )}\n </InputSearch>\n );\n};\n\nexport default SearchBar;\n", "import { useEffect } from 'react';\n\nconst useOutsideClick = (ref: React.RefObject<HTMLElement | null>, callback: () => void) => {\n const handleClick = (e: MouseEvent) => {\n if (ref.current && e.target && !ref.current.contains(e.target as Node)) {\n callback();\n }\n };\n\n useEffect(() => {\n document.addEventListener('click', handleClick);\n\n return () => {\n document.removeEventListener('click', handleClick);\n };\n });\n};\n\nexport default useOutsideClick;\n", "import React from 'react';\nimport { IconSearch } from '../Icon';\nimport { Action, ActionBtn, Input, Label, Search, Wrapper } from './wrapper';\n\ntype InputProps = React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n>;\n\ntype Props = InputProps & {\n placeholder: string;\n label: string;\n value?: string;\n id: string;\n onSearch: () => void;\n};\n\nconst InputSearch = React.forwardRef<HTMLDivElement, Props>(\n ({ placeholder, label, value, id, onSearch, onChange, onKeyDown, children, ...aria }, ref) => (\n <Wrapper ref={ref}>\n <Label htmlFor={id}>{label}</Label>\n <Search>\n <Input\n placeholder={placeholder}\n name=\"search\"\n value={value}\n id={id}\n onChange={onChange}\n onKeyDown={onKeyDown}\n autoComplete=\"off\"\n {...aria}\n />\n {children}\n </Search>\n <Action>\n <ActionBtn onClick={onSearch} title={`Genomf\u00F6r ${label}`} aria-label={`Genomf\u00F6r ${label}`}>\n <IconSearch block />\n </ActionBtn>\n </Action>\n </Wrapper>\n )\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\ntype SharedIconProps = {\n block?: boolean;\n};\n\ntype IconProps = React.SVGProps<SVGSVGElement> & SharedIconProps;\n\nconst Icon = styled.svg.attrs(() => ({\n xmlns: 'http://www.w3.org/2000/svg',\n}))<IconProps>`\n display: inline-block;\n vertical-align: middle;\n width: 1em;\n height: 1em;\n fill: currentColor;\n\n ${({ block }) =>\n block &&\n css`\n display: block;\n `}\n`;\n\ntype IconInfoProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> &\n SharedIconProps;\n\nexport const IconInfo = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 24 24\" block={block}>\n <path d=\"M12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0zm0 2c5.5234 0 10 4.4766 10 10s-4.4766 10-10 10S2 17.5234 2 12 6.4766 2 12 2zm0 3.8125c-.1836 0-.336-.004-.5.0313-.164.0351-.3164.125-.4375.2187-.121.0938-.211.2227-.2813.375s-.0937.332-.0937.5625c0 .2266.0234.4063.0938.5625.0703.1563.1601.2813.2812.375.121.0938.2734.1484.4375.1875.164.039.3164.0625.5.0625.1797 0 .371-.0234.5313-.0625.1601-.039.2851-.0938.4062-.1875.121-.0938.211-.2188.2813-.375.0703-.1523.125-.336.125-.5625 0-.2305-.0547-.4102-.125-.5625-.0704-.1523-.1602-.2813-.2813-.375-.121-.0938-.246-.1836-.4063-.2188-.1601-.0351-.3515-.0312-.5312-.0312zm-1.2188 3.3438v8.9687h2.4375V9.1562z\" />\n </Icon>\n);\n\nexport const IconCancel = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.7 14.3c.4.4.4 1 0 1.4-.2.2-.5.3-.7.3s-.5-.1-.7-.3L8 9.4l-6.3 6.3c-.2.2-.4.3-.7.3s-.5-.1-.7-.3c-.4-.4-.4-1 0-1.4L6.6 8 .3 1.7C-.1 1.3-.1.7.3.3c.4-.4 1-.4 1.4 0L8 6.6 14.3.3c.4-.4 1-.4 1.4 0 .4.4.4 1 0 1.4L9.4 8l6.3 6.3z\" />\n </Icon>\n);\n\nexport const IconChevronDown = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M17.7 5L9 13.7.3 5l.7-.7 8 8 8-8 .7.7z\" />\n </Icon>\n);\n\nexport const IconChevronLeft = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M13 17.7L4.3 9 13 .3l.7.7-8 8 8 8-.7.7z\" />\n </Icon>\n);\n\nexport const IconChevronRight = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 18 18\" block={block}>\n <path d=\"M5 .3L13.7 9 5 17.7l-.7-.7 8-8-8-8L5 .3z\" />\n </Icon>\n);\n\nexport const IconCheck = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.6 4.3l-9.3 9.4c-.5.5-1.4.5-1.9 0l-4-4c-.5-.5-.5-1.4 0-1.9s1.3-.5 1.9 0l3.1 3.1 8.4-8.5c.5-.5 1.4-.5 1.9 0s.4 1.3-.1 1.9z\" />\n </Icon>\n);\n\nexport const IconRadio = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M13 8c0 2.8-2.2 5-5 5s-5-2.2-5-5 2.2-5 5-5 5 2.2 5 5zm3 0c0 4.4-3.6 8-8 8s-8-3.6-8-8 3.6-8 8-8 8 3.6 8 8zm-1 0c0-3.9-3.1-7-7-7S1 4.1 1 8s3.1 7 7 7 7-3.1 7-7z\" />\n </Icon>\n);\n\nexport const IconSearch = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path d=\"M15.5 15.3L11 10.8c1.2-1.1 2-2.7 2-4.5C13 2.9 10.2.1 6.8.1S.5 2.8.5 6.2s2.8 6.2 6.2 6.2c1.3 0 2.5-.4 3.5-1.1l4.6 4.6.7-.6zM1.4 6.2C1.4 3.3 3.8 1 6.7 1S12 3.3 12 6.2c0 1.5-.7 2.9-1.7 3.9l-.7.5c-.8.5-1.8.8-2.8.8-3 .1-5.4-2.3-5.4-5.2z\" />\n </Icon>\n);\n\nexport const IconExclamationCircle = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 32 32\" block={block}>\n <path d=\"M14.482 21.893c0-0.857 0.694-1.551 1.551-1.551s1.551 0.694 1.551 1.551c0 0.857-0.694 1.551-1.551 1.551s-1.551-0.694-1.551-1.551zM16.033 2.838c-7.271 0-13.187 5.916-13.187 13.187s5.916 13.187 13.187 13.187 13.187-5.916 13.187-13.187c0-7.271-5.916-13.187-13.187-13.187zM16.033 27.203c-6.163 0-11.178-5.015-11.178-11.178s5.015-11.178 11.178-11.178c6.164 0 11.178 5.015 11.178 11.178s-5.014 11.178-11.178 11.178zM16.033 8.308c-0.555 0-1.004 0.45-1.004 1.004v8.227c0 0.555 0.45 1.004 1.004 1.004s1.004-0.45 1.004-1.004v-8.227c0-0.555-0.45-1.004-1.004-1.004z\" />\n </Icon>\n);\n\nexport const IconExclamationTriangle = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 32 32\" block={block}>\n <path d=\"M15.951 19.663c-0.457 0-0.828-0.37-0.828-0.828v-4.357c0-0.457 0.37-0.828 0.828-0.828s0.828 0.37 0.828 0.828v4.357c0 0.457-0.371 0.828-0.828 0.828zM15.952 22.906c-0.305 0-0.606-0.126-0.821-0.341s-0.338-0.514-0.338-0.818 0.122-0.606 0.338-0.821c0.431-0.43 1.209-0.43 1.639 0 0.215 0.215 0.341 0.516 0.341 0.821s-0.126 0.603-0.341 0.818c-0.215 0.215-0.513 0.341-0.818 0.341zM27.049 27.070h-22.196c-0.352 0-0.677-0.186-0.855-0.489s-0.184-0.677-0.014-0.985l11.098-20.105c0.175-0.317 0.508-0.513 0.87-0.513s0.695 0.197 0.87 0.513l11.098 20.105c0.17 0.308 0.165 0.683-0.014 0.985s-0.504 0.489-0.856 0.489zM6.536 25.083h18.83l-9.415-17.056-9.415 17.056z\" />\n </Icon>\n);\n\nexport const IconImage = ({ block }: IconInfoProps) => (\n <Icon viewBox=\"0 0 16 16\" block={block}>\n <path\n d=\"M14.4 1.6H1.6C.7 1.6 0 2.3 0 3.2v9.6c0 .9.7 1.6 1.6 1.6h12.8c.9 0 1.6-.7 1.6-1.6V3.2c0-.9-.7-1.6-1.6-1.6zm0 11.2H1.6V3.2h12.8v9.6zM3.2 6c0-.7.5-1.2 1.2-1.2s1.2.5 1.2 1.2-.5 1.2-1.2 1.2S3.2 6.7 3.2 6zm.2 4.5l6.2-4.4c.4-.3.9-.2 1.1.2v.1l2.4 4.2c.1.2 0 .4-.1.5-.1 0-.1.1-.2.1H3.7c-.2 0-.4-.2-.4-.4 0-.1 0-.3.1-.3z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </Icon>\n);\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'search',\n}))`\n display: flex;\n align-items: stretch;\n border-radius: 3px;\n`;\n\nexport const Label = styled.label`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n\nexport const Search = styled.div`\n flex: 1 1 auto;\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accentDark};\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n`;\n\nexport const ActionBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${(props) => props.theme.distances.inputHeight};\n height: ${(props) => props.theme.distances.inputHeight};\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n font-size: 1rem;\n`;\n\nexport const Input = styled.input.attrs(() => ({\n type: 'search',\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n padding: 0 ${size(2)};\n background-color: transparent;\n font-size: 16px;\n border: none;\n border-radius: 0;\n box-shadow: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::-webkit-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &::-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-ms-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "const _colors = {\n black: '#000',\n white: '#fff',\n gray: '#ddd',\n grayLight: '#f8f8f8',\n grayLightTransparent: 'rgba(248, 248, 248, 0)',\n grayLightDarker: '#ebebeb',\n grayDark: '#717171',\n blue: '#1d61ca',\n ui: {\n greenLight: '#cdf5c8',\n green: '#2b8747',\n redLight: '#ffd0d0',\n red: '#c71f1f',\n yellowLight: '#fff4c7',\n yellow: '#ffc700',\n blueLight: '#daf7fc',\n },\n};\n\nconst theme = {\n color: {\n bg: _colors.white,\n link: _colors.blue,\n accent: _colors.grayLight,\n accentTransparent: _colors.grayLightTransparent,\n accentDark: _colors.grayLightDarker,\n border: _colors.gray,\n textDark: _colors.black,\n textDarkLighten: _colors.grayDark,\n textLight: _colors.white,\n hoverOverlay: 'rgba(0, 0, 0, 0.04)',\n disabledBg: _colors.gray,\n disabledText: _colors.grayDark,\n placeholder: _colors.grayDark,\n ui: {\n positiveLight: _colors.ui.greenLight,\n positive: _colors.ui.green,\n neutralLight: _colors.ui.yellowLight,\n neutral: _colors.ui.yellow,\n negativeLight: _colors.ui.redLight,\n negative: _colors.ui.red,\n infoLight: _colors.ui.blueLight,\n },\n },\n breakpoint: {\n Sm: '@media (min-width: 600px)',\n LtSm: '@media (max-width: 599px)',\n Md: '@media (min-width: 900px)',\n LtMd: '@media (max-width: 899px)',\n Lg: '@media (min-width: 1200px)',\n LtLg: '@media (max-width: 1199px)',\n },\n mask: {\n gradient: {\n toTop: 'linear-gradient(to top, #000, transparent)',\n toBottom: 'linear-gradient(to bottom, #000, transparent)',\n toLeft: 'linear-gradient(to left, #000, transparent)',\n toRight: 'linear-gradient(to right, #000, transparent)',\n },\n },\n distances: {\n baseUnit: '8px',\n inputHeight: '48px',\n containerMaxWidth: '1312px',\n },\n};\n\nexport type Theme = typeof theme;\nexport default theme;\n", "import theme from './theme';\n\nexport const size = (multiplier = 1) => {\n const baseUnit = parseFloat(theme.distances.baseUnit);\n return `${multiplier * baseUnit}px`;\n};\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { UtilityTextRight } from '../Utility';\n\nexport const ButtonReset = styled.button.attrs(() => ({\n type: 'button',\n}))`\n display: inline-block;\n vertical-align: middle;\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: 0;\n border-radius: 0;\n font-family: sans-serif;\n font-weight: 400;\n font-size: 1em;\n color: currentColor;\n line-height: 1.2;\n text-align: center;\n text-decoration: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0.1);\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\ntype ButtonResetProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n fullWidth?: boolean;\n inputHeight?: boolean;\n};\n\nconst ButtonBase = styled(ButtonReset)<ButtonResetProps>`\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${size(1.75)} ${size(6)};\n border-radius: 3px;\n font-size: 1rem;\n line-height: 1.2;\n text-decoration: none;\n transform-origin: 50% 50%;\n transition:\n 200ms ease,\n transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.97);\n }\n\n &[disabled] {\n background-color: ${(props) => props.theme.color.disabledBg};\n border-color: ${(props) => props.theme.color.disabledBg};\n color: ${(props) => props.theme.color.disabledText};\n }\n\n ${({ fullWidth }) =>\n fullWidth &&\n css`\n display: flex;\n width: 100%;\n `}\n\n ${({ inputHeight }) =>\n inputHeight &&\n css`\n height: ${(props) => props.theme.distances.inputHeight};\n `}\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: ${size(1.75)} ${size(2.5)};\n font-size: 0.875rem;\n }\n`;\n\nexport const ButtonPrimary = styled(ButtonBase).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg wayke__font--bold',\n}))``;\n\nexport const ButtonSecondary = styled(ButtonBase).attrs(() => ({\n className: 'wayke__theme wayke__color--secondary-bg wayke__font--bold',\n}))`\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const ButtonContent = styled.div`\n position: relative;\n z-index: 1;\n\n & + & {\n margin-left: ${size(0.5)};\n }\n`;\n\nexport const ButtonClear = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n position: relative;\n font-size: 0.875rem;\n padding: ${size(1.5)};\n margin: ${size(-1.5)};\n text-align: left;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n ${UtilityTextRight} & {\n text-align: right;\n }\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\ntype ButtonInlineProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n inline?: boolean;\n as?: string;\n};\n\nexport const ButtonInline = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))<ButtonInlineProps>`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n text-decoration: underline;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDark};\n }\n\n ${({ inline }) =>\n inline &&\n css`\n display: inline;\n `}\n`;\n\nexport const ButtonInlineBold = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const ButtonInlineLight = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n text-decoration: none;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDarkLighten};\n }\n`;\n\nexport const ButtonInlinePrimary = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--regular',\n}))<ButtonInlineProps>`\n display: inline-flex;\n vertical-align: baseline;\n text-align: left;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n", "import styled from 'styled-components';\n\nexport const UtilityTextRight = styled.div`\n text-align: right;\n`;\n\nexport const UtilityFontSizeSmall = styled.span`\n font-size: 0.875rem;\n`;\n\nexport const UtilityTextPrimary = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))``;\n\nexport const UtilityTextBold = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Suggestions = styled.ul.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 10;\n margin: ${size(0.5)} 0 0;\n padding: ${size(0.5)} 0;\n list-style: none;\n background-color: ${(props) => props.theme.color.bg};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n`;\n\nexport const Suggestion = styled.li<{ $active: boolean }>`\n padding: ${size(1)} ${size(2)};\n cursor: pointer;\n background-color: ${(props) => (props.$active ? props.theme.color.hoverOverlay : 'transparent')};\n\n &:hover {\n background-color: ${(props) => props.theme.color.hoverOverlay};\n }\n`;\n", "import React, { useCallback, useEffect } from 'react';\nimport { SearchFilterTypes } from '../../@types/filter';\nimport Container from '../../components/Container';\nimport Filter from '../../components/Filter';\nimport Grid from '../../components/Grid';\nimport { Page, PageSection } from '../../components/Page';\nimport { PortalElement, PortalNamespace } from '../../components/Portal';\nimport Result from '../../components/Result';\nimport SearchFilter from '../../components/SearchFilter';\nimport SearchTerm from '../../components/SearchTerm';\nimport Snackbar from '../../components/Snackbar';\nimport { FREE_TEXT } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { i18nScoped } from '../../utils/I18n';\nimport PubSub from '../../utils/pubsub/pubsub';\n\nexport interface WaykeSearchProps {\n /** The filters to show, in this order. By default all filters. */\n filterList?: SearchFilterTypes[];\n /** Filters applied when the search loads. */\n initialQueryParams?: URLSearchParams | string;\n removeSearchBar?: boolean;\n removeFilterOptions?: boolean;\n /** Url to an image for vehicles without images. */\n placeholderImage?: string;\n /** Sets the page title. */\n modifyDocumentTitleSearch?: string;\n /** Shows the branch name on the vehicles. */\n displayBranchName?: boolean;\n}\n\nconst WaykeSearch = ({\n filterList,\n initialQueryParams,\n removeSearchBar,\n placeholderImage,\n removeFilterOptions,\n modifyDocumentTitleSearch,\n displayBranchName,\n}: WaykeSearchProps) => {\n const { error, result, params, update, initialize } = useSearch();\n const query = params.toString();\n\n useEffect(() => {\n if (modifyDocumentTitleSearch) {\n document.title = modifyDocumentTitleSearch;\n }\n initialize(\n typeof initialQueryParams === 'string'\n ? new URLSearchParams(initialQueryParams)\n : initialQueryParams\n );\n PubSub.publish('View', { type: 'search' });\n }, []);\n\n useEffect(() => {\n PubSub.publish('SearchInitiated', { query });\n }, [query]);\n\n useEffect(() => {\n if (result) {\n PubSub.publish('SearchCompleted', {\n query,\n hits: result.hits.length,\n totalHits: result.found,\n });\n }\n }, [result]);\n\n const onClearQuery = useCallback(() => {\n const next = new URLSearchParams(params);\n PubSub.publish('SearchClearQuery', { query: next.get(FREE_TEXT) });\n next.delete(FREE_TEXT);\n update(next);\n }, [params, update]);\n\n const searchQuery = params.get(FREE_TEXT);\n\n return (\n <>\n <Page>\n {!removeSearchBar && (\n <PageSection>\n <Container>\n <SearchFilter />\n </Container>\n </PageSection>\n )}\n {searchQuery && (\n <PageSection>\n <Container>\n <SearchTerm onClear={onClearQuery}>{searchQuery}</SearchTerm>\n </Container>\n </PageSection>\n )}\n {!removeFilterOptions && (\n <PageSection>\n <Container>\n <Filter filterList={filterList} />\n </Container>\n </PageSection>\n )}\n <PageSection accent fillSpace className=\"wayke__theme wayke__color--accent-bg\">\n <Container>\n <Result>\n <>\n {error && (\n <Snackbar severity=\"error\" icon heading=\"Ett fel har intr\u00E4ffat\">\n V\u00E4nligen f\u00F6rs\u00F6k igen.\n </Snackbar>\n )}\n {!error && result && result.hits.length > 0 && (\n <Grid\n hits={result.hits}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n )}\n {!error && result && result.hits.length === 0 && (\n <Snackbar\n severity=\"warning\"\n icon\n heading={i18nScoped.t('search.snackbarNoSearchResults.heading') || undefined}\n >\n {i18nScoped.t('search.snackbarNoSearchResults.body')}\n </Snackbar>\n )}\n </>\n </Result>\n </Container>\n </PageSection>\n </Page>\n <PortalElement id={PortalNamespace.DefaultPortal} />\n </>\n );\n};\n\nexport default WaykeSearch;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst Container = ({ children }: Props) => <Wrapper>{children}</Wrapper>;\n\nexport default Container;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n width: 100%;\n max-width: ${(props) => props.theme.distances.containerMaxWidth};\n margin: 0 auto;\n padding: 0 ${size(3)};\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: 0 ${size(2)};\n }\n`;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { resolveFilterList, SearchFilterTypes } from '../../@types/filter';\nimport { isRangeFilter, listOptions, rangeSteps, selectedCount } from '../../Gql/facets';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport FilterPanel, { PanelFilter } from '../FilterPanel';\nimport { Action, Indicator, IndicatorValue, Item, Label, List } from './wrapper';\n\ninterface FilterProps {\n filterList?: SearchFilterTypes[];\n}\n\nconst Filter = ({ filterList }: FilterProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n const { params, result, unfiltered } = useSearch();\n const [open, setOpen] = useState<string>();\n const onClose = useCallback(() => setOpen(undefined), []);\n\n // The filters in the order asked for, leaving out those with nothing to pick.\n const filters = useMemo<PanelFilter[]>(\n () =>\n resolveFilterList(filterList)\n .filter((f) =>\n isRangeFilter(f.filterName)\n ? rangeSteps(f.filterName, unfiltered, marketCode).length > 1\n : listOptions(f.filterName, params, result?.facets).length > 0\n )\n .map((f) => ({\n id: f.filterName,\n displayName: f.displayName || t(`filter.${f.filterName}`),\n })),\n [filterList, unfiltered, result, params, marketCode]\n );\n\n if (!result) return null;\n\n return (\n <>\n {open && <FilterPanel filters={filters} open={open} onClose={onClose} />}\n <List>\n {filters.map((f) => {\n const selected = selectedCount(f.id, params);\n return (\n <Item key={f.id}>\n <Action\n onClick={() => setOpen(f.id)}\n title={f.displayName}\n aria-label={f.displayName}\n className={\n selected > 0\n ? 'wayke__theme wayke__color--primary-bg wayke__font--bold'\n : 'wayke__theme wayke__font--regular'\n }\n >\n <Label>{f.displayName}</Label>\n {selected > 0 && (\n <Indicator>\n <IndicatorValue>{selected}</IndicatorValue>\n </Indicator>\n )}\n </Action>\n </Item>\n );\n })}\n </List>\n </>\n );\n};\n\nexport default Filter;\n", "/** The filters the panel can show, named as their URL keys (see Gql/searchParams.ts). */\nexport type SearchFilterNameTypes =\n | 'manufacturer'\n | 'model'\n | 'modelSeries'\n | 'fuelType'\n | 'gearboxType'\n | 'branchDisplayName'\n | 'branchCity'\n | 'colorName'\n | 'environmentClass'\n | 'segment'\n | 'bodyStyle'\n | 'trimLevel'\n | 'inventoryStatus'\n | 'drivetrainType'\n | 'engineBaseType'\n | 'price'\n | 'odometer'\n | 'modelYear'\n | 'privateLease'\n | 'businessLease';\n\nexport type SearchFilterTypes = {\n filterName: SearchFilterNameTypes;\n displayName?: string;\n};\n\n/** Filter names from before 6.0 \u2192 their name now. */\nexport const LEGACY_FILTER_NAMES: Record<string, SearchFilterNameTypes> = {\n branch: 'branchDisplayName',\n color: 'colorName',\n 'properties.segment': 'segment',\n drivingWheel: 'drivetrainType',\n mileage: 'odometer',\n odometerValueAsKm: 'odometer',\n leasingPrice: 'privateLease',\n businessLeasingPrice: 'businessLease',\n};\n\nexport const DEFAULT_FILTER_LIST: SearchFilterTypes[] = [\n { filterName: 'manufacturer' },\n { filterName: 'modelSeries' },\n { filterName: 'fuelType' },\n { filterName: 'gearboxType' },\n { filterName: 'branchDisplayName' },\n { filterName: 'colorName' },\n { filterName: 'environmentClass' },\n { filterName: 'segment' },\n { filterName: 'drivetrainType' },\n { filterName: 'price' },\n { filterName: 'privateLease' },\n { filterName: 'businessLease' },\n { filterName: 'odometer' },\n { filterName: 'modelYear' },\n];\n\n/** The filter list with old names translated and duplicates (mileage + odometerValueAsKm) dropped. */\nexport const resolveFilterList = (filterList?: SearchFilterTypes[]): SearchFilterTypes[] => {\n if (!filterList) return DEFAULT_FILTER_LIST;\n const legacy = filterList.filter((f) => f.filterName in LEGACY_FILTER_NAMES);\n if (legacy.length) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(\n `Wayke: filterList uses filter names from before 6.0 (${legacy\n .map((f) => f.filterName)\n .join(', ')}); they are translated, see the README for the new names`\n );\n }\n const seen = new Set<string>();\n return filterList\n .map((f) => ({ ...f, filterName: LEGACY_FILTER_NAMES[f.filterName] || f.filterName }))\n .filter((f) => {\n if (seen.has(f.filterName)) return false;\n seen.add(f.filterName);\n return true;\n });\n};\n", "// The search URL grammar on /sok, shared with web-ui-v2 so that saved links\n// behave the same on wayke.se and on a dealer site: plain query string, one\n// key per filter, `.min`/`.max` for ranges, `sort=<key>` and `page=<n>`.\n// Everything here is the browser-side translation of that grammar into the\n// arguments of `search.ads`.\n\nimport { MarketCode } from '../@types/market';\n\nexport const FREE_TEXT = 'q';\nexport const SORT = 'sort';\nexport const PAGE = 'page';\n\n/** Facet filters whose URL key, facet field and search argument share a name. */\nexport const LIST_FILTERS = [\n 'manufacturer',\n 'model',\n 'modelSeries',\n 'fuelType',\n 'gearboxType',\n 'branchDisplayName',\n 'colorName',\n 'environmentClass',\n 'segment',\n 'drivetrainType',\n 'bodyStyle',\n 'engineBaseType',\n 'trimLevel',\n 'inventoryStatus',\n 'branchCity',\n] as const;\nexport type ListFilter = (typeof LIST_FILTERS)[number];\n\n/** Range filters: URL base key \u2192 the `\u2026Min`/`\u2026Max` argument pair. */\nexport const RANGE_FILTERS = {\n price: 'cashPrice',\n odometer: 'odometerReading',\n modelYear: 'modelYear',\n privateLease: 'leasingPrice',\n businessLease: 'companyLeasingPrice',\n} as const;\nexport type RangeFilter = keyof typeof RANGE_FILTERS;\n\nexport const BOOLEAN_FILTERS = [\n 'certifiedPreOwned',\n 'isDemoVersion',\n 'deductibleVat',\n 'ecom',\n 'leasing',\n 'businessLeasing',\n] as const;\n\nexport interface SortDefinition {\n field: string;\n direction: 'asc' | 'desc';\n /** Legacy token the sort panel translates; see Utils/SortOptions.ts. */\n legacyName: string;\n}\n\n/** `sort=` keys, in the order the sort panel lists them. The first is the default. */\nexport const SORT_OPTIONS: Record<string, SortDefinition> = {\n 'published-desc': { field: 'publishedAt', direction: 'desc', legacyName: 'published-desc' },\n 'published-asc': { field: 'publishedAt', direction: 'asc', legacyName: 'published-asc' },\n 'price-asc': { field: 'price', direction: 'asc', legacyName: 'price-asc' },\n 'price-desc': { field: 'price', direction: 'desc', legacyName: 'price-desc' },\n 'modelYear-desc': { field: 'modelYear', direction: 'desc', legacyName: 'model-desc' },\n 'modelYear-asc': { field: 'modelYear', direction: 'asc', legacyName: 'model-asc' },\n 'odometer-asc': { field: 'odometerReading', direction: 'asc', legacyName: 'mileage-asc' },\n 'odometer-desc': { field: 'odometerReading', direction: 'desc', legacyName: 'mileage-desc' },\n 'leasing-asc': { field: 'leasingPrice', direction: 'asc', legacyName: 'leasing-asc' },\n 'leasing-desc': { field: 'leasingPrice', direction: 'desc', legacyName: 'leasing-desc' },\n 'companyLeasing-asc': {\n field: 'companyLeasingPrice',\n direction: 'asc',\n legacyName: 'companyLeasing-asc',\n },\n 'companyLeasing-desc': {\n field: 'companyLeasingPrice',\n direction: 'desc',\n legacyName: 'companyLeasing-desc',\n },\n};\nexport const DEFAULT_SORT = 'published-desc';\n\n/** Page size as components-react's legacy search had it: 30, also after a filter. */\nexport const pageSize = (_params: URLSearchParams) => 30;\n\nconst KNOWN_KEYS = new Set<string>([\n FREE_TEXT,\n SORT,\n PAGE,\n ...LIST_FILTERS,\n ...BOOLEAN_FILTERS,\n ...Object.keys(RANGE_FILTERS).flatMap((k) => [`${k}.min`, `${k}.max`]),\n]);\n\nexport const isKnownKey = (key: string) => KNOWN_KEYS.has(key);\n\n/** Odometer values in the URL are in the market's display unit; the API takes km. */\nexport const kmPerOdometerUnit = (market: MarketCode) => (market === 'NO' ? 1 : 10);\n\nconst toInt = (value: string | null) => {\n if (value === null || value === '') return undefined;\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : undefined;\n};\n\nexport interface AdsVariables {\n market: string[];\n q?: string;\n page: number;\n perPage: number;\n sort?: { field: string; direction: 'asc' | 'desc' };\n [key: string]: unknown;\n}\n\n/**\n * URL params \u2192 `search.ads` variables. Unknown keys are ignored; the page is read\n * from `page` unless given explicitly (load more passes it).\n */\nexport const toSearchVariables = (\n params: URLSearchParams,\n market: MarketCode,\n options?: { page?: number; perPage?: number }\n): AdsVariables => {\n const variables: AdsVariables = {\n market: [market],\n page: options?.page ?? toInt(params.get(PAGE)) ?? 1,\n perPage: options?.perPage ?? pageSize(params),\n };\n\n const q = params.get(FREE_TEXT)?.trim();\n if (q) variables.q = q;\n\n LIST_FILTERS.forEach((key) => {\n const values = params.getAll(key).filter(Boolean);\n if (values.length) variables[key] = values;\n });\n\n BOOLEAN_FILTERS.forEach((key) => {\n if (params.get(key) === 'true') variables[key] = true;\n });\n\n (Object.keys(RANGE_FILTERS) as RangeFilter[]).forEach((key) => {\n const scale = key === 'odometer' ? kmPerOdometerUnit(market) : 1;\n const min = toInt(params.get(`${key}.min`));\n const max = toInt(params.get(`${key}.max`));\n if (min !== undefined) variables[`${RANGE_FILTERS[key]}Min`] = min * scale;\n if (max !== undefined) variables[`${RANGE_FILTERS[key]}Max`] = max * scale;\n });\n\n const sort = SORT_OPTIONS[params.get(SORT) || ''];\n if (sort) variables.sort = { field: sort.field, direction: sort.direction };\n\n return variables;\n};\n\n/** The canonical form written to the address bar: known keys only, sorted, no paging. */\nexport const canonicalParams = (params: URLSearchParams) => {\n const next = new URLSearchParams();\n params.forEach((value, key) => {\n if (!isKnownKey(key) || key === PAGE) return;\n if (key === SORT && (value === DEFAULT_SORT || !SORT_OPTIONS[value])) return;\n if (value === '') return;\n next.append(key, value);\n });\n next.sort();\n return next;\n};\n\nexport const toggleListValue = (params: URLSearchParams, key: string, value: string) => {\n const next = new URLSearchParams(params);\n const current = next.getAll(key);\n next.delete(key);\n if (current.includes(value)) {\n current.filter((v) => v !== value).forEach((v) => next.append(key, v));\n } else {\n [...current, value].forEach((v) => next.append(key, v));\n }\n return canonicalParams(next);\n};\n\nexport const withSort = (params: URLSearchParams, sortKey: string) => {\n const next = new URLSearchParams(params);\n next.set(SORT, sortKey);\n return canonicalParams(next);\n};\n\nexport const withPage = (params: URLSearchParams, page: number) => {\n const next = new URLSearchParams(params);\n next.set(PAGE, String(page));\n return next;\n};\n", "// The filter panel's view of a search: which values a list filter offers and\n// which domain a slider covers, read straight from the API responses.\n\nimport { MarketCode } from '../@types/market';\nimport { kmPerOdometerUnit, RANGE_FILTERS, RangeFilter } from './searchParams';\nimport { AdsResult, Facet, HistogramBucket } from './types';\n\nexport interface FacetOption {\n value: string;\n count: number;\n selected: boolean;\n}\n\n/**\n * The values of a list filter, with counts from the filtered result (where a\n * selected filter's own facet is counted without it, see useAdsSearch). A\n * selected value is always listed, so it can be unticked.\n */\nexport const listOptions = (\n field: string,\n params: URLSearchParams,\n facets: Facet[] | undefined\n): FacetOption[] => {\n const selected = params.getAll(field);\n const counts = facets?.find((f) => f.field === field)?.counts || [];\n const options = counts.map((c) => ({\n value: c.value,\n count: c.count,\n selected: selected.includes(c.value),\n }));\n selected\n .filter((value) => !counts.some((c) => c.value === value))\n .forEach((value) => options.push({ value, count: 0, selected: true }));\n return options.sort((a, b) => a.value.localeCompare(b.value));\n};\n\nexport const isRangeFilter = (key: string): key is RangeFilter => key in RANGE_FILTERS;\n\nconst histogram = (key: RangeFilter, unfiltered: AdsResult, market: MarketCode) => {\n const h = unfiltered.histograms;\n switch (key) {\n case 'price':\n return h?.price;\n case 'odometer': {\n // The API counts km; the slider shows the market's unit.\n const scale = kmPerOdometerUnit(market);\n return h?.odometerReading?.map((b) => ({\n value: Math.round(b.value / scale),\n count: b.count,\n }));\n }\n case 'privateLease':\n return h?.leasingPrice;\n case 'businessLease':\n return h?.businessLeasingPrice;\n case 'modelYear':\n return unfiltered.facets\n ?.find((f) => f.field === 'modelYear')\n ?.counts.map((c) => ({ value: Number.parseInt(c.value, 10), count: c.count }))\n .filter((b) => Number.isFinite(b.value));\n default:\n return undefined;\n }\n};\n\n/** The bucket start values of a slider, ascending, from the unfiltered search. */\nexport const rangeValues = (\n key: RangeFilter,\n unfiltered: AdsResult | undefined,\n market: MarketCode\n): number[] =>\n unfiltered\n ? [...(histogram(key, unfiltered, market) || [])]\n .sort((a: HistogramBucket, b: HistogramBucket) => a.value - b.value)\n .map((b) => b.value)\n : [];\n\n/** How many values of a filter are picked: list values, or 1 for a set range. */\nexport const selectedCount = (key: string, params: URLSearchParams) =>\n isRangeFilter(key)\n ? params.has(`${key}.min`) || params.has(`${key}.max`)\n ? 1\n : 0\n : params.getAll(key).length;\n\nconst averageDelta = (values: number[]) =>\n values.length > 1 ? (values[values.length - 1] - values[0]) / (values.length - 1) : 0;\n\n/**\n * Even steps of 1000 or 500 for wide ranges, else the bucket values themselves.\n * A single bucket, such as one car with business leasing, gets a range from 0\n * so the filter still shows, as in 5.x; a single model year has nothing to pick.\n */\nconst toSteps = (values: number[], fromZero: boolean) => {\n if (values.length === 1 && fromZero && values[0] > 0) {\n return toSteps([0, values[0]], false);\n }\n const delta = averageDelta(values);\n const max = values[values.length - 1];\n // Math.ceil: uneven buckets would otherwise give a fractional array length.\n if (delta > 1000) return new Array(Math.ceil(max / 1000) + 1).fill(0).map((_, i) => i * 1000);\n if (delta >= 500) return new Array(Math.ceil(max / 500) + 1).fill(0).map((_, i) => i * 500);\n return values;\n};\n\n/** The steps of a range filter's slider; fewer than two means there is nothing to pick. */\nexport const rangeSteps = (\n key: RangeFilter,\n unfiltered: AdsResult | undefined,\n market: MarketCode\n): number[] => toSteps(rangeValues(key, unfiltered, market), key !== 'modelYear');\n", "import { useContext } from 'react';\nimport { SearchContext } from './SearchContext';\n\nconst useSearch = () => useContext(SearchContext);\n\nexport default useSearch;\n", "import { createContext } from 'react';\nimport { AdsResult } from '../../Gql/types';\nimport { AdsSearchResult } from '../../Gql/useAdsSearch';\n\nexport interface SearchContextProps {\n /** The filters in the searchParams.ts grammar; empty until the search has initialized */\n params: URLSearchParams;\n /** The filtered result, every page loaded so far */\n result?: AdsSearchResult;\n /** Facets and histograms without filters: the panel's full value lists and slider domains */\n unfiltered?: AdsResult;\n loading: boolean;\n loadingMore: boolean;\n error: boolean;\n hasMore: boolean;\n /** Applies new filters. Old keys and sort tokens are translated. */\n update: (next: URLSearchParams | string) => void;\n loadMore: () => void;\n /** Starts the search with the url's filters and/or initialQueryParams */\n initialize: (initialQueryParams?: URLSearchParams) => void;\n}\n\nexport const SearchContext = createContext<SearchContextProps>({\n params: new URLSearchParams(),\n loading: false,\n loadingMore: false,\n error: false,\n hasMore: false,\n update: () => undefined,\n loadMore: () => undefined,\n initialize: () => undefined,\n});\n", "import { useContext } from 'react';\n\nimport { SettingsContext } from './SettingsContext';\n\nconst useSettings = () => useContext(SettingsContext);\n\nexport default useSettings;\n", "import { createContext } from 'react';\nimport { resolveSettings, Settings } from './settings';\n\nexport const SettingsContext = createContext<Settings>(resolveSettings());\n", "import { MarketCode } from '../../@types/market';\nimport { PublicApiSettings } from '../../Gql/config';\n\nexport type Environment = 'production' | 'test';\n\nconst ENVIRONMENTS: Record<\n Environment,\n { publicApiUrl: string; leadUrl: string; ecomUrl: string }\n> = {\n production: {\n publicApiUrl: 'https://public-api.wayke.com/graphql',\n leadUrl: 'https://api.wayke.se/lead',\n ecomUrl: 'https://ecom.wayke.se',\n },\n test: {\n publicApiUrl: 'https://public-test-api.wayke.com/graphql',\n leadUrl: 'https://api.wayketech.se/lead',\n ecomUrl: 'https://ecom.wayketech.se',\n },\n};\n\nexport type RoutingMode = 'hash' | 'path' | 'none';\n\nexport interface RoutingSettings {\n /**\n * How a vehicle is opened from the search. `hash` (default) adds `#<id>` to\n * the url, `path` links to `<basePath>/<id>`, `none` makes the vehicles plain\n * cards and only publishes `ItemClicked`.\n */\n mode?: RoutingMode;\n /** Required for `path`. Relative to the current page, or an absolute url to another site. */\n basePath?: string;\n /** Reads and writes the search filters in the url. */\n syncUrl?: boolean;\n}\n\nexport interface EcomSettings {\n /**\n * Buy online is shown on the vehicles the dealer sells online. `false` hides it\n * on this site. Default `true`.\n */\n enabled?: boolean;\n /** Defaults to the ecom API of `environment`. */\n url?: string;\n /** Url to the logo shown in buy online, as an image file (not a `data:` url). */\n serviceLogotypeUrl?: string;\n bankIdThumbprint?: string;\n}\n\nexport interface WaykeProviderSettings {\n /** Which Wayke environment to use. Default `production`. */\n environment?: Environment;\n /** Identifies the site instead of its domain. Sent as `x-api-key`. */\n apiKey?: string;\n /** Limits the vehicles to a group of branches. By default the key decides which vehicles are shown. */\n branchGroupId?: string;\n /** Language and market. Default `SE`. */\n marketCode?: MarketCode;\n routing?: RoutingSettings;\n /** Buy online, see EcomSettings. */\n ecom?: EcomSettings;\n /** A Google Maps Static API key. Without it, the map button opens Google Maps. */\n googleMapsApiKey?: string;\n /** Url to a custom marker for the map. */\n googleMapsMarker?: string;\n /** Overrides the public API url of `environment`. */\n publicApiUrl?: string;\n /** Overrides the lead url of `environment`. */\n leadUrl?: string;\n}\n\nexport interface Settings {\n publicApi: PublicApiSettings;\n marketCode: MarketCode;\n leadUrl: string;\n routing: Required<Omit<RoutingSettings, 'basePath'>> & { basePath?: string };\n /** Undefined when buy online is turned off. */\n ecom?: Required<Pick<EcomSettings, 'url'>> & Omit<EcomSettings, 'enabled'>;\n googleMapsApiKey?: string;\n googleMapsMarker?: string;\n}\n\n/** 5.x settings that 6.0 no longer reads, and what replaces them. */\nconst REMOVED_SETTINGS: Record<string, string> = {\n url: 'environment',\n urlMlt: 'environment',\n graphQlUrl: 'environment',\n ecomSettings: 'ecom (buy online is on by default)',\n useQueryParamsFromUrl: 'routing.syncUrl',\n pathRoute: \"routing: { mode: 'path', basePath }\",\n};\n\nconst warnRemovedSettings = (settings: object) => {\n for (const key of Object.keys(settings)) {\n if (key in REMOVED_SETTINGS) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(`Wayke: the setting ${key} was removed in 6.0, use ${REMOVED_SETTINGS[key]}`);\n }\n }\n};\n\nconst resolveEcom = (\n { enabled = true, url, ...ecom }: EcomSettings = {},\n environmentUrl: string\n): Settings['ecom'] => (enabled ? { ...ecom, url: url || environmentUrl } : undefined);\n\nexport const resolveSettings = (settings: WaykeProviderSettings = {}): Settings => {\n warnRemovedSettings(settings);\n const environment = ENVIRONMENTS[settings.environment || 'production'];\n const marketCode = settings.marketCode || 'SE';\n const mode = settings.routing?.mode || 'hash';\n\n if (mode === 'path' && !settings.routing?.basePath) {\n // Without a base path there is nowhere to put the vehicle id.\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn('Wayke: routing.mode \"path\" needs routing.basePath, using \"hash\" instead');\n }\n\n return {\n publicApi: {\n api: { url: settings.publicApiUrl || environment.publicApiUrl, apiKey: settings.apiKey },\n branchGroupId: settings.branchGroupId,\n market: marketCode,\n },\n marketCode,\n leadUrl: settings.leadUrl || environment.leadUrl,\n routing: {\n mode: mode === 'path' && !settings.routing?.basePath ? 'hash' : mode,\n basePath: settings.routing?.basePath,\n syncUrl: !!settings.routing?.syncUrl,\n },\n ecom: resolveEcom(settings.ecom, environment.ecomUrl),\n googleMapsApiKey: settings.googleMapsApiKey,\n googleMapsMarker: settings.googleMapsMarker,\n };\n};\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { SORT } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport Accordion, { AccordionItem } from '../Accordion';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport Panel from '../Panel';\nimport { FooterAction, FooterActionItem } from '../Panel/wrapper';\nimport { Repeat } from '../Repeat';\nimport FacetSelector from './faceSelector';\n\nexport interface PanelFilter {\n id: string;\n displayName: string;\n}\n\ninterface Props {\n filters: PanelFilter[];\n /** The filter whose section is open */\n open: string;\n onClose: () => void;\n}\n\nconst FilterPanel = ({ filters, open, onClose }: Props) => {\n const { t } = useTranslation();\n const { params, result, loading, update } = useSearch();\n const found = result?.found || 0;\n\n const onClearFilters = useCallback(() => {\n PubSub.publish('SearchClearAllFilters', { query: params.toString() });\n // The sort order is not a filter: it stays.\n const next = new URLSearchParams();\n const sort = params.get(SORT);\n if (sort) next.set(SORT, sort);\n update(next);\n }, [params, update]);\n\n return (\n <Panel\n title={t('search.filter')}\n onClose={onClose}\n footer={\n <FooterAction>\n <FooterActionItem>\n <ButtonSecondary fullWidth disabled={loading} onClick={onClearFilters}>\n <ButtonContent>{t('search.clearAllFilters.text')}</ButtonContent>\n </ButtonSecondary>\n </FooterActionItem>\n <FooterActionItem>\n <ButtonPrimary fullWidth disabled={loading} onClick={onClose}>\n <ButtonContent>\n {t('search.showNumberOfCustomUnit', {\n count: found,\n unit: t(`search.result.${found === 1 ? 'singular' : 'plural'}`),\n })}\n </ButtonContent>\n </ButtonPrimary>\n </FooterActionItem>\n </FooterAction>\n }\n >\n <Accordion>\n {filters.map((f) => (\n <AccordionItem key={f.id} heading={f.displayName} isActive={f.id === open}>\n <Repeat>\n <FacetSelector id={f.id} label={f.displayName} />\n </Repeat>\n </AccordionItem>\n ))}\n </Accordion>\n </Panel>\n );\n};\n\nexport default FilterPanel;\n", "import {\n ActionAll,\n ActionNames,\n ActionOnFilterUpdate,\n ActionTypes,\n CallbackOnFilterUpdate,\n} from './Actions';\nimport {\n CallbackEcom,\n CallbackHashRouteChange,\n CallbackItem,\n CallbackView,\n EventAll,\n EventEcom,\n EventFilterApply,\n EventFinanceClose,\n EventFinanceInterest,\n EventFinanceOpen,\n EventHashRouteChange,\n EventImagesClick,\n EventInsuranceClose,\n EventInsuranceInterest,\n EventInsuranceOpen,\n EventItemClicked,\n EventLeadOpen,\n EventLeadSent,\n EventMailClick,\n EventMailVisible,\n EventNames,\n EventOptionsClick,\n EventPhonenumberCall,\n EventPhonenumberVisible,\n EventSearch,\n EventSearchClearAllFiltersQuery,\n EventSearchClearQuery,\n EventSearchCompleted,\n EventSearchInitiated,\n EventType,\n EventView,\n} from './Events';\n\nexport type EventSubscriptions = {\n View: EventView[];\n HashRouteChange: EventHashRouteChange[];\n ItemClicked: EventItemClicked[];\n Ecom: EventEcom[];\n ImagesClick: EventImagesClick[];\n OptionsClick: EventOptionsClick[];\n PhonenumberVisible: EventPhonenumberVisible[];\n PhonenumberCall: EventPhonenumberCall[];\n MailVisible: EventMailVisible[];\n MailClick: EventMailClick[];\n LeadOpen: EventLeadOpen[];\n LeadSent: EventLeadSent[];\n InsuranceOpen: EventInsuranceOpen[];\n InsuranceClose: EventInsuranceClose[];\n InsuranceInterest: EventInsuranceInterest[];\n FinanceOpen: EventFinanceOpen[];\n FinanceClose: EventFinanceClose[];\n FinanceInterest: EventFinanceInterest[];\n Search: EventSearch[];\n SearchClearQuery: EventSearchClearQuery[];\n SearchClearAllFilters: EventSearchClearAllFiltersQuery[];\n SearchInitiated: EventSearchInitiated[];\n SearchCompleted: EventSearchCompleted[];\n FilterApply: EventFilterApply[];\n All: EventAll[];\n};\n\nexport type ActionSubscriptions = {\n onFilterUpdate: ActionOnFilterUpdate[];\n All: ActionAll[];\n};\n\nclass PubSub {\n private static events: EventSubscriptions = {\n View: [],\n HashRouteChange: [],\n ItemClicked: [],\n Ecom: [],\n ImagesClick: [],\n OptionsClick: [],\n PhonenumberVisible: [],\n PhonenumberCall: [],\n MailVisible: [],\n MailClick: [],\n LeadOpen: [],\n LeadSent: [],\n InsuranceOpen: [],\n InsuranceClose: [],\n InsuranceInterest: [],\n FinanceOpen: [],\n FinanceClose: [],\n FinanceInterest: [],\n Search: [],\n SearchClearQuery: [],\n SearchClearAllFilters: [],\n SearchInitiated: [],\n SearchCompleted: [],\n FilterApply: [],\n All: [],\n };\n\n private static actions: ActionSubscriptions = {\n onFilterUpdate: [],\n All: [],\n };\n\n public static subscribeAction = (event: ActionTypes) =>\n PubSub.actions[event.actionName].push(event as any);\n\n public static unsubscribeAction = (event: ActionTypes) => {\n if (PubSub.actions[event.actionName]) {\n for (let i = 0; i < PubSub.actions[event.actionName].length; i++) {\n if (PubSub.actions[event.actionName][i] === event) {\n PubSub.actions[event.actionName].splice(i, 1);\n break;\n }\n }\n }\n };\n\n public static publishAction = (eventName: ActionNames, ...args: any) => {\n if (PubSub.actions.All) {\n PubSub.events.All.forEach((event) => event.callback(eventName, args[0]));\n }\n if (PubSub.actions[eventName]) {\n PubSub.actions[eventName].forEach((event: ActionTypes) => {\n switch (eventName) {\n case 'onFilterUpdate':\n (event.callback as CallbackOnFilterUpdate)(args[0]);\n break;\n default:\n break;\n }\n });\n }\n };\n\n public static subscribe = (event: EventType) => PubSub.events[event.eventName].push(event as any);\n\n public static unsubscribe = (event: EventType) => {\n if (PubSub.events[event.eventName]) {\n for (let i = 0; i < PubSub.events[event.eventName].length; i++) {\n if (PubSub.events[event.eventName][i] === event) {\n PubSub.events[event.eventName].splice(i, 1);\n break;\n }\n }\n }\n };\n\n public static publish = (eventName: EventNames, ...args: any) => {\n if (PubSub.events.All) {\n PubSub.events.All.forEach((event) => event.callback(eventName, args[0]));\n }\n if (PubSub.events[eventName]) {\n PubSub.events[eventName].forEach((event: EventType) => {\n switch (eventName) {\n case 'View':\n (event.callback as CallbackView)(args[0]);\n break;\n case 'HashRouteChange':\n (event.callback as CallbackHashRouteChange)(args[0]);\n break;\n case 'Ecom':\n (event.callback as CallbackEcom)(args[0]);\n break;\n case 'ItemClicked':\n case 'ImagesClick':\n case 'OptionsClick':\n case 'PhonenumberVisible':\n case 'PhonenumberCall':\n case 'MailVisible':\n case 'MailClick':\n case 'LeadOpen':\n case 'LeadSent':\n case 'InsuranceInterest':\n case 'InsuranceOpen':\n case 'InsuranceClose':\n case 'FinanceOpen':\n case 'FinanceClose':\n case 'Search':\n case 'SearchClearQuery':\n case 'SearchClearAllFilters':\n case 'SearchInitiated':\n case 'SearchCompleted':\n case 'FilterApply':\n case 'FinanceInterest':\n (event.callback as CallbackItem)(args[0]);\n break;\n default:\n break;\n }\n });\n }\n };\n}\nexport default PubSub;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconChevronDown } from '../Icon';\nimport {\n Body,\n Header,\n Heading,\n Icon,\n Indicator,\n IndicatorValue,\n Item,\n Label,\n List,\n} from './wrapper';\n\nexport interface IAccordionItem {\n heading: string;\n activeCount?: number;\n children: React.ReactNode;\n isActive?: boolean;\n}\n\nexport interface IAccordion {\n children?: React.ReactNode;\n}\n\nexport const AccordionItem = ({ heading, children, activeCount, isActive }: IAccordionItem) => {\n const { t } = useTranslation();\n const [extend, setExtend] = useState(isActive || false);\n const onToggleExtend = useCallback(() => setExtend(!extend), [extend]);\n\n return (\n <Item isOpen={extend}>\n <Header onClick={onToggleExtend} title={t('common.showMore') || ''}>\n <Label>\n <Heading\n className={activeCount && activeCount > 0 ? 'wayke__theme wayke__font--bold' : ''}\n >\n {heading}\n </Heading>\n {activeCount && activeCount > 0 && (\n <Indicator>\n <IndicatorValue>{activeCount}</IndicatorValue>\n </Indicator>\n )}\n </Label>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Header>\n <Body>{children}</Body>\n </Item>\n );\n};\n\nconst Accordion = ({ children }: IAccordion) => <List>{children}</List>;\n\nexport default Accordion;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: ${size(-1)} 0;\n font-size: 1rem;\n`;\n\nexport const Header = styled(ButtonReset)`\n display: flex;\n align-items: center;\n width: 100%;\n padding: ${size(3)} 0;\n text-align: left;\n font: inherit;\n`;\n\nexport const Label = styled.div`\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n`;\n\nexport const Heading = styled.div`\n line-height: 1;\n`;\n\nexport const Indicator = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 ${size(0.375)};\n margin-left: ${size(0.5)};\n min-width: 1em;\n height: 1em;\n border-radius: 999px;\n z-index: 1;\n`;\n\nexport const IndicatorValue = styled.div`\n font-family: sans-serif; // Default font to guarantee visibility\n font-size: 0.75rem;\n font-weight: bold;\n`;\n\nexport const Icon = styled.div`\n position: relative;\n flex-shrink: 0;\n padding-left: ${size(1)};\n transition: color 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-1)};\n bottom: ${size(-1)};\n left: 0;\n right: ${size(-1)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accent};\n z-index: -1;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n ${Header}:hover & {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Body = styled.div`\n display: none;\n padding-bottom: ${size(3)};\n`;\n\ntype ItemProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLLIElement>, HTMLLIElement> & {\n isOpen?: boolean;\n};\n\nexport const Item = styled.li<ItemProps>`\n & + & {\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n\n ${({ isOpen }) =>\n isOpen &&\n css`\n ${Body} {\n display: block;\n }\n\n ${Icon} {\n svg {\n transform: rotate(180deg);\n }\n }\n `}\n`;\n", "import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { H1 } from '../Heading';\nimport { IconCancel } from '../Icon';\nimport { Portal, PortalNamespace } from '../Portal';\nimport {\n Body,\n Close,\n CloseBtn,\n Footer,\n Header,\n Heading,\n PanelWrapper,\n UiBlock,\n Wrapper,\n} from './wrapper';\n\ninterface IPanelPortal {\n id?: string | null;\n title: string | null;\n onClose: () => void;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nconst Panel = ({ id, title, footer, onClose, children }: IPanelPortal) => {\n const { t } = useTranslation();\n return (\n <Portal id={id || PortalNamespace.DefaultPortal}>\n <Wrapper>\n <UiBlock title={t('other.closePanel') || ''} onClick={onClose} />\n <PanelWrapper>\n <Header>\n <Heading>\n <H1 noMargin>{title}</H1>\n </Heading>\n <Close>\n <CloseBtn title={t('other.closePanel') || ''} onClick={onClose}>\n <IconCancel block />\n </CloseBtn>\n </Close>\n </Header>\n <Body>{children}</Body>\n {footer && <Footer>{footer}</Footer>}\n </PanelWrapper>\n </Wrapper>\n </Portal>\n );\n};\n\nexport default Panel;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype HeadingBaseProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n noMargin?: boolean;\n};\n\nconst HeadingBase = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))<HeadingBaseProps>`\n margin-top: 0;\n margin-bottom: ${size(2)};\n font-weight: normal;\n line-height: 1.2;\n\n ${({ noMargin }) =>\n noMargin &&\n css`\n margin-bottom: 0;\n `}\n`;\n\nexport const H1 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h1',\n}))`\n font-size: 1.875rem;\n`;\n\nexport const H2 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h2',\n}))`\n font-size: 1.5rem;\n`;\n\nexport const H3 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h3',\n}))`\n font-size: 1.125rem;\n`;\n\nexport const H4 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h4',\n}))`\n font-size: 1rem;\n`;\n\nexport const H5 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h5',\n}))`\n font-size: 0.875rem;\n`;\n\n/*\nexport const H6 = styled(HeadingBase).attrs<{ as: string }>((props) => ({\n as: props.as || 'h6',\n}))`\n font-size: 0.67rem;\n`;\n*/\n\nexport const VisualHeading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1em;\n`;\n", "export const DefaultPortal = 'DEFAULT_PORTAL';\n", "import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface IPortal {\n id: string;\n children: React.ReactNode;\n}\n\nconst Portal = ({ id, children }: IPortal) => {\n const el = React.useRef(document.getElementById(id) || document.createElement('div'));\n if (!el.current) {\n return null;\n }\n\n const { current } = el;\n\n const [dynamic] = React.useState(!current.parentElement);\n\n React.useEffect(() => {\n if (dynamic) {\n current.id = id;\n if (document.body) {\n document.body.appendChild(current);\n }\n }\n return () => {\n if (dynamic && current.parentElement) {\n current.parentElement.removeChild(current);\n }\n };\n }, [id]);\n\n return ReactDOM.createPortal(children, current);\n};\n\nexport default React.memo<IPortal>(Portal);\n", "import * as React from 'react';\n\nexport interface IPortalElement {\n id: string;\n}\n\nconst PortalElement = ({ id }: IPortalElement) => <div id={id} />;\n\nexport default PortalElement;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { fadeIn, noTransform } from '../../layout/keyframes';\nimport { ButtonReset } from '../Button';\nimport { H1 } from '../Heading';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'dialog',\n}))`\n position: relative;\n z-index: 80;\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n 'aria-hidden': 'true',\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.35);\n animation: ${fadeIn} 200ms ease;\n`;\n\nexport const PanelWrapper = styled.article.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n width: 100%;\n background-color: ${(props) => props.theme.color.accent};\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n z-index: 1;\n animation: ${noTransform} 200ms ease forwards;\n\n ${(props) => props.theme.breakpoint.Sm} {\n max-width: 450px;\n transform: translateX(100%);\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n top: auto;\n max-height: 100%;\n transform: translateY(100%);\n }\n`;\n\nexport const Header = styled.header`\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: 45px;\n padding: ${size(3)};\n padding-bottom: 0;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: ${size(3)};\n background-image: linear-gradient(\n ${(props) => props.theme.color.accent},\n ${(props) => props.theme.color.accentTransparent}\n );\n z-index: 1;\n }\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n\n ${H1} {\n font-size: 1.5rem;\n }\n`;\n\nexport const Close = styled.div`\n flex-shrink: 0;\n margin: ${size(-2)};\n padding-left: ${size(3)};\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n position: relative;\n display: block;\n padding: ${size(2)};\n transform-origin: 50% 50%;\n transition: transform 200ms ease;\n z-index: 2;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accent};\n opacity: 0;\n transition: opacity 200ms ease;\n z-index: -1;\n }\n\n &:active {\n transform: scale(0.9);\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Body = styled.div`\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n padding: ${size(3)};\n`;\n\nexport const Footer = styled.footer`\n position: relative;\n flex-shrink: 0;\n padding: ${size(3)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n`;\n\nexport const FooterAction = styled.div.attrs(() => ({\n role: 'group',\n}))`\n display: flex;\n align-items: center;\n margin: ${size(-0.5)};\n`;\n\nexport const FooterActionItem = styled.div`\n flex: 1 1 50%;\n padding: ${size(0.5)};\n\n ${ButtonReset} {\n padding: ${size(1.75)} ${size(2)};\n }\n`;\n", "import { keyframes } from 'styled-components';\n\nexport const noTransform = keyframes`\n to {\n transform: none;\n }\n`;\n\nexport const fadeIn = keyframes`\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n`;\n\nexport const rotate = keyframes`\n to {\n transform: rotate(360deg);\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Repeat = styled.div`\n & + & {\n margin-top: ${size(3)};\n }\n`;\n\nexport const RepeatTiny = styled.div`\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const RepeatSmall = styled.div`\n & + & {\n margin-top: ${size(2)};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isRangeFilter } from '../../Gql/facets';\nimport useSettings from '../../State/Settings/useSettings';\nimport CheckListFacet from './checkListFacet';\nimport ColorSelectFacet from './colorFacet';\nimport RangeFacet from './rangeFacet';\n\ninterface FacetSelectorProps {\n id: string;\n /** The filter's title. */\n label?: string;\n}\n\nconst FacetSelector = ({ id, label }: FacetSelectorProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n\n if (id === 'colorName') return <ColorSelectFacet id={id} />;\n if (!isRangeFilter(id)) return <CheckListFacet id={id} />;\n\n switch (id) {\n case 'price':\n return <RangeFacet id={id} label={label} unit={t('currency.default')} formatValues />;\n case 'privateLease':\n case 'businessLease':\n return <RangeFacet id={id} label={label} unit={t('currency.monthly')} formatValues />;\n case 'odometer':\n return (\n <RangeFacet\n id={id}\n label={label}\n unit={t(`odometer.${marketCode === 'NO' ? 'Kilometer' : 'ScandinavianMile'}`)}\n formatValues\n />\n );\n case 'modelYear':\n return <RangeFacet id={id} label={label} unit=\"\u00E5r\" />;\n default:\n return null;\n }\n};\n\nexport default FacetSelector;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { listOptions } from '../../Gql/facets';\nimport { toggleListValue } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport Checklist from '../Checklist';\nimport OverflowBox from '../OverflowBox';\n\ninterface ChecklistFacetProps {\n id: string;\n}\n\nconst ChecklistFacet = ({ id }: ChecklistFacetProps) => {\n const { params, result, loading, error, update } = useSearch();\n // Ticks show at once, before the search answers.\n const [pending, setPending] = useState<{ [value: string]: boolean }>({});\n useEffect(() => setPending({}), [result, error]);\n\n const onClick = useCallback(\n (value: string, checked: boolean) => {\n if (loading) return;\n setPending((current) => ({ ...current, [value]: checked }));\n PubSub.publish('FilterApply', { type: 'checkbox', filter: id, value, checked });\n update(toggleListValue(params, id, value));\n },\n [loading, params, id, update]\n );\n\n return (\n <OverflowBox>\n <Checklist\n items={listOptions(id, params, result?.facets).map((option) => ({\n label: option.value,\n onClick: () => onClick(option.value, !option.selected),\n active: pending[option.value] ?? option.selected,\n }))}\n />\n </OverflowBox>\n );\n};\n\nexport default ChecklistFacet;\n", "import React from 'react';\nimport { IconCheck, IconRadio } from '../Icon';\nimport { Action, ActionIcon, ActionLabel, Item, List } from './wrapper';\n\nexport interface IChecklistItem {\n label: string;\n onClick: () => void;\n active?: boolean;\n radio?: boolean;\n}\n\nexport interface IChecklist {\n items: IChecklistItem[];\n radio?: boolean;\n}\n\nconst ChecklistItem = ({ label, onClick, active, radio }: IChecklistItem) => (\n <Item>\n <Action onClick={onClick}>\n {active && <ActionIcon>{radio ? <IconRadio block /> : <IconCheck block />}</ActionIcon>}\n <ActionLabel\n className={active ? 'wayke__theme wayke__font--bold wayke__color--primary-text' : ''}\n >\n {label}\n </ActionLabel>\n </Action>\n </Item>\n);\n\nconst Checklist = ({ items, radio }: IChecklist) => {\n if (!items?.length) {\n return null;\n }\n\n return (\n <List>\n {items.map((item) => (\n <ChecklistItem\n key={item.label}\n label={item.label}\n onClick={item.onClick}\n active={item.active}\n radio={radio}\n />\n ))}\n </List>\n );\n};\n\nexport default Checklist;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n list-style: none;\n padding: 0;\n margin: ${size(-1)} 0;\n font-size: 0.875rem;\n overflow: hidden;\n`;\n\nexport const Item = styled.li`\n ${List} {\n padding-left: ${size(5)};\n margin: 0;\n }\n`;\n\nexport const Action = styled(ButtonReset)`\n position: relative;\n display: block;\n width: 100%;\n text-align: left;\n font: inherit;\n padding: ${size(1)} 0;\n\n &:before {\n content: '';\n position: absolute;\n left: 0;\n width: ${size(2)};\n height: ${size(2)};\n border-radius: 3px;\n background-color: ${(props) => props.theme.color.accentDark};\n margin-top: 2px; // Magic number\n }\n`;\n\nexport const ActionIcon = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: absolute;\n top: ${size(1)};\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(2)};\n height: ${size(2)};\n margin-top: 2px; // Magic number\n font-size: ${size(1.5)};\n`;\n\nexport const ActionLabel = styled.div`\n padding-left: ${size(3)};\n transition: transform 150ms ease;\n\n ${Action}:hover & {\n transform: translateX(${size(0.5)});\n }\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface IProps {\n children?: React.ReactNode;\n}\n\nconst OverflowBox = ({ children }: IProps) => <Wrapper>{children}</Wrapper>;\n\nexport default OverflowBox;\n", "import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n max-height: 400px;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { listOptions } from '../../Gql/facets';\nimport { toggleListValue } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { getHexColorFromDisplayName } from '../../utils/converters';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport ColorSelect from '../ColorSelect';\n\ninterface ColorSelectFacetProps {\n id: string;\n}\n\nconst ColorSelectFacet = ({ id }: ColorSelectFacetProps) => {\n const { params, result, loading, error, update } = useSearch();\n const [pending, setPending] = useState<{ [value: string]: boolean }>({});\n useEffect(() => setPending({}), [result, error]);\n\n const onClick = useCallback(\n (value: string, checked: boolean) => {\n if (loading) return;\n setPending((current) => ({ ...current, [value]: checked }));\n PubSub.publish('FilterApply', { type: 'checkbox', filter: id, value, checked });\n update(toggleListValue(params, id, value));\n },\n [loading, params, id, update]\n );\n\n return (\n <ColorSelect\n items={listOptions(id, params, result?.facets).map((option) => ({\n label: option.value,\n onClick: () => onClick(option.value, !option.selected),\n active: pending[option.value] ?? option.selected,\n hex: [getHexColorFromDisplayName(option.value)],\n }))}\n />\n );\n};\n\nexport default ColorSelectFacet;\n", "export const MANUFACTURER = 'manufacturer';\nexport const MODEL_SERIES = 'modelSeries';\nexport const FUEL_TYPE = 'fuelType';\nexport const GEARBOX_TYPE = 'gearboxType';\nexport const BRANCH = 'branch';\nexport const COLOR = 'color';\nexport const ENVIRONMENT_CLASS = 'environmentClass';\nexport const SEGMENT = 'properties.segment';\nexport const DRIVING_WHEEL = 'drivingWheel';\nexport const PRICE = 'price';\nexport const MILEAGE = 'mileage';\nexport const MODEL_YEAR = 'modelYear';\nexport const LEASING_PRICE = 'leasingPrice';\nexport const BUSINESS_LEASING_PRICE = 'businessLeasingPrice';\nexport const ODOMETER_VALUE_AS_KM = 'odometerValueAsKm';\nexport const FUEL_TYPES = 'fuelTypes';\nexport const ENGINE_BASE_TYPE = 'engineBaseType';\nexport const ELECTRICAL_RANGE_WLTP = 'enhancedProperties.electricalRangeWLTP.value';\n\nexport const COLOR_WHITE = { displayName: 'Vit', hex: '#ffffff' };\nexport const COLOR_BLACK = { displayName: 'Svart', hex: '#000000' };\nexport const COLOR_GRAY = { displayName: 'Gr\u00E5', hex: '#808080' };\nexport const COLOR_SILVER = { displayName: 'Silver', hex: '#c0c0c0' };\nexport const COLOR_BLUE = { displayName: 'Bl\u00E5', hex: '#0000ff' };\nexport const COLOR_RED = { displayName: 'R\u00F6d', hex: '#ff0000' };\nexport const COLOR_BROWN = { displayName: 'Brun', hex: '#a52a2a' };\nexport const COLOR_GREEN = { displayName: 'Gr\u00F6n', hex: '#008000' };\nexport const COLOR_ORANGE = { displayName: 'Orange', hex: '#ffa500' };\nexport const COLOR_YELLOW = { displayName: 'Gul', hex: '#ffff00' };\nexport const COLOR_PURPLE = { displayName: 'Lila', hex: '#800080' };\nexport const COLOR_BEIGE = { displayName: 'Beige', hex: '#f5f5dc' };\n\n/*\nexport const DEFAULT_PLACEHOLDER_IMAGE =\n 'https://cdn.wayke.se/wui/images/placeholders/placeholder_product_card.jpg';\n*/\n\nexport const DEFAULT_PLACEHOLDER_IMAGE =\n 'data:image/jpeg;base64,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';\n", "import {\n COLOR_BEIGE,\n COLOR_BLACK,\n COLOR_BLUE,\n COLOR_BROWN,\n COLOR_GRAY,\n COLOR_GREEN,\n COLOR_ORANGE,\n COLOR_PURPLE,\n COLOR_RED,\n COLOR_SILVER,\n COLOR_WHITE,\n COLOR_YELLOW,\n} from './constants';\n\nexport const getHexColorFromDisplayName = (displayName: string) => {\n switch (displayName) {\n case COLOR_WHITE.displayName:\n return COLOR_WHITE.hex;\n case COLOR_BLACK.displayName:\n return COLOR_BLACK.hex;\n case COLOR_GRAY.displayName:\n return COLOR_GRAY.hex;\n case COLOR_SILVER.displayName:\n return COLOR_SILVER.hex;\n case COLOR_BLUE.displayName:\n return COLOR_BLUE.hex;\n case COLOR_RED.displayName:\n return COLOR_RED.hex;\n case COLOR_BROWN.displayName:\n return COLOR_BROWN.hex;\n case COLOR_GREEN.displayName:\n return COLOR_GREEN.hex;\n case COLOR_ORANGE.displayName:\n return COLOR_ORANGE.hex;\n case COLOR_YELLOW.displayName:\n return COLOR_YELLOW.hex;\n case COLOR_PURPLE.displayName:\n return COLOR_PURPLE.hex;\n case COLOR_BEIGE.displayName:\n return COLOR_BEIGE.hex;\n default:\n return '#fff';\n }\n};\n", "import React from 'react';\n\nimport { Action, Color, Item, Label, List } from './wrapper';\n\nexport interface ItemProps {\n label: string;\n hex: string[];\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n boxShadow?: boolean;\n}\n\nexport interface Props {\n items?: ItemProps[];\n}\n\nconst ColorSelectItem = ({ label, hex, onClick, active, disabled, boxShadow }: ItemProps) => {\n return (\n <Item>\n <Action onClick={onClick} disabled={disabled} title={label} aria-label={label}>\n <Color\n style={{\n backgroundColor: hex.length === 1 ? hex[0] : '',\n backgroundImage: hex.length > 1 ? `linear-gradient(${hex.join()})` : '',\n }}\n active={active}\n boxShadow={boxShadow}\n className={active ? 'wayke__theme wayke__color--primary-text' : ''}\n />\n <Label\n className={active ? 'wayke__theme wayke__color--primary-text wayke__font--bold' : ''}\n >\n {label}\n </Label>\n </Action>\n </Item>\n );\n};\n\nconst ColorSelect = ({ items }: Props) => {\n if (!items) {\n return null;\n }\n\n return (\n <List>\n {items.map((item) => (\n <ColorSelectItem\n key={item.label}\n label={item.label}\n hex={item.hex}\n onClick={item.onClick}\n active={item.active}\n disabled={item.disabled}\n boxShadow={item.boxShadow}\n />\n ))}\n </List>\n );\n};\n\nexport default ColorSelect;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-1.5)};\n`;\n\nexport const Item = styled.li`\n flex: 1 1 auto;\n width: 33.333%;\n max-width: 33.333%;\n padding: ${size(1.5)};\n`;\n\nexport const Action = styled(ButtonReset)`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n font: inherit;\n\n &[disabled] {\n opacity: 0.4;\n cursor: default;\n }\n`;\n\ntype ColorProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n active?: boolean;\n boxShadow?: boolean;\n};\n\nexport const Color = styled.div<ColorProps>`\n position: relative;\n width: ${size(3.75)};\n height: ${size(3.75)};\n border-radius: 50%;\n color: ${(props) => props.theme.color.border};\n\n &:before {\n content: '';\n position: absolute;\n top: -5px;\n bottom: -5px;\n left: -5px;\n right: -5px;\n border: 2px solid;\n border-radius: 50%;\n display: none;\n }\n\n ${Action}:not([disabled]):hover & {\n &::before {\n display: block;\n }\n }\n\n ${({ active }) =>\n active &&\n css`\n &::before {\n display: block;\n }\n `}\n\n ${({ boxShadow }) =>\n boxShadow &&\n css`\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);\n `}\n`;\n\nexport const Label = styled.div`\n margin-top: ${size(1.25)};\n font-size: 0.875rem;\n`;\n", "import React, { useCallback, useMemo } from 'react';\nimport { rangeSteps } from '../../Gql/facets';\nimport { canonicalParams, RangeFilter } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport RangeSlider from '../RangeSlider';\n\ninterface RangeFacetProps {\n id: RangeFilter;\n /** The filter's name, read out with the handles. */\n label?: string;\n unit?: string;\n formatValues?: boolean;\n}\n\nconst toInt = (value: string | null) => {\n const n = value === null ? Number.NaN : Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : undefined;\n};\n\nconst RangeFacet = ({ id, label, unit, formatValues }: RangeFacetProps) => {\n const { params, unfiltered, loading, update } = useSearch();\n const { marketCode } = useSettings();\n\n const steps = useMemo(() => rangeSteps(id, unfiltered, marketCode), [unfiltered, id]);\n const domain = [steps[0], steps[steps.length - 1]];\n const clamp = (n: number) => Math.min(Math.max(n, domain[0]), domain[1]);\n const values = [\n clamp(toInt(params.get(`${id}.min`)) ?? domain[0]),\n clamp(toInt(params.get(`${id}.max`)) ?? domain[1]),\n ];\n\n const onChange = useCallback(\n (next: readonly number[]) => {\n if (next[0] === values[0] && next[1] === values[1]) return;\n const query = new URLSearchParams(params);\n query.delete(`${id}.min`);\n query.delete(`${id}.max`);\n // At the edges the range is open: the top bucket means \"and above\".\n if (next[0] !== domain[0]) query.set(`${id}.min`, `${next[0]}`);\n if (next[1] !== domain[1]) query.set(`${id}.max`, `${next[1]}`);\n update(canonicalParams(query));\n PubSub.publish('FilterApply', { type: 'range', filter: id, min: next[0], max: next[1] });\n },\n [params, id, values[0], values[1], domain[0], domain[1], update]\n );\n\n if (steps.length < 2) return null;\n\n return (\n <RangeSlider\n loading={loading}\n domain={domain}\n values={values}\n maxPrefix={id === 'modelYear' ? undefined : '+'}\n label={label}\n steps={steps}\n unit={unit}\n onChange={onChange}\n formatValues={formatValues}\n />\n );\n};\n\nexport default RangeFacet;\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { numberSeparator } from '../../utils/formats';\nimport { Range, RangeSpan, RangeSpanItem, Root, Thumb, Track } from './wrapper';\n\n/** The smallest gap between two steps, so every bucket edge can be reached. */\nconst smallestStep = (steps: number[]) =>\n steps.reduce(\n (smallest, step, index) =>\n index === 0 ? smallest : Math.min(smallest, step - steps[index - 1]),\n Number.MAX_SAFE_INTEGER\n );\n\ninterface RangeSliderProps {\n loading: boolean;\n domain: number[];\n values: number[];\n steps: number[];\n /** The filter's name, read out with each handle. */\n label?: string;\n unit?: string;\n formatValues?: boolean;\n maxPrefix?: string;\n onChange: (values: readonly number[]) => void;\n}\n\nconst RangeSlider = ({\n loading,\n values,\n domain,\n steps,\n label,\n unit,\n formatValues,\n maxPrefix,\n onChange,\n}: RangeSliderProps) => {\n const { t } = useTranslation();\n // Follows the handles while they move; the search only changes when they are let go.\n const [current, setCurrent] = useState<number[]>(values);\n // The last value moved to, also before React has rendered it.\n const latest = useRef(values);\n const move = (next: number[]) => {\n latest.current = next;\n setCurrent(next);\n };\n\n useEffect(() => {\n move(values);\n }, [values[0], values[1]]);\n\n // Radix 1.6.1 compares a drag's end with stale values and never calls onValueCommit\n // for it; web-ui-v2's RangeSlider works around it the same way.\n const commitDrag = () => {\n const next = latest.current;\n if (next[0] !== values[0] || next[1] !== values[1]) onChange(next);\n };\n\n const format = (value: number) => (formatValues ? numberSeparator(value) : value);\n const suffix = unit ? ` ${unit}` : '';\n const equal = domain[0] === domain[1];\n const thumbLabel = (bound: 'min' | 'max') =>\n [label, t(`rangeSlider.${bound}`)].filter(Boolean).join(', ');\n\n return (\n <>\n {equal ? (\n // One value to pick: both handles at the ends, nothing to move.\n <Root min={0} max={1} value={[0, 1]} disabled>\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={thumbLabel('min')} />\n <Thumb aria-label={thumbLabel('max')} />\n </Root>\n ) : (\n <Root\n min={domain[0]}\n max={domain[1]}\n step={smallestStep(steps)}\n value={current}\n disabled={loading}\n onValueChange={move}\n // Keys commit here; a drag commits on pointerup, see commitDrag.\n onValueCommit={onChange}\n onPointerUp={commitDrag}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={thumbLabel('min')} />\n <Thumb aria-label={thumbLabel('max')} />\n </Root>\n )}\n <RangeSpan>\n <RangeSpanItem>{`${format(current[0])}${suffix}`}</RangeSpanItem>\n <RangeSpanItem>{`${format(current[1])}${\n maxPrefix && current[1] === domain[1] ? maxPrefix : ''\n }${suffix}`}</RangeSpanItem>\n </RangeSpan>\n </>\n );\n};\n\nexport default RangeSlider;\n", "import { format as formatFns } from 'date-fns';\nimport { nb, sv } from 'date-fns/locale';\n\n// Filter function to remove any null/undefined values.\nexport const notEmpty = <TValue>(value: TValue | null | undefined): value is TValue =>\n value !== null && value !== undefined;\n\nexport const numberSeparator = (value: number, n = 0, x = 3, s = ' ', c = '.') => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const re = `\\\\d(?=(\\\\d{${x || 3}})+${n > 0 ? '\\\\D' : '$'})`;\n const num = value.toFixed(Math.max(0, ~~n));\n\n return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), `$&${s || ','}`);\n};\n\nimport { MarketCode } from '../@types/market';\n\nexport const dateTimeFormat = {\n YearMonth: 1,\n DayMonth: 2,\n\n format: (value: string | Date, format: number, marketCode?: MarketCode) => {\n const date = new Date(value);\n const settings = { locale: marketCode === 'NO' ? nb : sv };\n switch (format) {\n case dateTimeFormat.YearMonth:\n return formatFns(date, 'MMMM yyyy', settings);\n case dateTimeFormat.DayMonth:\n return formatFns(date, 'd MMMM yyyy', settings);\n default:\n return formatFns(date, 'yyyy-MM-dd HH:mm', settings);\n }\n },\n};\n", "import * as SliderPrimitive from '@radix-ui/react-slider';\nimport styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const RangeSpan = styled.div`\n display: flex;\n align-items: center;\n margin-top: ${size(1)};\n user-select: none;\n`;\n\nexport const RangeSpanItem = styled.div`\n font-size: 0.875rem;\n color: ${(props) => props.theme.color.textDarkLighten};\n\n &:first-child {\n flex: 1 1 auto;\n }\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n\nexport const Root = styled(SliderPrimitive.Root)`\n position: relative;\n display: flex;\n align-items: center;\n height: 24px;\n margin: 10px 0;\n touch-action: none;\n user-select: none;\n\n &[data-disabled] {\n opacity: 0.6;\n }\n`;\n\nexport const Track = styled(SliderPrimitive.Track)`\n position: relative;\n flex-grow: 1;\n height: 4px;\n background-color: ${(props) => props.theme.color.accentDark};\n`;\n\nexport const Range = styled(SliderPrimitive.Range).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n position: absolute;\n height: 100%;\n`;\n\nexport const Thumb = styled(SliderPrimitive.Thumb).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg',\n}))`\n display: block;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n cursor: grab;\n transition:\n transform 150ms ease,\n box-shadow 150ms ease;\n\n &:active {\n cursor: grabbing;\n transform: scale(1.3);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n [data-disabled] > & {\n cursor: default;\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const List = styled.ul`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-0.5)};\n`;\n\nexport const Item = styled.li`\n padding: ${size(0.5)};\n`;\n\nexport const Action = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n padding: ${size(1.5)} ${size(3)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n font-size: 0.875rem;\n line-height: 1;\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 3px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Label = styled.div`\n z-index: 1;\n`;\n\nexport const Indicator = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 ${size(0.375)};\n margin-left: ${size(0.5)};\n background-color: currentColor;\n min-width: 1em;\n height: 1em;\n border-radius: 999px;\n z-index: 1;\n`;\n\nexport const IndicatorValue = styled.div`\n font-family: sans-serif; // Default font to guarantee visibility\n font-size: 0.75rem;\n font-weight: bold;\n color: white;\n mix-blend-mode: difference;\n`;\n", "import React from 'react';\nimport { SearchHit } from '../../Gql/types';\nimport HitCard from '../ProductCard/HitCard';\nimport { Item, List, Wrapper } from './wrapper';\n\ninterface GridProps {\n hits: SearchHit[];\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\nconst Grid = ({ hits, placeholderImage, displayBranchName }: GridProps) => (\n <Wrapper>\n <List>\n {hits.map((hit) => (\n <Item key={hit.ad.id}>\n <HitCard\n hit={hit}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n </Item>\n ))}\n </List>\n </Wrapper>\n);\n\nexport default Grid;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { hitImage, toAmount } from '../../Gql/hit';\nimport { SearchHit } from '../../Gql/types';\nimport { numberSeparator } from '../../utils/formats';\nimport ProductCard from '.';\n\ninterface HitCardProps {\n hit: SearchHit;\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\n/** A search hit as a product card: the search result and the related cars share it. */\nconst HitCard = ({ hit, placeholderImage, displayBranchName }: HitCardProps) => {\n const { t } = useTranslation();\n const { ad, iteration } = hit;\n const item = iteration?.item;\n const odometer = iteration?.logistics?.odometerReading;\n const price = toAmount(ad.pricing?.cash?.price);\n const oldPrice = toAmount(ad.pricing?.cash?.oldPrice);\n const money = (amount?: number, unit = 'currency.default') =>\n amount !== undefined ? `${numberSeparator(amount)} ${t(unit)}` : undefined;\n const usps: { title?: string | number }[] = [\n { title: item?.modelYear?.intValue },\n {\n title: odometer\n ? `${numberSeparator(odometer.value)} ${t(\n `odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`\n )}`\n : undefined,\n },\n { title: item?.attributes?.transmission?.formattedValue },\n { title: item?.driveline?.fuelTypesString?.stringValue },\n ];\n\n return (\n <ProductCard\n id={ad.id}\n title={item?.displayName || ad.salesDescription?.title || ''}\n description={ad.salesDescription?.title || undefined}\n image={hitImage(hit)}\n placeholderImage={placeholderImage}\n branch={{ id: ad.branch.id, name: ad.branch.displayName || undefined }}\n branchName={displayBranchName ? ad.branch.displayName || undefined : undefined}\n uspList={usps.filter((usp): usp is { title: string | number } => !!usp.title)}\n price={money(price)}\n oldPrice={\n price !== undefined && oldPrice !== undefined && price < oldPrice\n ? money(oldPrice)\n : undefined\n }\n leasingPrice={money(toAmount(ad.pricing?.leasing?.leasingMonthlyPayment), 'currency.monthly')}\n businessLeasingPrice={money(\n toAmount(ad.pricing?.companyLeasing?.leasingMonthlyPayment),\n 'currency.monthly'\n )}\n />\n );\n};\n\nexport default HitCard;\n", "import { Money, SearchHit } from './types';\n\n/** An amount from the API, or undefined when it is missing or not above zero. */\nexport const toAmount = (money?: Money | null) => {\n const n = money ? Number.parseFloat(money.amount) : Number.NaN;\n return Number.isFinite(n) && n > 0 ? n : undefined;\n};\n\n/** The first image of a hit, if any. */\nexport const hitImage = (hit: SearchHit) => hit.ad.media?.items?.find((i) => i?.url)?.url;\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useIsInViewport from '../../hooks/useIsInViewport';\nimport useRouter from '../../State/Router/useRouter';\nimport { DEFAULT_PLACEHOLDER_IMAGE } from '../../utils/constants';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport ResponsiveImage from '../ResponsiveImage';\nimport UspList, { ItemProps } from '../UspList';\nimport {\n Content,\n ContentBody,\n ContentFooter,\n CurrentPrice,\n Description,\n Heading,\n Image,\n Img,\n Label,\n Link,\n OldPrice,\n Picture,\n PreHeading,\n Price,\n PriceCell,\n Usp,\n Wrapper,\n} from './wrapper';\n\n// One column on phones, two on tablets, three from desktop (at most about 400 px).\nconst CARD_WIDTHS = [375, 450, 600, 750, 840];\nconst CARD_SIZES = '(min-width: 1024px) 400px, (min-width: 600px) 50vw, 100vw';\n\ninterface Props {\n id: string;\n title: string;\n /** The ad's first image (a cfit url) */\n image?: string;\n branch?: { id: string; name?: string };\n placeholderImage?: string;\n description?: string;\n uspList?: ItemProps[];\n /** Left out when the ad has no cash price (0), as on wayke.se */\n price?: string;\n leasingPrice?: string;\n oldPrice?: string;\n branchName?: string;\n businessLeasingPrice?: string;\n}\n\nconst ProductCard = ({\n id,\n title,\n image,\n placeholderImage,\n branch,\n branchName,\n description,\n uspList,\n price,\n oldPrice,\n leasingPrice,\n businessLeasingPrice,\n}: Props) => {\n const { t } = useTranslation();\n const { itemHref, onLinkClick } = useRouter();\n const href = itemHref(id);\n\n const [containerRef, isVisible] = useIsInViewport<HTMLDivElement>({\n persistVisibility: true,\n });\n\n const onClick = useCallback(\n () => PubSub.publish('ItemClicked', { id, branchId: branch?.id, branchName: branch?.name }),\n [id, branch?.id, branch?.name]\n );\n\n const onHrefClick = useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (href) onLinkClick(e, href);\n },\n [href, onLinkClick]\n );\n\n return (\n <Wrapper onClick={onClick}>\n {href && <Link onClick={onHrefClick} href={href} title={title} aria-label={title} />}\n <Image ref={containerRef}>\n {isVisible && image ? (\n <ResponsiveImage\n img={Img}\n src={image}\n widths={CARD_WIDTHS}\n sizes={CARD_SIZES}\n alt={title}\n />\n ) : (\n <Picture>\n <Img src={placeholderImage || DEFAULT_PLACEHOLDER_IMAGE} />\n </Picture>\n )}\n </Image>\n <Content>\n <ContentBody>\n {branchName && <PreHeading>{branchName}</PreHeading>}\n <Heading>{title}</Heading>\n {description && <Description>{description}</Description>}\n {uspList && (\n <Usp>\n <UspList small items={uspList} />\n </Usp>\n )}\n </ContentBody>\n <ContentFooter>\n <Price>\n {price && (\n <PriceCell>\n {oldPrice ? (\n <OldPrice>{oldPrice}</OldPrice>\n ) : (\n <Label>{t('productCard.price')}</Label>\n )}\n <CurrentPrice>{price}</CurrentPrice>\n </PriceCell>\n )}\n {leasingPrice && (\n <PriceCell>\n <Label>{t('productCard.privateLeasing')}</Label>\n <CurrentPrice>{leasingPrice}</CurrentPrice>\n </PriceCell>\n )}\n {businessLeasingPrice && (\n <PriceCell>\n <Label>{t('productCard.businessLeasing')}</Label>\n <CurrentPrice>{businessLeasingPrice}</CurrentPrice>\n </PriceCell>\n )}\n </Price>\n </ContentFooter>\n </Content>\n </Wrapper>\n );\n};\n\nexport default ProductCard;\n", "import { useEffect, useRef, useState } from 'react';\n\ninterface Options extends IntersectionObserverInit {\n persistVisibility?: boolean;\n}\n\nconst useIsInViewport = <T>(\n options?: Options\n): [React.MutableRefObject<T | null>, boolean, number] => {\n const containerRef = useRef<T | null>(null);\n\n const [isVisible, setIsVisible] = useState(false);\n const [intersectionRatio, setIntersectionRatio] = useState(0);\n\n const callbackFunction = (\n entries: IntersectionObserverEntry[],\n observer: IntersectionObserver\n ) => {\n const [entry] = entries;\n setIsVisible(entry.isIntersecting);\n setIntersectionRatio(entry.intersectionRatio);\n\n if (entry.isIntersecting && options?.persistVisibility && containerRef.current) {\n observer.unobserve(containerRef.current as unknown as HTMLElement);\n containerRef.current = null;\n }\n };\n\n useEffect(() => {\n const observer = new IntersectionObserver(callbackFunction, options);\n if (containerRef.current) observer.observe(containerRef.current as unknown as HTMLElement);\n\n return () => {\n if (containerRef.current) observer.unobserve(containerRef.current as unknown as HTMLElement);\n };\n }, [containerRef, options]);\n\n return [containerRef, isVisible, intersectionRatio];\n};\n\nexport default useIsInViewport;\n", "import { useContext } from 'react';\nimport { RouterContext } from './RouterContext';\n\nconst useRouter = () => useContext(RouterContext);\n\nexport default useRouter;\n", "import { createContext } from 'react';\n\nexport interface RouterContextProps {\n /** The vehicle that is open, from the hash or the path */\n id?: string;\n /** The query string in the address bar, without `?` */\n search: string;\n /** Link to a vehicle; undefined when routing is `none` */\n itemHref: (id: string) => string | undefined;\n /** Link back to the search from a vehicle; undefined when there is none */\n searchHref?: string;\n /** Click handler for the links above: same-site path links open without a reload */\n onLinkClick: (e: React.MouseEvent<HTMLAnchorElement>, href: string) => void;\n /** Writes the search filters to the address bar when routing.syncUrl is on */\n writeSearch: (params: URLSearchParams, replace?: boolean) => void;\n}\n\nexport const RouterContext = createContext<RouterContextProps>({\n search: '',\n itemHref: () => undefined,\n onLinkClick: () => undefined,\n writeSearch: () => undefined,\n});\n", "import React from 'react';\nimport { cfitSources, imageUrl, isCfit } from '../../utils/image';\n\ntype ImgProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\ninterface ResponsiveImageProps extends Omit<ImgProps, 'src' | 'srcSet' | 'sizes'> {\n src: string;\n /** Widths to offer; each is snapped to one the image service accepts. */\n widths: number[];\n /** How wide the image is shown, as for <img sizes>. */\n sizes: string;\n /** The styled <img> to render. */\n img?: React.ElementType<ImgProps>;\n}\n\n/**\n * An ad image in the size and format the browser needs (AVIF, WebP, else JPEG),\n * decoded off the main thread. Images from other hosts get the largest width.\n */\nconst ResponsiveImage = ({\n src,\n widths,\n sizes,\n img: Img = 'img',\n ...rest\n}: ResponsiveImageProps) => {\n const largest = Math.max(...widths);\n if (!isCfit(src)) {\n return (\n <Img src={imageUrl(src, { width: largest, height: Math.round(largest / 1.5) })} {...rest} />\n );\n }\n const sources = cfitSources(src, widths);\n return (\n <picture style={{ display: 'contents' }}>\n <source type=\"image/avif\" srcSet={sources.avif} sizes={sizes} />\n <source type=\"image/webp\" srcSet={sources.webp} sizes={sizes} />\n <Img\n src={imageUrl(src, { width: largest, height: Math.round(largest / 1.5) })}\n srcSet={sources.jpeg}\n sizes={sizes}\n decoding=\"async\"\n {...rest}\n />\n </picture>\n );\n};\n\nexport default ResponsiveImage;\n", "// Widths accepted by the cfit/v3 image worker (SUPPORTED_WIDTHS in image-transform-v3);\n// any other value makes it respond 400, and it reads only the first occurrence of\n// each query param. Legacy media URLs instead take a free-form ?spec=WxH.\nconst CFIT_WIDTHS = [\n 48, 64, 96, 128, 225, 375, 380, 450, 600, 680, 750, 770, 800, 840, 900, 1000, 1080, 1170, 1200,\n 1920, 2000, 4096, 8192,\n];\n\nexport const isCfit = (src: string) => src.includes('/cfit/');\n\nconst snapCfitWidth = (width: number) =>\n CFIT_WIDTHS.find((w) => w >= width) || CFIT_WIDTHS[CFIT_WIDTHS.length - 1];\n\nexport type ImageSpec = [width: number, height: number];\n\ninterface ImageOptions {\n width: number;\n height: number;\n webp?: boolean;\n}\n\nexport const imageUrl = (src: string, { width, height, webp }: ImageOptions) => {\n if (isCfit(src)) {\n const [base, query] = src.split('?');\n const params = new URLSearchParams(query);\n params.set('w', String(snapCfitWidth(width)));\n if (webp) {\n params.set('format', 'webp');\n }\n return `${base}?${params.toString()}`;\n }\n return `${src}?spec=${width}x${height}${webp ? '&format=webp' : ''}`;\n};\n\n/**\n * Width-limited URL for an image that may come from cfit (allowed widths only)\n * or from a host that takes a free ?w=&h= (legacy media, blob storage).\n */\nexport const imageWithWidth = (src: string, width: number, height?: number) => {\n if (isCfit(src)) return imageUrl(src, { width, height: height || width });\n return `${src}?w=${width}${height ? `&h=${height}` : ''}`;\n};\n\nexport const imageSrcSet = (src: string, specs: ImageSpec[], webp?: boolean) =>\n specs\n .map(([width, height]) => {\n const descriptor = isCfit(src) ? snapCfitWidth(width) : width;\n return `${imageUrl(src, { width, height, webp })} ${descriptor}w`;\n })\n .join(', ');\n\n/**\n * srcsets for a cfit image in AVIF, WebP and JPEG, as web-ui-v2's gallery has\n * them: the browser takes the first format it supports, in the width it needs.\n */\nexport const cfitSources = (src: string, widths: number[]) => {\n const set = (format?: 'avif' | 'webp') =>\n widths\n .map((width) => {\n const [base, query] = src.split('?');\n const params = new URLSearchParams(query);\n params.set('w', String(snapCfitWidth(width)));\n if (format) params.set('format', format);\n return `${base}?${params.toString()} ${snapCfitWidth(width)}w`;\n })\n .join(', ');\n return { avif: set('avif'), webp: set('webp'), jpeg: set() };\n};\n", "import React from 'react';\nimport { IconInfo } from '../Icon';\nimport { Action, Box, Item, ItemSection, List } from './wrapper';\n\nexport interface ItemProps {\n title: string | number | null;\n onClick?: () => void;\n}\n\nexport interface Props {\n items?: ItemProps[];\n small?: boolean;\n}\n\nconst UspItem = ({ title, onClick }: ItemProps) => {\n return (\n <Item>\n <Box>\n <ItemSection>{title}</ItemSection>\n {onClick && (\n <ItemSection>\n <Action onClick={onClick}>\n <IconInfo block />\n </Action>\n </ItemSection>\n )}\n </Box>\n </Item>\n );\n};\n\nconst UspList = ({ items, small }: Props) => {\n if (!items) {\n return null;\n }\n\n return (\n <List $isSmall={small}>\n {items.map((item, index) => (\n <UspItem key={`${item.title}-${index}`} title={item.title} onClick={item.onClick} />\n ))}\n </List>\n );\n};\n\nexport default UspList;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Item = styled.li`\n padding: ${size(0.5)};\n`;\n\nexport const Box = styled.div`\n display: flex;\n align-items: center;\n background-color: ${(props) => props.theme.color.accentDark};\n padding: ${size(1)} ${size(1.5)};\n border-radius: 3px;\n font-size: 0.875rem;\n overflow-wrap: break-word;\n hyphens: auto;\n`;\n\nexport const ItemSection = styled.div`\n & + & {\n margin-left: ${size(1)};\n }\n`;\n\nexport const Action = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const List = styled.ul<{ $isSmall?: boolean }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-0.5)};\n\n ${({ $isSmall }) =>\n $isSmall &&\n css`\n margin: ${size(-0.25)};\n\n ${Item} {\n padding: ${size(0.25)};\n }\n\n ${Box} {\n padding: ${size(0.5)} ${size(1)};\n font-size: 0.75rem;\n }\n\n ${ItemSection} {\n & + & {\n margin-left: ${size(0.5)};\n }\n }\n `}\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.article`\n position: relative;\n height: 100%;\n display: flex;\n flex-direction: column;\n cursor: pointer;\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nexport const Image = styled.div`\n flex-shrink: 0;\n position: relative;\n height: 0;\n padding-bottom: 66.666%;\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n ${Wrapper}:hover & {\n &::before {\n opacity: 1;\n }\n }\n`;\n\nexport const Picture = styled.picture``;\n\nexport const Img = styled.img`\n position: absolute;\n width: 100%;\n height: 100%;\n object-fit: cover;\n top: auto;\n left: auto;\n border-radius: 3px;\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n margin-top: ${size(2)};\n`;\n\nexport const ContentBody = styled.div``;\n\nexport const ContentFooter = styled.div`\n margin-top: auto;\n padding-top: ${size(1)};\n`;\n\nexport const PreHeading = styled.div`\n margin-bottom: ${size(0.25)};\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.75rem;\n`;\n\nexport const Heading = styled.h1.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n font-weight: 400;\n margin: 0;\n font-size: 1rem;\n`;\n\nexport const Link = styled.a`\n position: absolute;\n inset: 0;\n z-index: 1;\n color: inherit;\n text-decoration: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Description = styled.div`\n font-size: 0.875rem;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: ${size(0.25)};\n`;\n\nexport const Usp = styled.div`\n margin-top: ${size(1)};\n`;\n\nexport const Price = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n width: 100%;\n`;\n\nexport const CurrentPrice = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n font-size: 1rem;\n margin-right: ${size(1)};\n`;\n\nexport const PriceCell = styled.div`\n flex: 1 1 auto;\n padding-right: ${size(1)};\n`;\n\nexport const OldPrice = styled.div`\n text-decoration: line-through;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n`;\n\nexport const Label = styled.label`\n color: ${(props) => props.theme.color.disabledText};\n font-size: 0.75rem;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\nexport const List = styled.ul`\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: ${size(-2)} ${size(-1)};\n`;\n\nexport const Item = styled.li`\n flex: 1 1 auto;\n width: 100%;\n max-width: 100%;\n padding: ${size(2)} ${size(1)};\n\n ${(props) => props.theme.breakpoint.Sm} {\n width: 50%;\n max-width: 50%;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n width: 33.333%;\n max-width: 33.333%;\n }\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Page = styled.div``;\n\ntype PageSectionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n accent?: boolean;\n large?: boolean;\n fillSpace?: boolean;\n};\n\nexport const PageSection = styled.section<PageSectionProps>`\n margin-bottom: ${size(4)};\n\n ${({ accent }: { accent?: boolean }) =>\n accent &&\n css`\n padding: ${size(4)} 0;\n background-color: ${(props) => props.theme.color.accent};\n margin-bottom: 0;\n `}\n\n ${({ large }: { large?: boolean }) =>\n large &&\n css`\n margin-bottom: ${size(8)};\n `}\n\n ${({ accent, large }) =>\n accent &&\n large &&\n css`\n padding: ${size(8)} 0;\n margin-bottom: 0;\n `}\n\n ${({ fillSpace }: { fillSpace?: boolean }) =>\n fillSpace &&\n css`\n flex: 1 1 auto;\n `}\n`;\n", "import React, { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { DEFAULT_SORT, SORT, withSort } from '../../Gql/searchParams';\nimport useSearch from '../../State/Search/useSearch';\nimport { numberSeparator } from '../../utils/formats';\nimport { sortOptions } from '../../utils/sortOptions';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport Loader from '../Loader';\nimport ProgressBar from '../ProgressBar';\nimport SortSelect from '../SortSelect';\nimport {\n Body,\n Footer,\n FooterAction,\n FooterProgress,\n Header,\n HeaderCount,\n HeaderSort,\n ResultCount,\n Wrapper,\n} from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst Result = ({ children }: Props) => {\n const { t } = useTranslation();\n const { loading, loadingMore, result, params, hasMore, loadMore, update } = useSearch();\n\n const onSortOptionChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => update(withSort(params, e.currentTarget.value)),\n [params, update]\n );\n\n const numberOfDocuments = result?.hits.length || 0;\n const numberOfHits = result?.found || 0;\n const options = useMemo(() => sortOptions(), []);\n\n // A new search replaces the list; loading more keeps it and adds to it.\n if (loading && !loadingMore) {\n return <Loader />;\n }\n return (\n <Wrapper>\n <Header>\n <HeaderCount>\n <ResultCount>{`${numberSeparator(numberOfHits)} ${\n numberOfHits === 1 ? t('search.result.plural') : t('search.result.plural')\n }`}</ResultCount>\n </HeaderCount>\n <HeaderSort>\n <SortSelect\n value={params.get(SORT) || DEFAULT_SORT}\n options={options}\n onChange={onSortOptionChange}\n />\n </HeaderSort>\n </Header>\n <Body>{children}</Body>\n <Footer>\n <FooterProgress>\n <ProgressBar valueCurrent={numberOfDocuments} valueMax={numberOfHits} />\n </FooterProgress>\n {hasMore && (\n <FooterAction>\n <ButtonSecondary\n disabled={loadingMore}\n onClick={loadMore}\n title={t('search.showMore.title')}\n aria-label={t('search.showMore.text')}\n >\n <ButtonContent>{t('search.showMore.text')}</ButtonContent>\n </ButtonSecondary>\n </FooterAction>\n )}\n </Footer>\n </Wrapper>\n );\n};\n\nexport default Result;\n", "import i18n, { i18n as I18nInstance } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport { MarketCode } from '../@types/market';\n\n// Explicit type: an inferred type would reference node_modules/i18next in the emitted .d.ts (TS2883).\nexport const i18nScoped: I18nInstance = i18n.createInstance();\n\nconst getLanguage = (marketCode?: MarketCode) => {\n switch (marketCode) {\n case 'NO':\n return 'nb-NO';\n case 'SE':\n return 'sv-SE';\n default:\n return 'en-US';\n }\n};\n\nexport const initializeI18n = (marketCode: MarketCode = 'SE') => {\n return new Promise((resolve) => {\n if (i18nScoped.isInitialized) {\n resolve(true);\n return;\n }\n i18nScoped.use(initReactI18next).init(\n {\n lng: getLanguage(marketCode),\n fallbackLng: 'en-US',\n interpolation: {\n escapeValue: false,\n },\n resources: {\n 'sv-SE': {\n translation: {\n navigation: {\n backToSearch: 'Tillbaka till bils\u00F6k',\n },\n filter: {\n manufacturer: 'Tillverkare',\n model: 'Modell',\n modelSeries: 'Modell',\n fuelType: 'Drivmedel',\n gearboxType: 'V\u00E4xell\u00E5da',\n branchDisplayName: 'Anl\u00E4ggning',\n branchCity: 'Stad',\n colorName: 'F\u00E4rg',\n environmentClass: 'Milj\u00F6klass',\n segment: 'Segment',\n bodyStyle: 'Karosstyp',\n trimLevel: 'Utrustningsniv\u00E5',\n inventoryStatus: 'Lagerstatus',\n drivetrainType: 'Drivhjul',\n engineBaseType: 'Motortyp',\n price: 'Pris',\n odometer: 'Miltal',\n modelYear: 'Modell\u00E5r',\n privateLease: 'Privatleasing',\n businessLease: 'F\u00F6retagsleasa',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/m\u00E5n',\n },\n category: {\n basic: 'Basuppgifter',\n engineAndPerformance: 'Motor & Prestanda',\n },\n subCategory: {\n engine: 'Motor',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Varum\u00E4rke',\n hint: '',\n },\n modelSeries: {\n displayName: 'Modell',\n hint: '',\n },\n modelName: {\n displayName: 'Version',\n hint: 'Vilket utf\u00F6rande av bilmodellen det \u00E4r.',\n },\n modelYear: {\n displayName: 'Modell\u00E5r',\n hint: 'Modell\u00E5r s\u00E4tts av tillverkaren. Handlaren \u00E4ndrar ibland modell\u00E5ret f\u00F6r att matcha transportstyrelsens definition f\u00F6r <i>\u00E5rsmodell</i>. Definitionen f\u00F6r \u00E5rsmodell inneb\u00E4r att bilar tillverkade andra halvan av \u00E5ret f\u00E5r n\u00E4sta \u00E5rs modell\u00E5r.',\n },\n manufactureYear: {\n displayName: 'Tillverknings\u00E5r',\n hint: '\u00C5ret bilen tillverkades.',\n },\n odometer: { displayName: 'M\u00E4tarst\u00E4llning', hint: '' },\n gearboxType: { displayName: 'V\u00E4xell\u00E5da', hint: '' },\n registrationNumber: { displayName: 'Registreringsnummer', hint: '' },\n fuelType: {\n displayName: 'Br\u00E4nslegrupp',\n hint: 'Vad bilen ska tankas med och drivs av.',\n },\n enginePower: { displayName: 'Effekt', unit: 'hk' },\n color: { displayName: 'F\u00E4rg' },\n chassis: { displayName: 'Kaross' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: '\u00C5rlig fordonsskatt' },\n numberOfDoors: { displayName: 'D\u00F6rrar' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Ja',\n no: 'Nej',\n logotype: 'Logotyp',\n close: 'St\u00E4ng',\n showMore: 'Visa mer',\n readMore: 'L\u00E4s mer',\n showMoreInformation: 'Visa mer information',\n showLessInformation: 'Visa mindre information',\n choose: 'V\u00E4lj',\n address: 'Adress',\n mondayShort: 'M\u00E5n',\n tuesdayShort: 'Tis',\n wednesdayShort: 'Ons',\n thursdayShort: 'Tor',\n fridayShort: 'Fre',\n saturdayShort: 'L\u00F6r',\n sundayShort: 'S\u00F6n',\n moreInformation: 'Mer information',\n lessInformation: 'Mindre information',\n anErrorHasOccured: 'Ett fel har intr\u00E4ffat',\n opensInNewTab: '\u00D6ppnas i ny flik',\n open: '\u00D6ppna',\n imageIndex: 'Bild {{index}}',\n },\n item: {\n relatedVehicles: 'Relaterade fordon',\n latestVehicles: 'Senast inkomna',\n readMoreInNewTab: 'L\u00E4s mer (\u00F6ppnas i ny flik)',\n moreInfoAboutSubject: 'Mer information om {{subject}}',\n dataNotAvailable: 'Uppgift saknas',\n showOnGoogleMaps: 'Visa p\u00E5 Google Maps',\n googleMapsMapAlt: 'Karta',\n googleMapsPlaceholderInit: 'Visa karta',\n demoCar: 'Demobil',\n demoCarDescription:\n 'En demobil \u00E4r en bil som st\u00E5tt i utst\u00E4llning eller som p\u00E5 annat s\u00E4tt anv\u00E4nts f\u00F6r att visa upp en viss modell. Bilarna \u00E4r ofta v\u00E4lutrustade och har blivit v\u00E4l omh\u00E4ndertagna. Dessutom har de vanligtvis g\u00E5tt f\u00E5 mil och har fortfarande nybilsgarantierna kvar.',\n carData: 'Biluppgifter',\n carDataDescription: 'Information direkt fr\u00E5n Transportstyrelsen och tillverkaren.',\n equipment: 'Utrustning',\n equipmentDescription: 'Kompletterande uppgifter om bilen.',\n documents: 'Dokument',\n documentTypes: {\n tireEnergyDeclaration: 'Energideklaration f\u00F6r d\u00E4ck',\n goodsDeclaration: 'Varudeklaration',\n other: '\u00D6vriga dokument',\n },\n carIsReserved: 'Bilen \u00E4r reserverad',\n carIsReservedDescription: 'Denna bil \u00E4r reserverad av en annan k\u00F6pare.',\n carIsReservedModalBody: 'Denna bil \u00E4r reserverad av en annan k\u00F6pare.',\n centralWarehouseCar: 'Centrallagerbil',\n centralWarehouseCarDescription:\n 'Denna bil tillh\u00F6r ett centrallager och g\u00E5r att k\u00F6pa genom flera anl\u00E4ggningar. Byt anl\u00E4ggning f\u00F6r att visa kontaktuppgifter till just den anl\u00E4ggningen.',\n centralWarehouseCarDescriptionShort:\n 'Denna bil tillh\u00F6r ett centrallager och g\u00E5r att k\u00F6pa genom flera anl\u00E4ggningar.',\n clickHereToShowContactToAnotherBranch:\n ' Klicka h\u00E4r f\u00F6r att visa kontaktuppgifter till en annan anl\u00E4ggning',\n switchBranch: 'Byt anl\u00E4ggning',\n switchBranchDescription: 'V\u00E4lj den anl\u00E4ggning du vill visa kontaktuppgifter f\u00F6r.',\n chooseBranch: 'V\u00E4lj anl\u00E4ggning',\n chooseSelectedBranch: 'V\u00E4lj vald anl\u00E4ggning',\n availableFromDate: 'Tillg\u00E4nglig fr\u00E5n {{date}}',\n includingShort: 'Inkl.',\n usedWarrany: 'Begagnatgaranti',\n homeDelivery: 'Hemleverans',\n thisCarsIsLocatedAt: 'Den h\u00E4r bilen finns p\u00E5',\n thisCarIsAvailableAtOurBranch:\n 'Den h\u00E4r bilen finns p\u00E5 v\u00E5r anl\u00E4ggning i {{location}}',\n contact: 'Kontakt',\n threeSixty: {\n badge: '360\u00B0 bild',\n sphereBadge: '360\u00B0 interi\u00F6r',\n viewer: '360\u00B0 bildvisare',\n description: 'Dra eller anv\u00E4nd piltangenterna f\u00F6r att rotera bilen.',\n rotate: 'Rotera 360\u00B0',\n frame: '{{frame}} av {{total}}',\n },\n openingHoursToday: '\u00D6ppetider idag',\n closedToday: 'St\u00E4ngt idag',\n open: '\u00D6ppet',\n closed: 'St\u00E4ngt',\n addInsurance: 'V\u00E4lj till f\u00F6rs\u00E4kring',\n getInsuranceQuote: 'F\u00E5 prisf\u00F6rslag',\n insurance: 'F\u00F6rs\u00E4kring',\n readMoreAboutInsuranceInNewTab: 'L\u00E4s mer om f\u00F6rs\u00E4kringen (\u00F6ppnas i ny flik)',\n personalNumber: 'Personnummer',\n estimatedAnualMileage: 'Uppskattad k\u00F6rstr\u00E4cka per \u00E5r',\n showInsurances: 'Visa f\u00F6rs\u00E4kringar',\n savePersonalNumberOnThisDevice: 'Spara personnummer p\u00E5 denna enhet',\n savePersonalNumberOnThisDeviceHelp:\n 'Spara personnummer p\u00E5 denna dator f\u00F6r att direkt visa f\u00F6rs\u00E4kringskostnaderna i Wayke. Personnumret lagras inte hos Wayke utan finns bara sparad i din webbl\u00E4sare.',\n couldNotfetchInsurances: 'Kunde inte h\u00E4mta f\u00F6rs\u00E4kringar. V\u00E4nligen f\u00F6rs\u00F6k igen.',\n openPrePurchaseInformationInNewTab:\n 'F\u00F6rk\u00F6psinformation och villkor (\u00F6ppnas i ny flik)',\n insuranceIncludes: 'F\u00F6rs\u00E4kringen inneh\u00E5ller',\n addInsuranceHeading: 'L\u00E4gg till',\n financialOptions: {\n otherFinancialOptions: 'Andra finansieringsalternativ',\n privateLease: 'Privatleasa',\n businessLease: 'F\u00F6retagsleasa',\n monthlyCost: 'M\u00E5nadskostnad',\n bindingTime: 'Bindningstid',\n annualMileage: '\u00C5rlig k\u00F6rstr\u00E4cka',\n payInInstallments: 'Delbetala',\n payInInstallmentsDetailed: 'Delbetala {{amount}} i {{duration}} m\u00E5n',\n disclaimer: 'Ber\u00E4knat p\u00E5 {{interest}} r\u00E4nta.',\n loanOptions: 'L\u00E5nealternativ',\n downPayment: 'Kontantinsats',\n duration: 'Avbetalning',\n residual: 'Restskuld',\n interest: 'R\u00E4nta',\n effectiveinterest: 'Effektiv r\u00E4nta',\n setupFee: 'Uppl\u00E4ggningskostnad',\n administrationFee: 'Administrativa avgifter',\n totalCreditCost: 'Total kreditkostnad',\n mileagePerYear: 'mil/\u00E5r',\n months: 'm\u00E5n',\n loanOptionsDisclaimer:\n 'Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %) och en \u00E5rlig k\u00F6rstr\u00E4cka om {{mileage}} mil.',\n },\n actions: {\n emailSubject: '{{hostName}} \u2013 Jag \u00E4r intresserad av {{vehicle}}',\n emailBody: 'L\u00E4nk till bilen: {{url}}',\n openform: '\u00D6ppna formul\u00E4r',\n buyOnline: 'K\u00F6p bilen online',\n showEmail: 'Visa mailadress',\n showPhoneNumber: 'Visa telefonnummer',\n callNumber: 'Ring',\n sendEmailTo: 'Skicka ett mail till',\n },\n accessories: {\n accessories: 'Tillbeh\u00F6r',\n accessoriesDescription: 'Tillbeh\u00F6r som passar till detta fordon.',\n price: 'Kontantpris',\n oldPrice: 'Tidigare pris',\n installationCost: 'Monteringskostnad',\n articleNumberShort: 'Art. nr.',\n moreInformationAboutAccessory: 'Mer information om {{accessory}}',\n },\n },\n productCard: {\n price: 'Pris',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'F\u00F6retagsleasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sortera',\n showMore: {\n text: 'Visa fler',\n title: 'Visa fler resultat',\n },\n filterButton: {\n text: 'Filtrera',\n title: 'Visa filter',\n },\n sortButton: {\n text: 'Sortera',\n title: 'V\u00E4lj sorteringsordning',\n },\n searchResult: 'S\u00F6kresultat',\n snackbarNoSearchResults: {\n heading: 'Inga resultat',\n body: 'S\u00F6kningen gav inga resultat',\n },\n snackBarClearFreeText: {\n heading: 'Inga resultat',\n body: 'Rensa fritexten f\u00F6r att se alla filter',\n },\n sortOptions: {\n relevance: 'Relevans',\n publishedAsc: 'Publicerad (\u00E4ldst)',\n publishedDesc: 'Publicerad (senast)',\n priceAsc: 'Pris (l\u00E4gst)',\n priceDesc: 'Pris (h\u00F6gst)',\n modelAsc: '\u00C5rsmodell (\u00E4ldst)',\n modelDesc: '\u00C5rsmodell (nyast)',\n mileageAsc: 'Miltal (l\u00E4gst)',\n mileageDesc: 'Miltal (h\u00F6gst)',\n },\n clearAllFilters: {\n text: 'Rensa alla filter',\n title: 'Rensa alla filter',\n },\n showNumberOfCustomUnit: 'Visa {{count}} {{unit}}',\n result: {\n singular: 'Bil',\n plural: 'Bilar',\n },\n freeText: 'Fritext',\n from: 'Fr\u00E5n',\n to: 'Till',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'l\u00E4gsta',\n max: 'h\u00F6gsta',\n },\n searchBar: {\n title: 'S\u00F6k',\n placeholder: 'S\u00F6k din bil',\n button: {\n text: 'S\u00F6k',\n title: 'S\u00F6k',\n },\n searchResults: 'S\u00F6ktr\u00E4ffar',\n showAllRsults: 'Visa alla bilar',\n },\n lead: {\n messageFormTitle: 'Skicka meddelande',\n callFormTitle: 'Bli uppringd',\n firstName: 'F\u00F6rnamn',\n lastName: 'Efternamn',\n email: 'E-postadress',\n phoneNumber: 'Telefonnummer',\n message: 'Meddelande',\n tradeInCar: 'Inbytesbil',\n registrationNumber: 'Registreringsnummer',\n mileage: 'Miltal',\n send: 'Skicka',\n close: 'St\u00E4ng',\n error: 'Det gick inte att skicka. F\u00F6rs\u00F6k igen.',\n validationMessages: {\n requiredFirstName: 'F\u00F6rnamn kr\u00E4vs',\n requiredLastName: 'Efternamn kr\u00E4vs',\n requiredEmail: 'E-postadress kr\u00E4vs',\n invalidEmail: 'Ogiltig e-postadress',\n maxMessage: 'Meddelandet f\u00E5r inte \u00F6verstiga 500 tecken',\n requiredRegNo: 'Registreringsnummer kr\u00E4vs om du har inbytesbil',\n invalidRegNo: 'Ogiltigt registreringsnummer, ange det som t.ex. ABC123',\n requiredMileage: 'Miltal kr\u00E4vs om du har inbytesbil',\n requiredPhoneNumber: 'Telefonnummer kr\u00E4vs',\n },\n confirmationTitle: 'Tack!',\n confirmationMessage: 'Ditt meddelande har skickats. Vi kontaktar dig inom kort.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Bilder',\n loading: 'Laddar...',\n error404: '404',\n showingNumberOfResults_one: 'Visar {{current}} av {{count}} resultat',\n showingNumberOfResults_other: 'Visar {{current}} av {{count}} resultat',\n closeModal: 'St\u00E4ng modal',\n closePanel: 'St\u00E4ng panel',\n goToHeading: 'G\u00E5 till {{heading}}',\n openDocument: '\u00D6ppna {{document}}',\n previousImage: 'F\u00F6reg\u00E5ende bild',\n nextImage: 'N\u00E4sta bild',\n goToImageIndex: 'G\u00E5 till bild {{index}}',\n phoneNumber: 'Telefonnummer',\n showPhoneNumber: 'Visa telefonnummer',\n callPhoneNumber: 'Ring {{phoneNumber}}',\n price: 'Pris',\n privateLeasingPrice: 'Privatleasing',\n video: 'Video',\n playVideo: 'Spela video',\n searchResults: 'S\u00F6ktr\u00E4ffar',\n showAllCars: 'Visa alla bilar',\n },\n },\n },\n 'nb-NO': {\n translation: {\n navigation: {\n backToSearch: 'Tilbake til bils\u00F8k',\n },\n filter: {\n manufacturer: 'Produsent',\n model: 'Modell',\n modelSeries: 'Modell',\n fuelType: 'Drivstoff',\n gearboxType: 'Girkasse',\n branchDisplayName: 'Forhandler',\n branchCity: 'By',\n colorName: 'Farge',\n environmentClass: 'Milj\u00F8klasse',\n segment: 'Segment',\n bodyStyle: 'Karosseri',\n trimLevel: 'Utstyrsniv\u00E5',\n inventoryStatus: 'Lagerstatus',\n drivetrainType: 'Drivhjul',\n engineBaseType: 'Motortype',\n price: 'Pris',\n odometer: 'M\u00E5leravlesning',\n modelYear: 'Modell\u00E5r',\n privateLease: 'Leasingpris',\n businessLease: 'Bedriftsleasingpris',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/mnd',\n },\n category: {\n basic: 'Grunnopplysninger',\n engineAndPerformance: 'Motor og ytelse',\n },\n subCategory: {\n engine: 'Motor',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Produsent',\n hint: '',\n },\n modelSeries: {\n displayName: 'Modell',\n hint: '',\n },\n modelName: {\n displayName: 'Versjon',\n hint: 'Hvilken versjon av bilmodellen det er.',\n },\n modelYear: {\n displayName: '\u00C5rsmodell',\n hint: 'Modell\u00E5ret settes av produsenten. Forhandlere endrer av og til modell\u00E5ret for \u00E5 matche transportmyndighetens definisjon av modell\u00E5ret. Definisjonen av modell\u00E5ret inneb\u00E6rer at biler produsert i den siste halvdelen av \u00E5ret f\u00E5r neste \u00E5rs modell\u00E5r.',\n },\n manufactureYear: {\n displayName: 'Produksjons\u00E5r',\n hint: '\u00C5ret bilen ble produsert.',\n },\n odometer: { displayName: 'M\u00E5leravlesning', hint: '' },\n gearboxType: { displayName: 'Girkasse', hint: '' },\n registrationNumber: { displayName: 'Registreringsnummer', hint: '' },\n fuelType: {\n displayName: 'Drivstoff',\n hint: 'Hva bilen skal tankes med og drives av.',\n },\n enginePower: { displayName: 'Effekt', unit: 'hk' },\n color: { displayName: 'Farge' },\n chassis: { displayName: 'Karosseri' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: '\u00C5rsavgift' },\n numberOfDoors: { displayName: 'D\u00F8rer' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Ja',\n no: 'nei',\n logotype: 'Logotype',\n close: 'Close',\n showMore: 'Vis mer',\n readMore: 'Les mer',\n showMoreInformation: 'Vis mer informasjon',\n showLessInformation: 'Vis mindre informasjon',\n choose: 'Velg',\n address: 'Adresse',\n mondayShort: 'Mandag',\n tuesdayShort: 'Tirsdag',\n wednesdayShort: 'Onsdag',\n thursdayShort: 'Torsdag',\n fridayShort: 'Fredag',\n saturdayShort: 'L\u00F8rdag',\n sundayShort: 'S\u00F8ndag',\n moreInformation: 'Mer informasjon',\n lessInformation: 'Mindre informasjon',\n anErrorHasOccured: 'Det har oppst\u00E5tt en feil',\n opensInNewTab: '\u00C5pnes i ny fane',\n open: '\u00C5pne',\n imageIndex: 'Bilde {{index}}',\n },\n item: {\n relatedVehicles: 'Relaterte kj\u00F8ret\u00F8y',\n latestVehicles: 'Sist mottatt',\n readMoreInNewTab: 'Les mer (\u00E5pnes i ny fane)',\n moreInfoAboutSubject: 'Mer informasjon om {{subject}}',\n dataNotAvailable: 'Data ikke tilgjengelig',\n showOnGoogleMaps: 'Vis p\u00E5 Google Maps',\n googleMapsMapAlt: 'Kart',\n googleMapsPlaceholderInit: 'Vis kart',\n demoCar: 'Demo Car',\n demoCarDescription:\n 'En demobil er en bil som har v\u00E6rt utstilt eller som har blitt brukt p\u00E5 annen m\u00E5te for \u00E5 vise frem en bestemt modell. Bilene er ofte godt utstyrt og har blitt tatt godt vare p\u00E5. Dessuten har de vanligvis bare noen f\u00E5 kilometer p\u00E5 seg og har fortsatt garantien p\u00E5 nybilen.',\n carData: 'Bildata',\n carDataDescription: 'Informasjon direkte fra Statens Vegvesen og produsenten.',\n equipment: 'Utstyr',\n equipmentDescription: 'Ytterligere informasjon om bilen.',\n documents: 'Dokumenter',\n documentTypes: {\n tireEnergyDeclaration: 'Energideklarasjon for dekk',\n goodsDeclaration: 'Varedeklarasjon',\n other: 'Andre dokumenter',\n },\n carIsReserved: 'Bilen er reservert',\n carIsReservedDescription: 'Denne bilen er reservert av en annen kj\u00F8per.',\n carIsReservedModalBody: 'Denne bilen er reservert av en annen kj\u00F8per.',\n centralWarehouseCar: 'Sentrallagerbil',\n centralWarehouseCarDescription:\n 'Denne bilen tilh\u00F8rer et sentrallager og kan kj\u00F8pes gjennom flere fasiliteter. Endre forhandler for \u00E5 vise kontaktinformasjon for det bestemte forhandleren.',\n centralWarehouseCarDescriptionShort:\n 'Denne bilen tilh\u00F8rer et sentrallager og kan kj\u00F8pes gjennom flere fasiliteter.',\n clickHereToShowContactToAnotherBranch:\n 'Klikk her for \u00E5 se kontaktdetaljer for et annet forhandler',\n switchBranch: 'Switch Branch',\n switchBranchDescription: 'Velg filialen du vil vise kontaktdetaljer for.',\n selectBranch: 'Choose Branch',\n chooseSelectedBranch: 'Velg valgt gren',\n availableFromDate: 'Tilgjengelig fra {{date}}',\n includingShort: 'Inkl.',\n usedWarrany: 'Bruktgaranti',\n homeDelivery: 'Hjemlevering',\n thisCarsIsLocatedAt: 'Denne bilen er p\u00E5',\n thisCarIsAvailableAtOurBranch:\n 'Denne bilen er tilgjengelig i v\u00E5r filial i {{location}}',\n contact: 'Kontakt',\n threeSixty: {\n badge: '360\u00B0 bilde',\n sphereBadge: '360\u00B0 interi\u00F8r',\n viewer: '360\u00B0 bildeviser',\n description: 'Dra eller bruk piltastene for \u00E5 rotere bilen.',\n rotate: 'Roter 360\u00B0',\n frame: '{{frame}} av {{total}}',\n },\n openingHoursToday: '\u00C5pningstider i dag',\n closedToday: 'Stengt i dag',\n open: '\u00C5pne',\n closed: 'Stengt',\n addInsurance: 'Velg til forsikring',\n getInsuranceQuote: 'F\u00E5 tilbud',\n insurance: 'Forsikring',\n readMoreAboutInsuranceInNewTab: 'Les mer om forsikring (\u00E5pnes i ny fane)',\n personalNumber: 'Personnummer',\n estimatedAnualMileage: 'Estimert kj\u00F8relengde per \u00E5r',\n showInsurances: 'Vis forsikringer',\n savePersonalNumberOnThisDevice: 'Lagre personlig nummer p\u00E5 denne enheten',\n savePersonalNumberOnThisDeviceHelp:\n 'Lagre personnummeret p\u00E5 denne datamaskinen for \u00E5 direkte se forsikringskostnadene i Wayke. Personnummeret lagres ikke hos Wayke, men lagres kun i nettleseren din.',\n couldNotfetchInsurances:\n 'Kunne ikke hente forsikringer. V\u00E6r s\u00E5 snill, pr\u00F8v p\u00E5 nytt.',\n openPrePurchaseInformationInNewTab:\n 'Informasjon og vilk\u00E5r f\u00F8r kj\u00F8p (\u00E5pnes i ny fane)',\n insuranceIncludes: 'Forsikringen inkluderer',\n addInsuranceHeading: 'Add',\n financialOptions: {\n otherFinancialOptions: 'Andre finansieringsalternativer',\n privateLease: 'PrivateLease',\n businessLease: 'Etagslease',\n monthlyCost: 'M\u00E5nedlig kostnad',\n bindingTime: 'Bindingstid',\n annualMileage: 'Annual Mileage',\n payInInstallments: 'Betal i avdrag',\n payInInstallmentsDetailed: 'Betal delvis {{amount}} i {{duration}} m\u00E5neder',\n disclaimer: 'Beregnet til {{interest}} rente.',\n loanOptions: 'L\u00E5nealternativer',\n downPayment: 'Kontantinnskudd',\n duration: 'Avbetaling',\n residual: 'Restgjeld',\n interest: 'Nominell rente',\n effectiveinterest: 'Effektiv rente',\n setupFee: 'Oppsettskostnad',\n administrationFee: 'Administrative gebyrer',\n totalCreditCost: 'Total kredittkostnad',\n mileagePerYear: 'skandinaviske mil/\u00E5r',\n months: 'mnd',\n loanOptionsDisclaimer:\n 'Beregnet til {{interest}} % rente (effektiv {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %) og en \u00E5rlig kj\u00F8relengde p\u00E5 {{mileage}} miles.',\n },\n actions: {\n emailSubject: '{{hostName}} - Jeg er interessert i {{vehicle}}',\n emailBody: 'Lenke til bilen: {{url}}',\n openform: '\u00C5pent skjema',\n buyOnline: 'Kj\u00F8p bilen p\u00E5 nett',\n showEmail: 'Vis e-postadresse',\n showPhoneNumber: 'Vis telefonnummer',\n callNumber: 'Ring',\n sendEmailTo: 'Send en e-post til',\n },\n accessories: {\n accessories: 'Tilbeh\u00F8r',\n accessoriesDescription: 'Tilbeh\u00F8r som passer for dette kj\u00F8ret\u00F8yet.',\n price: 'Kontantpris',\n oldPrice: 'Forrige pris',\n installationCost: 'Installasjonskostnad',\n articleNumberShort: 'Art. Nei.',\n moreInformationAboutAccessory: 'Mer informasjon om {{accessory}}',\n },\n },\n productCard: {\n price: 'Pris',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'Bedriftsleasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sorter',\n showMore: {\n text: 'Vis fler',\n title: 'Vis flere resultater',\n },\n filterButton: {\n text: 'Filter',\n title: 'Vis filter',\n },\n sortButton: {\n text: 'Sorter',\n title: 'Velg sorteringsrekkef\u00F8lge',\n },\n searchResult: 'S\u00F8keresultat',\n snackbarNoSearchResults: {\n heading: 'Ingen resultater',\n body: 'S\u00F8ket ga ingen resultater',\n },\n snackBarClearFreeText: {\n heading: 'Ingen resultater',\n body: 'T\u00F8m friteksten for \u00E5 se alle filtre',\n },\n sortOptions: {\n relevance: 'Relevans',\n publishedAsc: 'Publisert (eldste)',\n publishedDesc: 'Publisert (siste)',\n priceAsc: 'Pris (laveste)',\n priceDesc: 'Pris (maksimum)',\n modelAsc: 'Modell\u00E5r (eldste)',\n modelDesc: 'Modell\u00E5r (nyeste)',\n mileageAsc: 'M\u00E5leravlesning (lavest)',\n mileageDesc: 'M\u00E5leravlesning (maksimum)',\n },\n clearAllFilters: {\n text: 'T\u00F8m alle filtre',\n title: 'T\u00F8m alle filtre',\n },\n showNumberOfCustomUnit: 'Vis {{count}} {{unit}}',\n result: {\n singular: 'Bil',\n plural: 'Biler',\n },\n freeText: 'Gratis tekst',\n from: 'Fra',\n to: 'Til',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'laveste',\n max: 'h\u00F8yeste',\n },\n searchBar: {\n title: 'S\u00F8k',\n placeholder: 'S\u00F8k i bilen din',\n button: {\n text: 'S\u00F8k',\n title: 'S\u00F8k',\n },\n searchResults: 'S\u00F8keresultater',\n showAllRsults: 'Vis alle biler',\n },\n lead: {\n messageFormTitle: 'Send melding',\n callFormTitle: 'Bli oppringt',\n firstName: 'Fornavn',\n lastName: 'Etternavn',\n email: 'E-postadresse',\n phoneNumber: 'Telefonnummer',\n message: 'Melding',\n tradeInCar: 'Innbyttebil',\n registrationNumber: 'Registreringsnummer',\n mileage: 'Kilometerstand',\n send: 'Send',\n close: 'Lukk',\n error: 'Kunne ikke sende. Pr\u00F8v igjen.',\n validationMessages: {\n requiredFirstName: 'Fornavn er p\u00E5krevd',\n requiredLastName: 'Etternavn er p\u00E5krevd',\n requiredEmail: 'E-postadresse er p\u00E5krevd',\n invalidEmail: 'Ugyldig e-postadresse',\n maxMessage: 'Meldingen kan ikke overskride 500 tegn',\n requiredRegNo: 'Registreringsnummer er p\u00E5krevd hvis du har innbyttebil',\n invalidRegNo: 'Ugyldig registreringsnummer, oppgi det som f.eks. AB12345',\n requiredMileage: 'Kilometerstand er p\u00E5krevd hvis du har innbyttebil',\n requiredPhoneNumber: 'Telefonnummer er p\u00E5krevd',\n },\n confirmationTitle: 'Takk!',\n confirmationMessage: 'Meldingen din er sendt. Vi kontakter deg snart.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Bilder',\n loading: 'Laster...',\n error404: '404',\n showingNumberOfResults_one: 'Viser {{current}} av {{count}} resultater',\n showingNumberOfResults_other: 'Viser {{current}} av {{count}} resultater',\n closeModal: 'Close Modal',\n closePanel: 'Lukk panel',\n goToHeading: 'G\u00E5 til {{heading}}',\n openDocument: '\u00C5pne {{dokument}}',\n previousImage: 'Forrige bilde',\n nextImage: 'Neste bilde',\n goToImageIndex: 'G\u00E5 til bilde {{index}}',\n phoneNumber: 'Telefonnummer',\n showPhoneNumber: 'Vis telefonnummer',\n callPhoneNumber: 'Ring {{phoneNumber}}',\n price: 'Pris',\n privateLeasingPrice: 'Privatleasing',\n video: 'Video',\n playVideo: 'Spill av video',\n searchResults: 'S\u00F8keresultater',\n showAllCars: 'Vis alle biler',\n },\n },\n },\n 'en-US': {\n translation: {\n navigation: {\n backToSearch: 'Back to car search',\n },\n filter: {\n manufacturer: 'Manufacturer',\n model: 'Model',\n modelSeries: 'Model',\n fuelType: 'Fuel Type',\n gearboxType: 'Gearbox Type',\n branchDisplayName: 'Branch',\n branchCity: 'City',\n colorName: 'Color',\n environmentClass: 'Environmental Class',\n segment: 'Segment',\n bodyStyle: 'Body style',\n trimLevel: 'Trim level',\n inventoryStatus: 'Inventory status',\n drivetrainType: 'Driving Wheel',\n engineBaseType: 'Engine type',\n price: 'Price',\n odometer: 'Mileage',\n modelYear: 'Model Year',\n privateLease: 'Private leasing',\n businessLease: 'Business leasing',\n },\n currency: {\n default: 'kr',\n monthly: 'kr/month',\n },\n category: {\n basic: 'Basic Information',\n engineAndPerformance: 'Engine & Performance',\n },\n subCategory: {\n engine: 'Engine',\n },\n customProperty: {\n manufacturer: {\n displayName: 'Brand',\n hint: '',\n },\n modelSeries: {\n displayName: 'Model',\n hint: '',\n },\n modelName: {\n displayName: 'Version',\n hint: 'Which version of the car model it is.',\n },\n modelYear: {\n displayName: 'Model year',\n hint: 'The model year is set by the manufacturer. Dealers sometimes change the model year to match the transport authority`s definition of the model year. The definition of the model year means that cars manufactured in the latter half of the year are given the next year`s model year.',\n },\n manufactureYear: {\n displayName: 'Manufacture year',\n hint: 'The year the car was manufactured.',\n },\n odometer: { displayName: 'Odometer reading', hint: '' },\n gearboxType: { displayName: 'Gearbox', hint: '' },\n registrationNumber: { displayName: 'Registration number', hint: '' },\n fuelType: {\n displayName: 'Fuel type',\n hint: 'What the car should be fueled with and powered by.',\n },\n enginePower: { displayName: 'Power', unit: 'hp' },\n color: { displayName: 'Color' },\n chassis: { displayName: 'Body style' },\n segment: { displayName: 'Segment' },\n annualTax: { displayName: 'Annual tax' },\n numberOfDoors: { displayName: 'Doors' },\n },\n odometer: {\n Kilometer: 'km',\n ScandinavianMile: 'mil',\n },\n common: {\n yes: 'Yes',\n no: 'No',\n logotype: 'Logotype',\n close: 'Close',\n showMore: 'Show more',\n readMore: 'Read more',\n showMoreInformation: 'Show more information',\n showLessInformation: 'Show less information',\n choose: 'Choose',\n address: 'Address',\n mondayShort: 'Mon',\n tuesdayShort: 'Tues',\n wednesdayShort: 'Wednesday',\n thursdayShort: 'Thursday',\n fridayShort: 'Fri',\n saturdayShort: 'Sat',\n sundayShort: 'Sun',\n moreInformation: 'More information',\n lessInformation: 'Less information',\n anErrorHasOccured: 'An error has occurred',\n opensInNewTab: 'Opens in new tab',\n open: 'Open',\n imageIndex: 'Image {{index}}',\n },\n item: {\n relatedVehicles: 'Related Vehicles',\n latestVehicles: 'Latest received',\n readMoreInNewTab: 'Read more (opens in new tab)',\n moreInfoAboutSubject: 'More information about {{subject}}',\n dataNotAvailable: 'Data not available',\n showOnGoogleMaps: 'Show on Google Maps',\n googleMapsMapAlt: 'Map',\n googleMapsPlaceholderInit: 'Show Map',\n demoCar: 'Demo Car',\n demoCarDescription:\n 'A demo car is a car that has been on display or that has been used in some other way to show off a certain model. The cars are often well equipped and have been well looked after. Also, they usually have only a few miles on them and still have their new car warranties.',\n carData: 'Car Data',\n carDataDescription:\n 'Information directly from the Swedish Transport Agency and the manufacturer.',\n equipment: 'Equipment',\n equipmentDescription: 'Additional information about the car.',\n documents: 'Documents',\n documentTypes: {\n tireEnergyDeclaration: 'Energy declaration for tyres',\n goodsDeclaration: 'Goods declaration',\n other: 'Other documents',\n },\n carIsReserved: 'The car is reserved',\n carIsReservedDescription: 'This car is reserved by another buyer.',\n carIsReservedModalBody: 'This car is reserved by another buyer.',\n centralWarehouseCar: 'Central warehouse car',\n centralWarehouseCarDescription:\n 'This car belongs to a central warehouse and can be purchased through several facilities. Change facility to display contact information for that particular facility.',\n centralWarehouseCarDescriptionShort:\n 'This car belongs to a central warehouse and can be purchased through several facilities.',\n clickHereToShowContactToAnotherBranch:\n 'Click here to view contact details for another facility',\n switchBranch: 'Switch Branch',\n switchBranchDescription:\n 'Select the branch you want to display contact details for.',\n chooseBranch: 'Choose branch',\n chooseSelectedBranch: 'Choose selected branch',\n availableFromDate: 'Available from {{date}}',\n includingShort: 'Incl.',\n usedWarrany: 'Used Warranty',\n homeDelivery: 'Home delivery',\n thisCarsIsLocatedAt: 'This car is on',\n thisCarIsAvailableAtOurBranch:\n 'This car is available at our branch in {{location}}',\n contact: 'Contact',\n threeSixty: {\n badge: '360\u00B0 image',\n sphereBadge: '360\u00B0 interior',\n viewer: '360\u00B0 image viewer',\n description: 'Drag or use the arrow keys to rotate the car.',\n rotate: 'Rotate 360\u00B0',\n frame: '{{frame}} of {{total}}',\n },\n openingHoursToday: 'Opening hours today',\n closedToday: 'Closed today',\n open: 'Open',\n closed: 'Closed',\n addInsurance: 'Select insurance',\n getInsuranceQuote: 'Get Quote',\n insurance: 'Insurance',\n readMoreAboutInsuranceInNewTab: 'Read more about insurance (opens in new tab)',\n personalNumber: 'Personal number',\n estimatedAnnualMileage: 'Estimated mileage per year',\n showInsurances: 'Show insurances',\n savePersonalNumberOnThisDevice: 'Save personal number on this device',\n savePersonalNumberOnThisDeviceHelp:\n 'Save social security number on this computer to directly view the insurance costs in Wayke. The social security number is not stored at Wayke, but is only saved in your browser.',\n couldNotfetchInsurances: 'Could not fetch insurances. Please try again.',\n openPrePurchaseInformationInNewTab:\n 'Pre-Purchase Information and Terms (opens in new tab)',\n insuranceIncludes: 'The insurance includes',\n addInsuranceHeading: 'Add',\n financialOptions: {\n otherFinancialOptions: 'Other financing options',\n privateLease: 'PrivateLease',\n businessLease: 'Etagslease',\n monthlyCost: 'Monthly cost',\n bindingTime: 'Binding Time',\n annualMileage: 'Annual Mileage',\n payInInstallments: 'Pay In Installments',\n payInInstallmentsDetailed: 'Partially pay {{amount}} in {{duration}} months',\n disclaimer: 'Calculated at {{interest}} interest.',\n loanOptions: 'Loan Options',\n downPayment: 'Cash Deposit',\n duration: 'Instalment',\n residual: 'Residual debt',\n interest: 'Interest',\n effectiveinterest: 'Effective interest',\n setupFee: 'Setup cost',\n administrationFee: 'Administrative fees',\n totalCreditCost: 'Total Credit Cost',\n mileagePerYear: 'mil/\u00E5r',\n months: 'mnd',\n loanOptionsDisclaimer:\n 'Calculated at {{interest}} % interest (effective {{effectiveInterest}} %).',\n loanOptionsDisclaimerMileage:\n 'Calculated on {{interest}} % interest (effective {{effectiveInterest}} %) and an annual mileage of {{mileage}} miles.',\n },\n actions: {\n emailSubject: \"{{hostName}} - I'm interested in {{vehicle}}\",\n emailBody: 'Link to the vehicle: {{url}}',\n openform: 'Open form',\n buyOnline: 'Buy the car online',\n showEmail: 'Show email address',\n showPhoneNumber: 'Show phone number',\n callNumber: 'Call',\n sendEmailTo: 'Send an email to',\n },\n accessories: {\n accessories: 'Accessories',\n accessoriesDescription: 'Accessories suitable for this vehicle.',\n price: 'Cash price',\n oldPrice: 'Previous Price',\n installationCost: 'Installation cost',\n articleNumberShort: 'Art. no.',\n moreInformationAboutAccessory: 'More information about {{accessory}}',\n },\n },\n productCard: {\n price: 'Price',\n privateLeasing: 'Privatleasing',\n businessLeasing: 'Business leasing',\n },\n search: {\n filter: 'Filter',\n sort: 'Sort',\n showMore: {\n text: 'Show more',\n title: 'Show more results',\n },\n filterButton: {\n text: 'Filter',\n title: 'Show filter',\n },\n sortButton: {\n text: 'Sort',\n title: 'Select sort order',\n },\n searchResult: 'Search Result',\n snackbarNoSearchResults: {\n heading: 'No results',\n body: 'The search returned no results',\n },\n snackBarClearFreeText: {\n heading: 'No results',\n body: 'Clear the free text to see all filters',\n },\n sortOptions: {\n relevance: 'Relevance',\n publishedAsc: 'Published (oldest)',\n publishedDesc: 'Published (latest)',\n priceAsc: 'Price (Lowest)',\n priceDesc: 'Price (Maximum)',\n modelAsc: 'Year model (oldest)',\n modelDesc: 'Year Model (Newest)',\n mileageAsc: 'Mileage (lowest)',\n mileageDesc: 'Mileage (maximum)',\n },\n clearAllFilters: {\n text: 'Clear all filters',\n title: 'Clear all filters',\n },\n showNumberOfCustomUnit: 'Show {{count}} {{unit}}',\n result: {\n singular: 'Car',\n plural: 'Cars',\n },\n freeText: 'Free text',\n from: 'From',\n to: 'To',\n min: 'Min',\n max: 'Max',\n },\n rangeSlider: {\n min: 'minimum',\n max: 'maximum',\n },\n searchBar: {\n title: 'Search',\n placeholder: 'Search your car',\n button: {\n text: 'Search',\n title: 'Search',\n },\n searchResults: 'Search Results',\n showAllRsults: 'Show all cars',\n },\n lead: {\n messageFormTitle: 'Send message',\n callFormTitle: 'Get a callback',\n firstName: 'First name',\n lastName: 'Last name',\n email: 'Email address',\n phoneNumber: 'Phone number',\n message: 'Message',\n tradeInCar: 'Trade-in car',\n registrationNumber: 'Registration number',\n mileage: 'Mileage',\n send: 'Send',\n close: 'Close',\n error: 'Could not send. Please try again.',\n validationMessages: {\n requiredFirstName: 'First name is required',\n requiredLastName: 'Last name is required',\n requiredEmail: 'Email address is required',\n invalidEmail: 'Invalid email address',\n maxMessage: 'Message cannot exceed 500 characters',\n requiredRegNo: 'Registration number is required if you have a trade-in car',\n invalidRegNo: 'Invalid registration number',\n requiredMileage: 'Mileage is required if you have a trade-in car',\n requiredPhoneNumber: 'Phone number is required',\n },\n confirmationTitle: 'Thank you!',\n confirmationMessage:\n 'Your message has been sent successfully. We will contact you soon.',\n confirmationClose: 'OK',\n },\n other: {\n gallery: 'Images',\n loading: 'Loading...',\n error404: '404',\n showingNumberOfResults_one: 'Showing {{current}} of {{count}} results',\n showingNumberOfResults_other: 'Showing {{current}} of {{count}} results',\n closeModal: 'Close Modal',\n closePanel: 'Close panel',\n goToHeading: 'Go to {{heading}}',\n openDocument: 'Open {{document}}',\n previousImage: 'Previous Image',\n nextImage: 'Next Image',\n goToImageIndex: 'Go to image {{index}}',\n phoneNumber: 'Phone Number',\n showPhoneNumber: 'Show phone number',\n callPhoneNumber: 'Call {{phoneNumber}}',\n price: 'Price',\n privateLeasingPrice: 'Private Leasing',\n video: 'Video',\n playVideo: 'Play video',\n searchResults: 'Search Results',\n showAllCars: 'Show all cars',\n },\n },\n },\n },\n },\n () => {\n resolve(true);\n }\n );\n });\n};\n", "import { i18nScoped } from './I18n';\n\n/** The sort keys offered (searchParams.ts SORT_OPTIONS), in order, with their translation. */\nconst SORT_LABELS: Record<string, string> = {\n 'published-desc': 'search.sortOptions.publishedDesc',\n 'published-asc': 'search.sortOptions.publishedAsc',\n 'price-asc': 'search.sortOptions.priceAsc',\n 'price-desc': 'search.sortOptions.priceDesc',\n 'modelYear-desc': 'search.sortOptions.modelDesc',\n 'modelYear-asc': 'search.sortOptions.modelAsc',\n 'odometer-asc': 'search.sortOptions.mileageAsc',\n 'odometer-desc': 'search.sortOptions.mileageDesc',\n};\n\nexport const sortOptions = () =>\n Object.entries(SORT_LABELS).map(([value, label]) => ({\n value,\n displayName: i18nScoped.t(label),\n }));\n", "import * as React from 'react';\nimport { i18nScoped } from '../../utils/I18n';\nimport { SrOnly } from '../SrOnly';\nimport { Spinner, Wrapper } from './wrapper';\n\ninterface Props {\n inline?: boolean;\n center?: boolean;\n}\n\nconst Loader = ({ inline, center }: Props) => {\n return (\n <Wrapper inline={inline} center={center}>\n <Spinner aria-hidden=\"true\" />\n {i18nScoped.isInitialized && <SrOnly>{i18nScoped.t('other.loading')}</SrOnly>}\n </Wrapper>\n );\n};\n\nexport default Loader;\n", "import styled from 'styled-components';\n\n// Adds element only visible to screen readers\nexport const SrOnly = styled.div`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { rotate } from '../../layout/keyframes';\n\nexport const Spinner = styled.div`\n display: block;\n margin: 0 auto;\n width: ${size(4)};\n height: ${size(4)};\n border-radius: 50%;\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: ${rotate} 600ms linear infinite;\n`;\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n inline?: boolean;\n center?: boolean;\n};\n\nexport const Wrapper = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n role: 'status',\n}))<WrapperProps>`\n ${({ inline }) =>\n inline &&\n css`\n display: inline-block;\n vertical-align: middle;\n color: currentColor !important;\n\n ${Spinner} {\n width: 1em;\n height: 1em;\n }\n `}\n\n ${({ center }) =>\n center &&\n css`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `}\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Bar, BarActive, Description, Wrapper } from './wrapper';\n\ninterface Props {\n valueCurrent: number;\n valueMax: number;\n}\n\nconst ProgressBar = ({ valueCurrent, valueMax }: Props) => {\n const { t } = useTranslation();\n const barWidth = (valueCurrent / valueMax) * 100;\n\n return (\n <Wrapper>\n <Description>\n {t('other.showingNumberOfResults', { current: valueCurrent, count: valueMax })}\n </Description>\n <Bar>\n <BarActive\n style={{ width: `${barWidth}%` }}\n aria-valuenow={valueCurrent}\n aria-valuemin={0}\n aria-valuemax={valueMax}\n />\n </Bar>\n </Wrapper>\n );\n};\n\nexport default ProgressBar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n text-align: center;\n`;\n\nexport const Description = styled.div`\n margin-bottom: ${size(1.5)};\n font-size: 0.875rem;\n`;\n\nexport const Bar = styled.div`\n position: relative;\n width: 100%;\n height: 2px;\n background-color: ${(props) => props.theme.color.accentDark};\n`;\n\nexport const BarActive = styled.div.attrs(() => ({\n role: 'progressbar',\n}))`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background-color: ${(props) => props.theme.color.textDark};\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconChevronDown } from '../Icon';\nimport { Icon, Option, Select, Wrapper } from './wrapper';\n\nexport interface OptionProps {\n value: number | string;\n displayName?: number | string;\n}\n\ninterface SortSelectProps {\n value: string | number;\n options: OptionProps[];\n unit?: string;\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n}\n\nconst SortSelect = ({ value, options, onChange, unit }: SortSelectProps) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n <Select\n value={value}\n onChange={onChange}\n title={t('search.sortButton.text')}\n aria-label={t('search.sortButton.text')}\n >\n {options.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.displayName || option.value}\n {unit ? ` ${unit}` : ''}\n </Option>\n ))}\n </Select>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Wrapper>\n );\n};\n\nexport default SortSelect;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst iconSize = '0.875rem';\n\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const Select = styled.select.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: relative;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n text-indent: 0.01px;\n border: 0;\n padding: 0;\n padding-right: calc(${iconSize} + ${size(1)});\n background-color: transparent;\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n font-size: 16px;\n cursor: pointer;\n z-index: 1;\n\n &:focus {\n outline: none;\n text-decoration: underline;\n }\n\n ::-ms-expand {\n display: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\nexport const Option = styled.option`\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const Icon = styled.div`\n position: absolute;\n top: 50%;\n right: 0;\n transform: translateY(-50%);\n font-size: ${iconSize};\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\nexport const Header = styled.header`\n display: flex;\n margin-bottom: ${size(4)};\n`;\n\nexport const HeaderCount = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const HeaderSort = styled.div`\n flex-shrink: 0;\n`;\n\nexport const Body = styled.div``;\n\nexport const Footer = styled.footer`\n margin-top: ${size(8)};\n text-align: center;\n`;\n\nexport const FooterProgress = styled.div`\n max-width: 175px;\n margin: 0 auto;\n`;\n\nexport const FooterAction = styled.div`\n margin-top: ${size(3)};\n`;\n\nexport const ResultCount = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n`;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FREE_TEXT, SORT } from '../../Gql/searchParams';\nimport { fetchSuggestions, suggestionParams } from '../../Gql/suggest';\nimport { Suggestion } from '../../Gql/types';\nimport useSearch from '../../State/Search/useSearch';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport SearchBar from '../SearchBar';\n\n/** Typeahead from search.ads(q).suggest, from two characters, after a short pause in typing. */\nconst useSuggestions = (value: string) => {\n const { publicApi } = useSettings();\n const [suggestions, setSuggestions] = useState<Suggestion[]>([]);\n const q = value.trim();\n\n useEffect(() => {\n if (q.length < 2) {\n setSuggestions([]);\n return;\n }\n let active = true;\n const timeout = setTimeout(() => {\n fetchSuggestions(publicApi, q)\n .then((next) => active && setSuggestions(next))\n .catch(() => active && setSuggestions([]));\n }, 150);\n return () => {\n active = false;\n clearTimeout(timeout);\n };\n }, [q, publicApi]);\n\n return suggestions;\n};\n\nconst SearchFilter = () => {\n const [value, setValue] = useState('');\n const { publicApi } = useSettings();\n const { params, update } = useSearch();\n const suggestions = useSuggestions(value);\n const labels = useMemo(() => suggestions.map((s) => s.label), [suggestions]);\n\n /** A suggestion's filters replace the current ones; the sort order stays. */\n const applySuggestion = useCallback(\n (suggestion: Suggestion) => {\n const next = suggestionParams(suggestion);\n const sort = params.get(SORT);\n if (sort) next.set(SORT, sort);\n update(next);\n setValue('');\n PubSub.publish('Search', { query: suggestion.label });\n },\n [params, update]\n );\n\n const onSearch = useCallback(\n async (value: string) => {\n const q = value.trim();\n if (q === (params.get(FREE_TEXT) || '')) {\n return;\n }\n\n // A free text that is exactly a suggestion (\"audi\" \u2192 Audi) becomes its\n // filters, as the legacy search rewrote such queries.\n if (q) {\n const exact = await fetchSuggestions(publicApi, q, 5)\n .then((list) =>\n list.find((s) => s.label.localeCompare(q, undefined, { sensitivity: 'base' }) === 0)\n )\n .catch(() => undefined);\n if (exact?.filters.length) {\n applySuggestion(exact);\n return;\n }\n }\n\n const next = new URLSearchParams(params);\n if (q) {\n next.set(FREE_TEXT, q);\n } else {\n next.delete(FREE_TEXT);\n }\n update(next);\n setValue('');\n PubSub.publish('Search', { query: q });\n },\n [params, update, publicApi, applySuggestion]\n );\n\n const onSelectSuggestion = useCallback(\n (index: number) => {\n const suggestion = suggestions[index];\n if (suggestion) applySuggestion(suggestion);\n },\n [suggestions, applySuggestion]\n );\n\n return (\n <SearchBar\n value={value}\n setValue={setValue}\n onSearch={onSearch}\n suggestions={labels}\n onSelectSuggestion={onSelectSuggestion}\n />\n );\n};\n\nexport default SearchFilter;\n", "{\n \"name\": \"@wayke-se/components-react\",\n \"version\": \"6.0.0\",\n \"description\": \"\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./style.css\": \"./dist/style.css\",\n \"./package.json\": \"./package.json\"\n },\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"npm run clean\",\n \"test\": \"npm run lint && npm run typecheck\",\n \"lint\": \"npx @biomejs/biome check\",\n \"lint:fix\": \"npx @biomejs/biome check --write\",\n \"typecheck\": \"tsc --noEmit --skipLibCheck\",\n \"generate-libphonenumber-metadata\": \"libphonenumber-metadata-generator src/utils/metadata.min.json --countries SE,NO --extended\",\n \"prepare\": \"husky\",\n \"start\": \"node ./esbuild/start.js\",\n \"build\": \"npm run clean && node ./esbuild/lib.js && node ./esbuild/cdn.js\",\n \"clean\": \"rimraf build && rimraf dist && rimraf dist-cdn\",\n \"build:types\": \"tsc --project tsconfig.build.json\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/wayke-se/components-react.git\"\n },\n \"author\": \"Ourstudio\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\",\n \"styled-components\": \"^6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.6.3\",\n \"@types/node\": \"^24.19.2\",\n \"@types/react\": \"^19.3.0\",\n \"@types/react-dom\": \"^19.3.0\",\n \"dotenv\": \"^18.0.9\",\n \"esbuild\": \"^0.28.2\",\n \"husky\": \"^9.1.7\",\n \"libphonenumber-metadata-generator\": \"^2.0.6\",\n \"lint-staged\": \"^17.6.0\",\n \"react\": \"^19.3.1\",\n \"react-dom\": \"^19.3.1\",\n \"react-router-dom\": \"^7.18.5\",\n \"rimraf\": \"^6.1.3\",\n \"styled-components\": \"^6.6.0\",\n \"typescript\": \"^7.0.2\"\n },\n \"dependencies\": {\n \"@emotion/is-prop-valid\": \"^1.4.0\",\n \"@photo-sphere-viewer/core\": \"^5.15.1\",\n \"@radix-ui/react-slider\": \"^1.6.1\",\n \"@wayke-se/ecom-web\": \"^2.1.1\",\n \"date-fns\": \"^4.4.0\",\n \"dompurify\": \"^3.4.17\",\n \"i18next\": \"^26.5.11\",\n \"libphonenumber-js\": \"^1.13.15\",\n \"marked\": \"^18.1.2\",\n \"react-i18next\": \"^17.1.9\"\n },\n \"allowScripts\": {\n \"esbuild\": true,\n \"fsevents\": false\n }\n}\n", "// Thin client for Wayke's public GraphQL API (public-api.wayke.com). The key is\n// the site's own origin unless an explicit key is given (local development).\n// Identical queries are deduplicated and cached for the page's lifetime, so going\n// back and forth between the list and an ad does not cost another request.\n\nimport packageJson from '../../package.json';\n\n/**\n * Tells the API which client and version a request comes from. Kong sets\n * x-graphql-client-name to the site's key (its domain), but passes this header on,\n * so Hive and the gateway's traces show which sites run which version.\n */\nconst CLIENT_VERSION = `components-react@${packageJson.version}`;\n\nexport interface PublicApiConfig {\n url: string;\n apiKey?: string;\n}\n\nexport type GqlErrorKind = 'unauthorized' | 'rate-limited' | 'graphql' | 'network';\n\nexport class GqlError extends Error {\n readonly kind: GqlErrorKind;\n readonly retryAfter?: number;\n\n constructor(kind: GqlErrorKind, message: string, retryAfter?: number) {\n super(message);\n this.kind = kind;\n this.retryAfter = retryAfter;\n }\n}\n\nconst cache = new Map<string, unknown>();\nconst pending = new Map<string, Promise<unknown>>();\n\nconst resolveApiKey = (config: PublicApiConfig) => config.apiKey || window.location.origin;\n\nconst request = async <T>(\n config: PublicApiConfig,\n query: string,\n variables: Record<string, unknown>\n): Promise<T> => {\n let response: Response;\n try {\n response = await fetch(config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': resolveApiKey(config),\n 'x-graphql-client-version': CLIENT_VERSION,\n },\n body: JSON.stringify({ query, variables }),\n });\n } catch (_e) {\n throw new GqlError('network', 'network');\n }\n\n if (response.status === 401) throw new GqlError('unauthorized', 'unauthorized');\n if (response.status === 429) {\n const retryAfter = Number(response.headers.get('retry-after')) || undefined;\n throw new GqlError('rate-limited', 'rate-limited', retryAfter);\n }\n\n const body = (await response.json().catch(() => null)) as {\n data?: T;\n errors?: { message: string }[];\n } | null;\n if (!response.ok || !body) throw new GqlError('network', `HTTP ${response.status}`);\n if (body.errors?.length) {\n throw new GqlError('graphql', body.errors.map((e) => e.message).join('; '));\n }\n return body.data as T;\n};\n\nexport const gqlQuery = <T>(\n config: PublicApiConfig,\n query: string,\n variables: Record<string, unknown>\n): Promise<T> => {\n const key = JSON.stringify([config.url, resolveApiKey(config), query, variables]);\n if (cache.has(key)) return Promise.resolve(cache.get(key) as T);\n const inflight = pending.get(key);\n if (inflight) return inflight as Promise<T>;\n\n const promise = request<T>(config, query, variables)\n .then((data) => {\n cache.set(key, data);\n return data;\n })\n .finally(() => pending.delete(key));\n pending.set(key, promise);\n return promise;\n};\n", "// GraphQL documents against the public API. Field selections are kept to what\n// the components render; the schema is the source of truth (public-ads-docs).\n\nexport const SEARCH_HIT_FIELDS = `\n ad {\n id\n salesDescription { title }\n pricing {\n cash { price { amount } oldPrice { amount } deductibleVat }\n leasing { leasingMonthlyPayment { amount } }\n companyLeasing { leasingMonthlyPayment { amount } }\n }\n media(limit: 1) { items { ... on AdImage { id url formats { format url } } } }\n branch { id displayName }\n channels { ... on PlatformChannel { status soldAt } }\n }\n iteration {\n logistics { odometerReading { value unit } }\n item {\n ... on Vehicle {\n displayName\n manufacturer { stringValue }\n modelSeries { stringValue }\n modelYear { intValue }\n registrationNumber { stringValue }\n driveline { fuelTypesString { stringValue } }\n attributes { transmission { formattedValue } }\n }\n }\n }\n`;\n\nexport const ADS_ARGUMENTS = `\n market: $market\n q: $q\n branchGroupId: $branchGroupId\n page: $page\n perPage: $perPage\n sort: $sort\n soldWithinDays: 0\n manufacturer: $manufacturer\n model: $model\n modelSeries: $modelSeries\n fuelType: $fuelType\n gearboxType: $gearboxType\n branchDisplayName: $branchDisplayName\n colorName: $colorName\n environmentClass: $environmentClass\n segment: $segment\n drivetrainType: $drivetrainType\n bodyStyle: $bodyStyle\n engineBaseType: $engineBaseType\n trimLevel: $trimLevel\n inventoryStatus: $inventoryStatus\n branchCity: $branchCity\n certifiedPreOwned: $certifiedPreOwned\n isDemoVersion: $isDemoVersion\n deductibleVat: $deductibleVat\n ecom: $ecom\n leasing: $leasing\n businessLeasing: $businessLeasing\n cashPriceMin: $cashPriceMin\n cashPriceMax: $cashPriceMax\n odometerReadingMin: $odometerReadingMin\n odometerReadingMax: $odometerReadingMax\n modelYearMin: $modelYearMin\n modelYearMax: $modelYearMax\n leasingPriceMin: $leasingPriceMin\n leasingPriceMax: $leasingPriceMax\n companyLeasingPriceMin: $companyLeasingPriceMin\n companyLeasingPriceMax: $companyLeasingPriceMax\n`;\n\nexport const ADS_VARIABLE_DEFINITIONS = `\n $market: [String]\n $q: String\n $branchGroupId: String\n $page: Int\n $perPage: Int\n $sort: AdsSort\n $manufacturer: [String]\n $model: [String]\n $modelSeries: [String]\n $fuelType: [String]\n $gearboxType: [String]\n $branchDisplayName: [String]\n $colorName: [String]\n $environmentClass: [String]\n $segment: [String]\n $drivetrainType: [String]\n $bodyStyle: [String]\n $engineBaseType: [String]\n $trimLevel: [String]\n $inventoryStatus: [String]\n $branchCity: [String]\n $certifiedPreOwned: Boolean\n $isDemoVersion: Boolean\n $deductibleVat: Boolean\n $ecom: Boolean\n $leasing: Boolean\n $businessLeasing: Boolean\n $cashPriceMin: Float\n $cashPriceMax: Float\n $odometerReadingMin: Int\n $odometerReadingMax: Int\n $modelYearMin: Int\n $modelYearMax: Int\n $leasingPriceMin: Float\n $leasingPriceMax: Float\n $companyLeasingPriceMin: Float\n $companyLeasingPriceMax: Float\n`;\n\n/** Alias of the facet-only search for one selected list filter, see buildSearchQuery. */\nexport const multiSelectFacetAlias = (field: string) => `facets_${field}`;\n\n/**\n * One request for the search page: the filtered list with its facets and, for\n * every list filter that has a selection, that facet counted WITHOUT its own\n * filter. The legacy search counted facets that way (\"multi-select\"), so the\n * other makes stay listed with their counts after picking one; the public API\n * counts facets on the filtered result, where only the picked make remains.\n */\nexport const buildSearchQuery = (selectedListFilters: string[]) => {\n const facetSearches = selectedListFilters\n .map((field) => {\n const args = ADS_ARGUMENTS.replace(` ${field}: $${field}\\n`, '').replace(\n 'perPage: $perPage',\n 'perPage: 0'\n );\n return `\n ${multiSelectFacetAlias(field)}: ads(${args}) @include(if: $withFacets) {\n facets { field counts { value count } }\n }`;\n })\n .join('');\n\n return `\nquery Search(\n ${ADS_VARIABLE_DEFINITIONS}\n $withFacets: Boolean!\n) {\n search {\n ads(${ADS_ARGUMENTS}) {\n found\n page\n perPage\n hits { ${SEARCH_HIT_FIELDS} }\n facets @include(if: $withFacets) { field counts { value count } }\n }${facetSearches}\n }\n}\n`;\n};\n\nexport const SEARCH_QUERY = buildSearchQuery([]);\n\n/** Unfiltered facets and histograms: the filter panel's full value lists and slider domains. */\nexport const FACETS_QUERY = `\nquery SearchFacets($market: [String], $branchGroupId: String) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, perPage: 0, soldWithinDays: 0) {\n found\n facets { field counts { value count } }\n histograms {\n price { value count }\n odometerReading { value count }\n leasingPrice { value count }\n businessLeasingPrice { value count }\n }\n }\n }\n}\n`;\n\nexport const SUGGEST_QUERY = `\nquery Suggest($market: [String], $branchGroupId: String, $q: String!, $limit: Int) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, q: $q, perPage: 0, soldWithinDays: 0) {\n suggest(limit: $limit) { label count dimension filters { field value } }\n }\n }\n}\n`;\n", "// Typeahead for the search field: `search.ads(q).suggest`. Each suggestion\n// carries the filters it stands for, applied as URL params when it is picked.\n\nimport { gqlQuery } from './client';\nimport { PublicApiSettings } from './config';\nimport { SUGGEST_QUERY } from './queries';\nimport { SuggestData, Suggestion } from './types';\n\nexport const fetchSuggestions = async (\n settings: PublicApiSettings,\n q: string,\n limit = 6\n): Promise<Suggestion[]> => {\n const data = await gqlQuery<SuggestData>(settings.api, SUGGEST_QUERY, {\n market: [settings.market],\n branchGroupId: settings.branchGroupId,\n q,\n limit,\n });\n return data.search?.ads?.suggest || [];\n};\n\n/**\n * The suggestion's filters as URL params. Built with URLSearchParams so values\n * with `+` or `&` (Bensin+El) survive the round trip.\n */\nexport const suggestionParams = (suggestion: Suggestion) =>\n new URLSearchParams(suggestion.filters.map((f) => [f.field, f.value]));\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconCancel } from '../Icon';\nimport { Clear, Query, Wrapper } from './wrapper';\n\ninterface Props {\n children: string;\n onClear?: () => void;\n clearTitle?: string;\n}\n\nconst SearchTerm = ({ children, onClear, clearTitle }: Props) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n <Query>{children}</Query>\n {onClear && (\n <Clear onClick={onClear} title={clearTitle ? clearTitle : t('search.freeText')}>\n <IconCancel block />\n </Clear>\n )}\n </Wrapper>\n );\n};\n\nexport default SearchTerm;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Query = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 2.25rem;\n min-width: 0;\n overflow-wrap: break-word;\n hyphens: auto;\n\n &:before,\n &:after {\n content: '\"';\n }\n`;\n\nexport const Clear = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(2)};\n height: ${size(2)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.accentDark};\n margin-left: ${size(1)};\n font-size: ${size(1)};\n transform-origin: 50% 50%;\n transition: transform 150ms ease;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-1)};\n bottom: ${size(-1)};\n left: ${size(-1)};\n right: ${size(-1)};\n border-radius: 50%;\n }\n\n &:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::after {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n", "import React from 'react';\nimport { IconCheck, IconExclamationCircle, IconExclamationTriangle, IconInfo } from '../Icon';\nimport { Content, Heading, Icon, Message, Wrapper } from './wrapper';\n\ninterface Props {\n severity?: string;\n icon?: boolean;\n heading?: string;\n children?: React.ReactNode;\n}\n\nconst Snackbar = ({ severity, icon, heading, children }: Props) => {\n let iconSelector = <IconInfo block />;\n if (severity === 'error') {\n iconSelector = <IconExclamationCircle block />;\n } else if (severity === 'warning') {\n iconSelector = <IconExclamationTriangle block />;\n } else if (severity === 'success') {\n iconSelector = <IconCheck block />;\n }\n\n return (\n <Wrapper severity={severity}>\n {icon && <Icon>{iconSelector}</Icon>}\n <Content>\n {heading && <Heading>{heading}</Heading>}\n <Message>{children}</Message>\n </Content>\n </Wrapper>\n );\n};\n\nexport default Snackbar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport theme from '../../layout/theme';\n\nconst getSnackbarBg = (severity: string | undefined): string => {\n let bg = theme.color.accent;\n\n if (severity === 'error') {\n bg = theme.color.ui.negativeLight;\n } else if (severity === 'warning') {\n bg = theme.color.ui.neutralLight;\n } else if (severity === 'info') {\n bg = theme.color.ui.infoLight;\n } else if (severity === 'success') {\n bg = theme.color.ui.positiveLight;\n }\n\n return bg;\n};\n\ninterface Wrapper {\n severity?: string;\n}\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'alert',\n}))<Wrapper>`\n display: flex;\n align-items: center;\n padding: ${size(1.5)} ${size(2)};\n background-color: ${(props): string => getSnackbarBg(props.severity)};\n color: ${(props): string => props.theme.color.textDark};\n border-radius: 3px;\n`;\n\nexport const Icon = styled.div`\n flex-shrink: 0;\n padding-right: ${size(2)};\n font-size: ${size(3)};\n\n > svg {\n display: block;\n }\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n font-size: 1rem;\n`;\n\nexport const Heading = styled.div`\n font-weight: 700;\n`;\n\nexport const Message = styled.div`\n > * {\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n`;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ConversionOption, defaultConversionOptions } from '../../@types/conversion';\nimport Blockquote from '../../components/Blockquote';\nimport { ButtonContent, ButtonInlineLight, ButtonPrimary } from '../../components/Button';\nimport Container from '../../components/Container';\nimport Content from '../../components/Content';\nimport ExtendContent from '../../components/ExtendContent';\nimport FinancialOptions from '../../components/FinancialOptions';\nimport Gallery from '../../components/Gallery';\nimport { H1, H2 } from '../../components/Heading';\nimport { IconChevronLeft } from '../../components/Icon';\nimport InsuranceOptions from '../../components/InsuranceOptions';\nimport LogoBox from '../../components/LogoBox';\nimport { Page, PageSection } from '../../components/Page';\nimport { PortalElement, PortalNamespace } from '../../components/Portal';\nimport PriceTable from '../../components/PriceTable';\nimport {\n ProductPage,\n ProductPageAside,\n ProductPageAsideSection,\n ProductPageMain,\n ProductPageMainSection,\n} from '../../components/ProductPage';\nimport { Repeat, RepeatSmall } from '../../components/Repeat';\nimport UspList, { ItemProps } from '../../components/UspList';\nimport { UtilityFontSizeSmall } from '../../components/Utility';\nimport { Ad } from '../../Gql/ad/types';\nimport useAd from '../../Gql/ad/useAd';\nimport {\n adEvent,\n contactPerson,\n discount,\n ecom,\n galleryMedia,\n leasingOffers,\n manufacturerPackage,\n packageOffers,\n price,\n publishedAt,\n} from '../../Gql/ad/view';\nimport { AdContext } from '../../State/Ad/AdContext';\nimport useRouter from '../../State/Router/useRouter';\nimport useSettings from '../../State/Settings/useSettings';\nimport { dateTimeFormat, numberSeparator } from '../../utils/formats';\nimport { i18nScoped } from '../../utils/I18n';\nimport { markdownToHtml } from '../../utils/markdown';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport AccessoriesSection from './Accessories';\nimport Branch from './Branch';\nimport CheckList from './CheckList';\nimport DemoCarModal from './DemoCarModal';\nimport Documents from './Documents';\nimport ManufacturerPackageOption from './ManufacturerPackagesOption';\nimport PackageOptions from './PackageOptions';\nimport Page404 from './Page404';\nimport PageLoading from './PageLoading';\nimport Property from './Property';\nimport Related from './Related';\nimport useEcom from './useEcom';\n\nexport interface WaykeSearchItemProps {\n /** The id of the vehicle. Older ids are resolved, and the url is updated to the new one. */\n id: string;\n /** Keeps the scroll position when the vehicle page opens. By default it scrolls to the top. */\n disableResetScrollOnInit?: boolean;\n /** Url to an image for vehicles without images. */\n placeholderImage?: string;\n /** Sets the page title to the vehicle. */\n modifyDocumentTitleItem?: boolean;\n /** Shows the branch name on related vehicles and where the vehicle is located. */\n displayBranchName?: boolean;\n /** The buttons on the vehicle page. */\n conversionOptions?: ConversionOption[];\n}\n\ntype ItemViewProps = Omit<WaykeSearchItemProps, 'id' | 'disableResetScrollOnInit'> & { ad: Ad };\n\nconst ItemView = ({\n ad,\n placeholderImage,\n modifyDocumentTitleItem,\n displayBranchName,\n conversionOptions,\n}: ItemViewProps) => {\n const { ecom: ecomSettings, marketCode } = useSettings();\n const { searchHref } = useRouter();\n const ecomContext = useEcom(ad, ecomSettings, marketCode);\n // The buy button below the gallery follows the same conversion options as the sidebar.\n const ecomOption = (conversionOptions ?? defaultConversionOptions).find(\n (option) => option.type === 'ecom'\n );\n const ecommerce = ecom(ad);\n\n const [demoCarModal, setDemoCarModal] = useState(false);\n const onToggleDemoCarModal = useCallback(() => setDemoCarModal(!demoCarModal), [demoCarModal]);\n\n const item = ad.iteration?.item;\n const title = item?.displayName || ad.iteration?.displayName || ad.salesDescription?.title || '';\n const shortDescription = ad.salesDescription?.title;\n const description = ad.salesDescription?.enriched;\n const odometer = ad.iteration?.logistics?.odometerReading;\n const fuelType = item?.driveline?.fuelTypesString?.stringValue;\n const gearboxType = item?.attributes?.transmission?.formattedValue;\n const loans = ad.iteration?.commerce.paymentDetailsList || [];\n const leasing = leasingOffers(ad);\n const insuranceProvider = ad.iteration?.commerce.insuranceProvider;\n const manufacturerOffer = manufacturerPackage(ad);\n const contact = contactPerson(ad);\n const published = publishedAt(ad);\n const media = useMemo(() => galleryMedia(ad.media.items), [ad]);\n\n useEffect(() => {\n if (modifyDocumentTitleItem) {\n document.title = [item?.registrationNumber?.stringValue, title, shortDescription]\n .filter(Boolean)\n .join(' | ');\n }\n }, [ad]);\n\n const options = useMemo(() => (ad.equipment?.items || []).map((e) => ({ title: e.name })), [ad]);\n\n const onShowMoreOptionsClick = useCallback(\n () => PubSub.publish('OptionsClick', adEvent(ad)),\n [ad]\n );\n const startEcom = useCallback(() => ecomContext.current?.start(), []);\n\n const uspList: ItemProps[] = [];\n if (item?.modelYear?.intValue) uspList.push({ title: item.modelYear.intValue });\n if (ad.packaging.isDemoVersion) {\n uspList.push({ title: i18nScoped.t('item.demoCar'), onClick: onToggleDemoCarModal });\n }\n if (odometer) {\n uspList.push({\n title: `${numberSeparator(odometer.value)} ${i18nScoped.t(\n `odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`\n )}`,\n });\n }\n if (gearboxType) uspList.push({ title: gearboxType });\n if (fuelType) uspList.push({ title: fuelType });\n\n return (\n <AdContext.Provider value={ad}>\n <Page>\n <PageSection large>\n <Container>\n <ProductPage>\n <ProductPageAside>\n <ProductPageAsideSection mobileOrder={1}>\n {searchHref && (\n <Repeat>\n <UtilityFontSizeSmall>\n <ButtonInlineLight\n as=\"a\"\n href={searchHref}\n title={i18nScoped.t('navigation.backToSearch')}\n >\n <ButtonContent>\n <IconChevronLeft block />\n </ButtonContent>\n <ButtonContent>{i18nScoped.t('navigation.backToSearch')}</ButtonContent>\n </ButtonInlineLight>\n </UtilityFontSizeSmall>\n </Repeat>\n )}\n {manufacturerOffer?.image && (\n <Repeat>\n <LogoBox\n logo={manufacturerOffer.image}\n alt={item?.manufacturer?.stringValue || manufacturerOffer.title}\n />\n </Repeat>\n )}\n <Repeat>\n <RepeatSmall>\n <H1 noMargin>{title}</H1>\n </RepeatSmall>\n {shortDescription && (\n <RepeatSmall>\n <div>{shortDescription}</div>\n </RepeatSmall>\n )}\n <RepeatSmall>\n <UspList small items={uspList} />\n </RepeatSmall>\n </Repeat>\n </ProductPageAsideSection>\n\n {/* No price at all rather than \"0 kr\", as on wayke.se: leasing-only cars have none. */}\n {price(ad) > 0 && (\n <ProductPageAsideSection mobileOrder={2}>\n <PriceTable price={price(ad)} discount={discount(ad)} />\n </ProductPageAsideSection>\n )}\n\n {(loans.length > 0 || leasing.length > 0 || insuranceProvider) && (\n <ProductPageAsideSection mobileOrder={4}>\n {(loans.length > 0 || leasing.length > 0) && (\n <FinancialOptions loans={loans} leasing={leasing} />\n )}\n {insuranceProvider && <InsuranceOptions provider={insuranceProvider} />}\n </ProductPageAsideSection>\n )}\n\n <ProductPageAsideSection mobileOrder={5}>\n <CheckList\n title={title}\n conversionOptions={conversionOptions}\n toggleEcomModal={ecomSettings ? startEcom : undefined}\n />\n </ProductPageAsideSection>\n </ProductPageAside>\n <ProductPageMain>\n <ProductPageAsideSection mobileOrder={3}>\n <Gallery media={media} placeholderImage={placeholderImage} />\n </ProductPageAsideSection>\n\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{i18nScoped.t('item.carData')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{i18nScoped.t('item.carDataDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <Property />\n </Repeat>\n </ProductPageMainSection>\n {description && (\n <ProductPageMainSection>\n <Blockquote\n author={contact?.name || null}\n date={\n published\n ? dateTimeFormat.format(published, dateTimeFormat.DayMonth, marketCode)\n : undefined\n }\n avatar={contact?.avatar}\n >\n <div dangerouslySetInnerHTML={{ __html: markdownToHtml(description) }} />\n </Blockquote>\n </ProductPageMainSection>\n )}\n\n {options.length > 0 && (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{i18nScoped.t('item.equipment')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{i18nScoped.t('item.equipmentDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <ExtendContent\n actionTitle={i18nScoped.t('common.showMore')}\n onClick={onShowMoreOptionsClick}\n >\n <UspList items={options} />\n </ExtendContent>\n </Repeat>\n </ProductPageMainSection>\n )}\n\n <Documents documents={ad.iteration?.documents.public || []} />\n\n <AccessoriesSection accessories={ad.accessories} />\n\n <ProductPageMainSection>\n <Branch branch={ad.branch} displayBranchName={displayBranchName} />\n {ecomSettings && ecomOption && ecommerce.enabled && (\n <Repeat>\n <ButtonPrimary\n disabled={ecommerce.reserved}\n title={ecomOption.name || i18nScoped.t('item.actions.buyOnline')}\n onClick={startEcom}\n >\n {ecomOption.name || i18nScoped.t('item.actions.buyOnline')}\n </ButtonPrimary>\n </Repeat>\n )}\n </ProductPageMainSection>\n\n <PackageOptions packageOptions={packageOffers(ad)} />\n <ManufacturerPackageOption packageOption={manufacturerOffer} />\n </ProductPageMain>\n </ProductPage>\n </Container>\n </PageSection>\n <Related\n adId={ad.id}\n manufacturer={item?.manufacturer?.stringValue}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n </Page>\n <PortalElement id={PortalNamespace.DefaultPortal} />\n {demoCarModal && <DemoCarModal onClose={onToggleDemoCarModal} />}\n </AdContext.Provider>\n );\n};\n\n/** The vehicle page. */\nconst WaykeSearchItem = ({ id, disableResetScrollOnInit, ...props }: WaykeSearchItemProps) => {\n const { publicApi } = useSettings();\n const { loading, ad } = useAd(id, publicApi);\n\n useEffect(() => {\n if (!disableResetScrollOnInit) {\n window.scrollTo(0, 0);\n }\n PubSub.publish('View', { type: 'item', id });\n }, []);\n\n if (loading) {\n return <PageLoading />;\n }\n\n if (!ad) {\n return <Page404 />;\n }\n\n return <ItemView ad={ad} {...props} />;\n};\n\nexport default WaykeSearchItem;\n", "/**\n * Conversion options control which call-to-action buttons are rendered on the item page,\n * in which order, and how they look. Mirrors the \"conversion_options\" concept used on\n * Wayke dealer websites, adapted to this package.\n */\nexport type ConversionOptionType =\n /** \"Buy online\" - only rendered when the vehicle has e-commerce enabled. */\n | 'ecom'\n /** Opens the \"Send message\" lead form. The lead is registered in Wayke Dealer. */\n | 'leadMessage'\n /** Opens the \"Get a callback\" lead form. The lead is registered in Wayke Dealer. */\n | 'leadCallMe'\n /** Reveal the dealer email address. Opens the mail client with a pre-populated subject. */\n | 'email'\n /** Reveal the dealer phone number. */\n | 'phone';\n\nexport interface ConversionOptionVehicle {\n id: string;\n title?: string | null;\n registrationNumber?: string | null;\n manufacturer?: string | null;\n modelSeries?: string | null;\n}\n\nexport type ConversionOptionText = string | ((vehicle: ConversionOptionVehicle) => string);\n\ninterface ConversionOptionBase {\n type: ConversionOptionType;\n /** Custom button label. Defaults to the translated label for the type. */\n name?: string;\n /** Render as primary button. Defaults to true for ecom/leadMessage/leadCallMe, false for email/phone. */\n primary?: boolean;\n}\n\nexport interface ConversionOptionEmail extends ConversionOptionBase {\n type: 'email';\n /** Mail subject. Defaults to \"<hostname> \u2013 I'm interested in <reg no>, <make> <model>\". */\n subject?: ConversionOptionText;\n /** Mail body. Defaults to a link to the current page. Pass `false` to omit the body. */\n body?: ConversionOptionText | false;\n}\n\nexport interface ConversionOptionOther extends ConversionOptionBase {\n type: Exclude<ConversionOptionType, 'email'>;\n}\n\nexport type ConversionOption = ConversionOptionEmail | ConversionOptionOther;\n\n/** Matches the behaviour before conversion options were introduced. */\nexport const defaultConversionOptions: ConversionOption[] = [\n { type: 'ecom' },\n { type: 'email' },\n { type: 'phone' },\n];\n", "import React from 'react';\nimport Avatar from '../Avatar';\nimport { Author, AvatarWrapper, Date, Info, Name, Quote, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n author?: string | null;\n avatar?: string;\n date?: string;\n}\n\nconst Blockquote = ({ children, author, avatar, date }: Props) => (\n <Wrapper>\n <Quote>{children}</Quote>\n {author && (\n <Author>\n {avatar && (\n <AvatarWrapper>\n <Avatar image={avatar} alt={`${author} avatar`} />\n </AvatarWrapper>\n )}\n <Info>\n <Name>{author}</Name>\n {date && <Date>{date}</Date>}\n </Info>\n </Author>\n )}\n </Wrapper>\n);\n\nexport default Blockquote;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n image: string;\n alt?: string;\n}\n\nconst Avatar = ({ image, alt }: Props) => <Wrapper image={image} aria-label={alt} />;\n\nexport default Avatar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface Wrapper {\n image: string;\n}\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'image',\n}))<Wrapper>`\n display: block;\n width: ${size(5)};\n height: ${size(5)};\n border-radius: 50%;\n background-image: ${(props): string => `url(${props.image})`};\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n background-color: ${(props) => props.theme.color.accent};\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.blockquote`\n display: flex;\n flex-direction: column;\n max-width: 600px;\n margin: 0 auto;\n\n ${(props) => props.theme.breakpoint.Sm} {\n align-items: center;\n }\n`;\n\nexport const Quote = styled.div`\n > * {\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n`;\n\nexport const Author = styled.footer`\n display: inline-flex;\n align-items: center;\n margin-top: ${size(3)};\n\n ${(props) => props.theme.breakpoint.Md} {\n margin-top: ${size(4)};\n }\n`;\n\nexport const AvatarWrapper = styled.div`\n flex-shrink: 0;\n padding-right: ${size(1.5)};\n`;\n\nexport const Info = styled.div`\n flex: 1 1 auto;\n font-size: 0.875rem;\n`;\n\nexport const Name = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n\nexport const Date = styled.div``;\n", "import React from 'react';\nimport { markdownToHtml, sanitizeHtml } from '../../utils/markdown';\nimport { Wrapper } from './wrapper';\n\ntype Props = {\n small?: boolean;\n children?: React.ReactNode;\n /** Dealer markdown, rendered and sanitized. */\n markdown?: string | null;\n /** Dealer HTML, sanitized. */\n html?: string | null;\n};\n\nconst Content = ({ children, small, markdown, html }: Props) => {\n if (markdown != null || html != null) {\n const __html = markdown != null ? markdownToHtml(markdown) : sanitizeHtml(html ?? '');\n return <Wrapper small={small} dangerouslySetInnerHTML={{ __html }} />;\n }\n return <Wrapper small={small}>{children}</Wrapper>;\n};\n\nexport default Content;\n", "import DOMPurify from 'dompurify';\nimport { Marked } from 'marked';\n\n/**\n * Dealer texts (descriptions, packages, accessories, leasing and insurance) are\n * markdown with raw HTML in it, shown on the dealer's own site. marked passes raw\n * HTML through, so every string that becomes HTML goes through sanitizeHtml.\n * Allowlist and marked options follow web-ui-v2's src/utils/markdown.ts (security\n * audit F03), so a text renders as on wayke.se.\n */\n\nconst escapeAttribute = (value: string) =>\n value.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n// A single newline is a <br>; bare urls, ~~text~~ and | tables | stay text, as on wayke.se.\nconst markdown = new Marked({ gfm: true, breaks: true });\nmarkdown.use({\n tokenizer: {\n url: () => undefined,\n del: () => undefined,\n table: () => undefined,\n },\n renderer: {\n link(token) {\n const title = token.title ? ` title=\"${escapeAttribute(token.title)}\"` : '';\n const text = this.parser.parseInline(token.tokens);\n return `<a href=\"${escapeAttribute(token.href)}\"${title} rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\n },\n },\n});\n\nconst ALLOWED_TAGS = [\n 'p',\n 'br',\n 'hr',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 's',\n 'del',\n 'sup',\n 'sub',\n 'a',\n 'ul',\n 'ol',\n 'li',\n 'blockquote',\n 'code',\n 'pre',\n 'img',\n 'table',\n 'thead',\n 'tbody',\n 'tr',\n 'th',\n 'td',\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'title',\n 'rel',\n 'target',\n 'src',\n 'alt',\n 'width',\n 'height',\n 'start',\n 'colspan',\n 'rowspan',\n];\n\n// http(s), mailto and tel, and protocol-relative or relative urls; no javascript: or data:.\nconst ALLOWED_URI_REGEXP = /^(?:(?:https?|mailto|tel):|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))/i;\n\n/** Only the allowlisted tags and attributes survive; event handlers and style never do. */\nexport const sanitizeHtml = (html: string): string =>\n // Without a DOM (server rendering) DOMPurify cannot sanitize, so nothing is rendered.\n DOMPurify.isSupported\n ? DOMPurify.sanitize(html, { ALLOWED_TAGS, ALLOWED_ATTR, ALLOWED_URI_REGEXP })\n : '';\n\nexport const markdownToHtml = (text: string | null | undefined): string =>\n sanitizeHtml(markdown.parse(text ?? '', { async: false }));\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n small?: boolean;\n};\n\nexport const Wrapper = styled.div<WrapperProps>`\n font-size: 1rem;\n line-height: 1.5;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: ${size(4)};\n margin-bottom: ${size(1)};\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & + p,\n & + table {\n margin-top: ${size(1)};\n }\n }\n\n p {\n margin: ${size(2)} 0;\n\n &:first-child {\n margin-top: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n img {\n display: block;\n width: 100%;\n }\n\n ${({ small }) =>\n small &&\n css`\n font-size: 0.875rem;\n `}\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Action, Extend, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n actionTitle: string;\n onClick?: () => void;\n}\n\nconst ExtendContent = ({ children, actionTitle, onClick }: Props) => {\n const [extend, setExtend] = useState(false);\n const onExtend = useCallback(() => {\n setExtend(true);\n if (onClick) {\n onClick();\n }\n }, []);\n\n const onRef = (ref: HTMLDivElement | null) => {\n const refHeight = ref?.clientHeight || 0;\n\n if (refHeight < 207) {\n setExtend(true);\n }\n };\n\n return (\n <Wrapper ref={onRef}>\n <Extend extended={extend}>{children}</Extend>\n {!extend && (\n <Action>\n <ButtonClear onClick={onExtend} title={actionTitle}>\n <ButtonContent>{actionTitle}</ButtonContent>\n </ButtonClear>\n </Action>\n )}\n </Wrapper>\n );\n};\n\nexport default ExtendContent;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div``;\n\ntype ExtendProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n extended?: boolean;\n};\n\nexport const Extend = styled.div<ExtendProps>`\n position: relative;\n max-height: 175px;\n overflow: hidden;\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: ${size(6)};\n background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n }\n\n ${({ extended }) =>\n extended &&\n css`\n max-height: none;\n\n &::after {\n content: none;\n }\n `}\n`;\n\nexport const Action = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: ${size(2)};\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport { LeasingOffer } from '../../Gql/ad/view';\nimport useSettings from '../../State/Settings/useSettings';\nimport { CreditorDisclaimer } from '../CreditorDisclaimer';\nimport { VisualHeading } from '../Heading';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport Leasing from './leasing';\nimport Loan from './loan';\n\ninterface FinancialOptionsProps {\n loans: PaymentResponse[];\n leasing: LeasingOffer[];\n}\n\nconst FinancialOptions = ({ loans, leasing }: FinancialOptionsProps) => {\n const { t } = useTranslation();\n const { marketCode } = useSettings();\n\n return (\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{t('item.financialOptions.otherFinancialOptions')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n {leasing.map((offer) => (\n <Leasing key={offer.business ? 'business' : 'private'} offer={offer} />\n ))}\n {loans.map((loan) => (\n <Loan key={loan.financialOptionId} loan={loan} />\n ))}\n </RepeatTiny>\n {marketCode === 'SE' && loans.length > 0 && (\n <RepeatTiny>\n <CreditorDisclaimer />\n </RepeatTiny>\n )}\n </Repeat>\n );\n};\n\nexport default FinancialOptions;\n", "import React from 'react';\nimport { Link } from '../Link';\nimport { Body, Heading, Icon, Wrapper } from './wrapper';\n\nexport const CreditorDisclaimer = () => (\n <Wrapper role=\"status\" aria-live=\"polite\">\n <Icon aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"59\"\n height=\"53\"\n viewBox=\"0 0 59 53\"\n fill=\"none\"\n >\n <title>Varning</title>\n <path\n d=\"M29.5255 20.3569V30.5712M29.5255 40.7855H29.551M54.3173 43.3391L33.9335 7.58906C33.4891 6.80308 32.8445 6.14932 32.0657 5.69448C31.2868 5.23964 30.4015 5 29.5001 5C28.5986 5 27.7133 5.23964 26.9344 5.69448C26.1556 6.14932 25.5111 6.80308 25.0666 7.58906L4.68285 43.3391C4.23359 44.1188 3.99802 45.0038 4.00001 45.9042C4.002 46.8046 4.24148 47.6884 4.69417 48.4662C5.14687 49.244 5.79668 49.8879 6.57776 50.3329C7.35883 50.7778 8.2434 51.0079 9.14179 50.9998H49.9093C50.8034 50.9989 51.6815 50.7622 52.4554 50.3136C53.2294 49.865 53.8719 49.2202 54.3186 48.444C54.7652 47.6677 55.0002 46.7874 55 45.8913C54.9998 44.9953 54.7643 44.1151 54.3173 43.3391Z\"\n stroke=\"#A43333\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Icon>\n <Body>\n <Heading>Att l\u00E5na kostar pengar!</Heading>\n <p>\n Om du inte kan betala tillbaka skulden i tid riskerar du en betalningsanm\u00E4rkning. Det kan\n leda till sv\u00E5righeter att f\u00E5 hyra bostad, teckna abonnemang och f\u00E5 nya l\u00E5n. F\u00F6r st\u00F6d, v\u00E4nd\n dig till budget- och skuldr\u00E5dgivningen i din kommun. Kontaktuppgifter finns p\u00E5{' '}\n <Link\n href=\"https://www.konsumentverket.se/\"\n title=\"Konsumentverket\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n konsumentverket.se\n </Link>\n .\n </p>\n </Body>\n </Wrapper>\n);\n", "import styled, { css } from 'styled-components';\n\ninterface LinkProps {\n $hoverGhost?: boolean;\n}\n\nexport const Link = styled.a.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))<LinkProps>`\n text-decoration: none;\n cursor: pointer;\n text-decoration: underline;\n\n &:not(:hover) {\n color: ${(props) => props.theme.color.textDark};\n }\n\n &:hover {\n text-decoration: underline;\n }\n\n ${({ $hoverGhost }) =>\n $hoverGhost &&\n css`\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n `}\n`;\n", "import styled from 'styled-components';\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: ${size(2)};\n padding: ${size(2)};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n font-size: 0.875rem;\n line-height: 1.3;\n`;\n\nexport const Icon = styled.div`\n flex-shrink: 0;\n\n svg {\n display: block;\n width: auto;\n height: 3lh;\n }\n`;\n\nexport const Body = styled.div`\n flex: 1 1 20ch;\n display: flex;\n flex-direction: column;\n gap: ${size(0.25)};\n\n p {\n margin: 0;\n }\n`;\n\nexport const Heading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LeasingOffer } from '../../Gql/ad/view';\nimport { numberSeparator } from '../../utils/formats';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport DataList from '../DataList';\nimport Modal from '../Modal';\nimport { Image, ModalFoldout, ModalFoldoutBody } from '../Modal/wrapper';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport { UtilityTextPrimary } from '../Utility';\n\ninterface LeasingProps {\n offer: LeasingOffer;\n}\n\nconst Leasing = ({ offer }: LeasingProps) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => setModal(!modal), [modal]);\n\n const { image, description, monthlyCost, months, mileagePerYear, business, name } = offer;\n\n const title = business\n ? t('item.financialOptions.businessLease')\n : t('item.financialOptions.privateLease');\n\n return (\n <>\n {modal && (\n <Modal title={title} onClose={toggleModal}>\n {image && <Image src={image} alt={title} />}\n {description && <Content html={description} />}\n <ModalFoldout>\n <ModalFoldoutBody>\n <DataList\n items={[\n {\n label: t('item.financialOptions.monthlyCost'),\n value: `${numberSeparator(monthlyCost || 0)} ${t('currency.monthly')}`,\n },\n {\n label: t('item.financialOptions.bindingTime'),\n value: `${months} m\u00E5nader`,\n },\n {\n label: t('item.financialOptions.annualMileage'),\n value: `${numberSeparator(mileagePerYear || 0)} ${t(\n 'item.financialOptions.mileagePerYear'\n )}`,\n },\n ]}\n />\n </ModalFoldoutBody>\n </ModalFoldout>\n </Modal>\n )}\n <OptionBox>\n <>\n <OptionBoxHeading>{`ca ${numberSeparator(monthlyCost)} ${t(\n 'currency.monthly'\n )}`}</OptionBoxHeading>\n </>\n <OptionBoxContent>\n <p>\n {title}{' '}\n {mileagePerYear && months && (\n <>\n <UtilityTextPrimary>\n {numberSeparator(mileagePerYear)} {t('item.financialOptions.mileagePerYear')}\n </UtilityTextPrimary>{' '}\n i{' '}\n <UtilityTextPrimary>\n {months} {t('item.financialOptions.months')}\n </UtilityTextPrimary>\n .{' '}\n </>\n )}\n </p>\n {name && (\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.readMore')}</ButtonInline>\n </p>\n )}\n </OptionBoxContent>\n </OptionBox>\n </>\n );\n};\n\nexport default Leasing;\n", "import React from 'react';\n\nimport { Item, Label, List, Value } from './wrapper';\n\ninterface ItemProps {\n label: string;\n value: string;\n}\n\ninterface Props {\n items: ItemProps[];\n}\n\nconst DataList = ({ items }: Props) => (\n <List>\n {items.map((item) => (\n <Item key={item.label}>\n <Label>{item.label}</Label>\n <Value>{item.value}</Value>\n </Item>\n ))}\n </List>\n);\n\nexport default DataList;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n display: flex;\n align-items: flex-start;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Label = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Value = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n flex-shrink: 0;\n padding-left: ${size(2)};\n`;\n", "import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { H1 } from '../Heading';\nimport { IconCancel } from '../Icon';\nimport { Portal, PortalNamespace } from '../Portal';\nimport {\n Body,\n Close,\n CloseBtn,\n Content,\n Dialog,\n Header,\n Heading,\n UiBlock,\n Wrapper,\n} from './wrapper';\n\ninterface ModalProps {\n id?: string | null;\n title: string | null;\n children: React.ReactNode;\n onClose: (e: React.MouseEvent<HTMLDivElement | HTMLButtonElement, MouseEvent>) => void;\n}\n\nconst Modal = ({ id, title, onClose, children }: ModalProps) => {\n const { t } = useTranslation();\n return (\n <Portal id={id || PortalNamespace.DefaultPortal}>\n <Wrapper onClick={(e) => e.stopPropagation()}>\n <UiBlock onClick={onClose} title={t('other.closeModal') || ''} />\n <Dialog>\n <Content>\n <Header>\n <Heading>\n <H1 noMargin>{title}</H1>\n </Heading>\n <Close>\n <CloseBtn onClick={onClose} title={t('other.closeModal') || ''}>\n <IconCancel block />\n </CloseBtn>\n </Close>\n </Header>\n <Body>{children}</Body>\n </Content>\n </Dialog>\n </Wrapper>\n </Portal>\n );\n};\n\nexport default Modal;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { fadeIn, noTransform } from '../../layout/keyframes';\n\nimport { ButtonReset } from '../Button';\nimport { H1 } from '../Heading';\n\nexport const Wrapper = styled.div.attrs(() => ({\n role: 'dialog',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n width: 100%;\n white-space: normal;\n text-align: left;\n z-index: 90;\n display: flex;\n align-items: center;\n justify-content: center;\n\n ${(props) => props.theme.breakpoint.Sm} {\n padding: ${size(2)};\n }\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n 'aria-hidden': 'true',\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.35);\n z-index: -1;\n\n ${(props) => props.theme.breakpoint.LtMd} {\n animation: ${fadeIn} 300ms ease forwards;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n animation: ${fadeIn} 400ms ease forwards;\n }\n`;\n\nexport const Dialog = styled.article.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n display: flex;\n flex-direction: column;\n background-color: ${(props) => props.theme.color.bg};\n z-index: 1;\n width: 100%;\n max-width: 680px;\n max-height: 100%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n align-self: flex-end;\n transform: translateY(100%);\n animation: ${noTransform} 300ms ease forwards;\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n transform: translateY(${size(2)});\n animation:\n ${fadeIn} 400ms ease,\n ${noTransform} 400ms ease forwards;\n }\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const Header = styled.header`\n display: flex;\n align-items: center;\n min-height: 60px;\n padding: ${size(3)};\n padding-bottom: 0;\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n\n ${H1} {\n font-size: 1.5rem;\n }\n`;\n\nexport const Close = styled.div`\n flex-shrink: 0;\n margin: ${size(-2)};\n padding-left: ${size(3)};\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n display: block;\n padding: ${size(2)};\n`;\n\nexport const Body = styled.div`\n padding: ${size(3)};\n`;\n\nexport const Image = styled.img`\n display: block;\n width: calc(100% + ${size(6)});\n margin-left: ${size(-3)};\n margin-bottom: ${size(3)};\n`;\n\nexport const ModalFoldout = styled.div`\n background-color: ${(props) => props.theme.color.accent};\n margin-top: ${size(3)};\n padding: ${size(2)};\n border-radius: 3px;\n`;\n\nexport const ModalFoldoutBody = styled.div``;\n", "import * as React from 'react';\n\nimport { Content, Logo, LogoImg, Wrapper } from './wrapper';\n\ninterface IOptionBox {\n logo?: string;\n logo2x?: string;\n logoAlt?: string;\n children: React.ReactNode;\n}\n\nconst OptionBox = ({ logo, logo2x, logoAlt, children }: IOptionBox) => (\n <Wrapper>\n {logo && (\n <Logo>\n <LogoImg src={logo} srcSet={logo2x} alt={logoAlt} />\n </Logo>\n )}\n <Content>{children}</Content>\n </Wrapper>\n);\n\nexport default OptionBox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n padding: ${size(1)};\n border: 1px solid ${(props) => props.theme.color.border};\n border-radius: 3px;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Logo = styled.div`\n position: relative;\n flex-shrink: 0;\n margin-right: ${size(1)};\n width: ${size(9.5)};\n height: ${size(6)};\n`;\n\nexport const LogoImg = styled.img`\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: auto;\n bottom: 0;\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n`;\n\nexport const Content = styled.div`\n flex: 1 1 auto;\n text-align: right;\n line-height: 1.4;\n`;\n\nexport const OptionBoxHeading = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1rem;\n`;\n\nexport const OptionBoxContent = styled.div`\n margin-top: ${size(0.5)};\n font-size: 0.875rem;\n\n p {\n margin: 0;\n }\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport useLoanCalculation from '../../Gql/ad/useLoanCalculation';\nimport { adEvent, num } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport LoanModal from './LoanModal';\n\ninterface LoanProps {\n loan: PaymentResponse;\n}\n\nconst Loan = ({ loan }: LoanProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi } = useSettings();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'FinanceClose' : 'FinanceOpen', adEvent(ad));\n }, [modal, ad]);\n\n // The list gives the defaults; the calculation gives the monthly cost for them.\n const { payment } = useLoanCalculation(publicApi, ad.id, {\n financialOptionId: loan.financialOptionId,\n duration: num(loan.duration?.current),\n downPayment: num(loan.downPayment?.current),\n residual: num(loan.residual?.current),\n });\n\n const interest = num(payment?.interest);\n const duration = num(payment?.duration?.current);\n const monthlyCost = num(payment?.monthlyCost);\n const loanAmount = num(loan.loanAmount);\n const logo = loan.imageUrl || undefined;\n\n if (interest === undefined || duration === undefined || monthlyCost === undefined) {\n return (\n <OptionBox logo={logo} logoAlt={t('common.logotype')}>\n <OptionBoxHeading>{t('other.loading')}</OptionBoxHeading>\n <OptionBoxContent>\n <p>{t('other.loading')}</p>\n </OptionBoxContent>\n </OptionBox>\n );\n }\n\n return (\n <>\n {modal && <LoanModal loan={loan} onClose={toggleModal} />}\n <OptionBox logo={logo} logoAlt={t('common.logotype')}>\n <>\n <OptionBoxHeading>{`${numberSeparator(monthlyCost)} ${t(\n 'currency.monthly'\n )}*`}</OptionBoxHeading>\n\n <OptionBoxContent>\n <p>\n {loanAmount && duration\n ? t('item.financialOptions.payInInstallmentsDetailed', {\n amount: `${numberSeparator(loanAmount)} kr`,\n duration,\n })\n : t('item.financialOptions.payInInstallments')}\n </p>\n\n <p>\n *\n {t('item.financialOptions.disclaimer', {\n interest: `${(interest * 100).toFixed(2)}%`,\n })}{' '}\n <ButtonInline onClick={toggleModal}>{t('common.readMore')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </>\n </OptionBox>\n </>\n );\n};\n\nexport default Loan;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { CALCULATE_PAYMENT_QUERY } from './queries';\nimport { CalculatePaymentData, PaymentResponse } from './types';\n\nexport interface LoanVariables {\n financialOptionId?: string | null;\n duration?: number;\n downPayment?: number;\n residual?: number;\n}\n\n/** A recalculated loan through iteration.commerce.calculatePayment. */\nconst useLoanCalculation = (\n settings: PublicApiSettings,\n adId: string,\n { financialOptionId, duration, downPayment, residual }: LoanVariables\n) => {\n const [payment, setPayment] = useState<PaymentResponse>();\n const [loading, setLoading] = useState(false);\n const skip = duration === undefined || downPayment === undefined;\n\n useEffect(() => {\n if (skip) return;\n let active = true;\n setLoading(true);\n gqlQuery<CalculatePaymentData>(settings.api, CALCULATE_PAYMENT_QUERY, {\n id: adId,\n config: {\n financialOptionId: financialOptionId || undefined,\n duration: Math.round(duration),\n downPayment: Math.round(downPayment),\n residual: residual || 0,\n },\n })\n .then((data) => {\n const next = data.ads?.byAdId?.iteration?.commerce.calculatePayment;\n if (active && next) setPayment(next);\n })\n .catch(() => undefined)\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [skip, adId, financialOptionId, duration, downPayment, residual]);\n\n return { loading, payment };\n};\n\nexport default useLoanCalculation;\n", "// GraphQL documents for the ad page against the public API.\n\nimport { SEARCH_HIT_FIELDS } from '../queries';\n\nconst WARRANTY_CONTENT = `content { __typename ... on AdSpecificText { text } ... on StandardText { text } ... on StructuredWarranty { text } }`;\n\nexport const AD_QUERY = `\nquery Ad($id: ID!) {\n ads {\n byAdId(ID: $id) {\n id\n branchId\n createdAt\n salesDescription { title enriched }\n packaging {\n isDemoVersion\n certifiedPreOwned\n selectedPackaging { id title description imageUrl ctaUrl ctaName }\n }\n channels {\n __typename\n ... on PlatformChannel {\n status\n inventoryStatus\n publishedAt\n soldAt\n deliveryTime { __typename ... on DeliveryDate { date } ... on DeliveryInterval { from to unit } }\n }\n }\n pricing {\n primaryPriceType\n cash { price { amount } oldPrice { amount } deductibleVat }\n leasing { issuer leasingMonthlyPayment { amount } contractMonthsRemaining contractKilometersRemaining }\n companyLeasing { issuer leasingMonthlyPayment { amount } contractMonthsRemaining contractKilometersRemaining }\n }\n leasingPromos { id title description image periodMonths mileagePerYear isBusinessLeasing link { url name } }\n media(limit: 60) {\n totalCount\n items {\n __typename\n ... on AdImage { id url sortOrder mediaType formats { format url } }\n ... on Ad360ImageGroup { id sortOrder images { id url } }\n ... on AdEmbeddedVideo { id externalUrl sortOrder }\n }\n }\n equipment { items { name } }\n accessories {\n id name price salePrice assemblyPrice shortDescription longDescription logoUrl\n productPageLink productPageLinkText articleNumber manufacturer model\n media { url sortOrder }\n }\n warrantyInfo { ${WARRANTY_CONTENT} }\n offerings {\n warranties {\n included\n text\n definition { id name description logoUrl externalUrl usps }\n }\n }\n exchangePolicy { enabled }\n contactOption {\n __typename\n ... on Branch { id displayName }\n ... on AdDefaultContactOptions { displayName telephone email title }\n ... on AssignedUser { displayName telephone email title }\n ... on Editorial { displayName phone email title }\n }\n branch {\n id displayName description street zip city latitude longitude homePage logo market\n contactInformation { telephone email }\n adDefaultContactOptions { displayName telephone email title avatarUrl }\n weekOpeningHours { openingHours { dayOfWeek openFrom openTo } }\n isAutomotiveAssociationVerified\n promos { id title description image link { url name } }\n }\n authorizedResellerForManufacturer\n iteration {\n id\n displayName\n item {\n __typename\n ... on Vehicle {\n displayName\n registrationNumber { stringValue }\n vin { formattedValue }\n manufacturer { stringValue }\n modelSeries { stringValue }\n modelName { stringValue }\n modelVariant { stringValue }\n modelYear { intValue }\n manufactureYear { intValue }\n salesName { stringValue }\n driveline { fuelTypesString { stringValue } }\n attributes {\n transmission { formattedValue }\n enginePower { intValue formattedValue }\n exteriorColor { formattedValue }\n doorsCount { formattedValue }\n chassisType { formattedValue }\n vehicleClassification { formattedValue }\n byCategory {\n categoryId displayName\n values { __typename key label formattedValue }\n categories { categoryId displayName values { __typename key label formattedValue } }\n }\n }\n authority {\n segment { stringValue }\n chassis { stringValue }\n annualTax { intValue formattedValue }\n }\n }\n }\n logistics { odometerReading { value unit } }\n commerce {\n enabled disabledOnWayke allowTradeIn homeDelivery reserved\n insuranceProvider {\n institute identifier logo title description longDescription url\n insuranceHeader ecomInsuranceText requiresPersonalNumber requiresDistance\n }\n paymentDetailsList {\n financialOptionId name description financialInstitution monthlyCost interest effectiveInterest\n setupFee administrationFee totalCreditCost totalResidualValue loanAmount imageUrl link linkText\n duration { min max step default current }\n downPayment { min max step default current }\n residual { min max step default current }\n }\n }\n documents { public { id name contentType uri category sortOrder } }\n }\n }\n }\n}\n`;\n\n/**\n * Older ads carry a legacy id that differs from ad.id. ads.byIterationId accepts a\n * bare GUID and resolves it to the ad, with the same visibility rules as byAdId.\n */\nexport const AD_ID_BY_LEGACY_ID_QUERY = `\nquery AdIdByLegacyId($id: ID!) {\n ads { byIterationId(iterationId: $id) { ads { id } } }\n}\n`;\n\nexport const CALCULATE_PAYMENT_QUERY = `\nquery CalculatePayment($id: ID!, $config: PaymentDetailsInput!) {\n ads {\n byAdId(ID: $id) {\n iteration {\n commerce {\n calculatePayment(config: $config) {\n financialOptionId monthlyCost interest effectiveInterest setupFee administrationFee\n totalCreditCost totalResidualValue loanAmount\n duration { min max step default current }\n downPayment { min max step default current }\n residual { min max step default current }\n }\n }\n }\n }\n }\n}\n`;\n\nexport const INSURANCE_INQUIRY_QUERY = `\nquery InsuranceInquiry($id: ID!, $socialId: String!, $drivingDistance: DrivingDistance!) {\n ads {\n byAdId(ID: $id) {\n iteration {\n commerce {\n insuranceInquiry(socialId: $socialId, drivingDistance: $drivingDistance) {\n insurances {\n name price unit description branding legalUrl legalDescription\n details { institute logo terms }\n insuranceItems { name description }\n addons { id title price description exclude }\n }\n }\n }\n }\n }\n }\n}\n`;\n\nexport const RELATED_ADS_QUERY = `\nquery RelatedAds($market: [String], $branchGroupId: String, $manufacturer: [String], $perPage: Int) {\n search {\n ads(market: $market, branchGroupId: $branchGroupId, manufacturer: $manufacturer, perPage: $perPage, soldWithinDays: 0, sort: { field: publishedAt, direction: desc }) {\n found\n hits { ${SEARCH_HIT_FIELDS} }\n }\n }\n}\n`;\n", "// An ad carries two ids. ad.id (UUID v7) is what the public API and the ad\n// page's URL use. The legacy waykeId is the vehicle id from before ads-service,\n// and the services that predate it are still keyed on it: commerce/ecom (the\n// order flow 404s on ad.id) and ev-calculation. The two are equal for ads\n// created after the migration and differ for older ones.\n//\n// The public API does not expose the waykeId, but iteration.id is shaped\n// <branchId>@<waykeId>@<vehicleCode>.<hash>. Same as web-ui-v2's\n// utils/ads/legacyWaykeId.ts.\n\nexport const legacyWaykeIdFromIterationId = (\n iterationId: string | null | undefined,\n fallback: string\n): string => {\n if (!iterationId) return fallback;\n const firstAt = iterationId.indexOf('@');\n const secondAt = firstAt === -1 ? -1 : iterationId.indexOf('@', firstAt + 1);\n if (firstAt === -1 || secondAt === -1) return fallback;\n return iterationId.slice(firstAt + 1, secondAt) || fallback;\n};\n", "// Small readers over an Ad that several parts of the ad page share. They take\n// the API's shape as it is and tolerate missing data.\n\nimport { legacyWaykeIdFromIterationId } from './legacyWaykeId';\nimport { Ad, AdAccessory, AdMediaItem, LeasingPrice, PaymentRange } from './types';\n\n/** A number from the API, which sends some amounts as strings. */\nexport const num = (value: string | number | null | undefined) => {\n if (value === null || value === undefined || value === '') return undefined;\n const n = typeof value === 'number' ? value : Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n};\n\nexport const str = (value: string | null | undefined) => value || undefined;\n\n/** What every ad page event carries. */\nexport const adEvent = (ad: Ad) => ({\n id: ad.id,\n branchId: ad.branch.id,\n branchName: str(ad.branch.displayName),\n});\n\n/** Ecom and ev-calculation are keyed on the legacy waykeId, not on ad.id. */\nexport const waykeId = (ad: Ad) => legacyWaykeIdFromIterationId(ad.iteration?.id, ad.id);\n\nexport const platformChannel = (ad: Ad) =>\n ad.channels.find((c) => c.__typename === 'PlatformChannel');\n\nexport const price = (ad: Ad) => num(ad.pricing?.cash?.price?.amount) ?? 0;\n\n/** How much the price was lowered, when it was. */\nexport const discount = (ad: Ad) => {\n const oldPrice = num(ad.pricing?.cash?.oldPrice?.amount);\n const current = price(ad);\n return oldPrice && oldPrice > current ? oldPrice - current : undefined;\n};\n\n/** The delivery date of a car that is not in stock yet. */\nexport const availableFrom = (ad: Ad) => {\n const channel = platformChannel(ad);\n return channel?.inventoryStatus !== 'InStock' &&\n channel?.deliveryTime?.__typename === 'DeliveryDate' &&\n channel.deliveryTime.date\n ? new Date(channel.deliveryTime.date)\n : undefined;\n};\n\nexport const publishedAt = (ad: Ad) => {\n const at = platformChannel(ad)?.publishedAt;\n return at ? new Date(at) : undefined;\n};\n\n/** Buy online is offered when the branch has it, unless it is switched off for Wayke. */\nexport const ecom = (ad: Ad) => {\n const commerce = ad.iteration?.commerce;\n return {\n enabled: !!commerce?.enabled && !commerce.disabledOnWayke,\n reserved: !!commerce?.reserved,\n };\n};\n\nexport interface ContactPerson {\n name?: string;\n email?: string;\n phone?: string;\n avatar?: string;\n}\n\n/**\n * The person to contact about the ad: the assigned salesperson or the ad's own\n * contact (Editorial), else the branch's default.\n */\nexport const contactPerson = (ad: Ad): ContactPerson | undefined => {\n const c = ad.contactOption;\n if (c.__typename === 'AssignedUser' || c.__typename === 'AdDefaultContactOptions') {\n return { name: str(c.displayName), email: str(c.email), phone: str(c.telephone) };\n }\n if (c.__typename === 'Editorial') {\n return { name: str(c.displayName), email: str(c.email), phone: str(c.phone) };\n }\n const d = ad.branch.adDefaultContactOptions;\n if (d && (d.email || d.telephone)) {\n return {\n name: str(d.displayName),\n email: str(d.email),\n phone: str(d.telephone),\n avatar: str(d.avatarUrl),\n };\n }\n return undefined;\n};\n\nexport type DayKey =\n | 'monday'\n | 'tuesday'\n | 'wednesday'\n | 'thursday'\n | 'friday'\n | 'saturday'\n | 'sunday';\n\nexport type WeekOpeningHours = Partial<Record<DayKey, { from: string; until: string } | null>>;\n\nexport const openingHours = (branch: Ad['branch']): WeekOpeningHours | undefined => {\n const hours = branch.weekOpeningHours?.openingHours;\n if (!hours?.length) return undefined;\n const week: WeekOpeningHours = {};\n hours.forEach((h) => {\n if (!h) return;\n const key = h.dayOfWeek.toLowerCase() as DayKey;\n week[key] = h.openFrom && h.openTo ? { from: h.openFrom, until: h.openTo } : null;\n });\n return week;\n};\n\nexport const position = (branch: Ad['branch']) =>\n branch.latitude !== null && branch.longitude !== null\n ? { latitude: branch.latitude, longitude: branch.longitude }\n : undefined;\n\nexport type MediaType = 'image' | 'sphere' | 'threesixty' | 'embedded';\n\n/** One slide of the gallery: an image, a panorama, a 360 spin of several images, or a video. */\nexport interface GalleryMedia {\n type: MediaType;\n urls: string[];\n}\n\nexport const galleryMedia = (items: AdMediaItem[]): GalleryMedia[] =>\n [...items]\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .map<GalleryMedia | undefined>((m) => {\n if (m.__typename === 'AdImage' && m.url) {\n return { type: m.mediaType === 'SPHERE' ? 'sphere' : 'image', urls: [m.url] };\n }\n if (m.__typename === 'Ad360ImageGroup' && m.images?.length) {\n return { type: 'threesixty', urls: m.images.map((i) => i.url) };\n }\n if (m.__typename === 'AdEmbeddedVideo' && m.externalUrl) {\n return { type: 'embedded', urls: [m.externalUrl] };\n }\n return undefined;\n })\n .filter((m): m is GalleryMedia => !!m);\n\nexport interface Range {\n current: number;\n min: number;\n max: number;\n step: number;\n}\n\nexport const range = (r: PaymentRange | null | undefined): Range | undefined =>\n r\n ? {\n current: num(r.current) ?? 0,\n min: num(r.min) ?? 0,\n max: num(r.max) ?? 0,\n step: num(r.step) ?? 0,\n }\n : undefined;\n\nexport interface LeasingOffer {\n business: boolean;\n monthlyCost: number;\n months?: number;\n mileagePerYear?: number;\n name?: string;\n description?: string;\n image?: string;\n}\n\n/** Private and business leasing, with the dealer's promo text when there is one. */\nexport const leasingOffers = (ad: Ad): LeasingOffer[] => {\n const pairs: [LeasingPrice | null | undefined, boolean][] = [\n [ad.pricing?.leasing, false],\n [ad.pricing?.companyLeasing, true],\n ];\n return pairs.flatMap(([leasing, business]) => {\n const monthlyCost = num(leasing?.leasingMonthlyPayment?.amount);\n if (!leasing || !monthlyCost) return [];\n const promo = ad.leasingPromos.find((lp) => lp.isBusinessLeasing === business);\n return [\n {\n business,\n monthlyCost,\n months: promo?.periodMonths || leasing.contractMonthsRemaining || undefined,\n mileagePerYear: promo?.mileagePerYear || undefined,\n name: str(promo?.title) || str(leasing.issuer),\n description: str(promo?.description),\n image: str(promo?.image),\n },\n ];\n });\n};\n\nexport interface PackageOffer {\n title: string;\n description?: string;\n image?: string;\n link?: { url: string; title?: string };\n}\n\nexport const packageOffers = (ad: Ad): PackageOffer[] =>\n ad.packaging.selectedPackaging.map((p) => ({\n title: p.title,\n description: str(p.description),\n image: str(p.imageUrl),\n link: p.ctaUrl ? { url: p.ctaUrl, title: str(p.ctaName) } : undefined,\n }));\n\n/** The manufacturer's warranty package of a certified pre-owned car. */\nexport const manufacturerPackage = (ad: Ad): PackageOffer | undefined => {\n if (!ad.packaging.certifiedPreOwned) return undefined;\n const warranty = ad.offerings.warranties.find((w) => w.included) || ad.offerings.warranties[0];\n if (!warranty) return undefined;\n const { definition } = warranty;\n return {\n title: definition.name,\n description: str(definition.description) || str(warranty.text),\n image: str(definition.logoUrl),\n link: definition.externalUrl ? { url: definition.externalUrl } : undefined,\n };\n};\n\n/** An accessory's images, in their order. */\nexport const accessoryImages = (accessory: AdAccessory) =>\n [...accessory.media].sort((a, b) => a.sortOrder - b.sortOrder).map((m) => m.url);\n", "import { createContext, useContext } from 'react';\nimport { Ad } from '../../Gql/ad/types';\n\n/** The ad the page shows, for the parts of the page that need more than their props. */\nexport const AdContext = createContext<Ad | undefined>(undefined);\n\nconst useAdContext = () => {\n const ad = useContext(AdContext);\n if (!ad) throw new Error('Wayke: used outside an ad page');\n return ad;\n};\n\nexport default useAdContext;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PaymentResponse } from '../../Gql/ad/types';\nimport useLoanCalculation from '../../Gql/ad/useLoanCalculation';\nimport { adEvent, num, range } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport Content from '../Content';\nimport { ContentLogo, ContentLogoMedia, ContentLogoText } from '../ContentLogo';\nimport { CreditorDisclaimer } from '../CreditorDisclaimer';\nimport DataList from '../DataList';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { ModalFoldout, ModalFoldoutBody } from '../Modal/wrapper';\nimport SliderWithLabel from '../RangeSlider/SliderWithLabel';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\n\nconst stepGenerator = (\n step: number,\n max: number,\n steps: number[] = [],\n current?: number\n): number[] => {\n if (step === 0 && current === undefined) return steps;\n\n if (current !== undefined && current >= max && step !== 0) {\n return steps;\n }\n\n const nextCurrent = current ? step + current : step;\n steps.push(nextCurrent);\n return stepGenerator(step, max, steps, nextCurrent);\n};\n\ninterface LoanModalProps {\n loan: PaymentResponse;\n onClose: () => void;\n}\n\nconst LoanModal = ({ loan: option, onClose }: LoanModalProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi, marketCode } = useSettings();\n const [extend, setExtend] = React.useState(false);\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n\n const onToggleExtend = React.useCallback(() => {\n if (!extend) {\n PubSub.publish('FinanceInterest', trackPayload);\n }\n setExtend(!extend);\n }, [extend]);\n\n const [variables, setVariables] = useState({\n duration: num(option.duration?.current),\n downPayment: num(option.downPayment?.current),\n residual: num(option.residual?.current),\n });\n\n const { loading, payment } = useLoanCalculation(publicApi, ad.id, {\n financialOptionId: option.financialOptionId,\n ...variables,\n });\n\n // The API snaps the values to its steps; the sliders follow what it settled on.\n useEffect(() => {\n if (payment) {\n setVariables({\n duration: num(payment.duration?.current) || 0,\n downPayment: num(payment.downPayment?.current) || 0,\n residual: num(payment.residual?.current) || 0,\n });\n }\n }, [payment]);\n\n const { residual } = variables;\n const downPayment = range(payment?.downPayment);\n const downPaymentCurrent = downPayment?.current || 0;\n const downPaymentMin = downPayment?.min || 0;\n const downPaymentMax = downPayment?.max || 0;\n const downPaymentSteps = stepGenerator(downPayment?.step || 0, downPaymentMax);\n const onDownPaymentChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, downPayment: values[0] });\n },\n [variables, trackPayload]\n );\n\n const duration = range(payment?.duration);\n const durationCurrent = duration?.current || 0;\n const durationMin = duration?.min || 0;\n const durationMax = duration?.max || 0;\n const durationSteps = stepGenerator(duration?.step || 0, durationMax);\n const onDurationChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, duration: values[0] });\n },\n [variables, trackPayload]\n );\n\n const residualRange = range(payment?.residual);\n const residualCurrent = (residualRange?.current || 0) * 100;\n const residualMin = (residualRange?.min || 0) * 100;\n const residualMax = (residualRange?.max || 0) * 100;\n const residualSteps = stepGenerator((residualRange?.step || 0) * 100, residualMax);\n const onResidualChange = useCallback(\n (values: readonly number[]) => {\n PubSub.publish('FinanceInterest', trackPayload);\n setVariables({ ...variables, residual: values[0] / 100 });\n },\n [variables, trackPayload]\n );\n\n const interestText = ((num(payment?.interest) || 0) * 100).toFixed(2);\n const effectiveInterestText = ((num(payment?.effectiveInterest) || 0) * 100).toFixed(2);\n const monthlyCost = num(payment?.monthlyCost);\n const image = option.imageUrl || undefined;\n const name = option.name || option.financialInstitution;\n\n return (\n <Modal title={t('item.financialOptions.loanOptions')} onClose={onClose}>\n {option.description ? (\n <Repeat>\n <ContentLogo>\n <ContentLogoText>\n <Content>\n <p>{option.description}</p>\n </Content>\n </ContentLogoText>\n {image && (\n <ContentLogoMedia>\n <LogoBox logo={image} alt={name || t('common.logotype')} wide />\n </ContentLogoMedia>\n )}\n </ContentLogo>\n </Repeat>\n ) : (\n <>\n {image && (\n <Repeat>\n <LogoBox logo={image} alt={name || t('common.logotype')} wide />\n </Repeat>\n )}\n </>\n )}\n <Repeat>\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.downPayment')}\n values={[downPaymentCurrent]}\n domain={[downPaymentMin, downPaymentMax]}\n steps={downPaymentSteps}\n unit={t('currency.default')}\n loading={loading}\n onChange={onDownPaymentChange}\n />\n </RepeatSmall>\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.duration')}\n values={[durationCurrent]}\n domain={[durationMin, durationMax]}\n steps={durationSteps}\n unit={t('item.financialOptions.months')}\n loading={loading}\n onChange={onDurationChange}\n />\n </RepeatSmall>\n {residual !== undefined && residualMax !== 0 && (\n <RepeatSmall>\n <SliderWithLabel\n label={t('item.financialOptions.residual')}\n values={[residualCurrent]}\n domain={[residualMin, residualMax]}\n steps={residualSteps}\n unit=\"%\"\n loading={loading}\n onChange={onResidualChange}\n />\n </RepeatSmall>\n )}\n <RepeatSmall>\n <RepeatTiny>\n {monthlyCost !== null && monthlyCost !== undefined && (\n <Content>{`${numberSeparator(monthlyCost)} ${t('currency.monthly')}*`}</Content>\n )}\n <Content small>\n <p>\n *\n {t('item.financialOptions.loanOptionsDisclaimer', {\n interest: interestText,\n effectiveInterest: effectiveInterestText,\n })}\n </p>\n </Content>\n </RepeatTiny>\n </RepeatSmall>\n\n <RepeatSmall>\n <ButtonClear\n onClick={onToggleExtend}\n title={\n extend ? t('common.showLessInformation') || '' : t('common.showMoreInformation') || ''\n }\n >\n <ButtonContent>\n {extend ? t('common.lessInformation') : t('common.showMoreInformation')}\n </ButtonContent>\n </ButtonClear>\n </RepeatSmall>\n <>\n {extend && (\n <ModalFoldout>\n <ModalFoldoutBody>\n <DataList\n items={[\n {\n label: t('item.financialOptions.interest'),\n value: `${interestText} %`,\n },\n {\n label: t('item.financialOptions.effectiveinterest'),\n value: `${effectiveInterestText} %`,\n },\n {\n label: t('item.financialOptions.setupFee'),\n value: `${numberSeparator(num(option.setupFee) || 0)} ${t(\n 'currency.default'\n )}`,\n },\n {\n label: t('item.financialOptions.administrationFee'),\n value: `${numberSeparator(num(option.administrationFee) || 0)} ${t(\n 'currency.monthly'\n )}`,\n },\n {\n label: t('item.financialOptions.totalCreditCost'),\n value: `${numberSeparator(num(payment?.totalCreditCost) || 0)} ${t(\n 'currency.default'\n )}`,\n },\n ]}\n />\n </ModalFoldoutBody>\n </ModalFoldout>\n )}\n </>\n </Repeat>\n {marketCode === 'SE' && (\n <Repeat>\n <CreditorDisclaimer />\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default LoanModal;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const ContentLogo = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n display: flex;\n align-items: flex-start;\n }\n`;\n\nexport const ContentLogoText = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n flex: 1 1 auto;\n }\n`;\n\nexport const ContentLogoMedia = styled.div`\n ${(props) => props.theme.breakpoint.LtSm} {\n margin-top: ${size(2)};\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n flex-shrink: 0;\n padding-left: ${size(4)};\n }\n`;\n", "import * as React from 'react';\n\nimport { Logo } from './wrapper';\n\ninterface ILogoBox {\n logo: string;\n logo2x?: string | null;\n alt?: string;\n wide?: boolean;\n}\n\nconst LogoBox = ({ logo, logo2x, alt, wide }: ILogoBox) => {\n let logoRetina = logo;\n\n if (logo2x) {\n logoRetina = `${logo2x} 2x`;\n }\n\n return <Logo src={logo} srcSet={logoRetina} alt={alt} wide={wide} />;\n};\n\nexport default LogoBox;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ntype LogoProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n wide?: boolean;\n};\n\nexport const Logo = styled.img<LogoProps>`\n display: block;\n max-width: ${size(9.5)};\n max-height: ${size(6)};\n\n ${({ wide }) =>\n wide &&\n css`\n max-width: ${size(20)};\n `}\n`;\n", "import React, { useCallback, useEffect, useState } from 'react';\nimport { numberSeparator } from '../../utils/formats';\nimport RangeSliderLabel from '../RangeSliderLabel';\nimport { RepeatTiny } from '../Repeat';\nimport RangeSliderSimple from './RangeSliderSimple';\n\ninterface SliderWithLabelProps {\n label: string;\n values: number[];\n domain: number[];\n steps: number[];\n loading: boolean;\n unit: string;\n onChange: (values: readonly number[]) => void;\n}\n\nconst SliderWithLabel = ({\n label,\n values,\n domain,\n steps,\n loading,\n unit,\n onChange,\n}: SliderWithLabelProps) => {\n const [local, setLocal] = useState<number[] | undefined>(undefined);\n\n const onUpdate = useCallback((nextValues: readonly number[]) => {\n setLocal([...nextValues]);\n }, []);\n\n useEffect(() => {\n if (!loading) setLocal(undefined);\n }, [loading]);\n\n return (\n <>\n <RepeatTiny>\n <RangeSliderLabel\n label={label}\n value={`${numberSeparator(local?.[0] || values[0])}${unit ? ` ${unit}` : ''}`}\n />\n </RepeatTiny>\n <RepeatTiny>\n <RangeSliderSimple\n loading={loading}\n values={values}\n domain={domain}\n steps={steps}\n onChange={onChange}\n onUpdate={onUpdate}\n label={label}\n />\n </RepeatTiny>\n </>\n );\n};\n\nexport default SliderWithLabel;\n", "import React from 'react';\n\nimport { Label, Value, Wrapper } from './wrapper';\n\ninterface Props {\n label: string;\n value?: React.ReactNode;\n highlight?: boolean;\n}\n\nconst RangeSliderLabel = ({ label, value, highlight }: Props) => (\n <Wrapper>\n <Label>{label}</Label>\n {value && <Value isHighlighted={highlight}>{value}</Value>}\n </Wrapper>\n);\n\nexport default RangeSliderLabel;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: flex-end;\n`;\n\nexport const Label = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n flex: 1 1 auto;\n`;\n\ntype ValueProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> & {\n isHighlighted?: boolean;\n};\n\nexport const Value = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold wayke__color--primary-text',\n}))<ValueProps>`\n flex-shrink: 0;\n padding-left: ${size(2)};\n font-size: 1.125rem;\n\n ${({ isHighlighted }) =>\n isHighlighted &&\n css`\n font-size: 1.375rem;\n color: ${(props) => props.theme.color.textDark} !important;\n `}\n`;\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { Range, Root, Thumb, Track } from './wrapper';\n\ninterface RangeSliderProps {\n loading: boolean;\n domain: number[];\n values: number[];\n steps: number[];\n /** Read out with the handle. */\n label: string;\n onChange: (values: readonly number[]) => void;\n onUpdate?: (values: readonly number[]) => void;\n}\n\n/** One handle, for a single value such as the down payment. */\nconst RangeSliderSimple = ({\n loading,\n values,\n domain,\n steps,\n label,\n onChange,\n onUpdate,\n}: RangeSliderProps) => {\n const [current, setCurrent] = useState<number[]>(values);\n const latest = useRef(values);\n\n useEffect(() => {\n latest.current = values;\n setCurrent(values);\n }, [values[0]]);\n\n if (steps.length < 2) {\n return null;\n }\n\n return (\n <Root\n min={domain[0]}\n max={domain[1]}\n step={steps[1] - steps[0]}\n value={current}\n disabled={loading}\n onValueChange={(next) => {\n latest.current = next;\n setCurrent(next);\n onUpdate?.(next);\n }}\n onValueCommit={onChange}\n // A drag commits here, see RangeSlider's commitDrag.\n onPointerUp={() => {\n if (latest.current[0] !== values[0]) onChange(latest.current);\n }}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={label} />\n </Root>\n );\n};\n\nexport default RangeSliderSimple;\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { adEvent, GalleryMedia } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport { DEFAULT_PLACEHOLDER_IMAGE } from '../../utils/constants';\nimport { imageUrl } from '../../utils/image';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { IconChevronLeft, IconChevronRight } from '../Icon';\nimport Lightbox from '../Lightbox';\nimport { NavButton } from '../NavButton';\nimport ResponsiveImage from '../ResponsiveImage';\nimport Sphere from '../Sphere/Sphere';\nimport ThreeSixty from '../ThreeSixty/ThreeSixty';\nimport EmbededVideo from '../Video/EmbededVideo';\nimport QuickNavEmbeded from '../Video/QuickNavEmbeded';\nimport {\n Alt,\n ArrowLeft,\n ArrowRight,\n Image,\n Item,\n Main,\n QuickNav,\n QuickNavBtn,\n QuickNavImg,\n QuickNavItem,\n Track,\n Wrapper,\n} from './wrapper';\n\n// The gallery is at most about 800 px wide, the full width less the thumbnails\n// on tablets and 95% of the screen on phones; the browser picks by pixel density.\nconst GALLERY_WIDTHS = [375, 600, 750, 1000, 1200];\nconst GALLERY_SIZES = '(min-width: 1200px) 800px, (min-width: 768px) calc(100vw - 180px), 95vw';\nconst THUMBNAIL_WIDTHS = [96, 128, 225];\n\ninterface GalleryProps {\n media: GalleryMedia[];\n placeholderImage?: string;\n}\n\nconst scrollBehavior = (): ScrollBehavior =>\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\n\n/** Scrolls the thumbnail list, and only it, so that the item is visible. */\nconst revealInList = (list: HTMLElement, item: HTMLElement) => {\n if (item.offsetTop < list.scrollTop) {\n list.scrollTop = item.offsetTop;\n } else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n};\n\nconst Gallery = ({ media, placeholderImage }: GalleryProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const trackRef = useRef<HTMLUListElement>(null);\n const quickNavRef = useRef<HTMLUListElement>(null);\n const [index, setIndex] = useState(0);\n const [lightbox, setLightbox] = useState(false);\n\n const mediaLength = media?.length || 0;\n const placeholder = useMemo(\n () => placeholderImage || DEFAULT_PLACEHOLDER_IMAGE,\n [placeholderImage]\n );\n\n const goTo = useCallback(\n (target: number) => {\n const track = trackRef.current;\n if (!track || mediaLength === 0) return;\n // The arrows wrap around, from the last slide to the first and back.\n const next = (target + mediaLength) % mediaLength;\n const slide = track.children[next] as HTMLElement | undefined;\n if (slide) track.scrollTo({ left: slide.offsetLeft, behavior: scrollBehavior() });\n },\n [mediaLength]\n );\n\n // The slide in view decides the index, however the track was scrolled.\n const onScroll = useCallback(() => {\n const track = trackRef.current;\n const first = track?.children[0] as HTMLElement | undefined;\n if (!track || !first?.offsetWidth) return;\n setIndex(Math.min(mediaLength - 1, Math.round(track.scrollLeft / first.offsetWidth)));\n }, [mediaLength]);\n\n useEffect(() => {\n const list = quickNavRef.current;\n const item = list?.children[index] as HTMLElement | undefined;\n if (list && item) revealInList(list, item);\n }, [index]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n goTo(index + (e.key === 'ArrowLeft' ? -1 : 1));\n }\n },\n [goTo, index]\n );\n\n const onClick = useCallback(() => {\n PubSub.publish('ImagesClick', adEvent(ad));\n // 360 and sphere images are turned in the lightbox, already started, as on wayke.se.\n if (mediaLength) setLightbox(true);\n }, [ad, mediaLength]);\n\n const onToggleLightbox = useCallback(() => setLightbox(!lightbox), [lightbox]);\n\n return (\n <>\n <Wrapper>\n <Main>\n <Track\n ref={trackRef}\n onScroll={onScroll}\n onKeyDown={onKeyDown}\n onClick={onClick}\n tabIndex={0}\n aria-label={t('other.gallery')}\n >\n {mediaLength ? (\n media.map((m, i) => (\n <Item\n key={m.urls[0] || i}\n aria-label={t('common.imageIndex', { index: i + 1 })}\n aria-current={i === index || undefined}\n >\n {m.type === 'image' && (\n <ResponsiveImage\n img={Image}\n src={m.urls[0]}\n widths={GALLERY_WIDTHS}\n sizes={GALLERY_SIZES}\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n // The first image is in view at once; the rest load as they come near.\n loading={i === 0 ? 'eager' : 'lazy'}\n draggable={false}\n />\n )}\n {m.type === 'threesixty' && <ThreeSixty urls={m.urls} />}\n {m.type === 'embedded' && <EmbededVideo src={m.urls[0]} index={i} />}\n {m.type === 'sphere' && <Sphere url={m.urls[0]} />}\n </Item>\n ))\n ) : (\n <Item key={placeholder}>\n <Image src={placeholder} alt={t('common.imageIndex', { index: 1 }) || ''} />\n </Item>\n )}\n </Track>\n {mediaLength > 1 && (\n <>\n <ArrowLeft>\n <NavButton onClick={() => goTo(index - 1)} title={t('other.previousImage') || ''}>\n <IconChevronLeft block />\n </NavButton>\n </ArrowLeft>\n <ArrowRight>\n <NavButton onClick={() => goTo(index + 1)} title={t('other.nextImage') || ''}>\n <IconChevronRight block />\n </NavButton>\n </ArrowRight>\n </>\n )}\n </Main>\n <Alt>\n <QuickNav ref={quickNavRef}>\n {mediaLength ? (\n media.map((m, i) => {\n const src =\n m.type === 'embedded'\n ? m.urls[0]\n : imageUrl(m.urls[0], { width: 225, height: 150 });\n return (\n <QuickNavItem key={src || i} $active={index === i}>\n <QuickNavBtn\n onClick={() => goTo(i)}\n title={t('other.goToImageIndex', { index: i + 1 }) || ''}\n aria-current={index === i || undefined}\n >\n {m.type === 'embedded' ? (\n <QuickNavEmbeded src={src} index={i} />\n ) : (\n <ResponsiveImage\n img={QuickNavImg}\n src={m.urls[0]}\n widths={THUMBNAIL_WIDTHS}\n sizes=\"75px\"\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n loading=\"lazy\"\n />\n )}\n </QuickNavBtn>\n </QuickNavItem>\n );\n })\n ) : (\n <QuickNavItem key={placeholder} $active>\n <QuickNavBtn\n onClick={() => goTo(0)}\n title={t('other.goToImageIndex', { index: 1 }) || ''}\n >\n <QuickNavImg src={placeholder} alt={t('common.imageIndex', { index: 1 }) || ''} />\n </QuickNavBtn>\n </QuickNavItem>\n )}\n </QuickNav>\n </Alt>\n </Wrapper>\n {lightbox && !!mediaLength && (\n <Lightbox media={media} index={index} onClose={onToggleLightbox} />\n )}\n </>\n );\n};\n\nexport default Gallery;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { GalleryMedia } from '../../Gql/ad/view';\nimport { IconCancel } from '../Icon';\nimport ResponsiveImage from '../ResponsiveImage';\nimport SphereLightbox from '../Sphere/SphereLightbox';\nimport ThreeSixtyLightbox from '../ThreeSixty/ThreeSixtLightbox';\nimport EmbeddedVideoLightbox from '../Video/EmbeddedVideoLightbox';\nimport { CloseBtn, Img, Item, UiBlock, Wrapper } from './wrapper';\n\ninterface LightboxProps {\n index: number;\n media: GalleryMedia[];\n onClose: () => void;\n}\n\nconst Lightbox = ({ index, media, onClose }: LightboxProps) => {\n const { t } = useTranslation();\n const onRef = (ref: HTMLDivElement | null) => {\n if (ref) {\n setTimeout(() => {\n ref.scrollIntoView();\n }, 300);\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode === 27) {\n onClose();\n }\n };\n\n return (\n <Wrapper ref={(ref) => ref?.focus()} onKeyDown={onKeyDown} tabIndex={0}>\n <UiBlock onClick={onClose} aria-hidden />\n {media.map((m, i) => (\n <Item key={i} ref={index === i ? onRef : undefined}>\n {m.type === 'image' && (\n <ResponsiveImage\n img={Img}\n id={`lightbox-image-${i}`}\n src={m.urls[0]}\n widths={[750, 1080, 1200, 1920]}\n // As wide as the screen, or as the screen is high for a 3:2 image.\n sizes=\"(min-aspect-ratio: 3/2) 150vh, 100vw\"\n // Reserves the 3:2 box, so only the images near the one opened load.\n width={1200}\n height={800}\n loading=\"lazy\"\n alt={t('common.imageIndex', { index: i + 1 }) || ''}\n />\n )}\n {m.type === 'threesixty' && <ThreeSixtyLightbox urls={m.urls} />}\n {m.type === 'sphere' && <SphereLightbox url={m.urls[0]} />}\n {m.type === 'embedded' && <EmbeddedVideoLightbox url={m.urls[0]} />}\n </Item>\n ))}\n <CloseBtn onClick={onClose} title={t('common.close') || ''}>\n <IconCancel block />\n </CloseBtn>\n </Wrapper>\n );\n};\n\nexport default Lightbox;\n", "import React from 'react';\nimport SphereViewer from './SphereViewer';\n\ntype PropsType = {\n url: string;\n};\n\nconst SphereLightbox = ({ url }: PropsType) => <SphereViewer id={url} src={url} interactive />;\n\nexport default SphereLightbox;\n", "import { Viewer } from '@photo-sphere-viewer/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Loader from '../Loader';\nimport { Wrapper } from '../Sphere/wrapper';\nimport { Badge } from '../ThreeSixty/wrapper';\n\ntype PropsType = {\n id: string;\n src: string;\n interactive?: boolean;\n};\n\nconst isWebgl2Supported = (): boolean => {\n try {\n return !!document.createElement('canvas').getContext('webgl2');\n } catch {\n return false;\n }\n};\n\nconst SphereViewer = ({ id, src, interactive }: PropsType) => {\n const { t } = useTranslation();\n const container = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<Viewer | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n if (!container.current) return;\n if (!isWebgl2Supported()) return;\n\n let viewer: Viewer;\n try {\n viewer = new Viewer({\n container: container.current,\n panorama: src,\n navbar: ['zoom', 'fullscreen'],\n defaultYaw: 0,\n defaultPitch: 0,\n mousewheel: false,\n touchmoveTwoFingers: true,\n minFov: 30,\n maxFov: 90,\n });\n } catch {\n setLoading(false);\n return;\n }\n viewerRef.current = viewer;\n\n const handleReady = () => setLoading(false);\n viewer.addEventListener('ready', handleReady);\n\n return () => {\n viewer.removeEventListener('ready', handleReady);\n viewer.destroy();\n viewerRef.current = null;\n };\n }, [src]);\n\n const fillStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n };\n\n return (\n <Wrapper $started={!!interactive}>\n <div\n id={`a-${id}`}\n ref={container}\n style={{ ...fillStyle, pointerEvents: interactive ? 'auto' : 'none' }}\n />\n {loading && <Loader />}\n {/* In the gallery: marked as 360; a click opens it in the lightbox, ready to turn. */}\n {!loading && !interactive && <Badge>{t('item.threeSixty.sphereBadge')}</Badge>}\n </Wrapper>\n );\n};\n\nexport default SphereViewer;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst compassSize = size(4);\nconst controlBtnSize = size(4);\n\nexport const Wrapper = styled.div<{ $started?: boolean }>`\n position: relative;\n aspect-ratio: 3 / 2;\n ${(p) =>\n p.$started\n ? `\n // As large as the lightbox's images: the full width, or 3:2 of the screen's height.\n width: min(100%, calc((100vh - ${size(6)}) * 1.5));\n margin: 0 auto;\n `\n : `\n width: 100%;\n `}\n\n .psv-navbar {\n display: ${(p) => (p.$started ? 'flex' : 'none')};\n }\n\n .pnlm-container {\n background-image: none;\n background-color: ${(props) => props.theme.color.accentDark};\n }\n\n // Compass\n\n .pnlm-compass {\n width: ${compassSize};\n height: ${compassSize};\n border-radius: 50%;\n bottom: ${size(2)};\n left: ${size(2)};\n right: auto;\n margin-top: 0;\n border: 5px solid transparent;\n border-top-color: ${(props) => props.theme.color.textLight};\n background-color: rgba(255, 255, 255, 0.4);\n background-image: none;\n backdrop-filter: blur(5px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n box-sizing: border-box;\n\n &:hover {\n background-color: red;\n }\n }\n\n // Controls (zoom & fullscreen button)\n\n .pnlm-grab,\n .pnlm-grabbing {\n .pnlm-controls-container {\n display: block;\n }\n }\n\n .pnlm-controls-container {\n display: none;\n top: ${size(2)};\n left: ${size(2)};\n }\n\n .pnlm-controls {\n margin-top: 0;\n\n & + .pnlm-controls {\n margin-top: ${size(1)};\n }\n }\n\n // Fullscreen button\n\n .pnlm-fullscreen-toggle-button {\n display: none;\n position: relative;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-image: none;\n background-color: rgba(255, 255, 255, 0.4);\n backdrop-filter: blur(5px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n color: ${(props) => props.theme.color.textDark};\n border: 0;\n border-radius: 50%;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.6);\n }\n\n &:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.875rem;\n }\n }\n\n .pnlm-fullscreen-toggle-button-inactive {\n &:before {\n content: '\u2922';\n }\n\n &.pnlm-fullscreen-toggle-button-active {\n &:before {\n content: '\u2922';\n }\n }\n }\n\n // Gyroscope (Orientation)\n\n .pnlm-orientation-button {\n background-image: none;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n border: 0;\n border-radius: 999px;\n\n &:hover {\n background-color: red;\n }\n\n &:before {\n content: 'A';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.875rem;\n }\n\n &.pnlm-orientation-button-active {\n background-color: green;\n\n &:hover {\n background-color: pink;\n }\n }\n }\n\n // Zoom controls\n\n .pnlm-zoom-controls {\n display: none;\n height: auto;\n width: auto;\n background-color: transparent;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 0;\n border-radius: 999px;\n\n > * {\n &:first-child {\n border-top-left-radius: 999px;\n border-top-right-radius: 999px;\n }\n\n &:last-child {\n border-bottom-left-radius: 999px;\n border-bottom-right-radius: 999px;\n }\n }\n }\n\n .pnlm-zoom-in,\n .pnlm-zoom-out {\n position: relative;\n display: block;\n width: ${controlBtnSize};\n height: ${controlBtnSize};\n background-image: none;\n background-color: rgba(255, 255, 255, 0.4);\n backdrop-filter: blur(5px);\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n\n &:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.6);\n }\n }\n\n .pnlm-zoom-in {\n top: auto;\n\n &:before {\n content: '+';\n }\n }\n\n .pnlm-zoom-out {\n bottom: auto;\n border-top: 1px solid ${(props) => props.theme.color.textDark};\n\n &:before {\n content: '-';\n }\n }\n\n // Load Button\n\n .pnlm-load-button {\n top: auto;\n bottom: ${size(2)};\n transform: translateX(-50%);\n width: auto;\n height: auto;\n padding: ${size(1.75)} ${size(2)};\n border-radius: 3px;\n margin: 0;\n background-color: ${(props) => props.theme.color.accentDark};\n color: ${(props) => props.theme.color.textDark};\n line-height: 1.1;\n user-select: none;\n\n &:hover {\n background-color: ${(props) => props.theme.color.accentDark};\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n // Load box\n\n .pnlm-load-box {\n background-color: transparent;\n height: auto;\n margin: 0;\n width: 150px;\n transform: translate(-50%, -50%);\n\n > p {\n display: none;\n }\n }\n\n // Load bar\n\n .pnlm-lbar {\n width: 100%;\n background-color: rgba(255, 255, 255, 0.4);\n border: 0;\n }\n\n .pnlm-lbar-fill {\n background-color: ${(props) => props.theme.color.textLight};\n }\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\n// As wide as the image, so the badge and the slider sit on it.\nexport const Figure = styled.figure`\n position: relative;\n width: fit-content;\n max-width: 100%;\n margin: 0 auto;\n cursor: grab;\n user-select: none;\n // Vertical scrolling stays with the page; horizontal moves rotate the car.\n touch-action: pan-y;\n\n &:active {\n cursor: grabbing;\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Badge = styled.span.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-bg wayke__font--bold',\n}))`\n position: absolute;\n top: ${size(2)};\n left: ${size(2)};\n // Above the lightbox image, which has z-index 1.\n z-index: 2;\n padding: ${size(0.5)} ${size(1)};\n border-radius: 3px;\n font-size: 0.75rem;\n pointer-events: none;\n`;\n\nexport const SliderBar = styled.div`\n position: absolute;\n left: ${size(1)};\n right: ${size(1)};\n bottom: ${size(1)};\n // Above the lightbox image, which has z-index 1.\n z-index: 2;\n display: flex;\n align-items: center;\n gap: ${size(2)};\n padding: 0 ${size(2)};\n border-radius: 3px;\n background-color: rgba(255, 255, 255, 0.9);\n cursor: default;\n\n // The slider takes the room the value text leaves.\n > :first-child {\n flex: 1 1 auto;\n }\n`;\n\nexport const SliderValue = styled.span`\n flex-shrink: 0;\n font-size: 0.875rem;\n`;\n\nexport const VisuallyHidden = styled.span`\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n`;\n", "import React from 'react';\nimport { Img } from '../Lightbox/wrapper';\nimport Rotation from './Rotation';\n\n// As the lightbox's own images.\nconst WIDTHS = [750, 1080, 1200, 1920];\nconst SIZES = '(min-aspect-ratio: 3/2) 150vh, 100vw';\n\ntype PropsType = {\n urls: string[];\n};\n\n/** A 360 image in the lightbox, ready to turn. */\nconst ThreeSixtyLightbox = ({ urls }: PropsType) => (\n <Rotation urls={urls} img={Img} widths={WIDTHS} sizes={SIZES} />\n);\n\nexport default ThreeSixtyLightbox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n padding: ${size(3)};\n z-index: 90;\n overflow: auto;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding: ${size(2)};\n }\n`;\n\nexport const UiBlock = styled.div.attrs(() => ({\n role: 'button',\n}))`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.3);\n z-index: -1;\n`;\n\nexport const Item = styled.div`\n position: relative;\n\n & + & {\n margin-top: ${size(1)};\n }\n`;\n\nexport const Img = styled.img`\n position: relative;\n display: block;\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: calc(100vh - ${size(6)});\n object-fit: contain;\n margin: 0 auto;\n z-index: 1;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n max-height: calc(100vh - ${size(4)});\n }\n`;\n\nexport const CloseBtn = styled(ButtonReset)`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n top: ${size(2)};\n right: ${size(2)};\n width: ${size(5)};\n height: ${size(5)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.bg};\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transform-origin: 50% 50%;\n transition:\n 200ms ease,\n transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n z-index: 1;\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${(props) => props.theme.color.hoverOverlay};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.97);\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n top: ${size(1)};\n right: ${size(1)};\n }\n`;\n", "import React, { useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Range, Root, Thumb, Track } from '../RangeSlider/wrapper';\nimport ResponsiveImage from '../ResponsiveImage';\nimport { Badge, Figure, SliderBar, SliderValue, VisuallyHidden } from './wrapper';\n\ntype ImgProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\ninterface RotationProps {\n urls: string[];\n /** The styled <img> of the surrounding gallery or lightbox. */\n img: React.ElementType<ImgProps>;\n widths: number[];\n sizes: string;\n}\n\nconst wrap = (value: number, length: number) => ((value % length) + length) % length;\n\n/**\n * A 360 image: drag, the arrow keys or the slider turn the car, as web-ui-v2's\n * 360 viewer does. The slider spans two turns and starts in the middle, so it\n * can be pulled either way; a drag across the whole image is one turn. Every\n * frame loads at once, so turning never waits for an image.\n */\nconst Rotation = ({ urls, img, widths, sizes }: RotationProps) => {\n const { t } = useTranslation();\n const count = urls.length;\n const [position, setPosition] = useState(count);\n const frame = position % count;\n const drag = useRef<{ x: number; position: number; width: number } | undefined>(undefined);\n const label = (i: number) => t('item.threeSixty.frame', { frame: i + 1, total: count });\n\n const onPointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if ((e.target as HTMLElement).closest('[data-rotate-slider]')) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n drag.current = { x: e.clientX, position, width: e.currentTarget.offsetWidth || 1 };\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLElement>) => {\n const start = drag.current;\n if (!start) return;\n const delta = Math.round(((e.clientX - start.x) / start.width) * count);\n setPosition(wrap(start.position + delta, count * 2));\n };\n\n // The release can come at a new position without a move before it.\n const onPointerUp = (e: React.PointerEvent<HTMLElement>) => {\n onPointerMove(e);\n drag.current = undefined;\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n const next: Record<string, number> = {\n ArrowLeft: position - 1,\n ArrowRight: position + 1,\n Home: 0,\n End: count * 2 - 1,\n };\n if (e.key in next) {\n e.preventDefault();\n setPosition(wrap(next[e.key], count * 2));\n }\n };\n\n return (\n <Figure\n tabIndex={0}\n aria-label={t('item.threeSixty.viewer')}\n aria-roledescription=\"360\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={() => {\n drag.current = undefined;\n }}\n onKeyDown={onKeyDown}\n onClick={(e) => e.stopPropagation()}\n >\n <VisuallyHidden>{t('item.threeSixty.description')}</VisuallyHidden>\n <VisuallyHidden aria-live=\"polite\">{label(frame)}</VisuallyHidden>\n <Badge aria-hidden>{t('item.threeSixty.badge')}</Badge>\n {urls.map((url, i) => (\n <ResponsiveImage\n key={url}\n img={img}\n src={url}\n widths={widths}\n sizes={sizes}\n alt={label(i)}\n draggable={false}\n style={{ display: i === frame ? 'block' : 'none' }}\n />\n ))}\n <SliderBar data-rotate-slider>\n <Root\n min={0}\n max={count * 2 - 1}\n step={1}\n value={[position]}\n onValueChange={([next]) => setPosition(next)}\n >\n <Track>\n <Range />\n </Track>\n <Thumb aria-label={t('item.threeSixty.rotate')} aria-valuetext={label(frame)} />\n </Root>\n <SliderValue aria-hidden>{label(frame)}</SliderValue>\n </SliderBar>\n </Figure>\n );\n};\n\nexport default Rotation;\n", "import React from 'react';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport VimeoPlayer from './VimeoPlayer';\nimport YouTubePlayer from './YoutubePlayer';\n\nconst ytNames = ['youtube.com', 'youtu.be'];\nconst isYouTubeVideo = (url: string): boolean =>\n ytNames.some((host: string): boolean => url.indexOf(host) >= 0);\n\nconst vNames = ['vimeo.com'];\nconst isVimeoVideo = (url: string): boolean =>\n vNames.some((host: string): boolean => url.indexOf(host) >= 0);\n\ntype PropsType = {\n url: string;\n autoplay?: boolean;\n controls?: boolean;\n};\n\nconst VideoPlayer = ({ url, autoplay = false, controls = true }: PropsType) => {\n if (!url) return null;\n\n if (isYouTubeVideo(url)) return <YouTubePlayer url={url} autoplay={autoplay} />;\n\n if (isVimeoVideo(url)) return <VimeoPlayer url={url} autoplay={autoplay} />;\n\n return <CustomPlayer ratio=\"56.25%\" controls={controls} url={url} />;\n};\n\nexport default VideoPlayer;\n", "import React from 'react';\nimport Video from './Video';\nimport { Wrapper } from './wrapper';\n\ntype PropsType = {\n url?: string;\n modal?: boolean;\n controls?: boolean;\n ratio?: string;\n isPreview?: boolean;\n};\n\nconst CustomPlayer = ({ url, controls, modal, ratio = '56.25%', isPreview }: PropsType) => {\n return (\n <Wrapper ratio={ratio} isPreview={isPreview}>\n <Video\n key={url}\n modal={modal}\n preload=\"metadata\"\n controls={controls}\n width=\"100%\"\n height=\"100%\"\n src={url}\n />\n </Wrapper>\n );\n};\nexport default CustomPlayer;\n", "import React from 'react';\nimport styled from 'styled-components';\n\ntype VideoProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLVideoElement>,\n HTMLVideoElement\n> & {\n modal?: boolean;\n};\n\nconst Video = styled.video<VideoProps>`\n position: absolute;\n top: 0;\n left: 0;\n object-fit: ${({ modal }) => (modal ? 'contain' : 'cover')};\n`;\n\nexport default Video;\n", "import styled from 'styled-components';\n\ntype WrapperProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n ratio?: string;\n isPreview?: boolean;\n};\n\nexport const Wrapper = styled.div<WrapperProps>`\n position: relative;\n width: 100%;\n height: ${(props) => (props.isPreview ? '100%' : 0)};\n padding-bottom: ${(props): string => (props.ratio ? props.ratio : '56.25%')};\n`;\n\nexport const Iframe = styled.iframe.attrs(() => ({\n width: '100%',\n height: '100%',\n allowFullScreen: true,\n frameBorder: '0',\n}))`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n`;\n", "import React from 'react';\nimport { getVimeoId } from './utils';\n\nimport { Iframe, Wrapper } from './wrapper';\n\ntype PropsType = {\n url: string;\n autoplay: boolean;\n};\n\nconst VimeoPlayer = ({ url, autoplay }: PropsType) => (\n <Wrapper>\n <Iframe\n src={`https://player.vimeo.com/video/${getVimeoId(url)}?${\n autoplay ? '&autoplay=1' : ''\n }&loop=0&autopause=0`}\n />\n </Wrapper>\n);\n\nexport default VimeoPlayer;\n", "export const getVimeoId = (url: string): string => {\n const regExp = /\\/(\\d+)/;\n const match = url.match(regExp);\n return match && match[1].length > 3 ? match[1] : '';\n};\n\nexport const getYouTubeId = (url: string): string => {\n const regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\n const match = url.match(regExp);\n return match && match[7].length === 11 ? match[7] : '';\n};\n\nconst youtubeBase = 'https://img.youtube.com/vi/';\nexport const getYoutubeThumbnail = (url: string) => {\n const id = getYouTubeId(url);\n if (!id) {\n return undefined;\n }\n return {\n maxresdefault: `${youtubeBase}${id}/maxresdefault.jpg`,\n hqdefault: `${youtubeBase}${id}/hqdefault.jpg`,\n mqdefault: `${youtubeBase}${id}/mqdefault.jpg`,\n };\n};\n\nexport const onImageLoad = (\n e: React.SyntheticEvent<HTMLImageElement, Event>,\n thumbnail?: string[]\n) => {\n if (\n thumbnail?.length === 2 &&\n e.currentTarget.src === thumbnail[0] &&\n e.currentTarget.naturalWidth === 120 &&\n e.currentTarget.naturalHeight === 90\n ) {\n e.currentTarget.src = thumbnail[1];\n }\n};\n\nexport const onImageError = (\n e: React.SyntheticEvent<HTMLImageElement, Event>,\n thumbnail?: string[]\n) => {\n if (thumbnail?.length === 2) {\n e.currentTarget.src = thumbnail[1];\n }\n};\n", "import React from 'react';\nimport { getYouTubeId } from './utils';\n\nimport { Iframe, Wrapper } from './wrapper';\n\ntype PropsType = {\n url: string;\n autoplay: boolean;\n};\n\nconst YouTubePlayer = ({ url, autoplay }: PropsType) => (\n <Wrapper>\n <Iframe\n src={`https://www.youtube.com/embed/${getYouTubeId(url)}?&enablejsapi=1&?rel=0${\n autoplay ? '&autoplay=1' : ''\n }`}\n />\n </Wrapper>\n);\n\nexport default YouTubePlayer;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const NavButton = styled(ButtonReset)`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${size(4)};\n height: ${size(4)};\n border-radius: 50%;\n background-color: ${(props) => props.theme.color.bg};\n color: ${(props) => props.theme.color.textDark};\n font-size: 0.75rem;\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);\n transition: transform 200ms ease;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n border-radius: 50%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n &:enabled {\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n", "import React from 'react';\nimport SphereViewer from './SphereViewer';\n\ntype PropsType = {\n url: string;\n};\n\nconst Sphere = ({ url }: PropsType) => <SphereViewer id={url} src={url} />;\n\nexport default Sphere;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Image } from '../Gallery/wrapper';\nimport ResponsiveImage from '../ResponsiveImage';\nimport { Badge } from './wrapper';\n\n// As the gallery's own images.\nconst WIDTHS = [375, 600, 750, 1000, 1200];\nconst SIZES = '(min-width: 1200px) 800px, (min-width: 768px) calc(100vw - 180px), 95vw';\n\ntype PropsType = {\n urls: string[];\n};\n\n/**\n * A 360 image in the gallery: its first frame, marked as 360. A click opens the\n * lightbox, where it turns at once, as on wayke.se; turning it here would take\n * the swipe away from the gallery.\n */\nconst ThreeSixty = ({ urls }: PropsType) => {\n const { t } = useTranslation();\n return (\n <>\n <Badge>{t('item.threeSixty.badge')}</Badge>\n <ResponsiveImage\n img={Image}\n src={urls[0]}\n widths={WIDTHS}\n sizes={SIZES}\n alt={t('item.threeSixty.badge')}\n loading=\"lazy\"\n draggable={false}\n />\n </>\n );\n};\n\nexport default ThreeSixty;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\nimport { Wrapper as Container } from '../Container/wrapper';\n\nconst quickNavWidth = 83; // 75px + 8px\n\nexport const Wrapper = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n ${Container} & {\n margin-left: ${size(-3)};\n margin-right: ${size(-3)};\n }\n }\n\n ${(props) => props.theme.breakpoint.LtSm} {\n ${Container} & {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n position: relative;\n padding-right: ${quickNavWidth}px;\n }\n`;\n\nexport const Main = styled.div`\n position: relative;\n height: 0;\n padding-bottom: 66.66666667%;\n`;\n\nexport const Alt = styled.div`\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: ${quickNavWidth}px;\n padding-left: ${size(1)};\n\n ${(props) => props.theme.breakpoint.LtMd} {\n display: none;\n }\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: ${size(2.5)};\n background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n pointer-events: none;\n }\n`;\n\n/** The slides side by side; swiping and the arrows scroll it, each slide snaps in place. */\nexport const Track = styled.ul`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: -2px;\n }\n`;\n\nexport const Item = styled.li`\n position: relative;\n flex: 0 0 100%;\n height: 100%;\n overflow: hidden;\n scroll-snap-align: start;\n scroll-snap-stop: always;\n\n // On small screens the next slide peeks in, as a hint that there are more.\n ${(props) => props.theme.breakpoint.LtMd} {\n flex-basis: 95%;\n border-right: ${size(1)} solid ${(props) => props.theme.color.bg};\n }\n`;\n\nexport const Image = styled.img`\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: cover;\n cursor: pointer;\n`;\n\nexport const ImageFull = styled.img`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\n// Arrow Nav\n\nconst Arrow = styled.div`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n ${(props) => props.theme.breakpoint.LtSm} {\n display: none;\n }\n`;\n\nexport const ArrowLeft = styled(Arrow)`\n left: ${size(2)};\n`;\n\nexport const ArrowRight = styled(Arrow)`\n right: ${size(2)};\n`;\n\n// Quick Nav\n\nexport const QuickNav = styled.ul`\n position: relative;\n max-height: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n`;\n\ntype QuickNavItemProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLLIElement>,\n HTMLLIElement\n> & {\n $active?: boolean;\n};\n\nexport const QuickNavItem = styled.li.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))<QuickNavItemProps>`\n position: relative;\n\n & + & {\n margin-top: ${size(1)};\n }\n\n ${({ $active }) =>\n $active &&\n css`\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 3px solid currentColor;\n z-index: 2;\n }\n `}\n`;\n\nexport const QuickNavBtn = styled(ButtonReset)`\n position: relative;\n display: block;\n width: 100%;\n height: 0;\n padding-bottom: 66.66666667%; // 3:2\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.15);\n opacity: 0;\n z-index: 1;\n transition: opacity 150ms ease;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const QuickNavImg = styled.img`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\n// Media Button\n\nexport const MediaButtonWrapper = styled.div`\n position: absolute;\n bottom: ${size(2)};\n left: 50%;\n transform: translateX(-50%);\n z-index: 1;\n cursor: pointer;\n`;\n\n// Sphere Close Button\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MediaButton from '../Gallery/MediaButton';\nimport { ImageFull } from '../Gallery/wrapper';\nimport Modal from '../Modal';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport VideoPlayer from './EmbeddedVideoLightbox';\nimport useThumbnail from './useThumbnail';\nimport { onImageError, onImageLoad } from './utils';\n\ninterface GalleryEmbed {\n src: string;\n index: number;\n controls?: boolean;\n}\n\nconst GalleryEmbed = ({ src, index }: GalleryEmbed) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState<string>();\n const thumbnail = useThumbnail(src);\n\n const onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.stopPropagation();\n setModal(src);\n };\n\n const onCloseModal = (e: React.MouseEvent<HTMLButtonElement | HTMLDivElement, MouseEvent>) => {\n e.stopPropagation();\n setModal(undefined);\n };\n\n const onError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),\n [thumbnail]\n );\n\n const onLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),\n [thumbnail]\n );\n\n const customVideo = src.toLowerCase().endsWith('.mp4');\n\n if (thumbnail?.length && !customVideo) {\n return (\n <>\n <ImageFull\n onLoad={onLoad}\n src={thumbnail[0]}\n onError={onError}\n alt={t('common.imageIndex', { index: index + 1 }) || ''}\n />\n <MediaButton text={t('other.playVideo')} onClick={onClick} />\n {modal && (\n <Modal title={t('other.video')} onClose={onCloseModal}>\n <VideoPlayer url={modal} />\n </Modal>\n )}\n </>\n );\n }\n\n if (customVideo)\n return (\n <>\n <CustomPlayer ratio=\"66.66%\" isPreview controls={false} url={src} />\n <MediaButton text={t('other.playVideo')} onClick={onClick} />\n {modal && (\n <Modal title={t('other.video')} onClose={onCloseModal}>\n <VideoPlayer url={modal} />\n </Modal>\n )}\n </>\n );\n return null;\n};\n\nexport default GalleryEmbed;\n", "import React from 'react';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport { MediaButtonWrapper } from './wrapper';\n\ninterface MediaButtonProps {\n text: string;\n onClick: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n}\n\nconst MediaButton = ({ text, onClick }: MediaButtonProps) => (\n <MediaButtonWrapper>\n <ButtonSecondary onClick={onClick} title={text}>\n <ButtonContent>{text}</ButtonContent>\n </ButtonSecondary>\n </MediaButtonWrapper>\n);\n\nexport default MediaButton;\n", "import { useEffect, useState } from 'react';\nimport useVimeoThumbnail from '../../hooks/useVimeoThumbnail';\nimport { getVimeoId, getYoutubeThumbnail } from './utils';\n\nconst useThumbnail = (url?: string | null, small?: boolean) => {\n if (url?.toLowerCase().endsWith('.mp4')) return;\n\n const [thumbnail, setThumbnail] = useState<string[]>();\n const vimeoId = url ? getVimeoId(url) : undefined;\n const vimeoThumbnail = useVimeoThumbnail(vimeoId, small);\n\n useEffect(() => {\n if (url) {\n const youtubeThumbnail = getYoutubeThumbnail(url);\n if (youtubeThumbnail) {\n if (small) {\n setThumbnail([youtubeThumbnail.mqdefault]);\n } else {\n setThumbnail([youtubeThumbnail.maxresdefault, youtubeThumbnail.hqdefault]);\n }\n }\n }\n }, [url]);\n\n return vimeoThumbnail ? [vimeoThumbnail] : thumbnail;\n};\n\nexport default useThumbnail;\n", "import { useEffect, useState } from 'react';\nimport useFetch from './useFetch';\n\ninterface VimeoItem {\n thumbnail_large: string;\n thumbnail_small: string;\n}\n\nconst useVimeoThumbnail = (id?: string, small?: boolean) => {\n const [thumbnail, setThumbnail] = useState<string>();\n const { data } = useFetch<VimeoItem[]>(\n `http://vimeo.com/api/v2/video/${id}.json`,\n {},\n !id || !!thumbnail,\n true\n );\n\n useEffect(() => {\n if (data?.[0]) {\n if (small && data[0].thumbnail_small) {\n setThumbnail(data[0].thumbnail_small);\n } else if (data[0].thumbnail_large) {\n setThumbnail(data[0].thumbnail_large);\n }\n }\n }, [data]);\n\n return thumbnail;\n};\n\nexport default useVimeoThumbnail;\n", "import { useCallback, useEffect, useState } from 'react';\n\nconst cache: { [key: string]: unknown | undefined } = {};\n\nconst getCachedResult = <T>(key: string) => (cache?.[key] as T) || undefined;\nconst setCachedResult = <T>(key: string, value: T) => {\n cache[key] = value;\n};\n\n/**\n * Reusing already fired request by attaching to same promise.\n * Usefull if multiple request is fetching from same endpoint, while\n * the first request has not been finished (so no cache exist yet).\n */\n\nlet pendingPromise: { [key: string]: Promise<globalThis.Response> } = {};\nconst isPendingPromise = (url: string) => !!pendingPromise[url];\nconst setPendingPromise = (url: string, promise: Promise<globalThis.Response>) => {\n pendingPromise = {\n ...pendingPromise,\n [url]: promise,\n };\n};\nconst clearPendingPromise = (url: string) => {\n delete pendingPromise[url];\n};\n\ninterface Response<T> {\n loading: boolean;\n data?: T;\n error: boolean;\n}\n\nconst useFetch = <T>(\n path: RequestInfo,\n options?: RequestInit,\n skip?: boolean,\n promiseCache?: boolean\n): Response<T> => {\n const [data, setData] = useState<T | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n const doFetch = useCallback(async () => {\n const key = path.toString();\n const cached = getCachedResult<T>(key);\n setError(false);\n if (cached) {\n setData(cached);\n return;\n }\n setLoading(true);\n try {\n const reusePromise = promiseCache && isPendingPromise(key);\n const request = reusePromise ? pendingPromise[key] : fetch(path, options);\n if (promiseCache) {\n setPendingPromise(key, request);\n }\n\n const result = await request;\n if (result.ok) {\n const json = await result.clone().json();\n setCachedResult(key, json);\n setData(json);\n }\n } catch {\n setError(true);\n } finally {\n setLoading(false);\n clearPendingPromise(key);\n }\n return;\n }, [path, options]);\n\n useEffect(() => {\n if (!skip) {\n doFetch();\n }\n }, [path, skip]);\n\n return {\n loading,\n data,\n error,\n };\n};\n\nexport default useFetch;\n", "import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { QuickNavImg } from '../Gallery/wrapper';\nimport CustomPlayer from '../Video/CustomPlayer';\nimport useThumbnail from './useThumbnail';\nimport { onImageError, onImageLoad } from './utils';\n\ninterface QuickNavEmbededProps {\n src?: string;\n index: number;\n}\n\nconst QuickNavEmbeded = ({ src, index }: QuickNavEmbededProps) => {\n const { t } = useTranslation();\n const thumbnail = useThumbnail(src);\n const onError = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageError(e, thumbnail),\n [thumbnail]\n );\n\n const onLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement, Event>) => onImageLoad(e, thumbnail),\n [thumbnail]\n );\n\n const customVideo = src?.toLowerCase().endsWith('.mp4');\n\n if (thumbnail?.length && !customVideo)\n return (\n <QuickNavImg\n onLoad={onLoad}\n src={thumbnail[0]}\n onError={onError}\n alt={t('common.imageIndex', { index: index + 1 }) || ''}\n />\n );\n if (customVideo) return <CustomPlayer key={index} url={src} ratio=\"66.66%\" />;\n return null;\n};\n\nexport default QuickNavEmbeded;\n", "import React from 'react';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport Insurance from './Insurance';\nimport InsuranceFree from './InsuranceFree';\n\ninterface InsuranceOptionsProps {\n provider: InsuranceProvider;\n}\n\n/** A quote needs a personal number and a distance; without them the offer is just described. */\nconst InsuranceOptions = ({ provider }: InsuranceOptionsProps) =>\n provider.requiresDistance && provider.requiresPersonalNumber ? (\n <Insurance provider={provider} />\n ) : (\n <InsuranceFree provider={provider} />\n );\n\nexport default InsuranceOptions;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { adEvent } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport { VisualHeading } from '../Heading';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent, OptionBoxHeading } from '../OptionBox/wrapper';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport InsuranceModal from './InsuranceModal';\n\ninterface InsuranceProps {\n provider: InsuranceProvider;\n}\n\nconst Insurance = ({ provider }: InsuranceProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'InsuranceClose' : 'InsuranceOpen', adEvent(ad));\n }, [modal, ad]);\n\n return (\n <>\n {modal && <InsuranceModal onClose={toggleModal} provider={provider} />}\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{t('item.addInsurance')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n <OptionBox\n logo={provider.logo || undefined}\n logoAlt={provider.title || t('common.logotype')}\n >\n <OptionBoxHeading>{t('item.getInsuranceQuote')}</OptionBoxHeading>\n <OptionBoxContent>\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.moreInformation')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </OptionBox>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default Insurance;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport useInsuranceInquiry, { DrivingDistance } from '../../Gql/ad/useInsuranceInquiry';\nimport { adEvent, str } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport { numberSeparator } from '../../utils/formats';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ssnIsValid } from '../../utils/ssn';\nimport { ButtonContent, ButtonInline, ButtonPrimary } from '../Button';\nimport { ColumnRow, ColumnRowItem } from '../ColumnRow';\nimport Content from '../Content';\nimport { ContentLogo, ContentLogoMedia, ContentLogoText } from '../ContentLogo';\nimport DetailBox from '../DetailBox';\nimport ExtendInfo from '../ExtendInfo';\nimport { H4 } from '../Heading';\nimport { InputGroup, InputGroupColumn } from '../InputGroup';\nimport InputLabel from '../InputLabel';\nimport InputSelect, { OptionProps } from '../InputSelect';\nimport InputText from '../InputText';\nimport Loader from '../Loader';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\nimport Snackbar from '../Snackbar';\nimport { UtilityTextBold } from '../Utility';\n\ninterface FormData {\n ssn: string;\n drivingDistance: DrivingDistance;\n}\n\ninterface InsuranceModalProps {\n onClose: () => void;\n provider: InsuranceProvider;\n}\n\nconst InsuranceModal = ({ onClose, provider }: InsuranceModalProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { publicApi } = useSettings();\n const [form, setForm] = useState<FormData>({\n ssn: '',\n drivingDistance: 'BETWEEN_0_AND_1000',\n });\n const [payload, setPayload] = useState<FormData>();\n const { loading, insurances, error } = useInsuranceInquiry(\n publicApi,\n ad.id,\n ssnIsValid(payload?.ssn) ? payload?.ssn : undefined,\n payload?.drivingDistance\n );\n\n const onChangeSsn = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => setForm({ ...form, ssn: e.currentTarget.value }),\n [form]\n );\n\n const onChangeDrivingDistance = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) =>\n setForm({ ...form, drivingDistance: e.currentTarget.value as DrivingDistance }),\n [form]\n );\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n\n const onShowInsurances = useCallback(() => {\n PubSub.publish('InsuranceInterest', trackPayload);\n setPayload(form);\n }, [form, trackPayload]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode === 13 && ssnIsValid(form.ssn) && !loading) {\n onShowInsurances();\n }\n },\n [form]\n );\n\n const options: OptionProps[] = [\n { value: 'BETWEEN_0_AND_1000', displayName: '0 - 1000' },\n { value: 'BETWEEN_1000_AND_1500', displayName: '1000 - 1500' },\n { value: 'BETWEEN_1500_AND_2000', displayName: '1500 - 2000' },\n { value: 'BETWEEN_2000_AND_2500', displayName: '2000 - 2500' },\n { value: 'OVER_2500', displayName: '2500+' },\n ];\n\n return (\n <Modal title={t('item.insurance')} onClose={onClose}>\n {(provider.description || provider.logo) && (\n <Repeat>\n {provider.description ? (\n <ContentLogo>\n <ContentLogoText>\n <Content>\n <p>{provider.description}</p>\n </Content>\n </ContentLogoText>\n {provider.logo && (\n <ContentLogoMedia>\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n </ContentLogoMedia>\n )}\n </ContentLogo>\n ) : (\n <>\n {provider.logo && (\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n )}\n </>\n )}\n </Repeat>\n )}\n\n <Repeat>\n <RepeatSmall>\n <RepeatTiny>\n <InputGroup>\n <InputGroupColumn>\n <InputLabel htmlFor=\"input-insurance-personalnumber\">\n {t('item.personalNumber')}\n </InputLabel>\n <InputText\n placeholder=\"\u00C5\u00C5\u00C5\u00C5MMDD-XXXX\"\n label={t('item.personalNumber')}\n value={form.ssn}\n onChange={onChangeSsn}\n onKeyDown={onKeyDown}\n id=\"input-insurance-personalnumber\"\n />\n </InputGroupColumn>\n <InputGroupColumn>\n <InputLabel htmlFor=\"input-insurance-mileage\">\n {t('item.estimatedAnualMileage')}\n </InputLabel>\n <InputSelect\n value={form.drivingDistance}\n onChange={onChangeDrivingDistance}\n options={options}\n unit=\"mil\"\n title={t('item.estimatedAnualMileage')}\n />\n </InputGroupColumn>\n </InputGroup>\n </RepeatTiny>\n <RepeatTiny>\n <ButtonPrimary\n fullWidth\n disabled={!ssnIsValid(form.ssn) || loading}\n onClick={onShowInsurances}\n >\n <ButtonContent>{t('item.showInsurances')}</ButtonContent>\n </ButtonPrimary>\n </RepeatTiny>\n </RepeatSmall>\n <RepeatSmall>\n <Content small>\n <p>{t('item.savePersonalNumberOnThisDeviceHelp')}</p>\n </Content>\n </RepeatSmall>\n </Repeat>\n\n {loading && (\n <Repeat>\n <Loader />\n </Repeat>\n )}\n\n {error && (\n <Repeat>\n <Snackbar severity=\"error\" icon heading={t('common.anErrorHasOccured') || undefined}>\n {t('item.couldNotfetchInsurances')}\n </Snackbar>\n </Repeat>\n )}\n\n <>\n {insurances && (\n <Repeat>\n {insurances.map((insurance) => (\n <Repeat key={insurance.name}>\n <DetailBox\n heading={`${numberSeparator(insurance.price)} ${insurance.unit}`}\n description={insurance.name}\n >\n <Repeat>\n <>\n {insurance.description && (\n <RepeatTiny>\n <Content>\n <p>{insurance.description}</p>\n </Content>\n </RepeatTiny>\n )}\n </>\n <>\n {str(insurance.details?.terms) && (\n <RepeatTiny>\n <ButtonInline\n as=\"a\"\n href={insurance.details.terms || ''}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n title={t('item.openPrePurchaseInformationInNewTab') || ''}\n >\n {t('item.openPrePurchaseInformationInNewTab')}\n </ButtonInline>\n </RepeatTiny>\n )}\n </>\n </Repeat>\n {insurance.insuranceItems.length > 0 && (\n <Repeat>\n <H4>{t('item.insuranceIncludes')}</H4>\n {insurance.insuranceItems.map((item) => (\n <RepeatSmall key={item.name || ''}>\n <ExtendInfo title={item.name || ''}>{item.description}</ExtendInfo>\n </RepeatSmall>\n ))}\n </Repeat>\n )}\n {insurance.addons && insurance.addons.length > 0 && (\n <Repeat>\n <H4>{t('item.addInsuranceHeading')}</H4>\n {insurance.addons.map((addon) => (\n <RepeatSmall key={addon.title || ''}>\n <ColumnRow>\n <ColumnRowItem>\n <ExtendInfo title={addon.title || ''}>{addon.description}</ExtendInfo>\n </ColumnRowItem>\n <ColumnRowItem>\n <UtilityTextBold>\n +{addon.price} {insurance.unit}\n </UtilityTextBold>\n </ColumnRowItem>\n </ColumnRow>\n </RepeatSmall>\n ))}\n </Repeat>\n )}\n </DetailBox>\n </Repeat>\n ))}\n </Repeat>\n )}\n </>\n </Modal>\n );\n};\n\nexport default InsuranceModal;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { INSURANCE_INQUIRY_QUERY } from './queries';\nimport { InsuranceInquiryData, InsuranceInquiryInsurance } from './types';\n\n/** Yearly driving distance in Swedish mil, as the public API's DrivingDistance enum. */\nexport type DrivingDistance =\n | 'BETWEEN_0_AND_1000'\n | 'BETWEEN_1000_AND_1500'\n | 'BETWEEN_1500_AND_2000'\n | 'BETWEEN_2000_AND_2500'\n | 'OVER_2500';\n\n/** Insurance quotes through iteration.commerce.insuranceInquiry. */\nconst useInsuranceInquiry = (\n settings: PublicApiSettings,\n adId: string,\n personalNumber?: string,\n drivingDistance?: DrivingDistance\n) => {\n const [insurances, setInsurances] = useState<InsuranceInquiryInsurance[]>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const skip = !personalNumber || !drivingDistance;\n\n useEffect(() => {\n if (skip) return;\n let active = true;\n setLoading(true);\n setError(false);\n gqlQuery<InsuranceInquiryData>(settings.api, INSURANCE_INQUIRY_QUERY, {\n id: adId,\n socialId: personalNumber,\n drivingDistance,\n })\n .then((data) => {\n const list = data.ads?.byAdId?.iteration?.commerce.insuranceInquiry?.insurances || [];\n if (active) setInsurances(list.filter((i): i is InsuranceInquiryInsurance => !!i));\n })\n .catch(() => active && setError(true))\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [skip, adId, personalNumber, drivingDistance]);\n\n return { loading, error, insurances };\n};\n\nexport default useInsuranceInquiry;\n", "export const ssnIsValid = (s?: string) => (s ? /^\\d{2,4}\\d{2}\\d{2}-?\\d{4}$/.test(s) : false);\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const ColumnRow = styled.div`\n display: flex;\n align-items: flex-start;\n`;\n\nexport const ColumnRowItem = styled.div`\n flex: 1 1 auto;\n\n &:last-child:not(:only-child) {\n flex: 0 0 auto;\n }\n\n & + & {\n padding-left: ${size(2)};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Description, Foldout, Footer, Heading, Main, Wrapper } from './wrapper';\n\ninterface Props {\n heading: string;\n description?: string;\n children: React.ReactNode;\n}\n\nconst DetailBox = ({ heading, description, children }: Props) => {\n const { t } = useTranslation();\n const [extend, setExtend] = React.useState(false);\n const onToggleExtend = React.useCallback(() => setExtend(!extend), [extend]);\n\n const extendBtnText = extend ? t('common.lessInformation') : t('common.moreInformation');\n\n return (\n <Wrapper>\n <Main>\n <Heading>{heading}</Heading>\n {description && <Description>{description}</Description>}\n <Footer>\n <ButtonClear onClick={onToggleExtend}>\n <ButtonContent>{extendBtnText}</ButtonContent>\n </ButtonClear>\n </Footer>\n </Main>\n {extend && <Foldout>{children}</Foldout>}\n </Wrapper>\n );\n};\n\nexport default DetailBox;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { H2 } from '../Heading';\n\nexport const Wrapper = styled.article`\n box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n overflow: hidden;\n`;\n\nexport const Main = styled.div`\n padding: ${size(2.5)};\n`;\n\nexport const Heading = styled(H2).attrs(() => ({\n as: 'h1',\n}))`\n margin-bottom: 0;\n`;\n\nexport const Description = styled.div`\n margin-top: ${size(1)};\n`;\n\nexport const Footer = styled.div`\n margin-top: ${size(1)};\n color: red;\n`;\n\nexport const Foldout = styled.div`\n background-color: ${(props) => props.theme.color.accent};\n padding: ${size(2.5)};\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconInfo } from '../Icon';\nimport { Extend, Header, Info, InfoBtn, Title, Wrapper } from './wrapper';\n\ninterface Props {\n title: string;\n children?: React.ReactNode;\n}\n\nconst ExtendInfo = ({ title, children }: Props) => {\n const { t } = useTranslation();\n const [extend, setExtend] = useState(false);\n const onToggleExtend = useCallback(() => setExtend(!extend), [extend]);\n\n return (\n <Wrapper>\n <Header>\n <Title>{title}</Title>\n {children && (\n <Info>\n <InfoBtn onClick={onToggleExtend} title={t('common.moreInformation') || ''}>\n <IconInfo block />\n </InfoBtn>\n </Info>\n )}\n </Header>\n {extend && <Extend>{children}</Extend>}\n </Wrapper>\n );\n};\n\nexport default ExtendInfo;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div``;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Title = styled.div``;\n\nexport const Info = styled.div`\n margin-left: ${size(1)};\n`;\n\nexport const InfoBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n font: inherit;\n font-size: 1em;\n transform-origin: 50% 50%;\n transition: transform 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8);\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Extend = styled.div`\n padding-top: ${size(1)};\n margin-top: ${size(1)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n font-size: 0.875em;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const InputGroup = styled.div`\n ${(props) => props.theme.breakpoint.Sm} {\n display: flex;\n align-items: flex-start;\n margin: ${size(-0.5)};\n }\n`;\n\nexport const InputGroupColumn = styled.div`\n ${(props) => props.theme.breakpoint.LtSm} {\n & + & {\n margin-top: ${size(1)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Sm} {\n flex: 1 1 50%;\n padding: ${size(0.5)};\n }\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n children: string;\n htmlFor?: string;\n}\n\nconst InputLabel = ({ children, htmlFor }: Props) => (\n <Wrapper htmlFor={htmlFor}>{children}</Wrapper>\n);\n\nexport default InputLabel;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.label.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n margin-bottom: ${size(0.5)};\n font-size: 0.875rem;\n`;\n", "import React from 'react';\nimport { IconChevronDown } from '../Icon';\nimport { Icon, Option, Select, Wrapper } from './wrapper';\n\nexport interface OptionProps {\n value: number | string;\n displayName?: number | string | null;\n}\n\ninterface Props {\n value?: string | number;\n options?: OptionProps[];\n unit?: string;\n title: string;\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n}\n\nconst InputSelect = ({ value, options, onChange, unit, title }: Props) => (\n <Wrapper>\n <Select value={value} onChange={onChange} title={title} aria-label={title}>\n {options?.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.displayName || option.value}\n {unit ? ` ${unit}` : ''}\n </Option>\n ))}\n </Select>\n <Icon>\n <IconChevronDown block />\n </Icon>\n </Wrapper>\n);\n\nexport default InputSelect;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nconst iconSize = '0.875rem';\nconst selectPadding = size(2);\n\nexport const Wrapper = styled.div`\n position: relative;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Select = styled.select.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n position: relative;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n text-indent: 0.01px;\n border: 0;\n padding: 0 ${selectPadding};\n padding-right: calc(${iconSize} + ${selectPadding});\n background-color: transparent;\n color: ${(props) => props.theme.color.textDark};\n border-radius: 0;\n font-size: 16px;\n cursor: pointer;\n z-index: 1;\n\n &:focus {\n outline: none;\n }\n\n ::-ms-expand {\n display: none;\n }\n\n ::-moz-focus-inner {\n border: 0;\n }\n`;\n\nexport const Option = styled.option`\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const Icon = styled.div`\n position: absolute;\n top: 50%;\n right: ${selectPadding};\n transform: translateY(-50%);\n font-size: ${iconSize};\n`;\n", "import React from 'react';\n\nimport { Input, Wrapper } from './wrapper';\n\ntype Props = React.InputHTMLAttributes<HTMLInputElement> & {\n value: string;\n label: string;\n};\n\nconst InputText = ({ label, ...props }: Props) => (\n <Wrapper>\n <Input aria-label={label} {...props} />\n </Wrapper>\n);\n\nexport default InputText;\n", "import type React from 'react';\nimport styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Input = styled.input.attrs<React.InputHTMLAttributes<HTMLInputElement>>((props) => ({\n type: props.type || 'text',\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n height: ${(props) => props.theme.distances.inputHeight};\n padding: 0 ${size(2)};\n background-color: transparent;\n font-size: 16px;\n border: none;\n border-radius: 0;\n box-shadow: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::-webkit-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &::-moz-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n\n &:-ms-input-placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { adEvent } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport { VisualHeading } from '../Heading';\nimport OptionBox from '../OptionBox';\nimport { OptionBoxContent } from '../OptionBox/wrapper';\nimport { Repeat, RepeatTiny } from '../Repeat';\nimport InsuranceFreeModal from './InsuranceFreeModal';\n\ninterface InsuranceFreeProps {\n provider: InsuranceProvider;\n}\n\nconst InsuranceFree = ({ provider }: InsuranceFreeProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [modal, setModal] = useState(false);\n const toggleModal = useCallback(() => {\n setModal(!modal);\n PubSub.publish(modal ? 'InsuranceClose' : 'InsuranceOpen', adEvent(ad));\n }, [modal, ad]);\n\n return (\n <>\n {modal && <InsuranceFreeModal onClose={toggleModal} provider={provider} />}\n <Repeat>\n <RepeatTiny>\n <VisualHeading>{provider.insuranceHeader ?? t('item.insurance')}</VisualHeading>\n </RepeatTiny>\n <RepeatTiny>\n <OptionBox\n logo={provider.logo || undefined}\n logoAlt={provider.title || t('common.logotype')}\n >\n {provider.description && <Content markdown={provider.description} />}\n <OptionBoxContent>\n <p>\n <ButtonInline onClick={toggleModal}>{t('common.moreInformation')}</ButtonInline>\n </p>\n </OptionBoxContent>\n </OptionBox>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default InsuranceFree;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InsuranceProvider } from '../../Gql/ad/types';\nimport { ButtonInline } from '../Button';\nimport Content from '../Content';\nimport LogoBox from '../LogoBox';\nimport Modal from '../Modal';\nimport { Repeat } from '../Repeat';\n\ninterface InsuranceFreeModalProps {\n onClose: () => void;\n provider: InsuranceProvider;\n}\n\nconst InsuranceFreeModal = ({ onClose, provider }: InsuranceFreeModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={provider.insuranceHeader ?? t('item.insurance')} onClose={onClose}>\n {provider.longDescription && (\n <Repeat>\n <Content markdown={provider.longDescription} />\n </Repeat>\n )}\n {provider.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={provider.url}\n title={t('item.readMoreAboutInsuranceInNewTab') || ''}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t('item.readMoreAboutInsuranceInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {provider.logo && (\n <Repeat>\n <LogoBox logo={provider.logo} alt={provider.title || t('common.logotype')} wide />\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default InsuranceFreeModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { numberSeparator } from '../../utils/formats';\nimport { VisualHeading } from '../Heading';\nimport { OldPrice, Price } from '../Price';\nimport { Item, Label, List, Value } from './wrapper';\n\ninterface PriceTableProps {\n price: number;\n discount?: number;\n}\n\nconst PriceTable = ({ price, discount }: PriceTableProps) => {\n const { t } = useTranslation();\n return (\n <List>\n <Item>\n <Label>\n <VisualHeading>{t('other.price')}</VisualHeading>\n </Label>\n <Value>\n <Price>\n {numberSeparator(price)} {t('currency.default')}\n </Price>\n </Value>\n </Item>\n {discount !== undefined && (\n <Item>\n <Label />\n <Value>\n <OldPrice>\n {numberSeparator(price + discount)} {t('currency.default')}\n </OldPrice>\n </Value>\n </Item>\n )}\n </List>\n );\n};\n\nexport default PriceTable;\n", "import styled from 'styled-components';\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n font-size: 1.375rem;\n`;\n\nexport const OldPrice = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n text-decoration: line-through;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n display: flex;\n align-items: flex-end;\n line-height: 1;\n\n & + & {\n margin-top: ${size(0.5)};\n }\n`;\n\nexport const Label = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Value = styled.div`\n flex-shrink: 0;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { Wrapper as Container } from '../Container/wrapper';\n\nexport const ProductPage = styled.div`\n display: flex;\n flex-direction: column;\n\n ${(props) => props.theme.breakpoint.Md} {\n flex-direction: row;\n }\n`;\n\nexport const ProductPageAside = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: contents;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n flex-shrink: 0;\n width: calc(375px + ${size(2)});\n padding-right: ${size(2)};\n }\n`;\n\nexport const ProductPageMain = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: contents;\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n flex: 1 1 100%;\n min-width: 0;\n padding-left: ${size(2)};\n }\n`;\n\ntype ProductPageAsideSectionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n> & {\n mobileOrder?: number;\n};\n\nexport const ProductPageAsideSection = styled.div<ProductPageAsideSectionProps>`\n ${(props) => props.theme.breakpoint.LtMd} {\n order: ${(props) => props.mobileOrder};\n\n & + & {\n margin-top: ${size(2)};\n }\n\n &:last-child {\n margin-bottom: ${size(4)};\n }\n\n ${ProductPageMain} & {\n margin-top: ${size(2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n & + & {\n margin-top: ${size(4)};\n }\n\n ${ProductPageMain} & {\n margin-bottom: ${size(8)};\n }\n }\n`;\n\nexport const ProductPageMainSection = styled.div`\n ${(props) => props.theme.breakpoint.LtMd} {\n order: 99;\n padding: ${size(4)} 0;\n border-top: ${size(1)} solid ${(props) => props.theme.color.accent};\n\n ${Container} & {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n padding-left: ${size(2)};\n padding-right: ${size(2)};\n }\n }\n\n ${(props) => props.theme.breakpoint.Md} {\n & + & {\n margin-top: ${size(8)};\n padding-top: ${size(8)};\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n }\n`;\n\nexport const ProductPageContentLimit = styled.div`\n max-width: 420px;\n`;\n", "// The ad page's data from the public API. Older links carry a legacy id that\n// differs from ad.id: when byAdId finds nothing the id is resolved through\n// byIterationId and the address bar is rewritten to ad.id, as web-ui-v2 does.\n\nimport { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { AD_ID_BY_LEGACY_ID_QUERY, AD_QUERY } from './queries';\nimport { Ad, AdData, AdIdByLegacyIdData } from './types';\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst fetchAd = async (settings: PublicApiSettings, id: string): Promise<Ad | null> => {\n const data = await gqlQuery<AdData>(settings.api, AD_QUERY, { id });\n return data.ads?.byAdId || null;\n};\n\nconst resolveLegacyId = async (settings: PublicApiSettings, id: string) => {\n if (!UUID.test(id)) return null;\n try {\n const data = await gqlQuery<AdIdByLegacyIdData>(settings.api, AD_ID_BY_LEGACY_ID_QUERY, {\n id,\n });\n return data.ads?.byIterationId?.ads?.[0]?.id || null;\n } catch (_e) {\n return null;\n }\n};\n\nconst replaceIdInUrl = (from: string, to: string) => {\n const { pathname, search, hash } = window.location;\n if (pathname.includes(from) || hash.includes(from)) {\n history.replaceState(\n history.state,\n '',\n `${pathname.replace(from, to)}${search}${hash.replace(from, to)}`\n );\n }\n};\n\nconst useAd = (id: string, settings: PublicApiSettings) => {\n const [ad, setAd] = useState<Ad>();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n let active = true;\n setLoading(true);\n setError(false);\n (async () => {\n let next = await fetchAd(settings, id);\n if (!next) {\n const adId = await resolveLegacyId(settings, id);\n if (adId && adId !== id) {\n next = await fetchAd(settings, adId);\n if (next) replaceIdInUrl(id, adId);\n }\n }\n if (active) setAd(next || undefined);\n })()\n .catch(() => active && setError(true))\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [id, settings.api.url, settings.api.apiKey]);\n\n return { loading, error, ad };\n};\n\nexport default useAd;\n", "import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport AccessoryCard from '../../../components/AccessoryCard';\nimport Content from '../../../components/Content';\nimport { H2 } from '../../../components/Heading';\nimport OverflowGrid from '../../../components/OverflowGrid';\nimport { ProductPageMainSection } from '../../../components/ProductPage';\nimport { Repeat } from '../../../components/Repeat';\nimport { AdAccessory } from '../../../Gql/ad/types';\nimport { accessoryImages } from '../../../Gql/ad/view';\nimport { numberSeparator } from '../../../utils/formats';\nimport AccesoryModal from './AccessoryModal';\n\ninterface AccessoriesSectionProps {\n accessories: AdAccessory[];\n}\n\nconst AccessoriesSection = ({ accessories }: AccessoriesSectionProps) => {\n const { t } = useTranslation();\n const [modal, setModal] = useState<AdAccessory | undefined>();\n\n const onOpenModal = (accessory: AdAccessory) => setModal(accessory);\n const onCloseModal = () => setModal(undefined);\n\n if (!accessories?.length) return null;\n\n return (\n <>\n {modal && <AccesoryModal accessory={modal} onClose={onCloseModal} />}\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{t('item.accessories.accessories')}</H2>\n </Repeat>\n <Repeat>\n <Content>\n <p>{t('item.accessories.accessoriesDescription')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <OverflowGrid\n columns={1.05}\n columnsSm={2.1}\n columnsMd={2}\n spacing={2}\n items={accessories.map((accessory) => (\n <AccessoryCard\n key={accessory.id}\n title={accessory.name}\n image={\n accessoryImages(accessory)[0]\n ? {\n src: `${accessoryImages(accessory)[0]}?w=539&h=303`,\n alt: accessory.name,\n }\n : undefined\n }\n price={`${numberSeparator(accessory.price ?? 0)} ${t('currency.default')}`}\n preamble={accessory.shortDescription}\n readMoreCta={() => onOpenModal(accessory)}\n />\n ))}\n />\n </Repeat>\n </ProductPageMainSection>\n </>\n );\n};\n\nexport default AccessoriesSection;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { IconImage } from '../Icon';\nimport {\n Body,\n Branding,\n Heading,\n Image,\n ImageaPlaceholder,\n Preamble,\n Price,\n ReadMoreBtn,\n Title,\n Wrapper,\n} from './wrapper';\n\ninterface AccessoryCardImageProps {\n src: string;\n srcSet?: string;\n alt: string;\n}\n\ninterface AccessoryCardProps {\n title: string;\n image?: AccessoryCardImageProps;\n branding?: AccessoryCardImageProps;\n price?: string;\n preamble?: string;\n readMoreCta?: () => void;\n}\n\nconst AccessoryCard = ({\n title,\n image,\n branding,\n price,\n preamble,\n readMoreCta,\n}: AccessoryCardProps) => {\n const { t } = useTranslation();\n return (\n <Wrapper>\n {image ? (\n <Image src={image.src} srcSet={image.srcSet} alt={image.alt} />\n ) : (\n <ImageaPlaceholder>\n <IconImage />\n </ImageaPlaceholder>\n )}\n <Body>\n <Heading>\n <Title>{title}</Title>\n {branding && <Branding src={branding.src} srcSet={branding.srcSet} alt={branding.alt} />}\n </Heading>\n {price && <Price>{price}</Price>}\n {preamble && <Preamble>{preamble}</Preamble>}\n {readMoreCta && (\n <ReadMoreBtn onClick={readMoreCta} title={t('common.readMore') || ''}>\n {t('common.readMore')}\n </ReadMoreBtn>\n )}\n </Body>\n </Wrapper>\n );\n};\n\nexport default AccessoryCard;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${size(2)};\n height: 100%;\n`;\n\nconst imageBaseStyling = css`\n flex-shrink: 0;\n aspect-ratio: 16 / 9;\n border-radius: 3px;\n`;\n\nexport const Image = styled.img`\n ${imageBaseStyling};\n display: block;\n width: 100%;\n object-fit: cover;\n`;\n\nexport const ImageaPlaceholder = styled.div`\n ${imageBaseStyling};\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 2rem;\n background-color: ${(props) => props.theme.color.accent};\n`;\n\nexport const Body = styled.div`\n flex: 1 1 auto;\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n gap: ${size(1)};\n`;\n\nexport const Heading = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${size(2)};\n`;\n\nexport const Title = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1.125rem;\n`;\n\nexport const Branding = styled.img`\n display: block;\n`;\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))``;\n\nexport const Preamble = styled.div`\n --preamble-max-height: ${size(6)};\n --preamble-gradient-height: calc(var(--preamble-max-height) / 2);\n\n position: relative;\n max-height: var(--preamble-max-height);\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n white-space: pre-wrap;\n\n &::before {\n content: '';\n position: absolute;\n top: var(--preamble-max-height);\n left: 0;\n width: 100%;\n height: var(--preamble-gradient-height);\n transform: translateY(-100%); // Only visible if Preamble reaches max height\n color: ${(props) => props.theme.color.bg};\n mask-image: ${(props) => props.theme.mask.gradient.toTop};\n pointer-events: none;\n }\n`;\n\nexport const ReadMoreBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__font--bold wayke__color--primary-text',\n}))`\n margin-top: auto;\n display: block;\n color: ${(props) => props.theme.color.link};\n font-size: 0.875rem;\n\n &:hover {\n text-decoration: underline;\n }\n`;\n", "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { IconChevronLeft, IconChevronRight } from '../Icon';\nimport { NavButton } from '../NavButton';\nimport { Item, List, ListWrapper, NextBtn, PrevBtn, Wrapper } from './wrapper';\n\nexport interface IOverflowGrid {\n items: React.ReactNode[];\n itemKeyBase?: string;\n spacing?: number;\n columns?: number;\n columnsSm?: number;\n columnsMd?: number;\n accentBg?: boolean;\n}\n\nconst OverflowGrid = ({\n items,\n itemKeyBase,\n spacing,\n columns,\n columnsSm,\n columnsMd,\n accentBg,\n}: IOverflowGrid) => {\n const overflowElement = useRef<HTMLUListElement | null>(null);\n\n const onPrev = useCallback(() => {\n const itemWidth = overflowElement.current?.children[0].clientWidth || 0;\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n\n if (scrollLeft > 0) {\n overflowElement.current?.scroll({\n left: scrollLeft - itemWidth,\n behavior: 'smooth',\n });\n }\n }, []);\n\n const onNext = useCallback(() => {\n const itemWidth = overflowElement.current?.children[0].clientWidth || 0;\n const scrollWidth = overflowElement.current?.scrollWidth || 0;\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n const overflowElementWidth = overflowElement.current?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n\n if (overflowElementScrollWidth !== scrollLeft) {\n overflowElement.current?.scroll({\n left: scrollLeft + itemWidth,\n behavior: 'smooth',\n });\n }\n }, []);\n\n // Hide navigation buttons depending on scroll position\n const [hidePrevNav, setHidePrevNav] = useState(true);\n const [hideNextNav, setHideNextNav] = useState(true);\n\n const onScroll = () => {\n const scrollLeft = overflowElement.current?.scrollLeft || 0;\n const scrollWidth = overflowElement.current?.scrollWidth || 0;\n const overflowElementWidth = overflowElement.current?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n\n setHidePrevNav(scrollLeft == 0 ? true : false);\n setHideNextNav(overflowElementScrollWidth == scrollLeft ? true : false);\n };\n\n useEffect(() => {\n onScroll();\n overflowElement.current?.addEventListener('scroll', onScroll);\n return () => overflowElement.current?.removeEventListener('scroll', onScroll);\n }, []);\n\n return (\n <Wrapper $accentBg={accentBg}>\n <ListWrapper $spacing={spacing}>\n <List\n ref={overflowElement}\n $columns={columns}\n $columnsSm={columnsSm}\n $columnsMd={columnsMd}\n >\n {items.map((item, i) => (\n <Item key={itemKeyBase ? `${itemKeyBase}-${i}` : `overflow-grid-item-${i}`}>\n {item}\n </Item>\n ))}\n </List>\n </ListWrapper>\n {!hidePrevNav && (\n <PrevBtn>\n <NavButton onClick={onPrev} title=\"Previous\">\n <IconChevronLeft />\n </NavButton>\n </PrevBtn>\n )}\n {!hideNextNav && (\n <NextBtn>\n <NavButton onClick={onNext} title=\"Next\">\n <IconChevronRight />\n </NavButton>\n </NextBtn>\n )}\n </Wrapper>\n );\n};\n\nexport default OverflowGrid;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface WrapperProps {\n $accentBg?: boolean;\n}\n\nexport const Wrapper = styled.div<WrapperProps>`\n --container-gutter: ${size(2)};\n --bg: ${(props) => props.theme.color.bg};\n\n ${(props) => props.theme.breakpoint.Sm} {\n --container-gutter: ${size(3)};\n }\n\n position: relative;\n\n ${({ $accentBg }) =>\n $accentBg &&\n css`\n --bg: ${(props) => props.theme.color.accent};\n `}\n`;\n\nexport const Item = styled.li`\n flex: 1 0 auto;\n width: 100%;\n max-width: 100%;\n scroll-snap-align: start;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n &:is(:only-child, #important) {\n width: 100%;\n max-width: 100%;\n }\n }\n`;\n\ninterface ListProps {\n $columns?: number;\n $columnsSm?: number;\n $columnsMd?: number;\n}\n\nexport const List = styled.ul<ListProps>`\n display: flex;\n align-items: stretch;\n list-style: none;\n padding: 0 var(--container-gutter);\n margin: 0;\n overflow: auto;\n scroll-snap-type: x mandatory;\n scroll-padding-left: var(--container-gutter);\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n ${({ $columns }) =>\n $columns &&\n css`\n ${Item} {\n width: ${100 / $columns}%;\n max-width: ${100 / $columns}%;\n }\n `}\n\n ${({ $columnsSm }) =>\n $columnsSm &&\n css`\n ${(props) => props.theme.breakpoint.Sm} {\n ${Item} {\n width: ${100 / $columnsSm}%;\n max-width: ${100 / $columnsSm}%;\n }\n }\n `}\n\n ${({ $columnsMd }) =>\n $columnsMd &&\n css`\n ${(props) => props.theme.breakpoint.Md} {\n ${Item} {\n width: ${100 / $columnsMd}%;\n max-width: ${100 / $columnsMd}%;\n }\n }\n `}\n`;\n\ninterface ListWrapperProps {\n $spacing?: number;\n}\n\nexport const ListWrapper = styled.div<ListWrapperProps>`\n position: relative;\n overflow: hidden;\n margin: 0 calc(var(--container-gutter) * -1);\n\n ${(props) => props.theme.breakpoint.Md} {\n &::before,\n &::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--container-gutter);\n background-color: var(--bg);\n z-index: 1;\n }\n\n &::before {\n left: 0;\n\n ${({ $spacing }) =>\n $spacing\n ? css`\n mask-image: linear-gradient(to right, #000 ${size($spacing)}, transparent);\n `\n : css`\n mask-image: ${(props) => props.theme.mask.gradient.toRight};\n `}\n }\n\n &::after {\n right: 0;\n\n ${({ $spacing }) =>\n $spacing\n ? css`\n mask-image: linear-gradient(to left, #000 ${size($spacing)}, transparent);\n `\n : css`\n mask-image: ${(props) => props.theme.mask.gradient.toLeft};\n `}\n }\n }\n\n ${({ $spacing }) =>\n $spacing &&\n css`\n ${List} {\n margin: 0 -${size($spacing / 2)};\n }\n\n ${Item} {\n padding: 0 ${size($spacing / 2)};\n }\n `}\n`;\n\nconst NavBtn = styled.div`\n position: absolute;\n top: 50%;\n z-index: 2;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n display: none;\n }\n`;\n\nexport const PrevBtn = styled(NavBtn)`\n left: 0;\n transform: translate(-50%, -50%);\n`;\n\nexport const NextBtn = styled(NavBtn)`\n right: 0;\n transform: translate(50%, -50%);\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Content from '../../../components/Content';\nimport { Image } from '../../../components/Image';\nimport { Link } from '../../../components/Link';\nimport LogoBox from '../../../components/LogoBox';\nimport Modal from '../../../components/Modal';\nimport PriceBox from '../../../components/PriceBox';\nimport { Repeat } from '../../../components/Repeat';\nimport { UtilityTextBold } from '../../../components/Utility';\nimport { AdAccessory } from '../../../Gql/ad/types';\nimport { accessoryImages } from '../../../Gql/ad/view';\nimport { numberSeparator } from '../../../utils/formats';\n\ninterface AccesoryModalProps {\n accessory: AdAccessory;\n onClose: () => void;\n}\n\nconst AccesoryModal = ({ accessory, onClose }: AccesoryModalProps) => {\n const { t } = useTranslation();\n const image = accessoryImages(accessory)[0];\n const priceList = [\n {\n label: t('item.accessories.price'),\n price: `${numberSeparator(accessory.price ?? 0)} ${t('currency.default')}`,\n oldPrice: false,\n },\n ];\n\n if (accessory.salePrice) {\n priceList.push({\n label: t('item.accessories.oldPrice'),\n price: `${numberSeparator(accessory.salePrice)} ${t('currency.default')}`,\n oldPrice: true,\n });\n }\n\n if (accessory.assemblyPrice) {\n priceList.push({\n label: t('item.accessories.installationCost'),\n price: `${numberSeparator(accessory.assemblyPrice)} ${t('currency.default')}`,\n oldPrice: false,\n });\n }\n\n return (\n <Modal title={accessory.name} onClose={onClose}>\n {image && (\n <Repeat>\n <Image src={`${image}?w=632`} alt={`${accessory.name}`} />\n </Repeat>\n )}\n {accessory.logoUrl && (\n <Repeat>\n <LogoBox\n logo={`${accessory.logoUrl}?w=160`}\n logo2x={`${accessory.logoUrl}?w=320`}\n alt={accessory.manufacturer || t('common.logotype') || ''}\n wide\n />\n </Repeat>\n )}\n <Repeat>\n <PriceBox prices={priceList} />\n </Repeat>\n\n <Repeat>\n <Content markdown={accessory.longDescription || ''} />\n </Repeat>\n {accessory.articleNumber && (\n <Repeat>\n <UtilityTextBold as=\"div\">{t('item.accessories.articleNumberShort')}</UtilityTextBold>\n <div>{accessory.articleNumber}</div>\n </Repeat>\n )}\n {accessory.productPageLink && (\n <Repeat>\n <Link\n href={accessory.productPageLink}\n title={\n t('item.accessories.moreInformationAboutAccessory', {\n accessory: accessory.name,\n }) || ''\n }\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n {accessory.productPageLinkText || t('common.readMore')} ({t('common.opensInNewTab')})\n </Link>\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default AccesoryModal;\n", "import styled from 'styled-components';\n\nexport const Image = styled.img`\n display: block;\n width: 100%;\n`;\n", "import React from 'react';\n\nimport { Label, Price, Row, Wrapper } from './wrapper';\n\ninterface PriceBoxItemProps {\n label: string;\n price: string;\n oldPrice?: boolean;\n}\n\ninterface PriceBoxProps {\n prices: PriceBoxItemProps[];\n}\n\nconst PriceBox = ({ prices }: PriceBoxProps) => (\n <Wrapper>\n {prices?.map((item, i) => (\n <Row key={`${item.label}-${i}`} $oldPrice={item.oldPrice}>\n <Label>{item.label}</Label>\n <Price>{item.price}</Price>\n </Row>\n ))}\n </Wrapper>\n);\n\nexport default PriceBox;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.ul`\n --price-box-gutter: ${size(2)};\n\n list-style: none;\n padding: var(--price-box-gutter);\n margin: 0;\n border: 1px solid ${(props) => props.theme.color.border};\n`;\n\ninterface RowProps {\n $oldPrice?: boolean;\n}\n\nexport const Row = styled.li<RowProps>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--price-box-gutter);\n\n & + & {\n margin-top: calc(var(--price-box-gutter) / 4);\n }\n\n ${({ $oldPrice }) =>\n $oldPrice &&\n css`\n --price-text-decoration: line-through;\n\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 0.875rem;\n `}\n`;\n\nexport const Label = styled.div``;\n\nexport const Price = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n text-decoration: var(--price-text-decoration);\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonInlineBold } from '../../components/Button';\nimport { H2 } from '../../components/Heading';\nimport Map from '../../components/Map';\nimport OpeningHours from '../../components/OpeningHours';\nimport PhoneNumber from '../../components/PhoneNumber';\nimport { ProductPageContentLimit } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { TableColumn, TableColumnCell, TableColumnRow } from '../../components/TableColumn';\nimport { Ad } from '../../Gql/ad/types';\nimport { openingHours, position } from '../../Gql/ad/view';\nimport { formatPhonenumber } from '../../utils/phonenumbers';\n\ninterface BranchProps {\n branch: Ad['branch'];\n displayBranchName?: boolean;\n}\n\nconst Branch = ({ branch, displayBranchName }: BranchProps) => {\n const { t } = useTranslation();\n const hours = openingHours(branch);\n const phone = branch.contactInformation?.telephone;\n\n return (\n <>\n <Repeat>\n <H2 noMargin>\n {displayBranchName\n ? `${t('item.thisCarsIsLocatedAt')} ${branch.displayName}`\n : branch.city\n ? t('item.thisCarIsAvailableAtOurBranch', { location: branch.city })\n : t('item.contact')}\n </H2>\n </Repeat>\n <Repeat>\n <Map position={position(branch)} />\n </Repeat>\n <Repeat>\n <ProductPageContentLimit>\n <Repeat>\n <TableColumn>\n {branch.street && branch.city && (\n <TableColumnRow>\n <TableColumnCell>{t('common.address')}</TableColumnCell>\n <TableColumnCell>\n <ButtonInlineBold>\n <ButtonContent>{`${branch.street}, ${branch.city}`}</ButtonContent>\n </ButtonInlineBold>\n </TableColumnCell>\n </TableColumnRow>\n )}\n {phone && <PhoneNumber phoneNumber={formatPhonenumber(phone)} />}\n </TableColumn>\n </Repeat>\n {hours && (\n <Repeat>\n <OpeningHours openingHours={hours} />\n </Repeat>\n )}\n </ProductPageContentLimit>\n </Repeat>\n </>\n );\n};\n\nexport default Branch;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useSettings from '../../State/Settings/useSettings';\nimport { ButtonContent, ButtonSecondary } from '../Button';\nimport { Image, Placeholder, PlaceholderAction, Wrapper } from './wrapper';\n\ninterface StaticMapProps {\n position?: { latitude: number; longitude: number };\n}\n\nconst StaticMap = ({ position }: StaticMapProps) => {\n const { t } = useTranslation();\n const { googleMapsApiKey, googleMapsMarker } = useSettings();\n const [visible, setVisible] = useState(false);\n\n const onShowMap = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (googleMapsApiKey) {\n e.preventDefault();\n setVisible(true);\n }\n }, []);\n\n if (!position) {\n return null;\n }\n\n const { latitude, longitude } = position;\n\n if (visible && googleMapsApiKey) {\n return (\n <Wrapper\n href={`https://maps.google.com/maps?q=${latitude},${longitude}`}\n title={t('item.showOnGoogleMaps')}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n >\n <Image\n src={`https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=10&size=640x280&maptype=roadmap&markers=${\n googleMapsMarker ? `icon:${encodeURIComponent(googleMapsMarker)}` : ''\n }%7C${latitude},${longitude}&key=${googleMapsApiKey}`}\n alt={t('item.googleMapsMapAlt')}\n />\n </Wrapper>\n );\n }\n return (\n <Placeholder\n href={`https://maps.google.com/maps?q=${latitude},${longitude}`}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n onClick={onShowMap}\n >\n <PlaceholderAction>\n <ButtonSecondary as=\"div\">\n <ButtonContent>{t('item.googleMapsPlaceholderInit')}</ButtonContent>\n </ButtonSecondary>\n </PlaceholderAction>\n </Placeholder>\n );\n};\n\nexport default StaticMap;\n", "import styled from 'styled-components';\n\nexport const Wrapper = styled.a`\n display: block;\n`;\n\nexport const Image = styled.img`\n display: block;\n width: 100%;\n border-radius: 3px;\n`;\n\nexport const Placeholder = styled.a`\n display: block;\n position: relative;\n width: 100%;\n height: 0;\n padding-bottom: 43.75%; // Proportions of Google Static Map (640x280)\n background-image: linear-gradient(-15deg, #dfe4ce, #c1d6ea, #dfe4ce);\n border-radius: 3px;\n color: ${(props) => props.theme.color.textDark};\n`;\n\nexport const PlaceholderAction = styled.div`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n", "import { TFunction } from 'i18next';\nimport React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { DayKey, WeekOpeningHours } from '../../Gql/ad/view';\nimport Badge from '../Badge';\nimport { RepeatSmall } from '../Repeat';\nimport { TableColumn, TableColumnCell, TableColumnRow } from '../TableColumn';\nimport { UtilityTextBold } from '../Utility';\n\ntype KeyType = DayKey;\nconst KeyOrder: KeyType[] = [\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n];\n\nconst TranslateWeekDays = (t: TFunction<'translation', undefined>, d: KeyType) => {\n switch (d) {\n case 'monday':\n return t('common.mondayShort');\n case 'tuesday':\n return t('common.tuesdayShort');\n case 'wednesday':\n return t('common.wednesdayShort');\n case 'thursday':\n return t('common.thursdayShort');\n case 'friday':\n return t('common.fridayShort');\n case 'saturday':\n return t('common.saturdayShort');\n case 'sunday':\n return t('common.sundayShort');\n }\n};\n\ninterface OpeningHoursSample {\n titleFrom: string;\n titleTo?: string;\n from?: string | null;\n until?: string | null;\n}\n\nconst arr: OpeningHoursSample[] = [];\n\nconst GetOpeningHours = (t: TFunction<'translation', undefined>, o: WeekOpeningHours) =>\n KeyOrder.reduce((prev, current) => {\n const title = TranslateWeekDays(t, current);\n const item = o[current];\n const previous = prev?.[prev.length - 1];\n if (previous && previous.from == item?.from && previous.until === item?.until) {\n prev[prev.length - 1].titleTo = title;\n } else {\n prev.push({\n titleFrom: title,\n from: item?.from,\n until: item?.until,\n });\n }\n\n return prev;\n }, arr.slice());\n\nconst GetOpeningHoursToday = (t: TFunction<'translation', undefined>, o: WeekOpeningHours) => {\n const dayNumber = new Date().getDay();\n const day = KeyOrder[dayNumber === 0 ? 6 : dayNumber - 1] as KeyType;\n const current = o[day];\n return {\n title: current ? t('item.openingHoursToday') : t('item.closedToday'),\n from: current?.from,\n until: current?.until,\n };\n};\n\nconst valuOfDateString = (s: string) => {\n const splitted = s.split(':').map((x) => parseInt(x, 10));\n return new Date().setHours(splitted[0], splitted[1]).valueOf();\n};\n\ninterface OpeningHoursProps {\n openingHours?: WeekOpeningHours;\n}\n\nconst OpeningHours = ({ openingHours }: OpeningHoursProps) => {\n const { t } = useTranslation();\n const today = useMemo(\n () => (openingHours ? GetOpeningHoursToday(t, openingHours) : null),\n [openingHours]\n );\n\n const currentlyOpen = useMemo(() => {\n try {\n if (today?.from && today?.until) {\n const currentDate = new Date().valueOf();\n const from = valuOfDateString(today.from);\n const until = valuOfDateString(today.until);\n return currentDate >= from && currentDate <= until;\n }\n } catch {\n return false;\n }\n }, [today]);\n\n const oh = useMemo(\n () => (openingHours ? GetOpeningHours(t, openingHours) : null),\n [openingHours]\n );\n if (!oh) {\n return null;\n }\n\n return (\n <>\n <RepeatSmall>\n <Badge\n label={currentlyOpen ? t('item.open') : t('item.closed')}\n severity={currentlyOpen ? 'positive' : 'negative'}\n />\n </RepeatSmall>\n <RepeatSmall>\n <TableColumn>\n <TableColumnRow>\n <TableColumnCell>\n <UtilityTextBold>{today?.title}</UtilityTextBold>\n </TableColumnCell>\n <TableColumnCell>\n <UtilityTextBold>\n {today?.from ? `${today.from} - ${today.until}` : t('item.closed')}\n </UtilityTextBold>\n </TableColumnCell>\n </TableColumnRow>\n {oh.map((o) => (\n <TableColumnRow key={o.titleFrom}>\n <TableColumnCell>\n {o.titleTo ? `${o.titleFrom} - ${o.titleTo}` : o.titleFrom}\n </TableColumnCell>\n <TableColumnCell>\n {o.from ? `${o.from} - ${o.until}` : t('item.closed')}\n </TableColumnCell>\n </TableColumnRow>\n ))}\n </TableColumn>\n </RepeatSmall>\n </>\n );\n};\n\nexport default OpeningHours;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n label: string;\n severity?: 'positive' | 'negative';\n}\n\nconst Badge = ({ label, severity }: Props) => <Wrapper severity={severity}>{label}</Wrapper>;\n\nexport default Badge;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport theme from '../../layout/theme';\n\nconst getBg = (severity: string | undefined): string => {\n let bg = theme.color.textDark;\n\n if (severity === 'positive') {\n bg = theme.color.ui.positive;\n } else if (severity === 'negative') {\n bg = theme.color.ui.negative;\n }\n\n return bg;\n};\n\ninterface Wrapper {\n severity?: string;\n}\n\nexport const Wrapper = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))<Wrapper>`\n display: inline-block;\n background-color: ${(props): string => getBg(props.severity)};\n padding: ${size(0.75)} ${size(1.5)};\n color: ${(props) => props.theme.color.textLight};\n border-radius: 3px;\n font-size: 0.75rem;\n line-height: 1.2;\n`;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const TableColumn = styled.div`\n line-height: 1.2;\n`;\n\nexport const TableColumnRow = styled.div`\n display: flex;\n align-items: flex-start;\n margin: ${size(-1)};\n`;\n\nexport const TableColumnCell = styled.div`\n flex: 1 0 50%;\n padding: ${size(1)};\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonInlineBold } from '../Button';\nimport { TableColumnCell, TableColumnRow } from '../TableColumn';\n\ninterface PhoneNumberProps {\n phoneNumber: string;\n}\n\nconst PhoneNumber = ({ phoneNumber }: PhoneNumberProps) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n const onClick = useCallback(() => !visible && setVisible(true), [visible]);\n\n return (\n <TableColumnRow>\n <TableColumnCell>{t('other.phoneNumber')}</TableColumnCell>\n <TableColumnCell>\n {visible ? (\n <ButtonInlineBold\n as=\"a\"\n href={`tel:${phoneNumber}`}\n title={t('other.callPhoneNumber', { phoneNumber }) || ''}\n >\n <ButtonContent>{phoneNumber}</ButtonContent>\n </ButtonInlineBold>\n ) : (\n <ButtonInlineBold onClick={onClick} title={t('other.showPhoneNumber') || ''}>\n <ButtonContent>{t('other.showPhoneNumber')}</ButtonContent>\n </ButtonInlineBold>\n )}\n </TableColumnCell>\n </TableColumnRow>\n );\n};\n\nexport default PhoneNumber;\n", "import { MetadataJson, parsePhoneNumberFromString } from 'libphonenumber-js/core';\n\nimport _metadata from './metadata.min.json';\n\nconst metadata = _metadata as unknown as MetadataJson;\n\nconst typedMetadata = metadata as unknown as MetadataJson;\n\nexport const formatPhonenumber = (text: string) => {\n try {\n const parsed = parsePhoneNumberFromString(\n text.replace('-', '').replace(/ /g, ''),\n typedMetadata\n );\n return parsed?.formatNational() || text;\n } catch {\n return text;\n }\n};\n", "{\"version\":4,\"country_calling_codes\":{\"46\":[\"SE\"],\"47\":[\"NO\"]},\"countries\":{\"NO\":[\"47\",\"00\",\"(?:0|[2-9]\\\\d{3})\\\\d{4}\",[5,8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-79]\"]]],0,0,0,0,0,\"[02-689]|7[0-8]\",[[\"(?:2[1-4]|3[1-3578]|5[1-35-7]|6[1-4679]|7[0-8])\\\\d{6}\",[8]],[\"(?:4[015-8]|9\\\\d)\\\\d{6}\",[8]],[\"80[01]\\\\d{5}\",[8]],[\"82[09]\\\\d{5}\",[8]],[\"880\\\\d{5}\",[8]],0,[\"(?:0[2-9]|81(?:0(?:0[7-9]|1\\\\d)|5\\\\d\\\\d))\\\\d{3}\"],0,[\"85[0-5]\\\\d{5}\",[8]],[\"810(?:0[0-6]|[2-8]\\\\d)\\\\d{3}\",[8]]]],\"SE\":[\"46\",\"00\",\"(?:[26]\\\\d\\\\d|9)\\\\d{9}|[1-9]\\\\d{8}|[1-689]\\\\d{7}|[1-4689]\\\\d{6}|2\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"20\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"9(?:00|39|44|9)\"],\"0$1\",0,\"$1 $2\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3\",[\"[12][136]|3[356]|4[0246]|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d)(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{3})\",\"$1-$2 $3\",[\"9(?:00|39|44)\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"10|7\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1-$2 $3 $4\",[\"9\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4 $5\",[\"[26]\"],\"0$1\",0,\"$1 $2 $3 $4 $5\"]],\"0\",0,0,0,0,0,[[\"(?:(?:[12][136]|3[356]|4[0246]|6[03]|8\\\\d)\\\\d|90[1-9])\\\\d{4,6}|(?:1(?:2[0-35]|4[0-4]|5[0-25-9]|7[13-6]|[89]\\\\d)|2(?:2[0-7]|4[0136-8]|5[0138]|7[018]|8[01]|9[0-57])|3(?:0[0-4]|1\\\\d|2[0-25]|4[056]|7[0-2]|8[0-3]|9[023])|4(?:1[013-8]|3[0135]|5[14-79]|7[0-246-9]|8[0156]|9[0-689])|5(?:0[0-6]|[15][0-5]|2[0-68]|3[0-4]|4\\\\d|6[03-5]|7[013]|8[0-79]|9[01])|6(?:1[1-3]|2[0-4]|4[02-57]|5[0-37]|6[0-3]|7[0-2]|8[0247]|9[0-356])|9(?:1[0-68]|2\\\\d|3[02-5]|4[0-3]|5[0-4]|[68][01]|7[0135-8]))\\\\d{5,6}\",[7,8,9]],[\"7[02369]\\\\d{7}\",[9]],[\"20\\\\d{4,7}\",[6,7,8,9]],[\"649\\\\d{6}|99[1-59]\\\\d{4}(?:\\\\d{3})?|9(?:00|39|44)[1-8]\\\\d{3,6}\",[7,8,9,10]],[\"75[1-8]\\\\d{6}\",[9]],0,[\"10[1-8]\\\\d{6}\",[9]],[\"74[02-9]\\\\d{6}\",[9]],0,[\"77[0-7]\\\\d{6}\",[9]]]]},\"nonGeographic\":{}}", "import { format } from 'date-fns';\nimport { nb, sv } from 'date-fns/locale';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConversionOption } from '../../@types/conversion';\nimport ActionList from '../../components/ActionList';\nimport { ButtonInline } from '../../components/Button';\nimport CheckMarkList, { CheckMarkListItem } from '../../components/CheckMarkList';\nimport { Column, Columns } from '../../components/Columns';\nimport Content from '../../components/Content';\nimport { Repeat, RepeatTiny } from '../../components/Repeat';\nimport { StateIndicator } from '../../components/StateIndicator';\nimport SwitchBar from '../../components/SwitchBar';\nimport { UtilityFontSizeSmall } from '../../components/Utility';\nimport {\n availableFrom as adAvailableFrom,\n ecom,\n manufacturerPackage,\n packageOffers,\n} from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport PackageOptionModal, { PackageOptionModalData } from './PackageOptionModal';\n\ninterface CheckListProps {\n title: string;\n conversionOptions?: ConversionOption[];\n // Undefined when the site turns buy online off, which hides the buy button.\n toggleEcomModal?: () => void;\n}\n\nconst CheckList = ({ title, conversionOptions, toggleEcomModal }: CheckListProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { marketCode } = useSettings();\n const ecommerce = ecom(ad);\n const availableFrom = adAvailableFrom(ad);\n const packageOption = manufacturerPackage(ad);\n const packageOptions = packageOffers(ad);\n\n const [modal, setModal] = useState<PackageOptionModalData>();\n const onOpen = useCallback((nextModal: PackageOptionModalData) => setModal(nextModal), []);\n const onClose = useCallback(() => setModal(undefined), []);\n\n return (\n <>\n {modal && <PackageOptionModal packageOption={modal} onClose={onClose} />}\n <Repeat>\n <ActionList\n title={title}\n conversionOptions={conversionOptions}\n toggleEcomModal={toggleEcomModal}\n />\n {ecommerce.enabled && ecommerce.reserved && (\n <RepeatTiny>\n <SwitchBar\n title={t('item.carIsReserved')}\n body={t('item.carIsReservedDescription') || undefined}\n >\n <Content>\n <p>{t('item.carIsReservedModalBody')}</p>\n </Content>\n </SwitchBar>\n </RepeatTiny>\n )}\n </Repeat>\n <Repeat>\n {availableFrom && new Date(availableFrom).valueOf() > new Date().valueOf() && (\n <RepeatTiny>\n <Columns $spacing={1} valign=\"center\">\n <Column noShrink>\n <StateIndicator $tone=\"pending\" />\n </Column>\n <Column>\n <UtilityFontSizeSmall>\n {t('item.availableFromDate', {\n date: format(new Date(availableFrom), 'dd MMMM yyyy', {\n locale: marketCode === 'NO' ? nb : sv,\n }),\n })}\n </UtilityFontSizeSmall>\n </Column>\n </Columns>\n </RepeatTiny>\n )}\n <RepeatTiny>\n <CheckMarkList>\n {packageOption?.title && (\n <CheckMarkListItem>\n <>\n {t('item.includingShort')}{' '}\n <ButtonInline onClick={() => onOpen(packageOption)}>\n {packageOption.title}\n </ButtonInline>{' '}\n {t('item.usedWarrany').toLowerCase()}\n </>\n </CheckMarkListItem>\n )}\n {packageOptions?.map((packageOption, index) => (\n <CheckMarkListItem key={packageOption.title || index}>\n <>\n {t('item.includingShort')}{' '}\n <ButtonInline onClick={() => onOpen(packageOption)}>\n {packageOption.title}\n </ButtonInline>\n </>\n </CheckMarkListItem>\n ))}\n {ecommerce.enabled && ad.iteration?.commerce.homeDelivery && (\n <CheckMarkListItem>{t('item.homeDelivery')}</CheckMarkListItem>\n )}\n </CheckMarkList>\n </RepeatTiny>\n </Repeat>\n </>\n );\n};\n\nexport default CheckList;\n", "import React, { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n ConversionOption,\n ConversionOptionEmail,\n ConversionOptionText,\n ConversionOptionVehicle,\n defaultConversionOptions,\n} from '../../@types/conversion';\nimport { adEvent, contactPerson, ecom } from '../../Gql/ad/view';\nimport useAdContext from '../../State/Ad/AdContext';\nimport { formatPhonenumber } from '../../utils/phonenumbers';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport LeadForm, { LeadCommunication } from '../LeadForm';\nimport { RepeatTiny } from '../Repeat';\nimport ToggleItem from './toggle-item';\n\ninterface ActionListProps {\n title: string;\n conversionOptions?: ConversionOption[];\n /** Undefined when the site turns buy online off, which hides the buy button. */\n toggleEcomModal?: () => void;\n}\n\nconst resolveText = (text: ConversionOptionText, vehicle: ConversionOptionVehicle) =>\n typeof text === 'function' ? text(vehicle) : text;\n\nconst ActionList = ({\n title,\n conversionOptions = defaultConversionOptions,\n toggleEcomModal,\n}: ActionListProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const contact = contactPerson(ad);\n const email = contact?.email || ad.branch.contactInformation?.email;\n const phonenumber = contact?.phone || ad.branch.contactInformation?.telephone;\n const ecommerce = ecom(ad);\n\n const vehicle = useMemo<ConversionOptionVehicle>(() => {\n const item = ad.iteration?.item;\n return {\n id: ad.id,\n title,\n registrationNumber: item?.registrationNumber?.stringValue,\n manufacturer: item?.manufacturer?.stringValue,\n modelSeries: item?.modelSeries?.stringValue,\n };\n }, [ad, title]);\n\n // Pre-populated subject/body gives the dealer a way to tell these leads apart from\n // other inbound mail, and tells them which site and vehicle the request concerns.\n const emailHref = useCallback(\n (option: ConversionOptionEmail) => {\n if (!email) return undefined;\n const vehicleLabel = [\n vehicle.registrationNumber,\n [vehicle.manufacturer, vehicle.modelSeries].filter(Boolean).join(' '),\n ]\n .filter(Boolean)\n .join(', ');\n const subject = option.subject\n ? resolveText(option.subject, vehicle)\n : t('item.actions.emailSubject', {\n hostName: window.location.hostname,\n vehicle: vehicleLabel,\n });\n const params = new URLSearchParams({ subject });\n if (option.body !== false) {\n params.set(\n 'body',\n option.body\n ? resolveText(option.body, vehicle)\n : t('item.actions.emailBody', { url: window.location.href })\n );\n }\n // URLSearchParams encodes spaces as \"+\", which mail clients render literally.\n return `${email}?${params.toString().replace(/\\+/g, '%20')}`;\n },\n [email, vehicle, t]\n );\n\n const trackPayload = useMemo(() => adEvent(ad), [ad]);\n const onClickMailVisible = useCallback(\n () => PubSub.publish('MailVisible', trackPayload),\n [trackPayload]\n );\n const onClickMailValue = useCallback(\n () => PubSub.publish('MailClick', trackPayload),\n [trackPayload]\n );\n const onClickPhoneVisible = useCallback(\n () => PubSub.publish('PhonenumberVisible', trackPayload),\n [trackPayload]\n );\n const onClickPhoneValue = useCallback(\n () => PubSub.publish('PhonenumberCall', trackPayload),\n [trackPayload]\n );\n\n const [leadCommunication, setLeadCommunication] = useState<LeadCommunication>();\n const openLeadForm = useCallback(\n (communication: LeadCommunication) => {\n setLeadCommunication(communication);\n PubSub.publish('LeadOpen', { ...trackPayload, communication });\n },\n [trackPayload]\n );\n const closeLeadForm = useCallback(() => setLeadCommunication(undefined), []);\n\n const renderButton = (\n key: string,\n label: string,\n primary: boolean,\n onClick: () => void,\n disabled?: boolean\n ) => {\n const Button = primary ? ButtonPrimary : ButtonSecondary;\n return (\n <RepeatTiny key={key}>\n <Button fullWidth disabled={disabled} onClick={onClick} title={label}>\n <ButtonContent>{label}</ButtonContent>\n </Button>\n </RepeatTiny>\n );\n };\n\n const buttons = conversionOptions.map((option, index) => {\n const key = `${option.type}-${index}`;\n switch (option.type) {\n case 'ecom':\n if (!ecommerce.enabled || !toggleEcomModal) return null;\n return renderButton(\n key,\n option.name || t('item.actions.buyOnline'),\n option.primary ?? true,\n toggleEcomModal,\n !!ecommerce.reserved\n );\n case 'leadMessage':\n return renderButton(\n key,\n option.name || t('lead.messageFormTitle'),\n option.primary ?? true,\n () => openLeadForm('email')\n );\n case 'leadCallMe':\n return renderButton(\n key,\n option.name || t('lead.callFormTitle'),\n option.primary ?? true,\n () => openLeadForm('callme')\n );\n case 'email':\n if (!email) return null;\n return (\n <ToggleItem\n key={key}\n onClickVisible={onClickMailVisible}\n onClickValue={onClickMailValue}\n title={option.name || t('item.actions.showEmail')}\n value={email}\n href={emailHref(option)}\n type=\"mailto\"\n primary={option.primary ?? false}\n />\n );\n case 'phone':\n if (!phonenumber) return null;\n return (\n <ToggleItem\n key={key}\n title={option.name || t('item.actions.showPhoneNumber')}\n value={formatPhonenumber(phonenumber)}\n type=\"tel\"\n onClickVisible={onClickPhoneVisible}\n onClickValue={onClickPhoneValue}\n primary={option.primary ?? false}\n />\n );\n default:\n return null;\n }\n });\n\n return (\n <>\n {leadCommunication && <LeadForm communication={leadCommunication} onClose={closeLeadForm} />}\n {buttons}\n </>\n );\n};\n\nexport default ActionList;\n", "import React, { useCallback, useId, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarketCode } from '../../@types/market';\nimport { adEvent } from '../../Gql/ad/view';\nimport useSubmitLead, { LeadCommunication } from '../../hooks/useSubmitLead';\nimport useAdContext from '../../State/Ad/AdContext';\nimport useSettings from '../../State/Settings/useSettings';\nimport PubSub from '../../utils/pubsub/pubsub';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport Content from '../Content';\nimport InputCheckbox from '../InputCheckbox';\nimport InputError from '../InputError';\nimport InputLabel from '../InputLabel';\nimport InputText from '../InputText';\nimport InputTextarea from '../InputTextarea';\nimport Modal from '../Modal';\nimport { Repeat, RepeatSmall, RepeatTiny } from '../Repeat';\nimport { Field } from './wrapper';\n\nexport type { LeadCommunication };\n\ninterface LeadFormProps {\n communication: LeadCommunication;\n onClose: () => void;\n}\n\ninterface FormValues {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n message: string;\n tradeInCar: boolean;\n tradeInCarRegNo: string;\n tradeInCarMileage: string;\n}\n\ntype FormErrors = Partial<Record<keyof FormValues, string>>;\n\nconst initialValues: FormValues = {\n firstName: '',\n lastName: '',\n email: '',\n phoneNumber: '',\n message: '',\n tradeInCar: false,\n tradeInCarRegNo: '',\n tradeInCarMileage: '',\n};\n\nconst MAX_MESSAGE_LENGTH = 500;\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n// Swedish plates: three letters, two digits and a final digit or letter (I, Q and V are unused).\n// Norwegian plates: two letters followed by five digits.\nconst registrationNumberPatterns: Partial<Record<MarketCode, RegExp>> = {\n SE: /^[A-HJ-PR-UW-Z]{3}[0-9]{2}[0-9A-HJ-PR-UW-Z]$/,\n NO: /^[A-Z]{2}[0-9]{5}$/,\n};\n\nexport const normalizeRegistrationNumber = (value: string) =>\n value.replace(/[\\s-]/g, '').toUpperCase();\n\nconst isValidRegistrationNumber = (value: string, marketCode: MarketCode) => {\n const pattern = registrationNumberPatterns[marketCode];\n return !pattern || pattern.test(normalizeRegistrationNumber(value));\n};\n\nconst LeadForm = ({ communication, onClose }: LeadFormProps) => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const { leadUrl, marketCode } = useSettings();\n const { submitLead, isLoading } = useSubmitLead(leadUrl, marketCode);\n const [values, setValues] = useState<FormValues>(initialValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [submitError, setSubmitError] = useState(false);\n const [sent, setSent] = useState(false);\n\n const formId = useId();\n const fieldId = (name: keyof FormValues) => `${formId}-${name}`;\n const errorId = (name: keyof FormValues) => `${formId}-${name}-error`;\n\n const title = communication === 'email' ? t('lead.messageFormTitle') : t('lead.callFormTitle');\n\n const trackPayload = useMemo(() => ({ ...adEvent(ad), communication }), [ad, communication]);\n\n const setValue = useCallback(<K extends keyof FormValues>(name: K, value: FormValues[K]) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n setErrors((prev) => (prev[name] ? { ...prev, [name]: undefined } : prev));\n }, []);\n\n const validate = useCallback(\n (v: FormValues): FormErrors => {\n const next: FormErrors = {};\n if (!v.firstName.trim()) next.firstName = t('lead.validationMessages.requiredFirstName');\n if (!v.lastName.trim()) next.lastName = t('lead.validationMessages.requiredLastName');\n if (communication === 'email') {\n if (!v.email.trim()) next.email = t('lead.validationMessages.requiredEmail');\n else if (!EMAIL_PATTERN.test(v.email.trim()))\n next.email = t('lead.validationMessages.invalidEmail');\n }\n if (communication === 'callme' && !v.phoneNumber.trim()) {\n next.phoneNumber = t('lead.validationMessages.requiredPhoneNumber');\n }\n if (v.message.length > MAX_MESSAGE_LENGTH) {\n next.message = t('lead.validationMessages.maxMessage');\n }\n if (v.tradeInCar) {\n if (!v.tradeInCarRegNo.trim()) {\n next.tradeInCarRegNo = t('lead.validationMessages.requiredRegNo');\n } else if (!isValidRegistrationNumber(v.tradeInCarRegNo, marketCode)) {\n next.tradeInCarRegNo = t('lead.validationMessages.invalidRegNo');\n }\n if (!v.tradeInCarMileage.trim()) {\n next.tradeInCarMileage = t('lead.validationMessages.requiredMileage');\n }\n }\n return next;\n },\n [communication, marketCode, t]\n );\n\n const onSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault();\n if (isLoading) return;\n\n const nextErrors = validate(values);\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) return;\n\n setSubmitError(false);\n try {\n await submitLead({\n itemId: ad.id,\n branchId: ad.branchId,\n communication,\n firstName: values.firstName.trim(),\n lastName: values.lastName.trim(),\n email: communication === 'email' ? values.email.trim() : undefined,\n phoneNumber: communication === 'callme' ? values.phoneNumber.trim() : undefined,\n message: values.message.trim(),\n tradeInCarRegNo: values.tradeInCar\n ? normalizeRegistrationNumber(values.tradeInCarRegNo)\n : undefined,\n tradeInCarMileage: values.tradeInCar ? values.tradeInCarMileage.trim() : undefined,\n });\n PubSub.publish('LeadSent', trackPayload);\n setSent(true);\n } catch {\n setSubmitError(true);\n }\n },\n [ad, communication, values, validate, submitLead, isLoading, trackPayload]\n );\n\n if (sent) {\n return (\n <Modal title={t('lead.confirmationTitle')} onClose={onClose}>\n <Repeat>\n <Content>\n <p>{t('lead.confirmationMessage')}</p>\n </Content>\n </Repeat>\n <Repeat>\n <ButtonPrimary onClick={onClose}>\n <ButtonContent>{t('lead.confirmationClose')}</ButtonContent>\n </ButtonPrimary>\n </Repeat>\n </Modal>\n );\n }\n\n const textField = (\n name:\n | 'firstName'\n | 'lastName'\n | 'email'\n | 'phoneNumber'\n | 'tradeInCarRegNo'\n | 'tradeInCarMileage',\n label: string,\n inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>\n ) => (\n <RepeatTiny>\n <Field>\n <InputLabel htmlFor={fieldId(name)}>{label}</InputLabel>\n <InputText\n id={fieldId(name)}\n label={label}\n value={values[name]}\n onChange={(e) => setValue(name, e.currentTarget.value)}\n disabled={isLoading}\n aria-required\n aria-invalid={!!errors[name]}\n aria-describedby={errors[name] ? errorId(name) : undefined}\n {...inputProps}\n />\n {errors[name] && <InputError id={errorId(name)}>{errors[name]}</InputError>}\n </Field>\n </RepeatTiny>\n );\n\n return (\n <Modal title={title} onClose={onClose}>\n <form onSubmit={onSubmit} noValidate>\n <Repeat>\n <RepeatSmall>\n {textField('firstName', t('lead.firstName'), { autoComplete: 'given-name' })}\n {textField('lastName', t('lead.lastName'), { autoComplete: 'family-name' })}\n {communication === 'email' &&\n textField('email', t('lead.email'), { type: 'email', autoComplete: 'email' })}\n {communication === 'callme' &&\n textField('phoneNumber', t('lead.phoneNumber'), { type: 'tel', autoComplete: 'tel' })}\n <RepeatTiny>\n <Field>\n <InputLabel htmlFor={fieldId('message')}>{t('lead.message')}</InputLabel>\n <InputTextarea\n id={fieldId('message')}\n label={t('lead.message')}\n value={values.message}\n maxLength={MAX_MESSAGE_LENGTH}\n onChange={(e) => setValue('message', e.currentTarget.value)}\n disabled={isLoading}\n aria-invalid={!!errors.message}\n aria-describedby={errors.message ? errorId('message') : undefined}\n />\n {errors.message && (\n <InputError id={errorId('message')}>{errors.message}</InputError>\n )}\n </Field>\n </RepeatTiny>\n <RepeatTiny>\n <InputCheckbox\n id={fieldId('tradeInCar')}\n checked={values.tradeInCar}\n disabled={isLoading}\n onChange={(e) => setValue('tradeInCar', e.currentTarget.checked)}\n >\n {t('lead.tradeInCar')}\n </InputCheckbox>\n </RepeatTiny>\n {values.tradeInCar && (\n <>\n {textField('tradeInCarRegNo', t('lead.registrationNumber'), {\n autoCapitalize: 'characters',\n })}\n {textField('tradeInCarMileage', t('lead.mileage'), { inputMode: 'numeric' })}\n </>\n )}\n </RepeatSmall>\n {submitError && (\n <RepeatSmall>\n <InputError>{t('lead.error')}</InputError>\n </RepeatSmall>\n )}\n <RepeatSmall>\n <ButtonPrimary type=\"submit\" disabled={isLoading} onClick={() => onSubmit()}>\n <ButtonContent>{t('lead.send')}</ButtonContent>\n </ButtonPrimary>{' '}\n <ButtonSecondary onClick={onClose} disabled={isLoading}>\n <ButtonContent>{t('lead.close')}</ButtonContent>\n </ButtonSecondary>\n </RepeatSmall>\n </Repeat>\n </form>\n </Modal>\n );\n};\n\nexport default LeadForm;\n", "import { useCallback, useState } from 'react';\nimport packageJson from '../../package.json';\nimport { MarketCode } from '../@types/market';\n\nexport type LeadCommunication = 'email' | 'callme';\n\ninterface LeadMetaData {\n key: string;\n value: string;\n}\n\ninterface LeadPayload {\n firstName: string;\n lastName: string;\n type: string;\n phoneNumber?: string;\n branchId: string;\n email?: string;\n metaData: LeadMetaData[];\n}\n\nexport interface LeadResponse {\n id?: string;\n branchId?: string;\n}\n\nexport interface SubmitLeadProps {\n itemId: string;\n branchId: string;\n communication: LeadCommunication;\n firstName: string;\n lastName: string;\n phoneNumber?: string;\n email?: string;\n message?: string;\n tradeInCarRegNo?: string;\n tradeInCarMileage?: string;\n}\n\n/**\n * Posts a lead straight to lead-service, same contract and metadata keys as\n * website-components-react so leads from any Wayke-powered site look the same in Dealer.\n * `source` (hostname) + `sourceMechanism` is what gives the dealer traceability.\n */\nconst useSubmitLead = (leadUrl: string, marketCode: MarketCode = 'SE') => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submitLead = useCallback(\n async ({\n itemId,\n branchId,\n communication,\n firstName,\n lastName,\n phoneNumber,\n email,\n message,\n tradeInCarRegNo,\n tradeInCarMileage,\n }: SubmitLeadProps): Promise<LeadResponse> => {\n setIsLoading(true);\n setError(null);\n\n const payload: LeadPayload = {\n firstName,\n lastName,\n phoneNumber,\n email,\n branchId,\n type: 'registrationOfInterestToBuy',\n metaData: [\n { key: 'source', value: window.location.hostname.replace(/^www\\./, '') },\n { key: 'sourceMechanism', value: `cta.${communication}` },\n // Lets Wayke tell leads from this package apart from dealer sites and wayke.se.\n { key: 'client', value: 'components-react' },\n { key: 'clientVersion', value: packageJson.version },\n { key: 'itemForSaleId', value: itemId },\n ...(tradeInCarRegNo ? [{ key: 'registrationNumber', value: tradeInCarRegNo }] : []),\n // readingUnit describes the unit of tradeInCarMileage, so it only travels with it.\n ...(tradeInCarMileage\n ? [\n { key: 'tradeInCarMileage', value: tradeInCarMileage },\n {\n key: 'readingUnit',\n value: marketCode === 'NO' ? 'Kilometer' : 'ScandinavianMile',\n },\n ]\n : []),\n { key: 'message', value: message || '' },\n ],\n };\n\n try {\n const response = await fetch(leadUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n return (await response.json()) as LeadResponse;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Something went wrong');\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [leadUrl, marketCode]\n );\n\n return { isLoading, error, submitLead };\n};\n\nexport default useSubmitLead;\n", "import * as React from 'react';\n\nimport { Input, Label, LabelText, Wrapper } from './wrapper';\n\ntype Props = React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n> & {\n id: string;\n children: React.ReactNode;\n};\n\nconst InputCheckbox = ({ children, ...props }: Props) => {\n const { id } = props;\n return (\n <Wrapper aria-labelledby={id ? `${id}-label` : undefined}>\n <Input\n {...(props as React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n >)}\n />\n <Label id={`${id}-label`} htmlFor={id}>\n <LabelText>{children}</LabelText>\n </Label>\n </Wrapper>\n );\n};\n\nexport default InputCheckbox;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Label = styled.label.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: flex;\n align-items: flex-start;\n font-size: 1rem;\n line-height: 1.2;\n cursor: pointer;\n\n &:before {\n content: '';\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: ${size(2.5)};\n height: ${size(2.5)};\n margin-right: ${size(1)};\n background-color: ${(props) => props.theme.color.accent};\n color: currentColor;\n border: none;\n box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.07);\n text-align: center;\n font-size: 15px;\n cursor: pointer;\n border-radius: 3px;\n margin-top: -2px;\n }\n`;\n\nexport const Wrapper = styled(\n (\n props: React.HTMLAttributes<HTMLDivElement> & {\n type?: string;\n checked?: boolean;\n error?: boolean;\n }\n ) => <div {...props} />\n).attrs(({ type, checked }) => ({\n role: type || 'checkbox',\n 'aria-checked': checked,\n}))`\n ${({ error }) =>\n error &&\n css`\n ${Label} {\n color: ${(props) => props.theme.color.ui.negative};\n\n &::before {\n background-color: ${(props) => props.theme.color.ui.negativeLight};\n }\n }\n `}\n`;\n\nexport const Input = styled((props: React.InputHTMLAttributes<HTMLInputElement>) => (\n <input {...props} className={`${props.checked ? 'checked' : undefined} ${props.className}`} />\n)).attrs(({ type, checked }) => ({\n checked,\n type: type || 'checkbox',\n}))`\n position: fixed;\n left: -9999px;\n opacity: 0;\n\n &[disabled] {\n & + ${Label} {\n color: ${(props) => props.theme.color.disabledText};\n\n &:before {\n background-color: ${(props) => props.theme.color.disabledBg};\n cursor: not-allowed;\n }\n }\n }\n\n &:checked,\n &.checked {\n & + ${Label} {\n &::before {\n content: '\u2713';\n }\n }\n }\n`;\n\nexport const LabelText = styled.div`\n color: ${(props) => props.theme.color.textDark};\n`;\n", "import React from 'react';\n\nimport { Wrapper } from './wrapper';\n\ninterface Props {\n id?: string;\n children: React.ReactNode;\n}\n\nconst InputError = ({ id, children }: Props) => (\n <Wrapper id={id} role=\"alert\" aria-live=\"polite\">\n {children}\n </Wrapper>\n);\n\nexport default InputError;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n margin-top: ${size(0.5)};\n font-size: 0.875rem;\n color: ${(props) => props.theme.color.ui.negative};\n`;\n", "import React from 'react';\n\nimport { Textarea, Wrapper } from './wrapper';\n\ntype Props = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n value: string;\n label: string;\n};\n\nconst InputTextarea = ({ label, ...props }: Props) => (\n <Wrapper>\n <Textarea aria-label={label} {...props} />\n </Wrapper>\n);\n\nexport default InputTextarea;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n position: relative;\n display: flex;\n align-items: stretch;\n background-color: ${(props) => props.theme.color.accent};\n border-radius: 3px;\n`;\n\nexport const Textarea = styled.textarea.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n flex: 1 1 auto;\n display: block;\n width: 100%;\n min-height: calc(${(props) => props.theme.distances.inputHeight} * 2.5);\n padding: ${size(1.5)} ${size(2)};\n background-color: transparent;\n font-family: inherit;\n font-size: 16px;\n line-height: 1.4;\n border: none;\n border-radius: 0;\n box-shadow: none;\n resize: vertical;\n -moz-appearance: none;\n -webkit-appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n font-family: inherit;\n color: ${(props) => props.theme.color.textDarkLighten};\n font-size: 1em;\n }\n`;\n", "import styled from 'styled-components';\n\nexport const Field = styled.div`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonContent, ButtonPrimary, ButtonSecondary } from '../Button';\nimport { RepeatTiny } from '../Repeat';\n\ninterface ToggleItemProps {\n title: string;\n value: string;\n type: 'tel' | 'mailto';\n /** Overrides the href target (without the `mailto:`/`tel:` scheme). Defaults to `value`. */\n href?: string;\n primary?: boolean;\n onClickVisible?: () => void;\n onClickValue?: () => void;\n}\n\nconst ToggleItem = ({\n title,\n value,\n type,\n href,\n primary,\n onClickVisible,\n onClickValue,\n}: ToggleItemProps) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n const _onClickValue = useCallback(() => {\n if (onClickValue) {\n onClickValue();\n }\n }, [onClickValue]);\n\n const onClick = useCallback(() => {\n if (!visible) {\n setVisible(true);\n if (onClickVisible) {\n onClickVisible();\n }\n }\n }, [visible, onClickVisible]);\n\n const visibleTitle =\n type === 'tel'\n ? t('item.actions.callNumber')\n : type === 'mailto'\n ? t('item.actions.sendEmailTo')\n : '';\n\n const Button = primary ? ButtonPrimary : ButtonSecondary;\n\n return (\n <RepeatTiny>\n {visible ? (\n <Button\n onClick={_onClickValue}\n as=\"a\"\n href={`${type}:${href || value}`}\n title={`${visibleTitle} ${value}`}\n fullWidth\n >\n <ButtonContent>{value}</ButtonContent>\n </Button>\n ) : (\n <Button onClick={onClick} title={title} fullWidth>\n <ButtonContent>{title}</ButtonContent>\n </Button>\n )}\n </RepeatTiny>\n );\n};\n\nexport default ToggleItem;\n", "import React from 'react';\nimport { IconCheck } from '../Icon';\nimport { Icon, Item, Label, List } from './wrapper';\n\nexport interface ICheckMarkList {\n children: React.ReactNode;\n}\n\nexport const CheckMarkListItem = ({ children }: ICheckMarkList) => (\n <Item>\n <Icon>\n <IconCheck block />\n </Icon>\n <Label>{children}</Label>\n </Item>\n);\n\nconst CheckMarkList = ({ children }: ICheckMarkList) => <List>{children}</List>;\n\nexport default CheckMarkList;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nexport const Item = styled.li`\n position: relative;\n font-size: 0.875rem;\n\n & + & {\n margin-top: ${size(0.5)};\n }\n`;\n\nexport const Icon = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: absolute;\n left: 0;\n top: 4px; // Magic number\n font-size: 0.875em;\n`;\n\nexport const Label = styled.div`\n padding-left: calc(1em + ${size(1)});\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface IColumn {\n grow?: boolean;\n noShrink?: boolean;\n}\n\nexport const Column = styled.div<IColumn>`\n flex: 0 1 auto;\n\n ${({ grow }) =>\n grow &&\n css`\n flex-grow: 1;\n `}\n\n ${({ noShrink }) =>\n noShrink &&\n css`\n flex-shrink: 0;\n `}\n`;\n\ninterface IColumns {\n $spacing?: number;\n flexWrap?: boolean;\n flexInline?: boolean;\n valign?: 'start' | 'center' | 'end';\n align?: 'start' | 'center' | 'end';\n clearLtSm?: boolean;\n clearLtMd?: boolean;\n}\n\nexport const Columns = styled.div<IColumns>`\n display: flex;\n align-items: flex-start;\n\n ${({ valign }) =>\n valign === 'end'\n ? css`\n align-items: flex-end;\n `\n : valign === 'center'\n ? css`\n align-items: center;\n `\n : css`\n align-items: flex-start;\n `}\n\n ${({ align }) =>\n align === 'end'\n ? css`\n justify-content: flex-end;\n `\n : align === 'center'\n ? css`\n justify-content: center;\n `\n : css`\n justify-content: flex-start;\n `}\n\n ${({ $spacing }) =>\n $spacing &&\n css`\n margin: ${size($spacing / -2)};\n\n & > ${Column} {\n padding: ${size($spacing / 2)};\n }\n `}\n\n ${({ flexWrap }) =>\n flexWrap &&\n css`\n flex-wrap: wrap;\n `}\n\n ${({ flexInline }) =>\n flexInline &&\n css`\n display: inline-flex;\n `}\n\n ${({ clearLtSm }) =>\n clearLtSm &&\n css`\n ${(props) => props.theme.breakpoint.LtSm} {\n display: block;\n }\n `}\n\n ${({ clearLtMd }) =>\n clearLtMd &&\n css`\n ${(props) => props.theme.breakpoint.LtMd} {\n display: block;\n }\n `}\n`;\n", "import styled, { css } from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\ninterface StateIndicatorProps {\n $tone?: 'success' | 'pending' | 'error';\n}\n\nexport const StateIndicator = styled.div<StateIndicatorProps>`\n width: ${size(1)};\n height: ${size(1)};\n border-radius: 50%;\n\n ${({ $tone }) =>\n $tone === 'success'\n ? css`\n background-color: ${(props) => props.theme.color.ui.positive};\n `\n : $tone === 'pending'\n ? css`\n background-color: ${(props) => props.theme.color.ui.neutral};\n `\n : $tone === 'error'\n ? css`\n background-color: ${(props) => props.theme.color.ui.negative};\n `\n : css`\n background-color: ${(props) => props.theme.color.textDarkLighten};\n `}\n`;\n", "import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../Button';\nimport { IconInfo } from '../Icon';\nimport Modal from '../Modal';\nimport { Action, Body, Header, Info, InfoBtn, InfoContent, Title, Wrapper } from './wrapper';\n\ninterface Props {\n title: string;\n body?: string;\n actionTitle?: string;\n children: React.ReactNode;\n onClick?: () => void;\n}\n\nconst SwitchBar = ({ title, body, actionTitle, children, onClick }: Props) => {\n const { t } = useTranslation();\n const [info, setInfo] = useState(false);\n const onToggleInfo = useCallback(() => setInfo(!info), [info]);\n\n return (\n <>\n <Wrapper>\n <Header>\n <Info>\n <InfoContent>\n <Title>{title}</Title>\n </InfoContent>\n {children && (\n <InfoContent>\n <InfoBtn onClick={onToggleInfo} title={t('common.moreInformation') || ''}>\n <IconInfo block />\n </InfoBtn>\n </InfoContent>\n )}\n </Info>\n {actionTitle && (\n <Action>\n <ButtonInline onClick={onClick} title={actionTitle}>\n {actionTitle}\n </ButtonInline>\n </Action>\n )}\n </Header>\n {body && <Body>{body}</Body>}\n </Wrapper>\n {info && (\n <Modal title={title} onClose={onToggleInfo}>\n {children}\n </Modal>\n )}\n </>\n );\n};\n\nexport default SwitchBar;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n padding: ${size(1.5)} ${size(2)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 3px;\n font-size: 0.875rem;\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Body = styled.div`\n font-size: 0.875rem;\n margin-top: ${size(1)};\n`;\n\nexport const Info = styled.div`\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n padding-left: ${size(1.5)};\n font-size: 0.875rem;\n`;\n\nexport const InfoContent = styled.div`\n & + & {\n margin-left: ${size(0.75)};\n }\n`;\n\nexport const InfoBtn = styled(ButtonReset).attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n position: relative;\n display: block;\n\n &:before {\n content: '';\n position: absolute;\n top: ${size(-0.5)};\n bottom: ${size(-0.5)};\n left: ${size(-0.5)};\n right: ${size(-0.5)};\n background-color: ${(props) => props.theme.color.accentDark};\n border-radius: 50%;\n opacity: 0;\n transition: opacity 200ms ease;\n }\n\n > * {\n position: relative;\n z-index: 1;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nexport const Title = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--bold',\n}))`\n font-size: 1rem;\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport LogoBox from '../../components/LogoBox';\nimport Modal from '../../components/Modal';\nimport { Repeat } from '../../components/Repeat';\n\ninterface ModelLink {\n url?: string | null;\n title?: string | null;\n}\n\nexport interface PackageOptionModalData {\n title?: string | null;\n image?: string | null;\n description?: string | null;\n link?: ModelLink | null;\n}\n\ninterface PackageOptionsModalProps {\n packageOption: PackageOptionModalData;\n onClose: () => void;\n}\n\nconst PackageOptionModal = ({ packageOption, onClose }: PackageOptionsModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={packageOption.title || ''} onClose={onClose}>\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={packageOption.title || undefined} wide />\n </Repeat>\n )}\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n </Modal>\n );\n};\n\nexport default PackageOptionModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Content from '../../components/Content';\nimport Modal from '../../components/Modal';\n\ninterface DemoCarModalProps {\n onClose: () => void;\n}\n\nconst DemoCarModal = ({ onClose }: DemoCarModalProps) => {\n const { t } = useTranslation();\n return (\n <Modal title={t('item.demoCar')} onClose={onClose}>\n <Content>\n <p>{t('item.demoCarDescription')}</p>\n </Content>\n </Modal>\n );\n};\n\nexport default DemoCarModal;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport DocumentList from '../../components/DocumentList';\nimport ExtendContent from '../../components/ExtendContent';\nimport { H2, H3 } from '../../components/Heading';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { AdDocument } from '../../Gql/ad/types';\n\nconst SortOrder = {\n 'tyre-label': 2,\n 'content declaration': 1,\n other: 3,\n};\n\ntype CategoryType = keyof typeof SortOrder;\n\ninterface DocumentCategory {\n category: string;\n sortOrder: number;\n documents: AdDocument[];\n}\n\ninterface DocumentsProps {\n documents: AdDocument[];\n}\n\nconst Documents = ({ documents }: DocumentsProps) => {\n const { t } = useTranslation();\n\n const Translation = {\n 'tyre-label': t('item.documentTypes.tireEnergyDeclaration'),\n 'content declaration': t('item.documentTypes.goodsDeclaration'),\n other: t('item.documentTypes.other'),\n };\n\n const categorised = documents\n .reduce((prev, curr) => {\n const index = prev.findIndex((x) => x.category === (curr.category || 'others'));\n if (index > -1) {\n prev[index].documents.push(curr);\n } else {\n const category = curr.category || 'others';\n prev.push({\n category,\n documents: [curr],\n sortOrder: SortOrder?.[category as CategoryType] ?? 99,\n });\n }\n\n return prev;\n }, [] as DocumentCategory[])\n .sort((a, b) => a.sortOrder - b.sortOrder);\n\n if (!documents.length) return null;\n\n const manyCategories = categorised.length > 1;\n\n return (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{t('item.documents')}</H2>\n </Repeat>\n <Repeat>\n <ExtendContent actionTitle={t('common.showMore')}>\n {categorised.map((group) => (\n <Repeat key={group.category}>\n {manyCategories && (\n <H3>{Translation?.[group.category as CategoryType] || Translation.other}</H3>\n )}\n <DocumentList documents={group.documents} />\n </Repeat>\n ))}\n </ExtendContent>\n </Repeat>\n </ProductPageMainSection>\n );\n};\n\nexport default Documents;\n", "import React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdDocument } from '../../Gql/ad/types';\nimport {\n List,\n PdfColumn,\n PdfLink,\n PdfListInner,\n PdfListItem,\n PdfSubtitle,\n PdfTitle,\n} from './wrapper';\n\ninterface PdfDownloadItemProps {\n document: AdDocument;\n}\n\nconst translateContentType = (document: AdDocument) => {\n switch (document.contentType) {\n case 'application/pdf':\n return 'PDF';\n default: {\n const formattedContentType =\n document.uri && document.uri.includes('.') ? document.uri.split('.').pop() : '';\n return formattedContentType;\n }\n }\n};\n\nexport const PdfDownloadItem = ({ document }: PdfDownloadItemProps) => {\n const { t } = useTranslation();\n const contentType = useMemo(() => translateContentType(document), [document]);\n return (\n <PdfListItem>\n <PdfListInner>\n <PdfColumn>\n <PdfTitle>{document.name}</PdfTitle>\n <PdfSubtitle>{contentType}</PdfSubtitle>\n </PdfColumn>\n <PdfColumn>\n <PdfLink\n href={document.uri}\n rel=\"noopener noreferrer nofollow\"\n target=\"_blank\"\n title={t('other.openDocument', { document: document.name })}\n >\n {t('common.open')}\n </PdfLink>\n </PdfColumn>\n </PdfListInner>\n </PdfListItem>\n );\n};\n\ninterface IDocumentList {\n documents: AdDocument[];\n}\n\nexport const DocumentList = ({ documents }: IDocumentList) => (\n <List>\n {documents.map((document, i) => (\n <PdfDownloadItem key={`${document.uri}-${i}`} document={document} />\n ))}\n </List>\n);\n\nexport default DocumentList;\n", "import styled from 'styled-components';\nimport { size } from '../../layout/helpers';\n\nexport const PdfListItem = styled.li.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text',\n}))`\n flex: 0 0 50%;\n padding: ${size(1)};\n\n ${({ theme }) => theme.breakpoint.LtSm} {\n flex: 0 0 100%;\n }\n`;\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n margin: ${size(-1)};\n`;\n\nexport const PdfLink = styled.a.attrs(() => ({\n className: 'wayke__theme wayke__color--primary-text wayke__font--bold',\n}))`\n text-decoration: none;\n font-size: 0.875rem;\n &:after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n`;\n\nexport const PdfTitle = styled.div`\n color: ${(props) => props.theme.color.textDark};\n`;\nexport const PdfSubtitle = styled.div`\n color: ${(props) => props.theme.color.textDarkLighten};\n`;\n\nexport const PdfColumn = styled.div`\n flex: 0 0 auto;\n &:first-child {\n flex: 1 1 auto;\n }\n`;\n\nexport const PdfListInner = styled.div`\n position: relative;\n border: 1px solid ${(props) => props.theme.color.border};\n padding: ${size(1.5)};\n display: flex;\n align-items: center;\n &:hover {\n background-color: ${(props) => props.theme.color.hoverOverlay};\n }\n`;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { H2 } from '../../components/Heading';\nimport LogoBox from '../../components/LogoBox';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { PackageOffer } from '../../Gql/ad/view';\n\ninterface ManufacturerPackageOption {\n packageOption?: PackageOffer;\n}\n\nconst ManufacturerPackageOption = ({ packageOption }: ManufacturerPackageOption) => {\n const { t } = useTranslation();\n if (!packageOption) {\n return null;\n }\n\n return (\n <ProductPageMainSection>\n <Repeat>\n <H2 noMargin>{packageOption.title}</H2>\n </Repeat>\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={t('common.logotype') || ''} wide />\n </Repeat>\n )}\n </ProductPageMainSection>\n );\n};\n\nexport default ManufacturerPackageOption;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { H2 } from '../../components/Heading';\nimport LogoBox from '../../components/LogoBox';\nimport { ProductPageMainSection } from '../../components/ProductPage';\nimport { Repeat } from '../../components/Repeat';\nimport { PackageOffer } from '../../Gql/ad/view';\n\ninterface PackageOptionsProps {\n packageOptions: PackageOffer[];\n}\n\nconst PackageOptions = ({ packageOptions }: PackageOptionsProps) => {\n const { t } = useTranslation();\n return (\n <>\n {packageOptions.map((packageOption, index) => (\n <ProductPageMainSection key={packageOption.title || index}>\n <Repeat>\n <H2 noMargin>{packageOption.title}</H2>\n </Repeat>\n {packageOption.description && (\n <Repeat>\n <Content markdown={packageOption.description} />\n </Repeat>\n )}\n {packageOption.link?.url && (\n <Repeat>\n <ButtonInline\n as=\"a\"\n href={packageOption.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {packageOption.link.title ? packageOption.link.title : t('item.readMoreInNewTab')}\n </ButtonInline>\n </Repeat>\n )}\n {packageOption.image && (\n <Repeat>\n <LogoBox logo={packageOption.image} alt={t('common.logotype') || ''} wide />\n </Repeat>\n )}\n </ProductPageMainSection>\n ))}\n </>\n );\n};\n\nexport default PackageOptions;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Container from '../../components/Container';\nimport { H1 } from '../../components/Heading';\nimport { Page, PageSection } from '../../components/Page';\n\nconst Page404 = () => {\n const { t } = useTranslation();\n return (\n <Page>\n <PageSection large>\n <Container>\n <H1 noMargin>{t('other.error404')}</H1>\n </Container>\n </PageSection>\n </Page>\n );\n};\n\nexport default Page404;\n", "import React from 'react';\n\nimport Container from '../../components/Container';\nimport Loader from '../../components/Loader';\nimport { Page, PageSection } from '../../components/Page';\n\nconst PageLoading = () => (\n <Page>\n <PageSection large>\n <Container>\n <Loader />\n </Container>\n </PageSection>\n </Page>\n);\n\nexport default PageLoading;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Category, Property } from '../../@types/vehicle-properties';\nimport { H5 } from '../../components/Heading';\nimport { Repeat } from '../../components/Repeat';\nimport { TableList } from '../../components/TableList';\nimport Tabs from '../../components/Tabs';\nimport propertyTree from '../../Gql/ad/propertyTree';\nimport useAdContext from '../../State/Ad/AdContext';\nimport MetadataItem from './MetadataItem';\n\ninterface MetadataSubCategoryProps {\n name: string;\n properties: Property[];\n}\n\nconst MetadataSubCategory = ({ name, properties }: MetadataSubCategoryProps) => (\n <Repeat>\n <H5 as=\"h3\">{name}</H5>\n <TableList>\n {!!properties.length &&\n properties.map((property, index) => (\n <MetadataItem\n name={property.name}\n hint={property.hint}\n value={property.value}\n unit={property.unit}\n key={`${property.name}-${index}`}\n />\n ))}\n </TableList>\n </Repeat>\n);\n\ninterface MetadataCaregoryProps {\n properties: Property[];\n subCategories: Category[];\n}\n\nconst MetadataCategory = ({ properties, subCategories }: MetadataCaregoryProps) => (\n <div className=\"tab-section\">\n {!!properties.length && (\n <Repeat>\n <TableList>\n {properties.map((property, index) => (\n <MetadataItem\n name={property.name}\n hint={property.hint}\n value={property.value}\n unit={property.unit}\n key={`${property.name}-${index}`}\n />\n ))}\n </TableList>\n </Repeat>\n )}\n {!!subCategories.length &&\n subCategories.map((subCategory, index) => (\n <MetadataSubCategory\n name={subCategory.name}\n properties={subCategory.properties}\n key={`${subCategory.name}-${index}`}\n />\n ))}\n </div>\n);\n\nconst PropertySet = () => {\n const { t } = useTranslation();\n const ad = useAdContext();\n const [activeCategoryId, setActiveCategoryId] = useState(-1);\n const mappedProperties = useMemo(() => propertyTree(ad, t), [ad, t]);\n\n useEffect(() => {\n const categories =\n mappedProperties?.categories?.length !== undefined ? mappedProperties?.categories : undefined;\n\n if (activeCategoryId < 0 && categories !== undefined && categories.length > 0) {\n setActiveCategoryId(categories[0].id);\n }\n }, [mappedProperties]);\n\n const onTab = useCallback((id: string) => setActiveCategoryId(parseInt(id, 10)), []);\n\n const activeCategory = mappedProperties?.categories?.find(\n (category) => category.id === activeCategoryId\n );\n\n return (\n <>\n <Repeat>\n <Tabs\n tabs={\n mappedProperties?.categories?.map((category) => ({\n name: `${category.id}`,\n displayName: category.name,\n })) || []\n }\n active={`${activeCategoryId}`}\n onClick={onTab}\n />\n </Repeat>\n {activeCategory && (\n <Repeat>\n <MetadataCategory\n properties={activeCategory.properties}\n subCategories={activeCategory.subCategories}\n />\n </Repeat>\n )}\n </>\n );\n};\n\nexport default PropertySet;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const TableList = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n border-top: 1px solid ${(props) => props.theme.color.border};\n border-bottom: 1px solid ${(props) => props.theme.color.border};\n font-size: 0.875rem;\n`;\n\nexport const TableListItem = styled.li`\n display: flex;\n align-items: center;\n padding: ${size(1)} 0;\n\n & + & {\n border-top: 1px solid ${(props) => props.theme.color.border};\n }\n`;\n\nexport const TableListKey = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const TableListValue = styled.div`\n flex-shrink: 0;\n padding-left: ${size(1)};\n`;\n\nexport const TableListBooleanPos = styled.div`\n color: ${(props) => props.theme.color.ui.positive};\n`;\n\nexport const TableListBooleanNeg = styled.div`\n color: ${(props) => props.theme.color.ui.negative};\n`;\n", "import * as React from 'react';\n\nimport { Action, Item, List, Wrapper } from './wrapper';\n\nexport interface ITabItem {\n name: string;\n displayName: string;\n}\n\nexport interface ITabInterface<T> {\n tabs: ITabItem[];\n active: string;\n onClick?: (name: T) => void;\n}\n\nconst Tabs = <T extends {}>({ tabs, active, onClick }: ITabInterface<T>) => (\n <Wrapper>\n <List>\n {tabs.map((tab) => (\n <Item key={tab.name}>\n <Action\n title={tab.displayName}\n onClick={onClick ? () => onClick(tab.name as unknown as T) : undefined}\n active={tab.name === active ? 'true' : undefined}\n >\n {tab.displayName}\n </Action>\n </Item>\n ))}\n </List>\n </Wrapper>\n);\n\nexport default Tabs;\n", "import * as React from 'react';\nimport styled, { css } from 'styled-components';\nimport { size } from '../../layout/helpers';\nimport { ButtonReset } from '../Button';\n\nexport const Wrapper = styled.div`\n overflow: hidden;\n margin-top: ${size(-1)};\n margin-left: ${size(-1)};\n margin-right: ${size(-1)};\n\n ${(props) => props.theme.breakpoint.LtSm} {\n margin-left: ${size(-2)};\n margin-right: ${size(-2)};\n }\n`;\n\nexport const List = styled.ul`\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n white-space: nowrap;\n font-size: 0;\n\n ${(props) => props.theme.breakpoint.LtSm} {\n padding-left: ${size(1)};\n padding-right: ${size(1)};\n }\n`;\n\nexport const Item = styled.li`\n display: inline-block;\n vertical-align: bottom;\n font-size: 1rem;\n`;\n\ntype ActionProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> & {\n active?: boolean | string;\n};\n\nexport const Action = styled(ButtonReset).attrs(() => ({\n role: 'tab',\n className: 'wayke__theme wayke__font--bold',\n}))<ActionProps>`\n position: relative;\n display: block;\n padding: ${size(1)};\n color: ${(props) => props.theme.color.textDarkLighten};\n\n &:hover {\n color: ${(props) => props.theme.color.textDark};\n }\n\n &:after {\n content: '';\n position: absolute;\n bottom: 0;\n left: ${size(1)};\n right: ${size(1)};\n height: 2px;\n background-color: ${(props) => props.theme.color.textDark};\n transform: scaleY(0);\n transition: transform 200ms ease;\n z-index: 1;\n }\n\n ${(props) =>\n props.active &&\n css`\n color: ${(props) => props.theme.color.textDark};\n\n &::after {\n transform: scaleY(1);\n }\n `}\n`;\n", "// The \"Fordonsdata\" tabs: the vehicle's attributes by category, with the basics\n// first, as web-ui-v2 shows them.\n\nimport { TFunction } from 'i18next';\nimport { Category, Property, Tree } from '../../@types/vehicle-properties';\nimport { Ad, AttributeCategory, AttributeValue } from './types';\n\nconst toProperty = (v: AttributeValue): Property => {\n const isBoolean =\n v.__typename === 'BooleanProperty' ||\n v.formattedValue === 'true' ||\n v.formattedValue === 'false';\n return {\n name: v.label,\n type: isBoolean ? 'boolean' : 'text',\n value: isBoolean ? v.formattedValue === 'true' : v.formattedValue,\n unit: null,\n hint: null,\n };\n};\n\nconst toCategory = (c: AttributeCategory, id: number): Category => ({\n id,\n name: c.displayName,\n properties: c.values.map(toProperty),\n subCategories: (c.categories || [])\n .filter((s) => s.values.length)\n .map((s, i) => toCategory(s, id * 100 + i + 1)),\n});\n\nconst propertyTree = (ad: Ad, t: TFunction): Tree => {\n const item = ad.iteration?.item;\n const odometer = ad.iteration?.logistics?.odometerReading;\n const basic: Property[] = [];\n const add = (key: string, value?: string | number | null, unit?: string, withHint?: boolean) => {\n if (value !== undefined && value !== null && value !== '') {\n basic.push({\n name: t(`customProperty.${key}.displayName`),\n value,\n type: typeof value === 'number' ? 'number' : 'text',\n unit: unit || null,\n hint: withHint ? t(`customProperty.${key}.hint`) : null,\n });\n }\n };\n const attributes = item?.attributes;\n const modelSeries = item?.modelSeries?.stringValue;\n // As web-ui-v2: the version is modelVariant; modelName only when it says more than the model.\n const modelName = item?.modelName?.stringValue;\n const version =\n item?.modelVariant?.stringValue || (modelName !== modelSeries ? modelName : undefined);\n\n add('manufacturer', item?.manufacturer?.stringValue);\n add('modelSeries', modelSeries);\n add('modelName', version, undefined, true);\n add('modelYear', item?.modelYear?.intValue, undefined, true);\n add('manufactureYear', item?.manufactureYear?.intValue, undefined, true);\n if (odometer) {\n add(\n 'odometer',\n odometer.value,\n t(`odometer.${odometer.unit === 'KILOMETER' ? 'Kilometer' : 'ScandinavianMile'}`)\n );\n }\n add('gearboxType', attributes?.transmission?.formattedValue);\n add('color', attributes?.exteriorColor?.formattedValue);\n add('registrationNumber', item?.registrationNumber?.stringValue);\n add('chassis', item?.authority?.chassis?.stringValue || attributes?.chassisType?.formattedValue);\n add(\n 'segment',\n item?.authority?.segment?.stringValue || attributes?.vehicleClassification?.formattedValue\n );\n add('annualTax', item?.authority?.annualTax?.formattedValue);\n add('numberOfDoors', attributes?.doorsCount?.formattedValue);\n add('fuelType', item?.driveline?.fuelTypesString?.stringValue, undefined, true);\n add('enginePower', attributes?.enginePower?.formattedValue);\n\n const categories = (item?.attributes?.byCategory || [])\n .map((c, i) => toCategory(c, i + 1))\n .filter((c) => c.properties.length || c.subCategories.length);\n\n // The API's own basic category takes the basics above in front of its values.\n const basicIndex = categories.findIndex((c) => c.name === t('category.basic'));\n if (basicIndex > -1) {\n const [existing] = categories.splice(basicIndex, 1);\n categories.unshift({ ...existing, properties: [...basic, ...existing.properties] });\n } else {\n categories.unshift({\n id: 1000,\n name: t('category.basic'),\n properties: basic,\n subCategories: [],\n });\n }\n return { categories };\n};\n\nexport default propertyTree;\n", "import { TFunction } from 'i18next';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Property } from '../../@types/vehicle-properties';\nimport { ButtonInline } from '../../components/Button';\nimport Content from '../../components/Content';\nimport { IconCancel, IconCheck } from '../../components/Icon';\nimport Modal from '../../components/Modal';\nimport { SrOnly } from '../../components/SrOnly';\nimport {\n TableListBooleanNeg,\n TableListBooleanPos,\n TableListItem,\n TableListKey,\n TableListValue,\n} from '../../components/TableList';\n\nconst formatValue = (\n t: TFunction<'translation', undefined>,\n value: Property['value'],\n unit: Property['unit']\n) => {\n if (typeof value === 'boolean') {\n return value ? (\n <TableListBooleanPos title={t('common.yes') || ''}>\n <SrOnly>{t('common.yes')}</SrOnly>\n <IconCheck block />\n </TableListBooleanPos>\n ) : (\n <TableListBooleanNeg title={t('common.no') || ''}>\n <SrOnly>{t('common.no')}</SrOnly>\n <IconCancel block />\n </TableListBooleanNeg>\n );\n }\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n if (!!value && !!unit) {\n return `${value} ${unit}`;\n }\n return value;\n};\n\ninterface MetadataItemProps {\n name: string;\n hint?: string | null | undefined;\n value: Property['value'];\n unit: Property['unit'];\n}\n\nconst MetadataItem = ({ name, hint, value, unit }: MetadataItemProps) => {\n const { t } = useTranslation();\n const [foldout, setFoldout] = useState(false);\n const onToggleFoldout = useCallback(() => setFoldout(!foldout), [foldout]);\n\n const presentedValue = formatValue(t, value, unit);\n\n return (\n <TableListItem>\n <TableListKey>\n {hint ? (\n <ButtonInline\n onClick={onToggleFoldout}\n title={t('item.moreInfoAboutSubject', { subject: name }) || ''}\n >\n {name}\n </ButtonInline>\n ) : (\n name\n )}\n </TableListKey>\n <TableListValue>\n {value !== undefined ? presentedValue : t('item.dataNotAvailable')}\n </TableListValue>\n {hint && foldout && (\n <Modal title={name} onClose={onToggleFoldout}>\n <Content html={hint} />\n </Modal>\n )}\n </TableListItem>\n );\n};\n\nexport default MetadataItem;\n", "import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Container from '../../components/Container';\nimport { H2 } from '../../components/Heading';\nimport OverflowGrid from '../../components/OverflowGrid';\nimport { PageSection } from '../../components/Page';\nimport HitCard from '../../components/ProductCard/HitCard';\nimport { Repeat } from '../../components/Repeat';\nimport SectionHeader from '../../components/SectionHeader';\nimport useRelatedAds from '../../Gql/ad/useRelatedAds';\nimport useSettings from '../../State/Settings/useSettings';\n\ninterface RelatedProps {\n adId: string;\n manufacturer?: string;\n placeholderImage?: string;\n displayBranchName?: boolean;\n}\n\n/** The latest cars of the same make, then of other makes. */\nconst Related = ({ adId, manufacturer, placeholderImage, displayBranchName }: RelatedProps) => {\n const { t } = useTranslation();\n const { publicApi } = useSettings();\n const { hits } = useRelatedAds(publicApi, adId, manufacturer);\n\n if (!hits?.length) {\n return null;\n }\n\n return (\n <PageSection accent large className=\"wayke__theme wayke__color--accent-bg\">\n <Container>\n <Repeat>\n <SectionHeader>\n <H2 noMargin>{t('item.relatedVehicles')}</H2>\n </SectionHeader>\n </Repeat>\n <Repeat>\n <OverflowGrid\n accentBg\n columns={1.05}\n columnsSm={2.1}\n columnsMd={3}\n spacing={2}\n items={hits.map((hit) => (\n <HitCard\n key={hit.ad.id}\n hit={hit}\n placeholderImage={placeholderImage}\n displayBranchName={displayBranchName}\n />\n ))}\n />\n </Repeat>\n </Container>\n </PageSection>\n );\n};\n\nexport default Related;\n", "import React from 'react';\nimport { ButtonClear, ButtonContent } from '../Button';\nimport { Action, Heading, Wrapper } from './wrapper';\n\ninterface Props {\n children: React.ReactNode;\n onClick?: () => void;\n actionTitle?: string;\n}\n\nconst SectionHeader = ({ children, onClick, actionTitle }: Props) => (\n <Wrapper>\n <Heading>{children}</Heading>\n {onClick && actionTitle && (\n <Action>\n <ButtonClear as=\"a\" href=\"#\" onClick={onClick}>\n <ButtonContent>{actionTitle}</ButtonContent>\n </ButtonClear>\n </Action>\n )}\n </Wrapper>\n);\n\nexport default SectionHeader;\n", "import styled from 'styled-components';\n\nimport { size } from '../../layout/helpers';\n\nexport const Wrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const Heading = styled.div`\n flex: 1 1 auto;\n`;\n\nexport const Action = styled.div`\n flex-shrink: 0;\n padding-left: ${size(2)};\n`;\n", "import { useEffect, useState } from 'react';\nimport { gqlQuery } from '../client';\nimport { PublicApiSettings } from '../config';\nimport { SearchData, SearchHit } from '../types';\nimport { RELATED_ADS_QUERY } from './queries';\n\n/**\n * \"Fler bilar\" on the ad page: the latest cars of the same make, the current\n * ad excluded, filled up with the latest of other makes when the make has too\n * few, so a site with one car of a make still shows related cars as 5.x did.\n * There is no more-like-this in the public API.\n */\nconst useRelatedAds = (\n settings: PublicApiSettings,\n adId: string,\n manufacturer?: string,\n limit = 3\n) => {\n const [hits, setHits] = useState<SearchHit[]>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n let active = true;\n const latest = (make: string | undefined, perPage: number) =>\n gqlQuery<SearchData>(settings.api, RELATED_ADS_QUERY, {\n market: [settings.market],\n branchGroupId: settings.branchGroupId,\n manufacturer: make ? [make] : undefined,\n perPage,\n }).then((data) => (data.search?.ads?.hits || []).filter((h) => h.ad.id !== adId));\n\n setLoading(true);\n latest(manufacturer, limit + 1)\n .then(async (sameMake) => {\n if (sameMake.length >= limit || !manufacturer) return sameMake;\n const taken = new Set(sameMake.map((h) => h.ad.id));\n // Enough to skip the current ad and the ones already taken.\n const others = (await latest(undefined, limit * 2 + 1)).filter((h) => !taken.has(h.ad.id));\n return [...sameMake, ...others];\n })\n .then((related) => active && setHits(related.slice(0, limit)))\n .catch(() => undefined)\n .finally(() => active && setLoading(false));\n return () => {\n active = false;\n };\n }, [settings.api.url, settings.branchGroupId, adId, manufacturer, limit]);\n\n return { loading, hits };\n};\n\nexport default useRelatedAds;\n", "import { useEffect, useRef } from 'react';\nimport { Ad } from '../../Gql/ad/types';\nimport { adEvent, waykeId } from '../../Gql/ad/view';\nimport { Settings } from '../../State/Settings/settings';\nimport PubSub from '../../utils/pubsub/pubsub';\n\ninterface EcomWeb {\n start: () => void;\n destroy: () => void;\n}\n\n/**\n * Buy online. ecom-web is keyed on the legacy waykeId: the commerce order flow\n * answers 404 on ad.id for ads from before ads-service.\n */\nfunction useEcom(ad: Ad, ecom: Settings['ecom'], marketCode: Settings['marketCode']) {\n const ecomContext = useRef<EcomWeb | undefined>(undefined);\n const id = waykeId(ad);\n\n useEffect(() => {\n if (!ecom) return;\n let destroyed = false;\n import('@wayke-se/ecom-web')\n .then((module) => {\n if (destroyed) return;\n ecomContext.current = new module.default({\n id,\n ecomSdkConfig: {\n api: {\n address: ecom.url,\n },\n bankIdThumbprint: ecom.bankIdThumbprint,\n },\n logo: ecom.serviceLogotypeUrl,\n logoX2: ecom.serviceLogotypeUrl,\n // Language, and Drive's look in Norway\n marketCode,\n onEvent: (view, event, currentStep?, data?) => {\n PubSub.publish('Ecom', { ...adEvent(ad), view, event, currentStep, data });\n },\n });\n })\n .catch(() => undefined);\n return () => {\n destroyed = true;\n ecomContext.current?.destroy();\n ecomContext.current = undefined;\n };\n }, [id]);\n\n return ecomContext;\n}\n\nexport default useEcom;\n", "import React from 'react';\n\nimport WaykeProvider, { WaykeProviderProps } from '../providers/WaykeProvider';\nimport WaykeComposite, { WaykeCompositeProps } from './WaykeComposite';\n\nexport interface WaykeCompositeWithProviderProps {\n provider?: WaykeProviderProps;\n composite?: WaykeCompositeProps;\n}\n\nconst WaykeCompositeWithProvider = ({ provider, composite }: WaykeCompositeWithProviderProps) => (\n <WaykeProvider {...provider}>\n <WaykeComposite {...composite} />\n </WaykeProvider>\n);\n\nexport default WaykeCompositeWithProvider;\n", "import React, { useMemo } from 'react';\n\nimport packageJson from '../../package.json';\nimport Root from '../components/Root';\nimport useInitializeTranslation from '../hooks/useInitializeTranslation';\nimport RouterProvider from '../State/Router/RouterProvider';\nimport SearchProvider from '../State/Search/SearchProvider';\nimport { SettingsContext } from '../State/Settings/SettingsContext';\nimport { resolveSettings, WaykeProviderSettings } from '../State/Settings/settings';\nimport Theme from './themeProvider';\n\nexport type { EcomSettings, WaykeProviderSettings } from '../State/Settings/settings';\n\nexport type WaykeProviderProps = WaykeProviderSettings & {\n children?: React.ReactNode;\n};\n\n/**\n * Settings, routing, the search state and the theme for every Wayke component\n * under it. Place it close to the root of the app, so its cache is kept.\n */\nconst WaykeProvider = ({ children, ...settings }: WaykeProviderProps) => {\n // Settings arrive as a new object on every render of the parent; only their content matters.\n const key = JSON.stringify(settings);\n const resolved = useMemo(() => resolveSettings(settings), [key]);\n const initialized = useInitializeTranslation(resolved.marketCode);\n\n return (\n <SettingsContext.Provider value={resolved}>\n <RouterProvider>\n <SearchProvider>\n <Theme>\n <Root data-version={packageJson.version}>{initialized ? children : null}</Root>\n </Theme>\n </SearchProvider>\n </RouterProvider>\n </SettingsContext.Provider>\n );\n};\n\nexport default WaykeProvider;\n", "import styled from 'styled-components';\n\nconst Root = styled.div.attrs(() => ({\n className: 'wayke__theme wayke__font--regular',\n}))`\n background-color: ${(props) => props.theme.color.bg};\n color: ${(props) => props.theme.color.textDark};\n font-size: 1rem;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n\n a img {\n border: 0;\n }\n`;\n\nexport default Root;\n", "import { useCallback, useEffect, useState } from 'react';\nimport { MarketCode } from '../@types/market';\nimport { i18nScoped, initializeI18n } from '../utils/I18n';\n\nconst useInitializeTranslation = (marketCode?: MarketCode) => {\n const [initialized, setInitialized] = useState(() => !!i18nScoped.isInitialized);\n\n const initialize = useCallback(async (m?: MarketCode) => {\n await initializeI18n(m);\n setInitialized(true);\n }, []);\n\n useEffect(() => {\n if (!i18nScoped.isInitialized) {\n initialize(marketCode);\n }\n }, []);\n\n return initialized;\n};\n\nexport default useInitializeTranslation;\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport useSettings from '../Settings/useSettings';\nimport { RouterContext, RouterContextProps } from './RouterContext';\n\n// Any UUID version: ads from the public API have UUID v7 ids.\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst snapshot = () => ({\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n});\n\n/** A hash that is not a vehicle id (`#content` from a skip link) leaves the search showing. */\nconst idFromHash = (hash: string) => {\n const value = hash.slice(1);\n return UUID.test(value) ? value : undefined;\n};\n\n/** The vehicle id is a whole path segment, so a slug after it (`/<id>/volvo-v60`) is fine. */\nconst idFromPath = (pathname: string) =>\n pathname\n .split('/')\n .filter((s) => UUID.test(s))\n .pop();\n\ninterface RouterProviderProps {\n children: React.ReactNode;\n}\n\nconst RouterProvider = ({ children }: RouterProviderProps) => {\n const { routing } = useSettings();\n const [location, setLocation] = useState(snapshot);\n\n useEffect(() => {\n const update = () => setLocation(snapshot());\n window.addEventListener('popstate', update);\n window.addEventListener('hashchange', update);\n return () => {\n window.removeEventListener('popstate', update);\n window.removeEventListener('hashchange', update);\n };\n }, []);\n\n // Resolved once, from the page the components were mounted on, like a relative link.\n const base = useMemo(\n () =>\n routing.mode === 'path' && routing.basePath\n ? new URL(routing.basePath.replace(/\\/+$/, ''), window.location.href)\n : undefined,\n [routing.mode, routing.basePath]\n );\n\n const id =\n routing.mode === 'hash'\n ? idFromHash(location.hash)\n : routing.mode === 'path'\n ? idFromPath(location.pathname)\n : undefined;\n\n const itemHref = useCallback(\n (itemId: string) => {\n if (routing.mode === 'hash') return `#${itemId}`;\n if (base) {\n return base.origin === window.location.origin\n ? `${base.pathname}/${itemId}`\n : `${base.href}/${itemId}`;\n }\n return undefined;\n },\n [routing.mode, base]\n );\n\n const onLinkClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n // A new tab, a hash or another site: the browser does it.\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n if (href.startsWith('#')) return;\n const url = new URL(href, window.location.href);\n if (url.origin !== window.location.origin) return;\n e.preventDefault();\n history.pushState(null, '', `${url.pathname}${url.search}${url.hash}`);\n setLocation(snapshot());\n }, []);\n\n const writeSearch = useCallback(\n (params: URLSearchParams, replace?: boolean) => {\n if (!routing.syncUrl) return;\n const query = params.toString();\n const next = query ? `?${query}` : '';\n if (next === window.location.search) return;\n const url = `${window.location.pathname}${next}${window.location.hash}`;\n if (replace) {\n history.replaceState(history.state, '', url);\n } else {\n history.pushState(null, '', url);\n }\n setLocation(snapshot());\n },\n [routing.syncUrl]\n );\n\n const value = useMemo<RouterContextProps>(\n () => ({\n id,\n search: location.search.replace(/^\\?/, ''),\n itemHref,\n // Hash routing keeps the search on the same page: an empty hash goes back to it\n // without a reload, and the filters in the query string stay.\n searchHref: routing.mode === 'hash' ? '#' : undefined,\n onLinkClick,\n writeSearch,\n }),\n [id, location, itemHref, onLinkClick, writeSearch, routing.mode]\n );\n\n return <RouterContext.Provider value={value}>{children}</RouterContext.Provider>;\n};\n\nexport default RouterProvider;\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { hasLegacyParams, migrateLegacyParams } from '../../Gql/legacyParams';\nimport { canonicalParams } from '../../Gql/searchParams';\nimport useAdsSearch from '../../Gql/useAdsSearch';\nimport { ActionOnFilterUpdate } from '../../utils/pubsub/Actions';\nimport WaykePubSub from '../../utils/pubsub/pubsub';\nimport useRouter from '../Router/useRouter';\nimport useSettings from '../Settings/useSettings';\nimport { SearchContext, SearchContextProps } from './SearchContext';\n\n/** Any input \u2192 the canonical new grammar, with a hint when a site still sends the old one. */\nconst toParams = (input: URLSearchParams | string, source: string) => {\n const params = typeof input === 'string' ? new URLSearchParams(input) : input;\n if (hasLegacyParams(params)) {\n // biome-ignore lint/suspicious/noConsole: tells the site's developer what to change\n console.warn(\n `Wayke: ${source} uses filter names from before 6.0 (${params}); they are translated, see the README for the new names`\n );\n return migrateLegacyParams(params);\n }\n return canonicalParams(params);\n};\n\ninterface SearchProviderProps {\n children: React.ReactNode;\n}\n\nconst SearchProvider = ({ children }: SearchProviderProps) => {\n const { publicApi, routing } = useSettings();\n const { search, writeSearch } = useRouter();\n // Undefined until a search component initializes it, so a vehicle page alone costs no search.\n const [params, setParams] = useState<URLSearchParams>();\n const lastWritten = useRef<string | undefined>(undefined);\n\n const { unfiltered, result, loading, loadingMore, error, hasMore, loadMore } = useAdsSearch(\n params,\n publicApi\n );\n\n const apply = useCallback(\n (next: URLSearchParams, replace?: boolean) => {\n lastWritten.current = next.toString();\n setParams(next);\n writeSearch(next, replace);\n },\n [writeSearch]\n );\n\n const initialize = useCallback(\n (initialQueryParams?: URLSearchParams) => {\n if (params) return;\n let next = initialQueryParams\n ? toParams(initialQueryParams, 'initialQueryParams')\n : undefined;\n if (routing.syncUrl) {\n // The url wins; initialQueryParams only adds what the url does not have.\n const fromUrl = toParams(search, 'The url');\n next?.forEach((value, key) => {\n if (!fromUrl.getAll(key).includes(value)) fromUrl.append(key, value);\n });\n next = canonicalParams(fromUrl);\n }\n apply(next || new URLSearchParams(), true);\n },\n [params, routing.syncUrl, search, apply]\n );\n\n const update = useCallback(\n (next: URLSearchParams | string) => apply(toParams(next, 'onFilterUpdate')),\n [apply]\n );\n\n // Back and forward in the browser: the url's filters, unless we wrote them ourselves.\n useEffect(() => {\n if (!params || !routing.syncUrl) return;\n const fromUrl = toParams(search, 'The url');\n if (fromUrl.toString() !== lastWritten.current) {\n lastWritten.current = fromUrl.toString();\n setParams(fromUrl);\n }\n }, [search]);\n\n useEffect(() => {\n const action: ActionOnFilterUpdate = { actionName: 'onFilterUpdate', callback: update };\n WaykePubSub.subscribeAction(action);\n return () => WaykePubSub.unsubscribeAction(action);\n }, [update]);\n\n const value = useMemo<SearchContextProps>(\n () => ({\n params: params || new URLSearchParams(),\n result,\n unfiltered,\n loading: loading || !result,\n loadingMore,\n error,\n hasMore,\n update,\n loadMore,\n initialize,\n }),\n [params, result, unfiltered, loading, loadingMore, error, hasMore, update, loadMore, initialize]\n );\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n", "// Translates the query strings sites have produced over the years into\n// the grammar in searchParams.ts, so that old links, bookmarks and the queries\n// dealers saved in the CMS keep applying the same filters:\n//\n// 1. `qf=<base64 of a query string>` from the filter panel and the product\n// grid's \"show all\" link, and the older `qf=<base64 of {\"cars\": <base64 of\n// a query string>}>` from the search before that. `f=` was the same idea in\n// the waykeComposite era.\n// 2. Key renames where the value is unchanged (Elastic \u2192 public API naming).\n// 3. `query` \u2192 `q`, legacy sort tokens \u2192 sort keys, `offset` \u2192 `page`;\n// `hits`, `campaign` and other dead keys are dropped.\n//\n// Mirrors web-ui-v2's legacyParams.ts, trimmed to the keys dealer sites used.\n\nimport { canonicalParams, DEFAULT_SORT, isKnownKey } from './searchParams';\n\nconst SCALAR_ALIASES: Record<string, string> = {\n query: 'q',\n branch: 'branchDisplayName',\n branches: 'branchDisplayName',\n color: 'colorName',\n drivingWheel: 'drivetrainType',\n 'properties.segment': 'segment',\n chassis: 'bodyStyle',\n fuelTypes: 'fuelType',\n hasManufacturerPackaging: 'certifiedPreOwned',\n};\n\nconst RANGE_BASE_ALIASES: Record<string, string> = {\n mileage: 'odometer',\n odometerValueAsKm: 'odometer',\n leasingPrice: 'privateLease',\n businessLeasingPrice: 'businessLease',\n};\n\n/** Legacy `sort=` tokens from the external search API; null = the default order. */\nconst SORT_ALIASES: Record<string, string | null> = {\n relevance: null,\n itemSortDesc: null,\n 'published-desc': DEFAULT_SORT,\n 'published-asc': 'published-asc',\n 'price-asc': 'price-asc',\n 'price-desc': 'price-desc',\n 'modelyear-asc': 'modelYear-asc',\n 'modelyear-desc': 'modelYear-desc',\n 'model-asc': 'modelYear-asc',\n 'model-desc': 'modelYear-desc',\n 'mileage-asc': 'odometer-asc',\n 'mileage-desc': 'odometer-desc',\n // wayke.se v1 tokens, in case a dealer copied a link from there\n priceDefaultAsc: 'price-asc',\n priceDefaultDesc: 'price-desc',\n priceDefaultSortAsc: 'price-asc',\n priceDefaultSortDesc: 'price-desc',\n modelYearAsc: 'modelYear-asc',\n modelYearDesc: 'modelYear-desc',\n mileageAsc: 'odometer-asc',\n mileageDesc: 'odometer-desc',\n leasingDefaultSortAsc: 'leasing-asc',\n leasingDefaultSortDesc: 'leasing-desc',\n businessLeasingDefaultSortAsc: 'companyLeasing-asc',\n businessLeasingDefaultSortDesc: 'companyLeasing-desc',\n};\n\nconst FUEL_TYPE_VALUE_ALIASES: Record<string, string> = {\n 'Bensin/E85': 'E85+Bensin',\n 'Bensin+E85': 'E85+Bensin',\n 'Bensin+Etanol': 'E85+Bensin',\n 'Bensin, El': 'Bensin+El',\n 'El, Bensin': 'Bensin+El',\n 'Diesel, Naturgas': 'Diesel+Naturgas',\n 'El+Etanol': 'E85+El',\n Etanol: 'E85',\n};\n\nconst DROPPED_KEYS = new Set(['hits', 'offset', 'campaign', 'priceType', 'qf', 'f']);\n\nconst LEGACY_PER_PAGE = 25;\n\nconst decodeBase64 = (value: string) => {\n try {\n return atob(value.replace(/-/g, '+').replace(/_/g, '/'));\n } catch (_e) {\n return undefined;\n }\n};\n\n/** Unpacks `qf`/`f`: a base64 query string, or base64 JSON whose `cars` is one. */\nconst unpackPacked = (value: string): URLSearchParams | undefined => {\n const decoded = decodeBase64(value);\n if (decoded === undefined) return undefined;\n try {\n const json = JSON.parse(decoded) as { cars?: string };\n if (json && typeof json === 'object' && typeof json.cars === 'string') {\n const inner = decodeBase64(json.cars);\n return new URLSearchParams(inner !== undefined ? inner : json.cars);\n }\n } catch (_e) {\n // not JSON: a plain packed query string\n }\n return new URLSearchParams(decoded);\n};\n\n/** True when the params carry anything that is not already in the new grammar. */\nexport const hasLegacyParams = (params: URLSearchParams) => {\n for (const [key, value] of params.entries()) {\n if (DROPPED_KEYS.has(key)) return true;\n if (key in SCALAR_ALIASES) return true;\n const base = key.replace(/\\.(min|max)$/, '');\n if (base in RANGE_BASE_ALIASES) return true;\n if (key === 'sort' && value in SORT_ALIASES && SORT_ALIASES[value] !== value) return true;\n }\n return false;\n};\n\n/**\n * Legacy params \u2192 canonical new-grammar params. Idempotent: params already in\n * the new grammar come back unchanged (apart from canonical ordering).\n */\nexport const migrateLegacyParams = (input: URLSearchParams): URLSearchParams => {\n // 1. Unpack the packed forms and merge them with whatever is on the top level.\n const merged = new URLSearchParams();\n for (const packedKey of ['qf', 'f']) {\n const packed = input.get(packedKey);\n if (packed) {\n unpackPacked(packed)?.forEach((value, key) => merged.append(key, value));\n }\n }\n input.forEach((value, key) => {\n if (key !== 'qf' && key !== 'f') merged.append(key, value);\n });\n\n // 2. Rename keys and values.\n const out = new URLSearchParams();\n let page: number | undefined;\n merged.forEach((value, key) => {\n if (key === 'offset') {\n const offset = Number.parseInt(value, 10);\n if (Number.isFinite(offset) && offset > 0) {\n page = Math.floor(offset / LEGACY_PER_PAGE) + 1;\n }\n return;\n }\n if (DROPPED_KEYS.has(key)) return;\n\n if (key === 'sort') {\n const mapped = value in SORT_ALIASES ? SORT_ALIASES[value] : value;\n if (mapped) out.append('sort', mapped);\n return;\n }\n\n const rangeMatch = key.match(/^(.+)\\.(min|max)$/);\n if (rangeMatch) {\n const base = RANGE_BASE_ALIASES[rangeMatch[1]] || rangeMatch[1];\n out.append(`${base}.${rangeMatch[2]}`, value);\n return;\n }\n\n const nextKey = SCALAR_ALIASES[key] || key;\n let nextValue = value;\n if (nextKey === 'fuelType' && value in FUEL_TYPE_VALUE_ALIASES) {\n nextValue = FUEL_TYPE_VALUE_ALIASES[value];\n }\n if (isKnownKey(nextKey)) out.append(nextKey, nextValue);\n });\n\n if (page !== undefined && page > 1 && !out.has('page')) out.set('page', String(page));\n return canonicalParams(out);\n};\n", "// The search page's data: one request per filter change for the list and its\n// facets, plus one unfiltered request for the panel's full value lists and\n// slider domains. Responses that arrive after the filters changed are dropped.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { gqlQuery } from './client';\nimport { PublicApiSettings } from './config';\nimport { buildSearchQuery, FACETS_QUERY, multiSelectFacetAlias, SEARCH_QUERY } from './queries';\nimport { LIST_FILTERS, toSearchVariables } from './searchParams';\nimport { AdsResult, Facet, FacetsData, SearchData, SearchHit } from './types';\n\nexport interface AdsSearchResult {\n found: number;\n page: number;\n perPage: number;\n /** Every page loaded so far */\n hits: SearchHit[];\n /** List facets of the filtered result, each selected one counted without its own filter */\n facets: Facet[];\n}\n\n/** The facets of the filtered result, with every selected list filter's facet counted without its own filter. */\nconst withMultiSelectFacets = (data: SearchData, ads: AdsResult, selected: string[]): Facet[] =>\n (ads.facets || []).map((facet) => {\n if (!selected.includes(facet.field)) return facet;\n const alias = data.search?.[multiSelectFacetAlias(facet.field)] as\n | { facets?: Facet[] | null }\n | undefined;\n return alias?.facets?.find((f) => f.field === facet.field) || facet;\n });\n\nconst useAdsSearch = (params: URLSearchParams | undefined, settings: PublicApiSettings) => {\n const [unfiltered, setUnfiltered] = useState<AdsResult>();\n const [result, setResult] = useState<AdsSearchResult>();\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState(false);\n const requestIndex = useRef(0);\n\n const paramsKey = params?.toString();\n const { api, market, branchGroupId } = settings;\n\n const variables = useCallback(\n (page: number) => ({\n ...toSearchVariables(params || new URLSearchParams(), market, { page }),\n branchGroupId,\n }),\n [paramsKey, market, branchGroupId]\n );\n\n const started = !!params;\n\n useEffect(() => {\n if (!started) return;\n gqlQuery<FacetsData>(api, FACETS_QUERY, { market: [market], branchGroupId })\n .then((data) => setUnfiltered(data.search?.ads || undefined))\n .catch(() => setError(true));\n }, [started, api.url, api.apiKey, market, branchGroupId]);\n\n useEffect(() => {\n // No params until the provider has read the initial filters.\n if (!params) return;\n const index = ++requestIndex.current;\n setLoading(true);\n setError(false);\n const selected = LIST_FILTERS.filter((field) => params.getAll(field).length > 0);\n gqlQuery<SearchData>(api, buildSearchQuery(selected), { ...variables(1), withFacets: true })\n .then((data) => {\n if (index !== requestIndex.current) return;\n const ads = data.search?.ads;\n setResult(\n ads\n ? {\n found: ads.found,\n page: ads.page,\n perPage: ads.perPage,\n hits: ads.hits,\n facets: withMultiSelectFacets(data, ads, selected),\n }\n : undefined\n );\n })\n .catch(() => {\n if (index === requestIndex.current) setError(true);\n })\n .finally(() => {\n if (index === requestIndex.current) setLoading(false);\n });\n }, [paramsKey, variables, api.url, api.apiKey]);\n\n const hasMore = !!result && result.page * result.perPage < result.found;\n\n const loadMore = useCallback(async () => {\n if (!result || !hasMore || loadingMore) return;\n const index = requestIndex.current;\n setLoadingMore(true);\n setError(false);\n try {\n const data = await gqlQuery<SearchData>(api, SEARCH_QUERY, {\n ...variables(result.page + 1),\n withFacets: false,\n });\n // The filters changed while this page was loading: it belongs to the old list.\n if (index !== requestIndex.current) return;\n const ads = data.search?.ads;\n if (ads) {\n setResult((current) =>\n current\n ? { ...current, page: ads.page, found: ads.found, hits: [...current.hits, ...ads.hits] }\n : current\n );\n }\n } catch (_e) {\n if (index === requestIndex.current) setError(true);\n } finally {\n setLoadingMore(false);\n }\n }, [result, hasMore, loadingMore, variables, api.url, api.apiKey]);\n\n return { unfiltered, result, loading, loadingMore, error, hasMore, loadMore };\n};\n\nexport default useAdsSearch;\n", "import isPropValid from '@emotion/is-prop-valid';\nimport React from 'react';\nimport { StyleSheetManager, ThemeProvider as ThemeProviderBase } from 'styled-components';\n\nimport theme from '../layout/theme';\n\ninterface ThemeProps {\n children: React.ReactNode;\n}\n\n// Restore styled-components v5 behavior: filter out non-standard props so\n// they are not forwarded to DOM elements (custom components still receive all props)\nconst shouldForwardProp = (propName: string, target: unknown) =>\n typeof target === 'string' ? isPropValid(propName) : true;\n\nconst ThemeProvider = ({ children }: ThemeProps) => (\n <StyleSheetManager shouldForwardProp={shouldForwardProp}>\n <ThemeProviderBase theme={theme}>{children}</ThemeProviderBase>\n </StyleSheetManager>\n);\n\nexport default ThemeProvider;\n", "import React, { useEffect } from 'react';\nimport useRouter from '../State/Router/useRouter';\nimport useSettings from '../State/Settings/useSettings';\nimport PubSub from '../utils/pubsub/pubsub';\nimport WaykeSearch, { WaykeSearchProps } from './search';\nimport WaykeSearchItem, { WaykeSearchItemProps } from './searchItem';\n\nexport type WaykeCompositeProps = WaykeSearchProps & Omit<WaykeSearchItemProps, 'id'>;\n\n/** The search, switching to the vehicle page when a vehicle is opened. */\nconst WaykeComposite = ({\n filterList,\n initialQueryParams,\n removeSearchBar,\n removeFilterOptions,\n disableResetScrollOnInit,\n placeholderImage,\n modifyDocumentTitleItem,\n modifyDocumentTitleSearch,\n displayBranchName,\n conversionOptions,\n}: WaykeCompositeProps) => {\n const { id } = useRouter();\n const { routing } = useSettings();\n\n useEffect(() => {\n if (routing.mode === 'hash') {\n PubSub.publish('HashRouteChange', { id });\n }\n }, [id]);\n\n return id ? (\n <WaykeSearchItem\n key={id}\n id={id}\n disableResetScrollOnInit={disableResetScrollOnInit}\n placeholderImage={placeholderImage}\n modifyDocumentTitleItem={modifyDocumentTitleItem}\n displayBranchName={displayBranchName}\n conversionOptions={conversionOptions}\n />\n ) : (\n <WaykeSearch\n filterList={filterList}\n initialQueryParams={initialQueryParams}\n removeSearchBar={removeSearchBar}\n placeholderImage={placeholderImage}\n removeFilterOptions={removeFilterOptions}\n modifyDocumentTitleSearch={modifyDocumentTitleSearch}\n displayBranchName={displayBranchName}\n />\n );\n};\n\nexport default WaykeComposite;\n", "import type {\n ConversionOption,\n ConversionOptionType,\n ConversionOptionVehicle,\n} from './@types/conversion';\nimport type { SearchFilterNameTypes, SearchFilterTypes } from './@types/filter';\nimport type { MarketCode } from './@types/market';\nimport SearchBar from './components/SearchBar';\nimport WaykeSearch, { WaykeSearchProps } from './layouts/search';\nimport WaykeSearchItem, { WaykeSearchItemProps } from './layouts/searchItem';\nimport WaykeComposite, {\n WaykeCompositeWithProviderProps,\n} from './layouts/WaykeCompositeWithProvider';\nimport WaykeThemeProvider from './providers/themeProvider';\nimport WaykeProvider, { EcomSettings, WaykeProviderSettings } from './providers/WaykeProvider';\nimport type { Environment, RoutingMode, RoutingSettings } from './State/Settings/settings';\nimport WaykePubSub, { EventSubscriptions } from './utils/pubsub/pubsub';\n\nexport {\n ConversionOption,\n ConversionOptionType,\n ConversionOptionVehicle,\n EcomSettings,\n Environment,\n EventSubscriptions,\n MarketCode,\n RoutingMode,\n RoutingSettings,\n SearchBar,\n SearchFilterNameTypes,\n SearchFilterTypes,\n WaykeCompositeWithProviderProps,\n WaykeProvider,\n WaykeProviderSettings,\n WaykePubSub,\n WaykeSearch,\n WaykeSearchItem,\n WaykeSearchItemProps,\n WaykeSearchProps,\n WaykeThemeProvider,\n};\n\nexport default WaykeComposite;\n\n// Every event and its data, for typing subscriptions.\nexport type * from './utils/pubsub/Events';\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useId", "useRef", "useState", "useTranslation", "useEffect", "useOutsideClick", "ref", "callback", "handleClick", "e", "useOutsideClick_default", "React", "React", "styled", "css", "Icon", "block", "IconInfo", "IconCancel", "IconChevronDown", "IconChevronLeft", "IconChevronRight", "IconCheck", "IconRadio", "IconSearch", "IconExclamationCircle", "IconExclamationTriangle", "IconImage", "styled", "_colors", "theme", "theme_default", "size", "multiplier", "baseUnit", "theme_default", "styled", "css", "styled", "UtilityTextRight", "UtilityFontSizeSmall", "UtilityTextPrimary", "UtilityTextBold", "ButtonReset", "styled", "ButtonBase", "size", "props", "fullWidth", "css", "inputHeight", "ButtonPrimary", "ButtonSecondary", "ButtonContent", "ButtonClear", "UtilityTextRight", "ButtonInline", "inline", "ButtonInlineBold", "ButtonInlineLight", "ButtonInlinePrimary", "Wrapper", "styled", "Label", "Search", "props", "Action", "ActionBtn", "ButtonReset", "Input", "size", "InputSearch", "React", "placeholder", "label", "value", "id", "onSearch", "onChange", "onKeyDown", "children", "aria", "ref", "Wrapper", "Label", "Search", "Input", "Action", "ActionBtn", "IconSearch", "InputSearch_default", "styled", "Suggestions", "styled", "size", "props", "Suggestion", "SearchBar", "value", "setValue", "onSearch", "suggestions", "onSelectSuggestion", "t", "useTranslation", "ref", "useRef", "listId", "useId", "active", "setActive", "useState", "open", "useEffect", "onChange", "useCallback", "e", "useOutsideClick_default", "_onSearch", "onKeyDown", "last", "i", "React", "InputSearch_default", "Suggestions", "label", "index", "Suggestion", "SearchBar_default", "React", "useCallback", "useEffect", "React", "styled", "Wrapper", "styled", "props", "size", "Container", "children", "React", "Wrapper", "Container_default", "React", "useCallback", "useMemo", "useState", "useTranslation", "LEGACY_FILTER_NAMES", "DEFAULT_FILTER_LIST", "resolveFilterList", "filterList", "legacy", "f", "seen", "FREE_TEXT", "SORT", "PAGE", "LIST_FILTERS", "RANGE_FILTERS", "BOOLEAN_FILTERS", "SORT_OPTIONS", "DEFAULT_SORT", "pageSize", "_params", "KNOWN_KEYS", "k", "isKnownKey", "key", "kmPerOdometerUnit", "market", "toInt", "value", "n", "toSearchVariables", "params", "options", "variables", "q", "values", "scale", "min", "max", "sort", "canonicalParams", "next", "toggleListValue", "current", "v", "withSort", "sortKey", "listOptions", "field", "params", "facets", "selected", "counts", "f", "options", "c", "value", "a", "b", "isRangeFilter", "key", "RANGE_FILTERS", "histogram", "unfiltered", "market", "h", "scale", "kmPerOdometerUnit", "rangeValues", "selectedCount", "averageDelta", "values", "toSteps", "fromZero", "delta", "max", "_", "i", "rangeSteps", "useContext", "createContext", "SearchContext", "useSearch", "useContext", "SearchContext", "useSearch_default", "useContext", "createContext", "ENVIRONMENTS", "REMOVED_SETTINGS", "warnRemovedSettings", "settings", "key", "resolveEcom", "enabled", "url", "ecom", "environmentUrl", "resolveSettings", "environment", "marketCode", "mode", "SettingsContext", "createContext", "resolveSettings", "useSettings", "useContext", "SettingsContext", "useSettings_default", "React", "useCallback", "useTranslation", "PubSub", "_PubSub", "event", "i", "eventName", "args", "pubsub_default", "React", "useCallback", "useState", "useTranslation", "styled", "css", "List", "styled", "size", "Header", "ButtonReset", "Label", "Heading", "Indicator", "IndicatorValue", "Icon", "props", "Body", "Item", "isOpen", "css", "AccordionItem", "heading", "children", "activeCount", "isActive", "t", "useTranslation", "extend", "setExtend", "useState", "onToggleExtend", "useCallback", "React", "Item", "Header", "Label", "Heading", "Indicator", "IndicatorValue", "Icon", "IconChevronDown", "Body", "Accordion", "List", "Accordion_default", "React", "useTranslation", "styled", "css", "HeadingBase", "styled", "size", "noMargin", "css", "H1", "props", "H2", "H3", "H4", "H5", "VisualHeading", "portal_namespace_exports", "__export", "DefaultPortal", "React", "ReactDOM", "Portal", "id", "children", "el", "current", "dynamic", "portal_default", "React", "PortalElement", "id", "portal_element_default", "styled", "keyframes", "noTransform", "fadeIn", "rotate", "Wrapper", "styled", "UiBlock", "fadeIn", "PanelWrapper", "props", "noTransform", "Header", "size", "Heading", "H1", "Close", "CloseBtn", "ButtonReset", "Body", "Footer", "FooterAction", "FooterActionItem", "Panel", "id", "title", "footer", "onClose", "children", "t", "useTranslation", "portal_default", "portal_namespace_exports", "Wrapper", "UiBlock", "PanelWrapper", "Header", "Heading", "H1", "Close", "CloseBtn", "IconCancel", "Body", "Footer", "Panel_default", "styled", "Repeat", "styled", "size", "RepeatTiny", "RepeatSmall", "React", "useTranslation", "React", "useCallback", "useEffect", "useState", "React", "styled", "List", "styled", "size", "Item", "Action", "ButtonReset", "props", "ActionIcon", "ActionLabel", "ChecklistItem", "label", "onClick", "active", "radio", "React", "Item", "Action", "ActionIcon", "IconRadio", "IconCheck", "ActionLabel", "Checklist", "items", "List", "item", "Checklist_default", "React", "styled", "Wrapper", "OverflowBox", "children", "React", "Wrapper", "OverflowBox_default", "ChecklistFacet", "id", "params", "result", "loading", "error", "update", "useSearch_default", "pending", "setPending", "useState", "useEffect", "onClick", "useCallback", "value", "checked", "current", "pubsub_default", "toggleListValue", "React", "OverflowBox_default", "Checklist_default", "listOptions", "option", "checkListFacet_default", "React", "useCallback", "useEffect", "useState", "COLOR_WHITE", "COLOR_BLACK", "COLOR_GRAY", "COLOR_SILVER", "COLOR_BLUE", "COLOR_RED", "COLOR_BROWN", "COLOR_GREEN", "COLOR_ORANGE", "COLOR_YELLOW", "COLOR_PURPLE", "COLOR_BEIGE", "DEFAULT_PLACEHOLDER_IMAGE", "getHexColorFromDisplayName", "displayName", "COLOR_WHITE", "COLOR_BLACK", "COLOR_GRAY", "COLOR_SILVER", "COLOR_BLUE", "COLOR_RED", "COLOR_BROWN", "COLOR_GREEN", "COLOR_ORANGE", "COLOR_YELLOW", "COLOR_PURPLE", "COLOR_BEIGE", "React", "styled", "css", "List", "styled", "size", "Item", "Action", "ButtonReset", "Color", "props", "active", "css", "boxShadow", "Label", "ColorSelectItem", "label", "hex", "onClick", "active", "disabled", "boxShadow", "React", "Item", "Action", "Color", "Label", "ColorSelect", "items", "List", "item", "ColorSelect_default", "ColorSelectFacet", "id", "params", "result", "loading", "error", "update", "useSearch_default", "pending", "setPending", "useState", "useEffect", "onClick", "useCallback", "value", "checked", "current", "pubsub_default", "toggleListValue", "React", "ColorSelect_default", "listOptions", "option", "getHexColorFromDisplayName", "colorFacet_default", "React", "useCallback", "useMemo", "React", "useEffect", "useRef", "useState", "useTranslation", "formatFns", "nb", "sv", "numberSeparator", "value", "n", "x", "s", "c", "re", "num", "dateTimeFormat", "format", "marketCode", "date", "settings", "nb", "sv", "formatFns", "SliderPrimitive", "styled", "RangeSpan", "styled", "size", "RangeSpanItem", "props", "Root", "Track", "Range", "Thumb", "smallestStep", "steps", "smallest", "step", "index", "RangeSlider", "loading", "values", "domain", "label", "unit", "formatValues", "maxPrefix", "onChange", "t", "useTranslation", "current", "setCurrent", "useState", "latest", "useRef", "move", "next", "useEffect", "commitDrag", "format", "value", "numberSeparator", "suffix", "equal", "thumbLabel", "bound", "React", "Root", "Track", "Range", "Thumb", "RangeSpan", "RangeSpanItem", "RangeSlider_default", "toInt", "value", "n", "RangeFacet", "id", "label", "unit", "formatValues", "params", "unfiltered", "loading", "update", "useSearch_default", "marketCode", "useSettings_default", "steps", "useMemo", "rangeSteps", "domain", "clamp", "values", "onChange", "useCallback", "next", "query", "canonicalParams", "pubsub_default", "React", "RangeSlider_default", "rangeFacet_default", "FacetSelector", "id", "label", "t", "useTranslation", "marketCode", "useSettings_default", "React", "colorFacet_default", "isRangeFilter", "checkListFacet_default", "rangeFacet_default", "faceSelector_default", "FilterPanel", "filters", "open", "onClose", "t", "useTranslation", "params", "result", "loading", "update", "useSearch_default", "found", "onClearFilters", "useCallback", "pubsub_default", "next", "sort", "SORT", "React", "Panel_default", "FooterAction", "FooterActionItem", "ButtonSecondary", "ButtonContent", "ButtonPrimary", "Accordion_default", "f", "AccordionItem", "Repeat", "faceSelector_default", "FilterPanel_default", "styled", "List", "styled", "size", "Item", "Action", "ButtonReset", "props", "Label", "Indicator", "IndicatorValue", "Filter", "filterList", "useTranslation", "marketCode", "useSettings_default", "params", "result", "unfiltered", "useSearch_default", "open", "setOpen", "useState", "onClose", "useCallback", "filters", "useMemo", "resolveFilterList", "f", "isRangeFilter", "rangeSteps", "listOptions", "React", "FilterPanel_default", "List", "selected", "selectedCount", "Item", "Action", "Label", "Indicator", "IndicatorValue", "Filter_default", "React", "React", "useTranslation", "toAmount", "money", "n", "hitImage", "hit", "i", "React", "useCallback", "useTranslation", "useEffect", "useRef", "useState", "useIsInViewport", "options", "containerRef", "isVisible", "setIsVisible", "intersectionRatio", "setIntersectionRatio", "callbackFunction", "entries", "observer", "entry", "useIsInViewport_default", "useContext", "createContext", "RouterContext", "useRouter", "useContext", "RouterContext", "useRouter_default", "React", "CFIT_WIDTHS", "isCfit", "src", "snapCfitWidth", "width", "w", "imageUrl", "height", "webp", "base", "query", "params", "cfitSources", "src", "widths", "set", "format", "width", "base", "query", "params", "snapCfitWidth", "ResponsiveImage", "src", "widths", "sizes", "Img", "rest", "largest", "isCfit", "React", "imageUrl", "sources", "cfitSources", "ResponsiveImage_default", "React", "styled", "css", "Item", "styled", "size", "Box", "props", "ItemSection", "Action", "ButtonReset", "List", "$isSmall", "css", "UspItem", "title", "onClick", "React", "Item", "Box", "ItemSection", "Action", "IconInfo", "UspList", "items", "small", "List", "item", "index", "UspList_default", "styled", "Wrapper", "styled", "Image", "props", "Picture", "Img", "Content", "size", "ContentBody", "ContentFooter", "PreHeading", "Heading", "Link", "Description", "Usp", "Price", "CurrentPrice", "PriceCell", "OldPrice", "Label", "CARD_WIDTHS", "CARD_SIZES", "ProductCard", "id", "title", "image", "placeholderImage", "branch", "branchName", "description", "uspList", "price", "oldPrice", "leasingPrice", "businessLeasingPrice", "t", "useTranslation", "itemHref", "onLinkClick", "useRouter_default", "href", "containerRef", "isVisible", "useIsInViewport_default", "onClick", "useCallback", "pubsub_default", "onHrefClick", "e", "React", "Wrapper", "Link", "Image", "ResponsiveImage_default", "Img", "Picture", "DEFAULT_PLACEHOLDER_IMAGE", "Content", "ContentBody", "PreHeading", "Heading", "Description", "Usp", "UspList_default", "ContentFooter", "Price", "PriceCell", "OldPrice", "Label", "CurrentPrice", "ProductCard_default", "HitCard", "hit", "placeholderImage", "displayBranchName", "t", "useTranslation", "ad", "iteration", "item", "odometer", "price", "toAmount", "oldPrice", "money", "amount", "unit", "numberSeparator", "usps", "React", "ProductCard_default", "hitImage", "usp", "HitCard_default", "styled", "Wrapper", "styled", "List", "size", "Item", "props", "Grid", "hits", "placeholderImage", "displayBranchName", "React", "Wrapper", "List", "hit", "Item", "HitCard_default", "Grid_default", "styled", "css", "Page", "styled", "PageSection", "size", "accent", "css", "props", "large", "fillSpace", "React", "useCallback", "useMemo", "useTranslation", "i18n", "initReactI18next", "i18nScoped", "getLanguage", "marketCode", "initializeI18n", "resolve", "SORT_LABELS", "sortOptions", "value", "label", "i18nScoped", "React", "styled", "SrOnly", "styled", "css", "Spinner", "styled", "size", "rotate", "Wrapper", "inline", "css", "center", "Loader", "inline", "center", "Wrapper", "Spinner", "i18nScoped", "SrOnly", "Loader_default", "React", "useTranslation", "styled", "Wrapper", "styled", "Description", "size", "Bar", "props", "BarActive", "ProgressBar", "valueCurrent", "valueMax", "t", "useTranslation", "barWidth", "React", "Wrapper", "Description", "Bar", "BarActive", "ProgressBar_default", "React", "useTranslation", "styled", "iconSize", "Wrapper", "styled", "Select", "size", "props", "Option", "Icon", "SortSelect", "value", "options", "onChange", "unit", "t", "useTranslation", "React", "Wrapper", "Select", "option", "Option", "Icon", "IconChevronDown", "SortSelect_default", "styled", "Wrapper", "styled", "Header", "size", "HeaderCount", "HeaderSort", "Body", "Footer", "FooterProgress", "FooterAction", "ResultCount", "props", "Result", "children", "useTranslation", "loading", "loadingMore", "result", "params", "hasMore", "loadMore", "update", "useSearch_default", "onSortOptionChange", "useCallback", "e", "withSort", "numberOfDocuments", "numberOfHits", "options", "useMemo", "sortOptions", "React", "Loader_default", "Wrapper", "Header", "HeaderCount", "ResultCount", "numberSeparator", "HeaderSort", "SortSelect_default", "SORT", "DEFAULT_SORT", "Body", "Footer", "FooterProgress", "ProgressBar_default", "FooterAction", "ButtonSecondary", "ButtonContent", "Result_default", "React", "useCallback", "useEffect", "useMemo", "useState", "package_default", "CLIENT_VERSION", "package_default", "GqlError", "kind", "message", "retryAfter", "cache", "pending", "resolveApiKey", "config", "request", "query", "variables", "response", "body", "e", "gqlQuery", "key", "inflight", "promise", "data", "SEARCH_HIT_FIELDS", "ADS_ARGUMENTS", "ADS_VARIABLE_DEFINITIONS", "multiSelectFacetAlias", "field", "buildSearchQuery", "selectedListFilters", "facetSearches", "args", "SEARCH_QUERY", "FACETS_QUERY", "SUGGEST_QUERY", "fetchSuggestions", "settings", "q", "limit", "gqlQuery", "SUGGEST_QUERY", "suggestionParams", "suggestion", "f", "useSuggestions", "value", "publicApi", "useSettings_default", "suggestions", "setSuggestions", "useState", "q", "useEffect", "active", "timeout", "fetchSuggestions", "next", "SearchFilter", "setValue", "params", "update", "useSearch_default", "labels", "useMemo", "s", "applySuggestion", "useCallback", "suggestion", "suggestionParams", "sort", "SORT", "pubsub_default", "onSearch", "FREE_TEXT", "exact", "list", "onSelectSuggestion", "index", "React", "SearchBar_default", "SearchFilter_default", "React", "useTranslation", "styled", "Wrapper", "styled", "Query", "Clear", "ButtonReset", "size", "props", "SearchTerm", "children", "onClear", "clearTitle", "t", "useTranslation", "React", "Wrapper", "Query", "Clear", "IconCancel", "SearchTerm_default", "React", "styled", "getSnackbarBg", "severity", "bg", "theme_default", "Wrapper", "styled", "size", "props", "Icon", "Content", "Heading", "Message", "Snackbar", "severity", "icon", "heading", "children", "iconSelector", "React", "IconInfo", "IconExclamationCircle", "IconExclamationTriangle", "IconCheck", "Wrapper", "Icon", "Content", "Heading", "Message", "Snackbar_default", "WaykeSearch", "filterList", "initialQueryParams", "removeSearchBar", "placeholderImage", "removeFilterOptions", "modifyDocumentTitleSearch", "displayBranchName", "error", "result", "params", "update", "initialize", "useSearch_default", "query", "useEffect", "pubsub_default", "onClearQuery", "useCallback", "next", "FREE_TEXT", "searchQuery", "React", "Page", "PageSection", "Container_default", "SearchFilter_default", "SearchTerm_default", "Filter_default", "Result_default", "Snackbar_default", "Grid_default", "i18nScoped", "portal_element_default", "portal_namespace_exports", "search_default", "React", "useCallback", "useEffect", "useMemo", "useState", "defaultConversionOptions", "React", "React", "styled", "Wrapper", "styled", "size", "props", "Avatar", "image", "alt", "React", "Wrapper", "Avatar_default", "styled", "Wrapper", "styled", "props", "Quote", "Author", "size", "AvatarWrapper", "Info", "Name", "Date", "Blockquote", "children", "author", "avatar", "date", "React", "Wrapper", "Quote", "Author", "AvatarWrapper", "Avatar_default", "Info", "Name", "Date", "Blockquote_default", "React", "DOMPurify", "Marked", "escapeAttribute", "value", "markdown", "token", "title", "text", "ALLOWED_TAGS", "ALLOWED_ATTR", "ALLOWED_URI_REGEXP", "sanitizeHtml", "html", "markdownToHtml", "styled", "css", "Wrapper", "styled", "size", "small", "css", "Content", "children", "small", "markdown", "html", "__html", "markdownToHtml", "sanitizeHtml", "React", "Wrapper", "Content_default", "React", "useCallback", "useState", "styled", "css", "Wrapper", "styled", "Extend", "size", "extended", "css", "Action", "ExtendContent", "children", "actionTitle", "onClick", "extend", "setExtend", "useState", "onExtend", "useCallback", "React", "Wrapper", "ref", "Extend", "Action", "ButtonClear", "ButtonContent", "ExtendContent_default", "React", "useTranslation", "React", "styled", "css", "Link", "props", "$hoverGhost", "styled", "Wrapper", "styled", "size", "props", "Icon", "Body", "Heading", "CreditorDisclaimer", "React", "Wrapper", "Icon", "Body", "Heading", "Link", "React", "useCallback", "useState", "useTranslation", "React", "styled", "List", "styled", "Item", "size", "Label", "Value", "DataList", "items", "React", "List", "item", "Item", "Label", "Value", "DataList_default", "React", "useTranslation", "styled", "Wrapper", "styled", "props", "size", "UiBlock", "fadeIn", "Dialog", "noTransform", "Content", "Header", "Heading", "H1", "Close", "CloseBtn", "ButtonReset", "Body", "Image", "ModalFoldout", "ModalFoldoutBody", "Modal", "id", "title", "onClose", "children", "t", "useTranslation", "portal_default", "portal_namespace_exports", "Wrapper", "e", "UiBlock", "Dialog", "Content", "Header", "Heading", "H1", "Close", "CloseBtn", "IconCancel", "Body", "Modal_default", "React", "styled", "Wrapper", "styled", "size", "props", "Logo", "LogoImg", "Content", "OptionBoxHeading", "OptionBoxContent", "OptionBox", "logo", "logo2x", "logoAlt", "children", "Wrapper", "Logo", "LogoImg", "Content", "OptionBox_default", "Leasing", "offer", "useTranslation", "modal", "setModal", "useState", "toggleModal", "useCallback", "image", "description", "monthlyCost", "months", "mileagePerYear", "business", "name", "title", "React", "Modal_default", "Image", "Content_default", "ModalFoldout", "ModalFoldoutBody", "DataList_default", "numberSeparator", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "UtilityTextPrimary", "ButtonInline", "leasing_default", "React", "useCallback", "useState", "useTranslation", "useEffect", "useState", "WARRANTY_CONTENT", "AD_QUERY", "AD_ID_BY_LEGACY_ID_QUERY", "CALCULATE_PAYMENT_QUERY", "INSURANCE_INQUIRY_QUERY", "RELATED_ADS_QUERY", "SEARCH_HIT_FIELDS", "useLoanCalculation", "settings", "adId", "financialOptionId", "duration", "downPayment", "residual", "payment", "setPayment", "useState", "loading", "setLoading", "skip", "useEffect", "active", "gqlQuery", "CALCULATE_PAYMENT_QUERY", "data", "next", "useLoanCalculation_default", "legacyWaykeIdFromIterationId", "iterationId", "fallback", "firstAt", "secondAt", "num", "value", "n", "str", "adEvent", "ad", "waykeId", "legacyWaykeIdFromIterationId", "platformChannel", "c", "price", "discount", "oldPrice", "current", "availableFrom", "channel", "publishedAt", "at", "ecom", "commerce", "contactPerson", "d", "openingHours", "branch", "hours", "week", "h", "key", "position", "galleryMedia", "items", "a", "b", "m", "i", "range", "r", "leasingOffers", "leasing", "business", "monthlyCost", "promo", "lp", "packageOffers", "p", "manufacturerPackage", "warranty", "w", "definition", "accessoryImages", "accessory", "createContext", "useContext", "AdContext", "useAdContext", "ad", "AdContext_default", "React", "useCallback", "useEffect", "useMemo", "useState", "useTranslation", "styled", "ContentLogo", "styled", "props", "ContentLogoText", "ContentLogoMedia", "size", "React", "styled", "css", "Logo", "styled", "size", "wide", "css", "LogoBox", "logo", "logo2x", "alt", "wide", "logoRetina", "Logo", "LogoBox_default", "React", "useCallback", "useEffect", "useState", "React", "styled", "css", "Wrapper", "styled", "Label", "Value", "size", "isHighlighted", "css", "props", "RangeSliderLabel", "label", "value", "highlight", "React", "Wrapper", "Label", "Value", "RangeSliderLabel_default", "React", "useEffect", "useRef", "useState", "RangeSliderSimple", "loading", "values", "domain", "steps", "label", "onChange", "onUpdate", "current", "setCurrent", "useState", "latest", "useRef", "useEffect", "React", "Root", "next", "Track", "Range", "Thumb", "RangeSliderSimple_default", "SliderWithLabel", "label", "values", "domain", "steps", "loading", "unit", "onChange", "local", "setLocal", "useState", "onUpdate", "useCallback", "nextValues", "useEffect", "React", "RepeatTiny", "RangeSliderLabel_default", "numberSeparator", "RangeSliderSimple_default", "SliderWithLabel_default", "stepGenerator", "step", "max", "steps", "current", "nextCurrent", "LoanModal", "option", "onClose", "t", "useTranslation", "ad", "AdContext_default", "publicApi", "marketCode", "useSettings_default", "extend", "setExtend", "React", "trackPayload", "useMemo", "adEvent", "onToggleExtend", "pubsub_default", "variables", "setVariables", "useState", "num", "loading", "payment", "useLoanCalculation_default", "useEffect", "residual", "downPayment", "range", "downPaymentCurrent", "downPaymentMin", "downPaymentMax", "downPaymentSteps", "onDownPaymentChange", "useCallback", "values", "duration", "durationCurrent", "durationMin", "durationMax", "durationSteps", "onDurationChange", "residualRange", "residualCurrent", "residualMin", "residualMax", "residualSteps", "onResidualChange", "interestText", "effectiveInterestText", "monthlyCost", "image", "name", "Modal_default", "Repeat", "ContentLogo", "ContentLogoText", "Content_default", "ContentLogoMedia", "LogoBox_default", "RepeatSmall", "SliderWithLabel_default", "RepeatTiny", "numberSeparator", "ButtonClear", "ButtonContent", "ModalFoldout", "ModalFoldoutBody", "DataList_default", "CreditorDisclaimer", "LoanModal_default", "Loan", "loan", "useTranslation", "ad", "AdContext_default", "publicApi", "useSettings_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "payment", "useLoanCalculation_default", "num", "interest", "duration", "monthlyCost", "loanAmount", "logo", "React", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "LoanModal_default", "numberSeparator", "ButtonInline", "loan_default", "FinancialOptions", "loans", "leasing", "t", "useTranslation", "marketCode", "useSettings_default", "React", "Repeat", "RepeatTiny", "VisualHeading", "offer", "leasing_default", "loan", "loan_default", "CreditorDisclaimer", "FinancialOptions_default", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useTranslation", "React", "useTranslation", "React", "Viewer", "React", "useEffect", "useRef", "useState", "useTranslation", "styled", "compassSize", "size", "controlBtnSize", "Wrapper", "styled", "p", "props", "styled", "Figure", "styled", "Badge", "size", "SliderBar", "SliderValue", "VisuallyHidden", "isWebgl2Supported", "SphereViewer", "id", "src", "interactive", "t", "useTranslation", "container", "useRef", "viewerRef", "loading", "setLoading", "useState", "useEffect", "viewer", "Viewer", "handleReady", "fillStyle", "React", "Wrapper", "Loader_default", "Badge", "SphereViewer_default", "SphereLightbox", "url", "React", "SphereViewer_default", "SphereLightbox_default", "React", "styled", "Wrapper", "styled", "size", "props", "UiBlock", "Item", "Img", "CloseBtn", "ButtonReset", "React", "useRef", "useState", "useTranslation", "wrap", "value", "length", "Rotation", "urls", "img", "widths", "sizes", "t", "useTranslation", "count", "position", "setPosition", "useState", "frame", "drag", "useRef", "label", "i", "onPointerDown", "e", "onPointerMove", "start", "delta", "onPointerUp", "onKeyDown", "next", "React", "Figure", "VisuallyHidden", "Badge", "url", "ResponsiveImage_default", "SliderBar", "Root", "Track", "Range", "Thumb", "SliderValue", "Rotation_default", "WIDTHS", "SIZES", "ThreeSixtyLightbox", "urls", "React", "Rotation_default", "Img", "ThreeSixtLightbox_default", "React", "React", "styled", "Video", "modal", "Video_default", "styled", "Wrapper", "props", "Iframe", "CustomPlayer", "url", "controls", "modal", "ratio", "isPreview", "React", "Wrapper", "Video_default", "CustomPlayer_default", "React", "getVimeoId", "url", "regExp", "match", "getYouTubeId", "youtubeBase", "getYoutubeThumbnail", "id", "onImageLoad", "thumbnail", "onImageError", "VimeoPlayer", "url", "autoplay", "React", "Wrapper", "Iframe", "getVimeoId", "VimeoPlayer_default", "React", "YouTubePlayer", "url", "autoplay", "React", "Wrapper", "Iframe", "getYouTubeId", "YoutubePlayer_default", "ytNames", "isYouTubeVideo", "url", "host", "vNames", "isVimeoVideo", "VideoPlayer", "autoplay", "controls", "React", "YoutubePlayer_default", "VimeoPlayer_default", "CustomPlayer_default", "EmbeddedVideoLightbox_default", "Lightbox", "index", "media", "onClose", "t", "useTranslation", "onRef", "ref", "React", "Wrapper", "e", "UiBlock", "m", "i", "Item", "ResponsiveImage_default", "Img", "ThreeSixtLightbox_default", "SphereLightbox_default", "EmbeddedVideoLightbox_default", "CloseBtn", "IconCancel", "Lightbox_default", "styled", "NavButton", "styled", "ButtonReset", "size", "props", "React", "Sphere", "url", "React", "SphereViewer_default", "Sphere_default", "React", "useTranslation", "styled", "css", "quickNavWidth", "Wrapper", "styled", "props", "size", "Main", "Alt", "Track", "Item", "Image", "ImageFull", "Arrow", "ArrowLeft", "ArrowRight", "QuickNav", "QuickNavItem", "$active", "css", "QuickNavBtn", "ButtonReset", "QuickNavImg", "MediaButtonWrapper", "WIDTHS", "SIZES", "ThreeSixty", "urls", "useTranslation", "React", "Badge", "ResponsiveImage_default", "Image", "ThreeSixty_default", "React", "useCallback", "useState", "useTranslation", "React", "MediaButton", "text", "onClick", "React", "MediaButtonWrapper", "ButtonSecondary", "ButtonContent", "MediaButton_default", "useEffect", "useState", "useEffect", "useState", "useCallback", "useEffect", "useState", "cache", "getCachedResult", "key", "setCachedResult", "value", "pendingPromise", "isPendingPromise", "url", "setPendingPromise", "promise", "clearPendingPromise", "useFetch", "path", "options", "skip", "promiseCache", "data", "setData", "loading", "setLoading", "error", "setError", "doFetch", "cached", "request", "result", "json", "useFetch_default", "useVimeoThumbnail", "id", "small", "thumbnail", "setThumbnail", "useState", "data", "useFetch_default", "useEffect", "useVimeoThumbnail_default", "useThumbnail", "url", "small", "thumbnail", "setThumbnail", "useState", "vimeoId", "getVimeoId", "vimeoThumbnail", "useVimeoThumbnail_default", "useEffect", "youtubeThumbnail", "getYoutubeThumbnail", "useThumbnail_default", "GalleryEmbed", "src", "index", "t", "useTranslation", "modal", "setModal", "useState", "thumbnail", "useThumbnail_default", "onClick", "e", "onCloseModal", "onError", "useCallback", "onImageError", "onLoad", "onImageLoad", "customVideo", "React", "ImageFull", "MediaButton_default", "Modal_default", "EmbeddedVideoLightbox_default", "CustomPlayer_default", "EmbededVideo_default", "React", "useCallback", "useTranslation", "QuickNavEmbeded", "src", "index", "t", "useTranslation", "thumbnail", "useThumbnail_default", "onError", "useCallback", "e", "onImageError", "onLoad", "onImageLoad", "customVideo", "React", "QuickNavImg", "CustomPlayer_default", "QuickNavEmbeded_default", "GALLERY_WIDTHS", "GALLERY_SIZES", "THUMBNAIL_WIDTHS", "scrollBehavior", "revealInList", "list", "item", "Gallery", "media", "placeholderImage", "t", "useTranslation", "ad", "AdContext_default", "trackRef", "useRef", "quickNavRef", "index", "setIndex", "useState", "lightbox", "setLightbox", "mediaLength", "placeholder", "useMemo", "DEFAULT_PLACEHOLDER_IMAGE", "goTo", "useCallback", "target", "track", "next", "slide", "onScroll", "first", "useEffect", "onKeyDown", "e", "onClick", "pubsub_default", "adEvent", "onToggleLightbox", "React", "Wrapper", "Main", "Track", "m", "i", "Item", "ResponsiveImage_default", "Image", "ThreeSixty_default", "EmbededVideo_default", "Sphere_default", "ArrowLeft", "NavButton", "IconChevronLeft", "ArrowRight", "IconChevronRight", "Alt", "QuickNav", "src", "imageUrl", "QuickNavItem", "QuickNavBtn", "QuickNavEmbeded_default", "QuickNavImg", "Lightbox_default", "Gallery_default", "React", "React", "useCallback", "useState", "useTranslation", "React", "useCallback", "useMemo", "useState", "useTranslation", "useEffect", "useState", "useInsuranceInquiry", "settings", "adId", "personalNumber", "drivingDistance", "insurances", "setInsurances", "useState", "loading", "setLoading", "error", "setError", "skip", "useEffect", "active", "gqlQuery", "INSURANCE_INQUIRY_QUERY", "data", "list", "i", "useInsuranceInquiry_default", "ssnIsValid", "s", "styled", "ColumnRow", "styled", "ColumnRowItem", "size", "React", "useTranslation", "styled", "Wrapper", "styled", "Main", "size", "Heading", "H2", "Description", "Footer", "Foldout", "props", "DetailBox", "heading", "description", "children", "t", "useTranslation", "extend", "setExtend", "React", "onToggleExtend", "extendBtnText", "Wrapper", "Main", "Heading", "Description", "Footer", "ButtonClear", "ButtonContent", "Foldout", "DetailBox_default", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "styled", "Header", "Title", "Info", "size", "InfoBtn", "ButtonReset", "props", "Extend", "ExtendInfo", "title", "children", "t", "useTranslation", "extend", "setExtend", "useState", "onToggleExtend", "useCallback", "React", "Wrapper", "Header", "Title", "Info", "InfoBtn", "IconInfo", "Extend", "ExtendInfo_default", "styled", "InputGroup", "styled", "props", "size", "InputGroupColumn", "React", "styled", "Wrapper", "styled", "size", "InputLabel", "children", "htmlFor", "React", "Wrapper", "InputLabel_default", "React", "styled", "iconSize", "selectPadding", "size", "Wrapper", "styled", "props", "Select", "Option", "Icon", "InputSelect", "value", "options", "onChange", "unit", "title", "React", "Wrapper", "Select", "option", "Option", "Icon", "IconChevronDown", "InputSelect_default", "React", "styled", "Wrapper", "styled", "props", "Input", "size", "InputText", "label", "props", "React", "Wrapper", "Input", "InputText_default", "InsuranceModal", "onClose", "provider", "t", "useTranslation", "ad", "AdContext_default", "publicApi", "useSettings_default", "form", "setForm", "useState", "payload", "setPayload", "loading", "insurances", "error", "useInsuranceInquiry_default", "ssnIsValid", "onChangeSsn", "useCallback", "e", "onChangeDrivingDistance", "trackPayload", "useMemo", "adEvent", "onShowInsurances", "pubsub_default", "onKeyDown", "options", "React", "Modal_default", "Repeat", "ContentLogo", "ContentLogoText", "Content_default", "ContentLogoMedia", "LogoBox_default", "RepeatSmall", "RepeatTiny", "InputGroup", "InputGroupColumn", "InputLabel_default", "InputText_default", "InputSelect_default", "ButtonPrimary", "ButtonContent", "Loader_default", "Snackbar_default", "insurance", "DetailBox_default", "numberSeparator", "str", "ButtonInline", "H4", "item", "ExtendInfo_default", "addon", "ColumnRow", "ColumnRowItem", "UtilityTextBold", "InsuranceModal_default", "Insurance", "provider", "useTranslation", "ad", "AdContext_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "React", "InsuranceModal_default", "Repeat", "RepeatTiny", "VisualHeading", "OptionBox_default", "OptionBoxHeading", "OptionBoxContent", "ButtonInline", "Insurance_default", "React", "useCallback", "useState", "useTranslation", "React", "useTranslation", "InsuranceFreeModal", "onClose", "provider", "t", "useTranslation", "React", "Modal_default", "Repeat", "Content_default", "ButtonInline", "LogoBox_default", "InsuranceFreeModal_default", "InsuranceFree", "provider", "useTranslation", "ad", "AdContext_default", "modal", "setModal", "useState", "toggleModal", "useCallback", "pubsub_default", "adEvent", "React", "InsuranceFreeModal_default", "Repeat", "RepeatTiny", "VisualHeading", "OptionBox_default", "Content_default", "OptionBoxContent", "ButtonInline", "InsuranceFree_default", "InsuranceOptions", "provider", "React", "Insurance_default", "InsuranceFree_default", "InsuranceOptions_default", "React", "useTranslation", "styled", "Price", "OldPrice", "props", "styled", "List", "styled", "Item", "size", "Label", "Value", "PriceTable", "price", "discount", "t", "useTranslation", "React", "List", "Item", "Label", "VisualHeading", "Value", "Price", "numberSeparator", "OldPrice", "PriceTable_default", "styled", "ProductPage", "styled", "props", "ProductPageAside", "size", "ProductPageMain", "ProductPageAsideSection", "ProductPageMainSection", "Wrapper", "ProductPageContentLimit", "useEffect", "useState", "UUID", "fetchAd", "settings", "id", "gqlQuery", "AD_QUERY", "resolveLegacyId", "AD_ID_BY_LEGACY_ID_QUERY", "replaceIdInUrl", "from", "to", "pathname", "search", "hash", "useAd", "ad", "setAd", "useState", "loading", "setLoading", "error", "setError", "useEffect", "active", "next", "adId", "useAd_default", "React", "useState", "useTranslation", "React", "useTranslation", "styled", "css", "Wrapper", "styled", "size", "imageBaseStyling", "css", "Image", "ImageaPlaceholder", "props", "Body", "Heading", "Title", "Branding", "Price", "Preamble", "ReadMoreBtn", "ButtonReset", "AccessoryCard", "title", "image", "branding", "price", "preamble", "readMoreCta", "t", "useTranslation", "React", "Wrapper", "Image", "ImageaPlaceholder", "IconImage", "Body", "Heading", "Title", "Branding", "Price", "Preamble", "ReadMoreBtn", "AccessoryCard_default", "React", "useCallback", "useEffect", "useRef", "useState", "styled", "css", "Wrapper", "styled", "size", "props", "$accentBg", "css", "Item", "List", "$columns", "$columnsSm", "$columnsMd", "ListWrapper", "$spacing", "NavBtn", "PrevBtn", "NextBtn", "OverflowGrid", "items", "itemKeyBase", "spacing", "columns", "columnsSm", "columnsMd", "accentBg", "overflowElement", "useRef", "onPrev", "useCallback", "itemWidth", "scrollLeft", "onNext", "scrollWidth", "overflowElementWidth", "hidePrevNav", "setHidePrevNav", "useState", "hideNextNav", "setHideNextNav", "onScroll", "overflowElementScrollWidth", "useEffect", "React", "Wrapper", "ListWrapper", "List", "item", "i", "Item", "PrevBtn", "NavButton", "IconChevronLeft", "NextBtn", "IconChevronRight", "OverflowGrid_default", "React", "useTranslation", "styled", "Image", "React", "styled", "css", "Wrapper", "styled", "size", "props", "Row", "$oldPrice", "css", "Label", "Price", "PriceBox", "prices", "React", "Wrapper", "item", "i", "Row", "Label", "Price", "PriceBox_default", "AccesoryModal", "accessory", "onClose", "t", "useTranslation", "image", "accessoryImages", "priceList", "numberSeparator", "React", "Modal_default", "Repeat", "Image", "LogoBox_default", "PriceBox_default", "Content_default", "UtilityTextBold", "Link", "AccessoryModal_default", "AccessoriesSection", "accessories", "useTranslation", "modal", "setModal", "useState", "onOpenModal", "accessory", "onCloseModal", "React", "AccessoryModal_default", "ProductPageMainSection", "Repeat", "H2", "Content_default", "OverflowGrid_default", "AccessoryCard_default", "accessoryImages", "numberSeparator", "Accessories_default", "React", "useTranslation", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "Image", "Placeholder", "props", "PlaceholderAction", "StaticMap", "position", "useTranslation", "googleMapsApiKey", "googleMapsMarker", "useSettings_default", "visible", "setVisible", "useState", "onShowMap", "useCallback", "e", "latitude", "longitude", "React", "Wrapper", "Image", "Placeholder", "PlaceholderAction", "ButtonSecondary", "ButtonContent", "Map_default", "React", "useMemo", "useTranslation", "React", "styled", "getBg", "severity", "bg", "theme_default", "Wrapper", "styled", "props", "size", "Badge", "label", "severity", "React", "Wrapper", "Badge_default", "styled", "TableColumn", "styled", "TableColumnRow", "size", "TableColumnCell", "KeyOrder", "TranslateWeekDays", "t", "d", "arr", "GetOpeningHours", "o", "prev", "current", "title", "item", "previous", "GetOpeningHoursToday", "dayNumber", "day", "valuOfDateString", "s", "splitted", "x", "OpeningHours", "openingHours", "useTranslation", "today", "useMemo", "currentlyOpen", "currentDate", "from", "until", "oh", "React", "RepeatSmall", "Badge_default", "TableColumn", "TableColumnRow", "TableColumnCell", "UtilityTextBold", "OpeningHours_default", "React", "useCallback", "useState", "useTranslation", "PhoneNumber", "phoneNumber", "useTranslation", "visible", "setVisible", "useState", "onClick", "useCallback", "React", "TableColumnRow", "TableColumnCell", "ButtonInlineBold", "ButtonContent", "PhoneNumber_default", "parsePhoneNumberFromString", "metadata_min_default", "metadata", "metadata_min_default", "typedMetadata", "formatPhonenumber", "text", "parsePhoneNumberFromString", "Branch", "branch", "displayBranchName", "t", "useTranslation", "hours", "openingHours", "phone", "React", "Repeat", "H2", "Map_default", "position", "ProductPageContentLimit", "TableColumn", "TableColumnRow", "TableColumnCell", "ButtonInlineBold", "ButtonContent", "PhoneNumber_default", "formatPhonenumber", "OpeningHours_default", "Branch_default", "format", "nb", "sv", "React", "useCallback", "useState", "useTranslation", "React", "useCallback", "useMemo", "useState", "useTranslation", "React", "useCallback", "useId", "useMemo", "useState", "useTranslation", "useCallback", "useState", "useSubmitLead", "leadUrl", "marketCode", "isLoading", "setIsLoading", "useState", "error", "setError", "submitLead", "useCallback", "itemId", "branchId", "communication", "firstName", "lastName", "phoneNumber", "email", "message", "tradeInCarRegNo", "tradeInCarMileage", "payload", "package_default", "response", "err", "useSubmitLead_default", "React", "React", "styled", "css", "Label", "styled", "size", "props", "Wrapper", "type", "checked", "error", "css", "Input", "LabelText", "InputCheckbox", "children", "props", "id", "Wrapper", "Input", "Label", "LabelText", "InputCheckbox_default", "React", "styled", "Wrapper", "styled", "size", "props", "InputError", "id", "children", "React", "Wrapper", "InputError_default", "React", "styled", "Wrapper", "styled", "props", "Textarea", "size", "InputTextarea", "label", "props", "React", "Wrapper", "Textarea", "InputTextarea_default", "styled", "Field", "initialValues", "MAX_MESSAGE_LENGTH", "EMAIL_PATTERN", "registrationNumberPatterns", "normalizeRegistrationNumber", "value", "isValidRegistrationNumber", "marketCode", "pattern", "LeadForm", "communication", "onClose", "t", "useTranslation", "ad", "AdContext_default", "leadUrl", "useSettings_default", "submitLead", "isLoading", "useSubmitLead_default", "values", "setValues", "useState", "errors", "setErrors", "submitError", "setSubmitError", "sent", "setSent", "formId", "useId", "fieldId", "name", "errorId", "title", "trackPayload", "useMemo", "adEvent", "setValue", "useCallback", "prev", "validate", "v", "next", "onSubmit", "e", "nextErrors", "pubsub_default", "React", "Modal_default", "Repeat", "Content_default", "ButtonPrimary", "ButtonContent", "textField", "label", "inputProps", "RepeatTiny", "Field", "InputLabel_default", "InputText_default", "InputError_default", "RepeatSmall", "InputTextarea_default", "InputCheckbox_default", "ButtonSecondary", "LeadForm_default", "React", "useCallback", "useState", "useTranslation", "ToggleItem", "title", "value", "type", "href", "primary", "onClickVisible", "onClickValue", "t", "useTranslation", "visible", "setVisible", "useState", "_onClickValue", "useCallback", "onClick", "visibleTitle", "Button", "ButtonPrimary", "ButtonSecondary", "React", "RepeatTiny", "ButtonContent", "toggle_item_default", "resolveText", "text", "vehicle", "ActionList", "title", "conversionOptions", "defaultConversionOptions", "toggleEcomModal", "t", "useTranslation", "ad", "AdContext_default", "contact", "contactPerson", "email", "phonenumber", "ecommerce", "ecom", "useMemo", "item", "emailHref", "useCallback", "option", "vehicleLabel", "subject", "params", "trackPayload", "adEvent", "onClickMailVisible", "pubsub_default", "onClickMailValue", "onClickPhoneVisible", "onClickPhoneValue", "leadCommunication", "setLeadCommunication", "useState", "openLeadForm", "communication", "closeLeadForm", "renderButton", "key", "label", "primary", "onClick", "disabled", "React", "RepeatTiny", "ButtonPrimary", "ButtonSecondary", "ButtonContent", "buttons", "index", "toggle_item_default", "formatPhonenumber", "LeadForm_default", "ActionList_default", "React", "styled", "List", "styled", "Item", "size", "Icon", "Label", "CheckMarkListItem", "children", "React", "Item", "Icon", "IconCheck", "Label", "CheckMarkList", "List", "CheckMarkList_default", "styled", "css", "Column", "styled", "grow", "css", "noShrink", "Columns", "valign", "align", "$spacing", "size", "flexWrap", "flexInline", "clearLtSm", "props", "clearLtMd", "styled", "css", "StateIndicator", "styled", "size", "$tone", "css", "props", "React", "useCallback", "useState", "useTranslation", "styled", "Wrapper", "styled", "size", "props", "Header", "Body", "Info", "Action", "InfoContent", "InfoBtn", "ButtonReset", "Title", "SwitchBar", "title", "body", "actionTitle", "children", "onClick", "t", "useTranslation", "info", "setInfo", "useState", "onToggleInfo", "useCallback", "React", "Wrapper", "Header", "Info", "InfoContent", "Title", "InfoBtn", "IconInfo", "Action", "ButtonInline", "Body", "Modal_default", "SwitchBar_default", "React", "useTranslation", "PackageOptionModal", "packageOption", "onClose", "t", "useTranslation", "React", "Modal_default", "Repeat", "LogoBox_default", "Content_default", "ButtonInline", "PackageOptionModal_default", "CheckList", "title", "conversionOptions", "toggleEcomModal", "t", "useTranslation", "ad", "AdContext_default", "marketCode", "useSettings_default", "ecommerce", "ecom", "availableFrom", "packageOption", "manufacturerPackage", "packageOptions", "packageOffers", "modal", "setModal", "useState", "onOpen", "useCallback", "nextModal", "onClose", "React", "PackageOptionModal_default", "Repeat", "ActionList_default", "RepeatTiny", "SwitchBar_default", "Content_default", "Columns", "Column", "StateIndicator", "UtilityFontSizeSmall", "format", "nb", "sv", "CheckMarkList_default", "CheckMarkListItem", "ButtonInline", "index", "CheckList_default", "React", "useTranslation", "DemoCarModal", "onClose", "useTranslation", "React", "Modal_default", "Content_default", "DemoCarModal_default", "React", "useTranslation", "React", "useMemo", "useTranslation", "styled", "PdfListItem", "styled", "size", "theme", "List", "PdfLink", "PdfTitle", "props", "PdfSubtitle", "PdfColumn", "PdfListInner", "translateContentType", "document", "PdfDownloadItem", "useTranslation", "contentType", "useMemo", "React", "PdfListItem", "PdfListInner", "PdfColumn", "PdfTitle", "PdfSubtitle", "PdfLink", "DocumentList", "documents", "List", "i", "DocumentList_default", "SortOrder", "Documents", "documents", "useTranslation", "Translation", "categorised", "prev", "curr", "index", "x", "category", "b", "manyCategories", "React", "ProductPageMainSection", "Repeat", "H2", "ExtendContent_default", "group", "H3", "DocumentList_default", "Documents_default", "React", "useTranslation", "ManufacturerPackageOption", "packageOption", "useTranslation", "React", "ProductPageMainSection", "Repeat", "H2", "Content_default", "ButtonInline", "LogoBox_default", "ManufacturerPackagesOption_default", "React", "useTranslation", "PackageOptions", "packageOptions", "useTranslation", "React", "packageOption", "index", "ProductPageMainSection", "Repeat", "H2", "Content_default", "ButtonInline", "LogoBox_default", "PackageOptions_default", "React", "useTranslation", "Page404", "t", "useTranslation", "React", "Page", "PageSection", "Container_default", "H1", "Page404_default", "React", "PageLoading", "React", "Page", "PageSection", "Container_default", "Loader_default", "PageLoading_default", "React", "useCallback", "useEffect", "useMemo", "useState", "useTranslation", "styled", "TableList", "styled", "props", "TableListItem", "size", "TableListKey", "TableListValue", "TableListBooleanPos", "TableListBooleanNeg", "React", "styled", "css", "Wrapper", "styled", "size", "props", "List", "Item", "Action", "ButtonReset", "css", "Tabs", "tabs", "active", "onClick", "Wrapper", "List", "tab", "Item", "Action", "Tabs_default", "toProperty", "v", "isBoolean", "toCategory", "c", "id", "s", "i", "propertyTree", "ad", "item", "odometer", "basic", "add", "key", "value", "unit", "withHint", "attributes", "modelSeries", "modelName", "version", "categories", "basicIndex", "existing", "propertyTree_default", "React", "useCallback", "useState", "useTranslation", "formatValue", "t", "value", "unit", "React", "TableListBooleanPos", "SrOnly", "IconCheck", "TableListBooleanNeg", "IconCancel", "MetadataItem", "name", "hint", "useTranslation", "foldout", "setFoldout", "useState", "onToggleFoldout", "useCallback", "presentedValue", "TableListItem", "TableListKey", "ButtonInline", "TableListValue", "Modal_default", "Content_default", "MetadataItem_default", "MetadataSubCategory", "name", "properties", "React", "Repeat", "H5", "TableList", "property", "index", "MetadataItem_default", "MetadataCategory", "subCategories", "subCategory", "PropertySet", "t", "useTranslation", "ad", "AdContext_default", "activeCategoryId", "setActiveCategoryId", "useState", "mappedProperties", "useMemo", "propertyTree_default", "useEffect", "categories", "onTab", "useCallback", "id", "activeCategory", "category", "Tabs_default", "Property_default", "React", "useTranslation", "React", "styled", "Wrapper", "styled", "Heading", "Action", "size", "SectionHeader", "children", "onClick", "actionTitle", "React", "Wrapper", "Heading", "Action", "ButtonClear", "ButtonContent", "SectionHeader_default", "useEffect", "useState", "useRelatedAds", "settings", "adId", "manufacturer", "limit", "hits", "setHits", "useState", "loading", "setLoading", "useEffect", "active", "latest", "make", "perPage", "gqlQuery", "RELATED_ADS_QUERY", "data", "h", "sameMake", "taken", "others", "related", "useRelatedAds_default", "Related", "adId", "manufacturer", "placeholderImage", "displayBranchName", "t", "useTranslation", "publicApi", "useSettings_default", "hits", "useRelatedAds_default", "React", "PageSection", "Container_default", "Repeat", "SectionHeader_default", "H2", "OverflowGrid_default", "hit", "HitCard_default", "Related_default", "useEffect", "useRef", "useEcom", "ad", "ecom", "marketCode", "ecomContext", "useRef", "id", "waykeId", "useEffect", "destroyed", "module", "view", "event", "currentStep", "data", "pubsub_default", "adEvent", "useEcom_default", "ItemView", "ad", "placeholderImage", "modifyDocumentTitleItem", "displayBranchName", "conversionOptions", "ecomSettings", "marketCode", "useSettings_default", "searchHref", "useRouter_default", "ecomContext", "useEcom_default", "ecomOption", "defaultConversionOptions", "option", "ecommerce", "ecom", "demoCarModal", "setDemoCarModal", "useState", "onToggleDemoCarModal", "useCallback", "item", "title", "shortDescription", "description", "odometer", "fuelType", "gearboxType", "loans", "leasing", "leasingOffers", "insuranceProvider", "manufacturerOffer", "manufacturerPackage", "contact", "contactPerson", "published", "publishedAt", "media", "useMemo", "galleryMedia", "useEffect", "options", "e", "onShowMoreOptionsClick", "pubsub_default", "adEvent", "startEcom", "uspList", "i18nScoped", "numberSeparator", "React", "AdContext", "Page", "PageSection", "Container_default", "ProductPage", "ProductPageAside", "ProductPageAsideSection", "Repeat", "UtilityFontSizeSmall", "ButtonInlineLight", "ButtonContent", "IconChevronLeft", "LogoBox_default", "RepeatSmall", "H1", "UspList_default", "price", "PriceTable_default", "discount", "FinancialOptions_default", "InsuranceOptions_default", "CheckList_default", "ProductPageMain", "Gallery_default", "ProductPageMainSection", "H2", "Content_default", "Property_default", "Blockquote_default", "dateTimeFormat", "markdownToHtml", "ExtendContent_default", "Documents_default", "Accessories_default", "Branch_default", "ButtonPrimary", "PackageOptions_default", "packageOffers", "ManufacturerPackagesOption_default", "Related_default", "portal_element_default", "portal_namespace_exports", "DemoCarModal_default", "WaykeSearchItem", "id", "disableResetScrollOnInit", "props", "publicApi", "loading", "useAd_default", "PageLoading_default", "Page404_default", "searchItem_default", "React", "React", "useMemo", "styled", "Root", "props", "Root_default", "useCallback", "useEffect", "useState", "useInitializeTranslation", "marketCode", "initialized", "setInitialized", "useState", "i18nScoped", "initialize", "useCallback", "m", "initializeI18n", "useEffect", "useInitializeTranslation_default", "React", "useCallback", "useEffect", "useMemo", "useState", "UUID", "snapshot", "idFromHash", "hash", "value", "idFromPath", "pathname", "s", "RouterProvider", "children", "routing", "useSettings_default", "location", "setLocation", "useState", "useEffect", "update", "base", "useMemo", "id", "itemHref", "useCallback", "itemId", "onLinkClick", "e", "href", "url", "writeSearch", "params", "replace", "query", "next", "React", "RouterContext", "RouterProvider_default", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "SCALAR_ALIASES", "RANGE_BASE_ALIASES", "SORT_ALIASES", "DEFAULT_SORT", "FUEL_TYPE_VALUE_ALIASES", "DROPPED_KEYS", "LEGACY_PER_PAGE", "decodeBase64", "value", "unpackPacked", "decoded", "json", "inner", "hasLegacyParams", "params", "key", "migrateLegacyParams", "input", "merged", "packedKey", "packed", "out", "page", "offset", "mapped", "rangeMatch", "base", "nextKey", "nextValue", "isKnownKey", "canonicalParams", "useCallback", "useEffect", "useRef", "useState", "withMultiSelectFacets", "data", "ads", "selected", "facet", "multiSelectFacetAlias", "f", "useAdsSearch", "params", "settings", "unfiltered", "setUnfiltered", "useState", "result", "setResult", "loading", "setLoading", "loadingMore", "setLoadingMore", "error", "setError", "requestIndex", "useRef", "paramsKey", "api", "market", "branchGroupId", "variables", "useCallback", "page", "toSearchVariables", "started", "useEffect", "gqlQuery", "FACETS_QUERY", "index", "LIST_FILTERS", "field", "buildSearchQuery", "hasMore", "loadMore", "SEARCH_QUERY", "current", "useAdsSearch_default", "toParams", "input", "source", "params", "hasLegacyParams", "migrateLegacyParams", "canonicalParams", "SearchProvider", "children", "publicApi", "routing", "useSettings_default", "search", "writeSearch", "useRouter_default", "setParams", "useState", "lastWritten", "useRef", "unfiltered", "result", "loading", "loadingMore", "error", "hasMore", "loadMore", "useAdsSearch_default", "apply", "useCallback", "next", "replace", "initialize", "initialQueryParams", "fromUrl", "value", "key", "update", "useEffect", "action", "pubsub_default", "useMemo", "React", "SearchContext", "SearchProvider_default", "isPropValid", "React", "StyleSheetManager", "ThemeProviderBase", "shouldForwardProp", "propName", "target", "isPropValid", "ThemeProvider", "children", "React", "StyleSheetManager", "ThemeProviderBase", "theme_default", "themeProvider_default", "WaykeProvider", "children", "settings", "key", "resolved", "useMemo", "resolveSettings", "initialized", "useInitializeTranslation_default", "React", "SettingsContext", "RouterProvider_default", "SearchProvider_default", "themeProvider_default", "Root_default", "package_default", "WaykeProvider_default", "React", "useEffect", "WaykeComposite", "filterList", "initialQueryParams", "removeSearchBar", "removeFilterOptions", "disableResetScrollOnInit", "placeholderImage", "modifyDocumentTitleItem", "modifyDocumentTitleSearch", "displayBranchName", "conversionOptions", "id", "useRouter_default", "routing", "useSettings_default", "useEffect", "pubsub_default", "React", "searchItem_default", "search_default", "WaykeComposite_default", "WaykeCompositeWithProvider", "provider", "composite", "React", "WaykeProvider_default", "WaykeComposite_default", "WaykeCompositeWithProvider_default", "src_default", "WaykeCompositeWithProvider_default"]
7
7
  }