{
  "version": 3,
  "sources": ["../src/Utils/i18n.ts", "../src/translation/nb-NO.ts", "../src/translation/sv-SE.ts", "../src/Utils/market.ts", "../src/App.ts", "../package.json", "../src/Utils/trapFocus.ts", "../src/Components/Extension/HtmlNode.ts", "../src/Components/Modal/ModalBody.ts", "../src/Components/Modal/ModalCenter.ts", "../src/Components/Button/ButtonClose.ts", "../src/Components/Modal/ModalClose.ts", "../src/Components/Modal/ModalContainer.ts", "../src/Components/Modal/ModalDialog.ts", "../src/Templates/Logotype.ts", "../src/Components/Modal/ModalFooter.ts", "../src/Components/Modal/ModalHeader.ts", "../src/Components/Modal/Modal.ts", "../src/Data/creditAssessmentCancelSigning.ts", "../src/Utils/convert.ts", "../src/Redux/action.ts", "../src/Redux/store.ts", "../src/Redux/reducer.ts", "../src/Utils/compare.ts", "../src/Redux/watch.ts", "../src/Utils/ecomEvent.ts", "../src/Utils/intervals.ts", "../src/Utils/vw.ts", "../src/Templates/Loader.ts", "../src/Components/Button/Button.ts", "../src/Components/Button/ButtonAlt.ts", "../src/Views/ConfirmClose/index.ts", "../src/Utils/cdn.ts", "../src/Utils/format.ts", "../src/Templates/ItemTileSmall.ts", "../src/Components/Button/ButtonArrowRight.ts", "../src/Components/Button/ButtonSkip.ts", "../src/Templates/KeyValueListItem.ts", "../src/Components/StageCompleted.ts", "../src/Templates/ListItem.ts", "../src/Components/OverflowGrid/Arrow.ts", "../src/Components/OverflowGrid/OverflowGridList.ts", "../src/Components/Button/ButtonAddRemove.ts", "../src/Components/Button/ButtonAsLink.ts", "../src/Components/OverflowGrid/OverflowGridItem.ts", "../src/Utils/portal.ts", "../src/Components/Button/ButtonAsLinkArrowLeft.ts", "../src/Components/Button/ButtonClear.ts", "../src/Components/Gallery/Arrow.ts", "../src/Components/Gallery/Gallery.ts", "../src/Utils/parser.ts", "../src/Utils/scroll.ts", "../src/Views/Main/Accessories/AccessoryItemInfo.ts", "../src/Views/Main/Accessories/AccessoryItem.ts", "../src/Views/Main/Accessories/AccessoryList.ts", "../src/Views/Main/Accessories/index.ts", "../src/Components/Input/InputError.ts", "../src/Components/Input/InputInformation.ts", "../src/Components/Input/InputRadioField.ts", "../src/Components/Input/InputRadioGroup.ts", "../src/Data/getOrder.ts", "../src/Templates/Alert.ts", "../src/Views/Main/CentralStorage/index.ts", "../src/Utils/mask.ts", "../src/Components/Input/InputField.ts", "../src/Utils/regex.ts", "../src/Utils/validationMethods.ts", "../src/Views/Main/Customer/EmailAndPhone.ts", "../src/Components/Disclaimer/DisclaimerPadlock.ts", "../src/Data/getAddress.ts", "../src/Utils/render.ts", "../src/Views/Main/Customer/FullAddressBySocialId.ts", "../src/Views/Main/Customer/FullAddressForm.ts", "../src/Views/Main/Customer/FullAddress.ts", "../src/Views/Main/Customer/index.ts", "../src/Views/Main/Delivery/index.ts", "../src/Utils/delivery.ts", "../src/Views/Main/Financial/index.ts", "../src/Utils/constants.ts", "../src/Views/Main/Financial/CreditAssessment.ts", "../src/Components/Accordion/index.ts", "../src/Components/BankId/BankIdSign.ts", "../src/Utils/isMobile.ts", "../src/Components/BankId/BankIdSignQrCode.ts", "../src/Components/Button/ButtonBankId.ts", "../src/Components/BankId/BankIdSignSameDevice.ts", "../src/Components/Disclaimer/Disclaimer.ts", "../src/Components/Input/InputSelect.ts", "../src/Data/creditAssessmentDecline.ts", "../src/Data/creditAssessmentGetStatus.ts", "../src/Data/creditAssessmentNewCase.ts", "../src/Data/creditAssessmentSignCase.ts", "../src/Views/Main/Financial/CreditAssessmentResult.ts", "../src/Views/Main/Financial/CreditAssessmentApproved.ts", "../src/Views/Main/Financial/StageCompletedFinancialCreditAssessment.ts", "../src/Views/Main/Financial/CreditAssessmentAssessManually.ts", "../src/Views/Main/Financial/CreditAssessmentRejected.ts", "../src/Views/Main/Financial/utils.ts", "../src/Components/ErrorAlert/index.ts", "../src/Components/Input/InputRange.ts", "../src/Data/getPayment.ts", "../src/Components/Chart/PieChart.ts", "../src/Views/Main/Financial/LoanDetailsBasic.ts", "../src/Views/Main/Financial/LoanDetailsDetailed.ts", "../src/Views/Main/Financial/LoanDetailsMonthlyCost.ts", "../src/Views/Main/Financial/LoanDetails.ts", "../src/Views/Main/Financial/Loan.ts", "../src/Views/Main/Financial/StageCompletedFinancial.ts", "../src/Views/Main/Insurance/DefaultInsurance/InsuranceItemInfo.ts", "../src/Views/Main/Insurance/DefaultInsurance/InsuranceItem.ts", "../src/Views/Main/Insurance/DefaultInsurance/InsuranceList.ts", "../src/Views/Main/Insurance/DefaultInsurance/index.ts", "../src/Views/Main/Insurance/IfInsurance/index.ts", "../src/Data/getInsurances.ts", "../src/Components/Button/ButtonSuccess.ts", "../src/Components/Input/InputCheckbox.ts", "../src/Views/Main/Insurance/IfInsurance/InsuranceAddonBox.ts", "../src/Views/Main/Insurance/IfInsurance/InsuranceItemInfo.ts", "../src/Views/Main/Insurance/IfInsurance/InsuranceItem.ts", "../src/Views/Main/Insurance/IfInsurance/InsuranceList.ts", "../src/Views/Main/Insurance/IfInsurance/InsuranceView.ts", "../src/Views/Main/Insurance/index.ts", "../src/Components/Input/InputTextarea.ts", "../src/Data/getTradeInVehicle.ts", "../src/Views/Main/TradeIn/PartTradeIn.ts", "../src/Views/Main/TradeIn/index.ts", "../src/Utils/stage.ts", "../src/Data/createOrder.ts", "../src/Views/Main/Confirmation/NoVerify.ts", "../src/Utils/payment.ts", "../src/Views/Main/Confirmation/Payment.ts", "../src/Views/Main/Confirmation/VerifyByBankId.ts", "../src/Data/creditAssessmentAccept.ts", "../src/Data/getBankIdAuth.ts", "../src/Data/getBankIdQrCode.ts", "../src/Data/getBankIdStatus.ts", "../src/Views/Main/Confirmation/index.ts", "../src/Views/Main/index.ts", "../src/Views/OrderCallback/index.ts", "../src/Components/Checklist/Checklist.ts", "../src/Templates/ItemTileLarge.ts", "../src/Views/Preview/HowTo.ts", "../src/Templates/TimelineItem.ts", "../src/Views/Preview/index.ts", "../src/Components/Extension/StackNode.ts", "../src/Views/Summary/CentralStorage.ts", "../src/Views/Summary/Customer.ts", "../src/Views/Summary/Delivery.ts", "../src/Views/Summary/Intro.ts", "../src/Views/Summary/Order.ts", "../src/Views/Summary/TradeIn.ts", "../src/Views/Summary/index.ts", "../src/index.ts"],
  "sourcesContent": ["import _i18next from 'i18next';\nimport { MarketCode } from '../@types/MarketCode';\nimport { nbNO, svSE } from '../translation';\nimport { getLanguage } from './market';\n\nconst i18next: typeof _i18next = _i18next.createInstance();\n\nexport const t = (key: string, options?: any): string => i18next?.t(key, options) as string;\n\nexport const initializeI18N = (marketCode?: MarketCode) => {\n  const locale = getLanguage(marketCode);\n\n  i18next.init({\n    lng: locale,\n    resources: {\n      'sv-SE': {\n        translation: svSE,\n      },\n      'nb-NO': {\n        translation: nbNO,\n      },\n    },\n  });\n};\n\nexport default i18next;\n", "const nbNO = {\n  glossary: {\n    change: 'Endre',\n    showPrevious: 'Vis forrige',\n    showNext: 'Vis neste',\n    showPreviousImage: 'Vis forrige bilde',\n    showNextImage: 'Vis neste bilde',\n    readMore: 'Les mer',\n    closeModal: 'Lukk modalen',\n    homeUrl: 'https://www.drive.no',\n    goToHome: 'G\u00E5 til drive.no',\n    company: 'Drive',\n    modalTitle: 'Drive Ecom',\n    add: 'Legg til',\n    chosen: 'Valgt',\n    ourAdvantages: 'Fordeler med \u00E5 kj\u00F8pe bilen online hos oss',\n    showHelp: 'Vis hjelp',\n    closeHelp: 'Lukk hjelp',\n    whatDoesThisMean: 'Hva betyr dette?',\n    buyOnline: 'Kj\u00F8p online hos oss',\n  },\n  confirmClose: {\n    heading: 'Bilen er ikke reservert enn\u00E5',\n    message:\n      'Du har ikke klikket deg gjennom alle trinnene som kreves for at bestillingen skal fullf\u00F8res og bilen skal reserveres til deg. Er du sikker p\u00E5 at du vil avslutte bestillingen din?',\n    abortButton: 'Fortsett min bestilling',\n    confirmButton: 'Avbryt min bestilling',\n  },\n  accessoryItemInfo: {\n    backButton: 'Tilbake',\n    logoAlt: 'Produsentens logo for',\n  },\n  accessories: {\n    title: 'Tilbeh\u00F8r',\n    noSelected: 'Ingen valgt',\n    changeButtonTitle: 'Endre tilbeh\u00F8r',\n    heading: 'Vil du kj\u00F8pe tilbeh\u00F8r til din nye bil?',\n    description: 'Her viser vi noen av tilbeh\u00F8rene som passer til din nye bil.',\n    proceedButton: 'G\u00E5 videre',\n    skipButton: 'Hopp over dette trinnet',\n  },\n  centralStorage: {\n    title: 'Sentral lager',\n    heading: 'Hvilket anlegg vil du kj\u00F8pe fra?',\n    description:\n      'Dette kj\u00F8ret\u00F8yet er en sentrallagerbil og er tilgjengelig fra flere anlegg. Velg anlegget du vil handle fra.',\n    changeButtonTitle: 'Endre',\n    proceedButton: 'G\u00E5 videre',\n    errorMessage: 'En feil oppstod, og det var ikke mulig \u00E5 velge ovennevnte anlegg. Pr\u00F8v igjen.',\n    dealerSelection: 'Valg av anlegg',\n    addressMissing: 'Adresse mangler',\n  },\n  confirmation: {\n    title: 'Fullf\u00F8r bestillingen',\n    paymentTitle: 'Betaling',\n    heading: 'Nesten ferdig!',\n    description:\n      'For \u00E5 reservere bilen til deg trenger vi bare \u00E5 verifisere din identitet med BankID. Etter det vil {{name}} kontakte deg for \u00E5 fullf\u00F8re kj\u00F8pet.',\n    description2:\n      'Kj\u00F8pet blir f\u00F8rst bindende etter signering av endelig tilbud fra {{name}}. Det er ogs\u00E5 da betalingen vil foreg\u00E5.',\n    ageError:\n      'Du m\u00E5 v\u00E6re over 18 \u00E5r for \u00E5 kunne fortsette. Identifisering med BankID viser at du er under 18 \u00E5r gammel.',\n    requestError: 'En feil oppstod, og det var ikke mulig \u00E5 opprette bestillingen, pr\u00F8v igjen.',\n    notAvailable: 'Denne bilen er dessverre ikke lenger tilgjengelig.',\n    socialIdNotMatchingError:\n      'Personnummeret i f\u00F8rste trinn samsvarer ikke med det som er knyttet til BankID',\n    confirmConditionsTitle: 'Jeg godkjenner {{link}}.',\n    insuranceText: 'og har tatt del av informasjonen om forsikringsformidling',\n    reserveButton: 'Reserver bilen',\n    policyText: 'Dine personopplysninger behandles og lagres i samsvar med v\u00E5r {{link}}.',\n    reservationDisclaimer:\n      'Vi forbeholder oss retten til eventuelle endringer i tilgjengeligheten av tilbudte biler.',\n    bankIdDescriptionQrCode:\n      'For \u00E5 verifisere din identitet, start BankID-applikasjonen p\u00E5 din andre enhet.',\n    bankIdDescriptionSameDevice: 'For \u00E5 verifisere din identitet, start BankID-applikasjonen.',\n    bankIdErrorMessage: 'Det var ikke mulig \u00E5 hente status for n\u00E5v\u00E6rende BankID-signering.',\n    bankIdQrCodeErrorMessage: 'Det var ikke mulig \u00E5 hente ny QR-kode for BankID-signering.',\n    bankIdInitErrorMessage: 'Det var dessverre ikke mulig \u00E5 initiere BankID. Vennligst pr\u00F8v igjen.',\n    bankIdCompletedMessage: 'Verifisering fullf\u00F8rt, bestillingen opprettes n\u00E5...',\n    paymentHeading: 'Velg betalingsm\u00E5te',\n    paymentDescription:\n      'Gjennomf\u00F8r en forskuddsbetaling p\u00E5 5% av bilens pris (10 995 kr) for \u00E5 reservere bilen. Velg hvordan du vil gjennomf\u00F8re betalingen.',\n    paymentDescription2:\n      'Resterende del av kontantinnsatsen 32 985 kr med eventuelt fradrag for innbyttebil betales hos {{name}} ved kontraktsignering.',\n    paymentCardType: 'Korttype',\n    paymentCardTypeValue: 'Kreditt',\n    paymentCardNo3DSecure: 'Kort uten 3D secure',\n    paymentCardNo3DSecureValue: '4925000000000004',\n    paymentCard3DSecure: 'Kort med 3D secure',\n    paymentCard3DSecureValue: '4761739001010416',\n    paymentExpiry: 'MM/\u00C5\u00C5:',\n    paymentExpiryValue: '12/25',\n    paymentCVC: 'CVC:',\n    paymentCVCValue: '123',\n    privacyPolicy: 'personvernpolicy',\n    purchaseTermsAndCancellationPolicy: 'kj\u00F8psvilk\u00E5r og vilk\u00E5r for angrerett',\n    noVerifyConfirmMessage: 'Elit in eiusmod cupidatat tempor elit fugiat ad.',\n  },\n  customer: {\n    title: 'Dine opplysninger',\n    changeButtonTitle: 'Endre dine opplysninger',\n    email: 'E-post',\n    phone: 'Telefonnummer',\n    socialId: 'Personnummer',\n    name: 'Navn',\n    givenName: 'Fornavn',\n    surname: 'Etternavn',\n    address: 'Adresse',\n    street: 'Gateadresse',\n    street2: 'Leilighet, etasje, etc.',\n    registeredAddress: 'Registrert adresse',\n    postalCode: 'Postnummer',\n    city: 'Poststed',\n    contactInfoTitle: 'Kontaktinformasjon',\n    contactInfoDescription: 'Oppgi din e-postadresse og telefonnummer.',\n    emailPlaceholder: 'Oppgi din e-postadresse',\n    emailErrorMessage: 'En gyldig e-postadresse m\u00E5 oppgis',\n    phonePlaceholder: 'Oppgi ditt telefonnummer',\n    phoneErrorMessage: 'Oppgi ditt telefonnummer',\n    givenNamePlaceholder: 'Oppgi fornavnet ditt',\n    givenNameErrorMessage: 'Oppgi fornavnet ditt',\n    surnamePlaceholder: 'Oppgi etternavnet ditt',\n    surnameErrorMessage: 'Oppgi etternavnet ditt',\n    streetPlaceholder: 'Oppgi din gateadresse',\n    streetErrorMessage: 'Oppgi din gateadresse',\n    street2Placeholder: 'Leilighet, etasje, etc.',\n    street2ErrorMessage: 'Leilighet, etasje, etc.',\n    postalCodePlaceholder: 'Oppgi postnummeret ditt',\n    postalCodeErrorMessage: 'Oppgi postnummeret ditt',\n    cityPlaceholder: 'Oppgi poststed',\n    cityErrorMessage: 'Oppgi poststed',\n\n    proceedButton: 'G\u00E5 videre',\n    personalInfoTitle: 'Personopplysninger',\n    personalInfoDescription: 'Oppgi ditt personnummer for \u00E5 hente ditt navn og adresse.',\n    socialIdPlaceholder: '\u00C5\u00C5\u00C5\u00C5MMDD-XXXX',\n    socialIdErrorMessage: 'Oppgi personnummer i formatet \u00C5\u00C5\u00C5\u00C5MMDD-XXXX. M\u00E5 v\u00E6re over 18 \u00E5r.',\n    fetchButton: 'Hent opplysninger',\n    fetchErrorMessage: 'Vi fikk dessverre ingen treff p\u00E5 personnummeret du oppga.',\n    fetchInfoMessage: 'Vi vil hente f\u00F8lgende opplysninger om deg:',\n    policyText: 'Dine personopplysninger behandles og lagres i samsvar med v\u00E5r {{link}}.',\n    changeContactsButton: 'Endre',\n  },\n  delivery: {\n    title: 'Levering',\n    deliveryMethod: 'Leveringsm\u00E5te',\n    homeDelivery: 'Hjemlevering',\n    pickup: 'Hent hos forhandleren',\n    changeDeliveryMethod: 'Endre leveringsm\u00E5te',\n    heading: 'Hvordan vil du ha bilen levert?',\n    description:\n      'Velg om du vil ha bilen levert hjem til deg eller om du vil hente den hos {{name}}.',\n    free: 'Gratis',\n    toYourAddress: 'Til din registrerte adresse',\n    tooFarAway: 'Dessverre kan vi ikke tilby hjemlevering til din adresse.',\n    proceedButton: 'G\u00E5 videre',\n  },\n  creditAssessment: {\n    loanApplication: 'L\u00E5nes\u00F8knad',\n    loanApplicationDescription:\n      'For \u00E5 besvare din foresp\u00F8rsel om bill\u00E5n trenger {{name}} noen flere opplysninger om deg og din husstand. Sp\u00F8rsm\u00E5lene tar bare noen minutter \u00E5 besvare. Bekreft og signer deretter med BankID \u2013 deretter f\u00E5r du ditt l\u00E5nebeskjed direkte p\u00E5 skjermen og kan g\u00E5 videre med ditt bilkj\u00F8p. Blir du godkjent s\u00E5 gjelder l\u00E5nebeskjeden gjennom hele kj\u00F8pet s\u00E5 lenge ingen tillegg gj\u00F8res \u2013 men din s\u00F8knad er ikke bindende.',\n    maritalStatus: 'Sivilstatus',\n    employment: 'Sysselsetting',\n    children: 'Barn',\n    income: 'Inntekt',\n    housingType: 'Boligtype',\n    housingTypeDescription: 'Oppgi type bolig.',\n    housingCost: 'Boligkostnad',\n    debtsAndLiabilities: 'Gjeld og forpliktelser',\n    debtsAndLiabilitiesDescription:\n      'Oppgi eventuelle gjeld og forpliktelser innenfor respektive kategori.',\n    totalLoanAmount: 'Totalt l\u00E5nebel\u00F8p',\n    noPaymentInfo:\n      'Du betaler ingenting i dette trinnet, dette er bare en l\u00E5nes\u00F8knad. Kj\u00F8pet fullf\u00F8res deretter ved m\u00F8te med {{name}}.',\n    caseError: 'Det var ikke mulig \u00E5 starte en l\u00E5nes\u00F8knad, pr\u00F8v igjen. {{caseError}}',\n    bankIdError: 'En feil oppstod med BankID, pr\u00F8v igjen.',\n    performLoanApplication: 'Gjennomf\u00F8r l\u00E5nes\u00F8knad',\n    disclaimer:\n      'Ved \u00E5 klikke p\u00E5 \"Gjennomf\u00F8r l\u00E5nes\u00F8knad\" godkjenner jeg at {{name}} gj\u00F8r en kredittsjekk p\u00E5 meg basert p\u00E5 informasjonen ovenfor, og jeg bekrefter at jeg har lest {{link}}.',\n    disclaimerSafe: 'Dine opplysninger lagres og oppbevares sikkert.',\n    whyAnswer: 'Hvorfor m\u00E5 jeg svare p\u00E5 alt dette?',\n    whyAnswerDescription:\n      '{{name}} m\u00E5 innhente opplysningene fra kunden for \u00E5 oppfylle bestemmelser i Forbrukerkredittloven (2010:1846) og Lov (2017:630) om tiltak mot hvitvasking og finansiering av terrorisme.',\n    waitingFor: 'Venter p\u00E5 {{name}}...',\n    fetchingInfo: 'Henter opplysninger fra {{name}}. Vent, det kan ta noen sekunder.',\n    errorOccurred: 'En feil oppstod',\n    bankIdStatusError: 'Det var ikke mulig \u00E5 hente status for n\u00E5v\u00E6rende BankID-signering',\n    descriptionQrCode:\n      'For \u00E5 hente dine opplysninger, start BankID-applikasjonen p\u00E5 din andre enhet.',\n    descriptionSameDevice: 'For \u00E5 hente dine opplysninger, start BankID-applikasjonen.',\n    incomePerMonth: 'Inntekt per m\u00E5ned f\u00F8r skatt',\n    incomeError: 'Oppgi din inntekt per \u00E5r f\u00F8r skatt',\n    incomeDescription: 'L\u00F8nn og/eller pensjon, ikke bidrag eller studiel\u00E5n.',\n    childrenUnder18: 'Antall barn under 18 \u00E5r',\n    childrenError: 'Velg antall barn',\n    selectChildren: 'Velg antall barn',\n    tenOrMore: '10 eller flere',\n    myPartOfMonthlyFee: 'Min del av m\u00E5nedsavgiften',\n    myPartOfMonthlyRent: 'Min del av m\u00E5nedshusleien',\n    excludingInterest: 'Eksklusive renter og avdrag',\n    housingCostError: 'Oppgi boligkostnader per m\u00E5ned',\n    cardCredits: 'Kredittkort',\n    cardCreditsError: 'Oppgi kredittkort eller la st\u00E5 tomt',\n    totalDebt: 'Total gjeld',\n    vehicleLoan: 'Bill\u00E5n',\n    vehicleLoanError: 'Oppgi bill\u00E5n eller la st\u00E5 tomt',\n    collateral: 'Sikkerhet',\n    collateralError: 'Oppgi sikkerhet eller la st\u00E5 tomt',\n    totalAmount: 'Totalt bel\u00F8p.',\n    leasingFees: 'Bil leasing',\n    leasingFeesError: 'Oppgi bil leasingkostnader eller la st\u00E5 tomt',\n    privateLoan: 'Privatl\u00E5n (ikke boligl\u00E5n og studiel\u00E5n)',\n    privateLoanError: 'Oppgi privatl\u00E5n eller la st\u00E5 tomt',\n    fullTimeEmployed: 'Fast ansatt',\n    temporarilyEmployed: 'Midlertidig ansatt',\n    selfEmployed: 'Selvstendig n\u00E6ringsdrivende',\n    retired: 'Pensjonist',\n    student: 'Student',\n    other: 'Annet',\n    married: 'Gift/partnerskap',\n    commonLaw: 'Samboer',\n    single: 'Enslig',\n    singleFamily: 'Enebolig',\n    condominium: 'Borettslag',\n    apartment: 'Leilighet',\n    proceedButton: 'G\u00E5 videre',\n    abortButton: 'Avbryt',\n    assessManually: 'Kredittsjekken m\u00E5 gj\u00F8res manuelt. Vennligst kontakt {{name}} for \u00E5 fortsette.',\n    dataProtectionPolicy: 'personvernpolicy',\n    readMore: 'Les mer om dette her',\n  },\n  financial: {\n    title: 'Finansiell informasjon',\n    description: 'Oppgi din finansielle informasjon for \u00E5 fortsette.',\n    income: 'Inntekt',\n    incomePlaceholder: 'Oppgi din inntekt',\n    incomeErrorMessage: 'En gyldig inntekt m\u00E5 oppgis',\n    expenses: 'Utgifter',\n    expensesPlaceholder: 'Oppgi dine utgifter',\n    expensesErrorMessage: 'Gyldige utgifter m\u00E5 oppgis',\n    assets: 'Eiendeler',\n    assetsPlaceholder: 'Oppgi dine eiendeler',\n    assetsErrorMessage: 'Gyldige eiendeler m\u00E5 oppgis',\n    liabilities: 'Gjeld',\n    liabilitiesPlaceholder: 'Oppgi din gjeld',\n    liabilitiesErrorMessage: 'Gyldig gjeld m\u00E5 oppgis',\n    proceedButton: 'G\u00E5 videre',\n    abortButton: 'Avbryt',\n    heading: 'Finansiering',\n    howToFinance: 'Hvordan vil du finansiere din {{vehicleTitle}} {{vehicleDescription}}?',\n    buyCar: 'Kj\u00F8p bilen',\n    buyCarDescription:\n      'Du kj\u00F8per bilen og eier den selv, enten ved \u00E5 betale hele bilen med egne midler eller gjennom et bill\u00E5n. Du er selv ansvarlig for salget av bilen og velger selvf\u00F8lgelig helt fritt n\u00E5r det skal finne sted.',\n    leaseCar: 'Leie bilen',\n    leaseCarDescription:\n      'N\u00E5r du privatleier en bil eier du den ikke selv, men betaler en m\u00E5nedsavgift i en avtalt periode som dekker en viss kj\u00F8relengde og andre avtalte tjenester.',\n    cash: 'Kontant',\n    cashDescription:\n      'Betaling skjer hos {{contactName}} ved kontraktsignering. Ingen kostnader tilkommer.',\n    loanApplicationOnline: 'L\u00E5nes\u00F8knad online med BankID',\n    loanApplicationResponse: ' \u2013 svar direkte!',\n    paymentAtContract: 'Betaling skjer hos {{contactName}} ved kontraktsignering.',\n    calculatedOn: 'Beregnet p\u00E5 {{creditAmount}} kr, {{duration}} mnd, {{interest}}% rente.',\n    from: 'Fra',\n    proceed: 'G\u00E5 videre',\n    privateLeasing: 'Privatleasing',\n    privateLeasingDescription:\n      'N\u00E5r du privatleier en bil eier du den ikke selv, men betaler en m\u00E5nedsavgift i en avtalt periode som dekker en viss kj\u00F8relengde og andre avtalte tjenester.',\n    financialInformationToggle: 'Finansiell informasjon',\n    financialCashSelected: 'Kontant betaling valgt',\n    financialLeaseSelected: 'Privatleasing valgt',\n    financialLoanSelected: 'Bill\u00E5n valgt',\n    financialCashSet: 'Kontant betaling satt',\n    financialLeaseSet: 'Privatleasing satt',\n    financialLoanSet: 'Bill\u00E5n satt',\n    financialEdit: 'Rediger finansiering',\n  },\n  loan: {\n    title: 'Bill\u00E5n',\n    description: 'Finansier bilen med bill\u00E5n via {{name}}.',\n    creditScoringInfo:\n      'Gj\u00F8r din l\u00E5nes\u00F8knad her - og f\u00E5 beskjed direkte. Husk, kj\u00F8pet er ikke bindende f\u00F8r du har signert det endelige forslaget som utarbeides av {{name}}.',\n    instruction: 'Oppgi din tenkte kontantinnsats og hvor mange m\u00E5neder du vil legge opp l\u00E5net p\u00E5.',\n    downPaymentTitle: 'Kontantinnsats',\n    downPaymentInfoTitle: 'Hvor mye av dine egne penger vil du legge?',\n    downPaymentInfoDescription:\n      'Kontantinnsatsen er en del av bilens pris som du betaler med egne penger. Den m\u00E5 v\u00E6re minst 20% av prisen p\u00E5 bilen. Kontantinnsatsen betaler du senere i forbindelse med kontraktsignering hos {{name}}. Hvis du har en innbyttebil kan du betale kontantinnsatsen med den. Dette avtaler du sammen med {{name}} ved kontraktsignering.',\n    durationTitle: 'Avbetaling',\n    residualTitle: 'Restverdi',\n    errorOccurred: 'En feil oppstod, pr\u00F8v igjen.',\n    proceedButton: 'G\u00E5 videre',\n  },\n  loanDetails: {\n    disclaimerText:\n      '*Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %). Den renten du f\u00E5r settes ved kontraktsignering.',\n    showDetails: 'Vis detaljer',\n    details: 'Detaljer',\n    repaymentPeriod: 'Avbetalingsperiode',\n    months: 'mnd',\n    interest: 'Rente',\n    effectiveInterest: 'Effektiv rente',\n    setupFee: 'Etableringskostnad',\n    administrationFee: 'Administrasjonskostnader',\n    totalCreditCost: 'Total kredittkostnad',\n    disclaimerText1:\n      '*Dette er ikke det endelige tilbudet. Renten kan endres hvis det gj\u00F8res justeringer i den opprinnelige nedbetalingsplanen, tillegg i utstyr eller andre endringer som p\u00E5virker det opprinnelige prisforslaget.',\n    disclaimerText2:\n      'Hvis markedsrenten endres, kan m\u00E5nedskostnaden endres tilsvarende. M\u00E5nedskostnaden kan ogs\u00E5 p\u00E5virkes av den kredittvurderingen som gj\u00F8res etter en kredittsjekk.',\n    moreInfo: 'Mer informasjon om {{loanOrgName}}',\n  },\n  loanDetailsDetailed: {\n    showDetails: 'Vis detaljer',\n    details: 'Detaljer',\n    repaymentPeriod: 'Avbetalingsperiode',\n    months: 'mnd',\n    interest: 'Rente',\n    effectiveInterest: 'Effektiv rente',\n    setupFee: 'Etableringskostnad',\n    administrationFee: 'Administrasjonskostnader',\n    totalCreditCost: 'Total kredittkostnad',\n    disclaimerText1:\n      '*Dette er ikke det endelige tilbudet. Renten kan endres hvis det gj\u00F8res justeringer i den opprinnelige nedbetalingsplanen, tillegg i utstyr eller andre endringer som p\u00E5virker det opprinnelige prisforslaget.',\n    disclaimerText2:\n      'Hvis markedsrenten endres, kan m\u00E5nedskostnaden endres tilsvarende. M\u00E5nedskostnaden kan ogs\u00E5 p\u00E5virkes av den kredittvurderingen som gj\u00F8res etter en kredittsjekk.',\n    moreInfo: 'Mer informasjon om {{loanOrgName}}',\n  },\n  loanDetailsMonthlyCost: {\n    monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n    perMonth: 'kr/mnd*',\n  },\n  stageCompletedFinancial: {\n    downPayment: 'Kontantinnsats',\n    loanAmount: 'L\u00E5nebel\u00F8p',\n    repaymentPeriod: 'Avbetalingsperiode',\n    months: 'mnd',\n    monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n    disclaimerText:\n      '*Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %). Den renten du f\u00E5r settes ved kontraktsignering.',\n    orderAlmostReady: 'Bestillingen er snart klar, her ser du ditt l\u00E5nebeskjed:',\n    changeFinancing: 'Endre finansiering',\n    financing: 'Finansiering',\n    cash: 'Kontant',\n    lease: 'Privatleasing',\n  },\n  stageCompletedFinancialCreditAssessment: {\n    approved: 'Gratulerer! Din l\u00E5nes\u00F8knad er godkjent av {{loanName}}.',\n    approvedDescription:\n      'Fullf\u00F8r bestillingen ved \u00E5 klikke deg gjennom de neste trinnene. Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n    assessManually:\n      'N\u00E5r bestillingen er fullf\u00F8rt, vil vi g\u00E5 gjennom saken din og gi deg tilbakemelding med et l\u00E5nebeskjed.',\n    assessManuallyDescription:\n      'Bilen er fortsatt ikke reservert. G\u00E5 videre til neste trinn for \u00E5 fullf\u00F8re bestillingen, men det er ikke sikkert at l\u00E5net ditt vil bli godkjent. Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n    declined: 'Vi kan dessverre ikke godkjenne din s\u00F8knad om bill\u00E5n.',\n    declinedDescription:\n      'Det kan v\u00E6re ulike grunner til at en s\u00F8knad avsl\u00E5s. Du vil snart motta et brev med bekreftelse og mer informasjon om din s\u00F8knad.',\n    declinedNextSteps:\n      'Ditt allerede p\u00E5begynte kj\u00F8p kan fortsatt gjennomf\u00F8res og fullf\u00F8res, for \u00E5 g\u00E5 videre kan du velge en annen betalingsm\u00E5te.',\n    contactInfo: 'Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n  },\n  loanSummary: {\n    title: 'Bill\u00E5n',\n    description: 'Bestillingen er snart klar, her ser du ditt l\u00E5nebeskjed:',\n    successMessage: 'Gratulerer! Din l\u00E5nes\u00F8knad er godkjent av {{loanName}}.',\n    notReserved:\n      'Bilen er ikke reservert enn\u00E5. Fullf\u00F8r bestillingen ved \u00E5 klikke deg gjennom de neste trinnene. Har du sp\u00F8rsm\u00E5l underveis? Kontakt [forhandleren] p\u00E5 tlf [telefonnummer].',\n    downPayment: 'Kontantinnsats',\n    loanAmount: 'L\u00E5nebel\u00F8p',\n    repaymentPeriod: 'Avbetalingsperiode',\n    monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n    disclaimer:\n      '*Beregnet p\u00E5 X,XX % rente (effektiv X,XX %). Den renten du f\u00E5r settes ved kontraktsignering.',\n  },\n  summary: {\n    financing: 'Finansiering',\n    cash: 'Kontant',\n    loan: 'Bill\u00E5n',\n    leasing: 'Privatleasing',\n    changeButton: 'Endre',\n    centralStorageTitle: 'Sentral lager',\n    dealerSelection: 'Valg av forhandler',\n    customerTitle: 'Kundeopplysninger',\n    customerName: 'For- og etternavn',\n    customerSSN: 'Personnummer',\n    customerAddress: 'Adresse',\n    customerEmail: 'E-post',\n    customerPhone: 'Telefonnummer',\n    deliveryTitle: 'Levering',\n    deliveryMethod: 'Leveringsm\u00E5te',\n    homeDelivery: 'Hjemlevering',\n    pickup: 'Hent hos forhandleren',\n    thankYou: 'Takk for din bestilling!',\n    whatHappensNext: 'Dette skjer n\u00E5:',\n    orderConfirmation: 'En bestillingsbekreftelse vil bli sendt til din e-postadresse {{email}}.*',\n    contactFromDealer:\n      '{{contactName}} tar kontakt med deg for \u00E5 g\u00E5 gjennom avtale, betaling og levering.',\n    driveSafely: 'Klart! Kj\u00F8r forsiktig p\u00E5 veiene.',\n    orderConfirmationDisclaimer:\n      '*Bestillingsbekreftelsen sendes normalt innen 10 minutter, men kan i unntakstilfeller ta opptil 48 timer.',\n    orderNumber: 'Bestillingsnummer {{createdOrderId}}',\n    orderTitle: 'Din bestilling',\n    paymentMethod: 'Betalingsm\u00E5te',\n    perMonth: 'kr/mnd',\n    lease: 'Privatleasing',\n    from: 'Fra',\n    accessories: 'Tilbeh\u00F8r',\n    insurance: 'Forsikring',\n    free: 'Gratis',\n    tradeInTitle: 'Innbyttebil',\n    mileage: 'Kj\u00F8relengde',\n    description: 'Beskrivelse',\n    condition: 'Bilens tilstand',\n    estimatedValue: 'Omtrentlig verdi',\n    no: 'Nei',\n  },\n  insurance: {\n    heading: 'Vil du tegne en forsikring p\u00E5 din nye bil?',\n    description: 'Nedenfor vises forslag p\u00E5 forsikringer som passer deg og din nye bil.',\n    proceedButton: 'G\u00E5 videre',\n    backButton: 'Tilbake',\n    logoAlt: 'Produsentens logo for {{title}}',\n    ifDescription:\n      'Oppgi din estimerte kj\u00F8relengde for \u00E5 se din forsikringskostnad. Deretter presenterer vi forslag p\u00E5 forsikringer som passer deg og din nye bil. I b\u00E5de hel- og halvforsikring inng\u00E5r trafikkforsikring som er obligatorisk \u00E5 ha. Hvis du har valgt \u00E5 finansiere bilen med et bill\u00E5n, er prisen du ser rabattert.',\n    showInsurances: 'Vis forsikringer',\n    ifAlert:\n      'Vi er tilknyttede forsikringsformidlere til {{insuranceDisclaimerTitle}}, If Skadeforsikring. Forsikringsgiver er If Skadeforsikring (publ). Hva dette inneb\u00E6rer kan du lese mer om p\u00E5 forsikringsformidlerens nettside.',\n    ifDisclaimer:\n      'Ved \u00E5 klikke p\u00E5 Vis forsikringer godkjenner du at vi sender dine opplysninger videre til {{insuranceDisclaimerTitle}} slik at de kan gi deg en pris p\u00E5 forsikring. Hvordan de h\u00E5ndterer dine personopplysninger kan du lese om p\u00E5 deres nettside.',\n    skipButton: 'Hopp over dette trinnet',\n    perMonth: 'kr/mnd',\n    addons: 'Tillegg',\n    includes: 'Forsikringen inneholder',\n    update: 'Oppdater',\n    select: 'Velg',\n    estimatedMileage: 'Estimert kj\u00F8relengde',\n    edit: 'Endre',\n    fetchError: 'Det var ikke mulig \u00E5 hente forsikringer.',\n    retry: 'Pr\u00F8v igjen',\n    title: 'Forsikring',\n    none: 'Ingen',\n    changeButtonTitle: 'Endre forsikring',\n  },\n  tradeIn: {\n    title: 'Innbyttebil',\n    mileage: 'Kj\u00F8relengde',\n    description: 'Beskrivelse',\n    condition: 'Bilens tilstand',\n    estimatedValue: 'Omtrentlig verdi',\n    infoText: 'Vi sender med opplysninger om din innbyttebil til bilforhandleren.',\n    infoDisclaimer:\n      'V\u00E6r oppmerksom p\u00E5 at vurderingen som utf\u00F8res gir en estimert innbytteverdi. Den endelige verdien avgj\u00F8res n\u00E5r forhandleren kan bekrefte bilens tilstand.',\n    no: 'Nei',\n    changeButtonTitle: 'Endre',\n    heading: 'Har du en innbyttebil?',\n    tradeInDescription:\n      'Har du en bil du vil bytte inn n\u00E5r du kj\u00F8per din nye bil? Her f\u00E5r du en estimert innkj\u00F8pspris av oss direkte online.',\n    yesButton: 'Jeg har innbyttebil',\n    skipButton: 'Hopp over dette trinnet',\n    veryGoodCondition: 'Meget god tilstand',\n    goodCondition: 'God tilstand',\n    okCondition: 'Helt ok tilstand',\n    noScratches: 'Ingen riper eller skader',\n    serviced: 'Servet ved hver anledning med stempler i serviceboken',\n    goodTires: 'Dekk med veldig god m\u00F8nsterdybde (5-8 mm)',\n    someScratches: 'Noen mindre riper og/eller skader',\n    okTires: 'Dekk som ikke trenger \u00E5 byttes (m\u00F8nsterdybde p\u00E5 3-5 mm)',\n    manyScratches: 'Det er en del riper og skader',\n    notServiced: 'Ikke servet ved hver anledning',\n    badTires: 'Dekk som m\u00E5 byttes (m\u00F8nsterdybde under 3 mm)',\n    detailsHeading: 'Opplysninger om din innbyttebil',\n    detailsDescription:\n      'Oppgi registreringsnummeret og aktuell kj\u00F8relengde for din innbyttebil s\u00E5 f\u00E5r du en estimert innkj\u00F8pspris av oss.',\n    registrationNumber: 'Registreringsnummer',\n    registrationNumberError: 'Et gyldig registreringsnummer i formatet AB12345 m\u00E5 oppgis',\n    registrationNumberPlaceholder: 'Oppgi registreringsnummer',\n    mileageError: 'En kj\u00F8relengde mellom 0 til 80 000 km m\u00E5 oppgis',\n    mileagePlaceholder: 'Oppgi bilens kj\u00F8relengde',\n    descriptionOptional: 'Beskrivelse (valgfritt)',\n    descriptionError: 'Beskrivelsen er ikke gyldig',\n    descriptionPlaceholder: 'Beskriv bilen',\n    fetchValue: 'Hent estimert verdi',\n    proceedButton: 'Bruk og g\u00E5 videre',\n    fetchError:\n      'Vi fikk dessverre ingen treff p\u00E5 registreringsnummeret du oppga. Vennligst kontroller at registreringsnummeret stemmer.',\n  },\n  vehicleInfo: 'Kj\u00F8ret\u00F8yinformasjon',\n  orderCallback: {\n    thankYou: 'Takk for ditt kj\u00F8p',\n    orderId: 'Ordre id',\n    waykeId: 'Drive id',\n  },\n  howTo: {\n    heading: 'Slik kj\u00F8per du bilen online',\n    description:\n      'Hos oss kan du trygt kj\u00F8pe din neste bil online. Reserver bilen ved \u00E5 klikke deg gjennom v\u00E5r kj\u00F8psflyt med f\u00F8lgende trinn:',\n    timelineAriaLabel: 'Fremgangsm\u00E5te',\n    customerHeading: 'Dine kundeopplysninger',\n    centralStorageHeading: 'Velg anlegg',\n    centralStorageDescription: 'Velg hvilket anlegg du vil kj\u00F8pe bilen fra.',\n    deliveryHeading: 'Velg leveringsm\u00E5te',\n    tradeInHeading: 'Har du innbyttebil?',\n    tradeInDescription: 'F\u00E5 den vurdert direkte online.',\n    financialHeading: 'Finansiering',\n    insuranceHeading: 'Vil du tegne en forsikring?',\n    insuranceDescription: 'Se forslag p\u00E5 forsikringer som passer din nye bil.',\n    accessoriesHeading: 'Tilbeh\u00F8r',\n    accessoriesDescription: 'Bestill ekstra utstyr til bilen din.',\n    financialDescriptionAll:\n      'Denne bilen kan du kj\u00F8pe kontant, privatleie eller finansiere med et bill\u00E5n.',\n    financialDescriptionCashLease: 'Denne bilen kan du kj\u00F8pe kontant eller privatleie.',\n    financialDescriptionCashLoan: 'Denne bilen kan du kj\u00F8pe kontant eller finansiere med et bill\u00E5n',\n    financialDescriptionLoanLease: 'Denne bilen kan du privatleie eller finansiere med et bill\u00E5n',\n    financialDescriptionCash: 'Denne bilen kan du kj\u00F8pe kontant.',\n    financialDescriptionLoan: 'Denne bilen kan du finansiere med et bill\u00E5n',\n    financialDescriptionLease: 'Denne bilen kan du privatleie.',\n    deliveryDescriptionBoth: 'Hjemlevering eller hent hos forhandleren.',\n    deliveryDescriptionPickup: 'Hent hos forhandleren.',\n    deliveryDescriptionHome: 'Hjemlevering.',\n    paymentHeading: 'Gjennomf\u00F8r forskuddsbetaling!',\n    paymentDescription:\n      'Gjennomf\u00F8r forskuddsbetaling p\u00E5 5% av bilens verdi. (Gjennomf\u00F8r betaling av depositum tilsvarende 5% av bilens verdi.)',\n    finalHeading: 'Klart!',\n    finalDescription:\n      'Etter at bestillingen er gjennomf\u00F8rt tar {{contactName}} kontakt med deg for \u00E5 avtale detaljer rundt betaling og signere avtalen.',\n  },\n  preview: {\n    heading: 'S\u00E5 g\u00F8y at du vil kj\u00F8pe denne bilen!',\n    proceedButton: 'G\u00E5 videre',\n    checklistTitle: 'Kj\u00F8p online hos Drive',\n    checklistAriaLabel: 'Fordeler med \u00E5 kj\u00F8pe bilen online hos Drive',\n    checklistItem1: 'Trygg h\u00E5ndtering av personopplysninger',\n    checklistItem2: 'Reserver bilen n\u00E5 - betaling og avtalesignering skjer senere med forhandleren',\n    checklistItem3: 'Ikke bindende f\u00F8r avtale er signert med forhandleren',\n    checklistItem4: 'Kun kontrollerte biler',\n    error: 'En feil oppstod og det var ikke mulig \u00E5 initiere modulen. Pr\u00F8v igjen.',\n    reserved:\n      'Bilen er dessverre reservert av en annen kj\u00F8per og kan derfor ikke reserveres akkurat n\u00E5.',\n    unavailable: 'Bilen er dessverre ikke lenger tilgjengelig og kan derfor ikke reserveres.',\n  },\n};\n\nexport default nbNO;\n", "const svSE = {\n  glossary: {\n    change: '\u00C4ndra',\n    showPrevious: 'Visa f\u00F6reg\u00E5ende',\n    showNext: 'Visa n\u00E4sta',\n    showPreviousImage: 'Visa f\u00F6reg\u00E5ende bild',\n    showNextImage: 'Visa n\u00E4sta bild',\n    readMore: 'L\u00E4s mer',\n    closeModal: 'St\u00E4ng modalen',\n    homeUrl: 'https://www.wayke.se',\n    goToHome: 'G\u00E5 till wayke.se',\n    company: 'Wayke',\n    modalTitle: 'Wayke Ecom',\n    add: 'L\u00E4gg till',\n    chosen: 'Vald',\n    ourAdvantages: 'F\u00F6rdelar med att k\u00F6pa bilen online hos oss',\n    showHelp: 'St\u00E4ng hj\u00E4lp',\n    closeHelp: 'St\u00E4ng hj\u00E4lp',\n    whatDoesThisMean: 'Vad betyder detta?',\n    buyOnline: 'K\u00F6p online hos oss',\n  },\n  confirmClose: {\n    heading: 'Bilen \u00E4r inte reserverad \u00E4nnu',\n    message:\n      'Du har inte klickat dig igenom alla steg som kr\u00E4vs f\u00F6r att ordern ska slutf\u00F6ras och bilen ska reserveras till dig. \u00C4r du s\u00E4ker p\u00E5 att du vill avsluta din order?',\n    abortButton: 'Forts\u00E4tt min order',\n    confirmButton: 'Avbryt min order',\n  },\n  accessoryItemInfo: {\n    backButton: 'Tillbaka',\n    logoAlt: 'Tillverkarens logotyp f\u00F6r',\n  },\n  accessories: {\n    title: 'Tillbeh\u00F6r',\n    noSelected: 'Inga valda',\n    changeButtonTitle: '\u00C4ndra tillbeh\u00F6r',\n    heading: 'Vill du k\u00F6pa till ett tillbeh\u00F6r till din nya bil?',\n    description: 'H\u00E4r visar vi n\u00E5gra av de tillbeh\u00F6r som passar din nya bil.',\n    proceedButton: 'G\u00E5 vidare',\n    skipButton: 'Hoppa \u00F6ver detta steg',\n  },\n  centralStorage: {\n    title: 'Centrallager',\n    heading: 'Vilken anl\u00E4ggning vill du k\u00F6pa ifr\u00E5n?',\n    description:\n      'Detta fordon \u00E4r en centrallagerbil och finns tillg\u00E4ngligt fr\u00E5n flera anl\u00E4ggningar. V\u00E4lj den anl\u00E4ggning du vill handla ifr\u00E5n.',\n    changeButtonTitle: '\u00C4ndra',\n    proceedButton: 'G\u00E5 vidare',\n    errorMessage:\n      'Ett fel uppstod och det gick inte att v\u00E4lja ovanst\u00E5ende anl\u00E4ggning. F\u00F6rs\u00F6k igen.',\n    dealerSelection: 'Val av anl\u00E4ggning',\n    addressMissing: 'Adress saknas',\n  },\n  confirmation: {\n    title: 'Slutf\u00F6r ordern',\n    paymentTitle: 'Betalning',\n    heading: 'Strax klart!',\n    description:\n      'F\u00F6r att reservera bilen \u00E5t dig beh\u00F6ver vi bara verifiera din identitet med BankID. Efter det kommer {{name}} att kontakta dig f\u00F6r att slutf\u00F6ra k\u00F6pet.',\n    description2:\n      'K\u00F6pet blir bindande f\u00F6rst n\u00E4r du signerat det definitiva aff\u00E4rsf\u00F6rslaget med {{name}}. Det \u00E4r \u00E4ven d\u00E5 betalningen sker.',\n    ageError:\n      'Du m\u00E5ste vara \u00F6ver 18 \u00E5r f\u00F6r att kunna forts\u00E4tta. Identifiering med BankId visar att du \u00E4r under 18 \u00E5r gammal.',\n    requestError: 'Ett fel uppstod och det gick inte att skapa ordern, f\u00F6rs\u00F6k igen.',\n    notAvailable: 'Den h\u00E4r bilen finns tyv\u00E4rr inte l\u00E4ngre tillg\u00E4nglig.',\n    socialIdNotMatchingError:\n      'Personnummret i f\u00F6rsta steget matchar inte med det som \u00E4r kopplat mot bankid',\n    confirmConditionsTitle: 'Jag godk\u00E4nner {{link}}.',\n    insuranceText: 'samt har tagit del av information kring f\u00F6rs\u00E4kringsf\u00F6rmedling',\n    reserveButton: 'Reservera bilen',\n    policyText: 'Dina personuppgifter behandlas och sparas i enlighet med v\u00E5r {{link}}.',\n    reservationDisclaimer:\n      'Vi reserverar oss f\u00F6r eventuell \u00E4ndring i tillg\u00E5ngen av utbjudna bilar.',\n    bankIdDescriptionQrCode:\n      'F\u00F6r att verifiera din identitet, starta din BankID applikation p\u00E5 din andra enhet.',\n    bankIdDescriptionSameDevice: 'F\u00F6r att verifiera din identitet, starta din BankID-applikation.',\n    bankIdErrorMessage: 'Det gick inte att h\u00E4mta status kring nuvanrade BankId signering.',\n    bankIdQrCodeErrorMessage: 'Det gick inte att h\u00E4mta ny QR-kod f\u00F6r BankId signering.',\n    bankIdInitErrorMessage: 'Det gick tyv\u00E4rr inte att initiera BankId. V\u00E4nligen f\u00F6rs\u00F6k igen.',\n    bankIdCompletedMessage: 'Verifiering klar, ordern skapas nu...',\n    paymentHeading: 'V\u00E4lj betals\u00E4tt',\n    paymentDescription:\n      'Genomf\u00F6r en f\u00F6rskottsbetalning p\u00E5 5% av bilens pris (10 995 kr) f\u00F6r att reservera bilen. V\u00E4lj hur du vill genomf\u00F6ra betalningen.',\n    paymentDescription2:\n      'Resterande del av kontantinsatsen 32 985 kr med eventuellt avdrag av v\u00E4rde f\u00F6r inbytesbil betalas hos {{name}} vid kontraktskrivning.',\n    paymentCardType: 'Korttyp',\n    paymentCardTypeValue: 'Credit',\n    paymentCardNo3DSecure: 'Kort utan 3d secure',\n    paymentCardNo3DSecureValue: '4925000000000004',\n    paymentCard3DSecure: 'Kort med 3d secure',\n    paymentCard3DSecureValue: '4761739001010416',\n    paymentExpiry: 'MM/\u00C5\u00C5:',\n    paymentExpiryValue: '12/25',\n    paymentCVC: 'CVC:',\n    paymentCVCValue: '123',\n    privacyPolicy: 'personuppgiftspolicy',\n    purchaseTermsAndCancellationPolicy: 'k\u00F6pvillkor och villkor f\u00F6r \u00E5ngerr\u00E4tt',\n    noVerifyConfirmMessage:\n      'Ex exercitation excepteur commodo est reprehenderit ad pariatur cillum quis esse aute.',\n  },\n  customer: {\n    title: 'Dina uppgifter',\n    changeButtonTitle: '\u00C4ndra dina uppgifter',\n    email: 'E-post',\n    phone: 'Telefonnummer',\n    socialId: 'Personnummer',\n    name: 'Namn',\n    givenName: 'F\u00F6rnamn',\n    surname: 'Efternamn',\n    address: 'Adress',\n    street: 'Gatuadress',\n    street2: 'L\u00E4genhet, v\u00E5ning, etc.',\n    registeredAddress: 'Folkbokf\u00F6ringsadress',\n    postalCode: 'Postnummer',\n    city: 'Stad',\n    contactInfoTitle: 'Kontaktuppgifter',\n    contactInfoDescription: 'Ange din e-postadress och ditt telefonnummer.',\n    emailPlaceholder: 'Ange din e-postadress',\n    emailErrorMessage: 'En giltig e-postadress m\u00E5ste anges',\n    phonePlaceholder: 'Ange ditt telefonnummer',\n    phoneErrorMessage: 'Ange ditt telefonnummer',\n    givenNamePlaceholder: 'Ange ditt f\u00F6rnamn',\n    givenNameErrorMessage: 'Ange ditt f\u00F6rnamn',\n    surnamePlaceholder: 'Ange ditt efternamn',\n    surnameErrorMessage: 'Ange ditt efternamn',\n    streetPlaceholder: 'Ange din gatuadress',\n    streetErrorMessage: 'Ange din gatuadress',\n    street2Placeholder: 'L\u00E4genhet, v\u00E5ning, etc.',\n    street2ErrorMessage: 'L\u00E4genhet, v\u00E5ning, etc.',\n    postalCodePlaceholder: 'Ange ditt postnummer',\n    postalCodeErrorMessage: 'Ange ditt postnummer',\n    cityPlaceholder: 'Ange din stad',\n    cityErrorMessage: 'Ange din stad',\n    proceedButton: 'G\u00E5 vidare',\n    personalInfoTitle: 'Personuppgifter',\n    personalInfoDescription: 'Ange ditt personnummer f\u00F6r att h\u00E4mta ditt namn och din adress.',\n    socialIdPlaceholder: '\u00C5\u00C5\u00C5\u00C5MMDD-XXXX',\n    socialIdErrorMessage: 'Ange personnummer i formatet \u00C5\u00C5\u00C5\u00C5MMDD-XXXX. M\u00E5ste vara \u00F6ver 18 \u00E5r.',\n    fetchButton: 'H\u00E4mta uppgifter',\n    fetchErrorMessage: 'Tyv\u00E4rr fick vi ingen tr\u00E4ff p\u00E5 personnumret du angav.',\n    fetchInfoMessage: 'Vi kommer h\u00E4mta f\u00F6ljande uppgifter om dig:',\n    policyText: 'Dina personuppgifter behandlas och sparas i enlighet med v\u00E5r {{link}}.',\n    changeContactsButton: '\u00C4ndra',\n  },\n  delivery: {\n    title: 'Leverans',\n    deliveryMethod: 'Leveranss\u00E4tt',\n    homeDelivery: 'Hemleverans',\n    pickup: 'H\u00E4mta hos handlaren',\n    changeDeliveryMethod: '\u00C4ndra leveranss\u00E4tt',\n    heading: 'Hur vill du ha din bil levererad?',\n    description:\n      'V\u00E4lj ifall du vill ha bilen levererad hem till dig eller ifall du vill h\u00E4mta den hos {{name}}.',\n    free: 'Gratis',\n    toYourAddress: 'Till din folkbokf\u00F6ringsadress',\n    tooFarAway: 'Tyv\u00E4rr kan vi inte erbjuda hemleverans till din adress.',\n    proceedButton: 'G\u00E5 vidare',\n  },\n  creditAssessment: {\n    loanApplication: 'L\u00E5neans\u00F6kan',\n    loanApplicationDescription:\n      'F\u00F6r att besvara din f\u00F6rfr\u00E5gan om bill\u00E5n beh\u00F6ver {{name}} n\u00E5gra fler uppgifter om dig och ditt hush\u00E5ll. Fr\u00E5gorna tar bara n\u00E5gon minut att besvara. Bekr\u00E4fta och signera sedan med BankID \u2013 d\u00E4refter f\u00E5r du ditt l\u00E5nebesked direkt p\u00E5 sk\u00E4rmen och kan g\u00E5 vidare med ditt bilk\u00F6p. Blir du godk\u00E4nd s\u00E5 g\u00E4ller l\u00E5nebeskedet genom hela k\u00F6pet s\u00E5 l\u00E4nge inga till\u00E4gg g\u00F6rs \u2013 men din ans\u00F6kan \u00E4r inte bindande.',\n    maritalStatus: 'Civilstatus',\n    employment: 'Syssels\u00E4ttning',\n    children: 'Barn',\n    income: 'Inkomst',\n    housingType: 'Boendeform',\n    housingTypeDescription: 'Ange typ av boende.',\n    housingCost: 'Boendekostnad',\n    debtsAndLiabilities: 'Skulder och Ansvarsf\u00F6rbindelser',\n    debtsAndLiabilitiesDescription:\n      'Ange eventuella skulder och ansvarsf\u00F6rbindelser inom respektive kategori.',\n    totalLoanAmount: 'Totalt l\u00E5nebelopp',\n    noPaymentInfo:\n      'Du betalar inget i detta steg, detta \u00E4r bara en l\u00E5neans\u00F6kan. K\u00F6pet slutf\u00F6rs sedan vid m\u00F6te med {{name}}.',\n    caseError: 'Det gick inte att starta en l\u00E5neans\u00F6kan, f\u00F6rs\u00F6k igen. {{caseError}}',\n    bankIdError: 'Ett fel uppstod med BankId, f\u00F6rs\u00F6k igen.',\n    performLoanApplication: 'Genomf\u00F6r l\u00E5neans\u00F6kan',\n    disclaimer:\n      'Genom att klicka p\u00E5 \u201DGenomf\u00F6r l\u00E5neans\u00F6kan\u201D godk\u00E4nner jag att {{name}} g\u00F6r en kreditupplysning p\u00E5 mig baserat p\u00E5 informationen ovan och jag bekr\u00E4ftar att jag l\u00E4st {{link}}.',\n    disclaimerSafe: 'Dina uppgifter lagras och sparas s\u00E4kert.',\n    whyAnswer: 'Varf\u00F6r m\u00E5ste jag svara p\u00E5 allt detta?',\n    whyAnswerDescription:\n      '{{name}} m\u00E5ste ta in uppgifterna av kunden f\u00F6r att uppfylla best\u00E4mmelser i Konsumentkreditlagen (2010:1846) och Lag (2017:630) om \u00E5tg\u00E4rder mot penningtv\u00E4tt och finansiering av terrorism. {{link}}',\n    waitingFor: 'V\u00E4ntar p\u00E5 {{name}}...',\n    fetchingInfo: 'H\u00E4mtar uppgifter fr\u00E5n {{name}}. V\u00E4nta kvar det kan ta n\u00E5gra sekunder.',\n    errorOccurred: 'Ett fel uppstod',\n    bankIdStatusError: 'Det gick inte att h\u00E4mta status kring nuvanrade BankId signering',\n    descriptionQrCode:\n      'F\u00F6r att h\u00E4mta dina uppgifter, starta din BankID applikation p\u00E5 din andra enhet.',\n    descriptionSameDevice: 'F\u00F6r att h\u00E4mta dina uppgifter, starta din BankID-applikation.',\n    incomePerMonth: 'Inkomst per m\u00E5nad f\u00F6re skatt',\n    incomeError: 'Ange din inkomst per \u00E5r f\u00F6re skatt',\n    incomeDescription: 'L\u00F6n och/eller pension, inte bidrag eller studiel\u00E5n.',\n    childrenUnder18: 'Antal barn under 18 \u00E5r',\n    childrenError: 'V\u00E4lj antal barn',\n    selectChildren: 'V\u00E4lj antal barn',\n    tenOrMore: '10 eller fler',\n    myPartOfMonthlyFee: 'Min del av m\u00E5nadsavgiften',\n    myPartOfMonthlyRent: 'Min del av m\u00E5nadshyran',\n    excludingInterest: 'Exklusive r\u00E4nta och amortering',\n    housingCostError: 'Ange boendekostnader per m\u00E5nad',\n    cardCredits: 'Kortkrediter',\n    cardCreditsError: 'Ange kortkrediter eller l\u00E4mna tomt',\n    totalDebt: 'Total skuld',\n    vehicleLoan: 'Bill\u00E5n',\n    vehicleLoanError: 'Ange bill\u00E5n eller l\u00E4mna tomt',\n    collateral: 'Borgens\u00E5tagande',\n    collateralError: 'Ange borgens\u00E5tagande eller l\u00E4mna tomt',\n    totalAmount: 'Totalt belopp.',\n    leasingFees: 'Billeasing',\n    leasingFeesError: 'Ang billeasingkostnader eller l\u00E4mna tomt',\n    privateLoan: 'Privatl\u00E5n (ej bol\u00E5n och CSN)',\n    privateLoanError: 'Ange privatl\u00E5n eller l\u00E4mna tomt',\n    fullTimeEmployed: 'Fast eller tillsvidareanst\u00E4lld',\n    temporarilyEmployed: 'Visstidsanst\u00E4lld',\n    selfEmployed: 'Egen f\u00F6retagare',\n    retired: 'Pension\u00E4r',\n    student: 'Student',\n    other: 'Annan',\n    married: 'Gift/partnerskap',\n    commonLaw: 'Sambo',\n    single: 'Ensamst\u00E5ende',\n    singleFamily: 'Villa',\n    condominium: 'Bostadsr\u00E4tt',\n    apartment: 'Hyresr\u00E4tt',\n    proceedButton: 'G\u00E5 vidare',\n    abortButton: 'Avbryt',\n    assessManually:\n      'Kreditupplysningen m\u00E5ste g\u00F6ras manuellt. V\u00E4nligen kontakta {{name}} f\u00F6r att forts\u00E4tta.',\n    dataProtectionPolicy: 'dataskyddspolicy',\n    readMore: 'L\u00E4s mer om detta h\u00E4r',\n  },\n  financial: {\n    title: 'Finansiell information',\n    description: 'Ange din finansiella information f\u00F6r att forts\u00E4tta.',\n    income: 'Inkomst',\n    incomePlaceholder: 'Ange din inkomst',\n    incomeErrorMessage: 'En giltig inkomst m\u00E5ste anges',\n    expenses: 'Utgifter',\n    expensesPlaceholder: 'Ange dina utgifter',\n    expensesErrorMessage: 'Giltiga utgifter m\u00E5ste anges',\n    assets: 'Tillg\u00E5ngar',\n    assetsPlaceholder: 'Ange dina tillg\u00E5ngar',\n    assetsErrorMessage: 'Giltiga tillg\u00E5ngar m\u00E5ste anges',\n    liabilities: 'Skulder',\n    liabilitiesPlaceholder: 'Ange dina skulder',\n    liabilitiesErrorMessage: 'Giltiga skulder m\u00E5ste anges',\n    proceedButton: 'G\u00E5 vidare',\n    abortButton: 'Avbryt',\n    heading: '\u00C4gandeform',\n    howToFinance: 'Hur vill du finansiera din {{vehicleTitle}} {{vehicleDescription}}?',\n    buyCar: 'K\u00F6p bilen',\n    buyCarDescription:\n      'Du k\u00F6per bilen och \u00E4ger den sj\u00E4lv, antingen genom att betala hela bilen med egna medel eller genom ett bill\u00E5n. Du ansvarar sj\u00E4lv f\u00F6r f\u00F6rs\u00E4ljningen av bilen och v\u00E4ljer s\u00E5klart helt fritt n\u00E4r den ska \u00E4ga rum.',\n    leaseCar: 'Leasa bilen',\n    leaseCarDescription:\n      'N\u00E4r du privatleasar en bil \u00E4ger du den inte sj\u00E4lv utan betalar en m\u00E5nadsavgift under en avtalad tid och som t\u00E4cker en viss k\u00F6rstr\u00E4cka och andra avtalade tj\u00E4nster.',\n    cash: 'Kontant',\n    cashDescription:\n      'Betalning sker hos {{contactName}} vid kontraktskrivning. Inga kostnader tillkommer.',\n    loanApplicationOnline: 'L\u00E5neans\u00F6kan online med BankID',\n    loanApplicationResponse: ' \u2013 svar direkt!',\n    paymentAtContract: 'Betalning sker hos {{contactName}} vid kontraktskrivning.',\n    calculatedOn: 'Ber\u00E4knat p\u00E5 {{creditAmount}} kr, {{duration}} m\u00E5n, {{interest}}% r\u00E4nta.',\n    from: 'Fr\u00E5n',\n    proceed: 'G\u00E5 vidare',\n    privateLeasing: 'Privatleasing',\n    privateLeasingDescription:\n      'N\u00E4r du privatleasar en bil \u00E4ger du den inte sj\u00E4lv utan betalar en m\u00E5nadsavgift under en avtalad tid och som t\u00E4cker en viss k\u00F6rstr\u00E4cka och andra avtalade tj\u00E4nster.',\n    financialInformationToggle: 'Finansiell information',\n    financialCashSelected: 'Kontant betalning vald',\n    financialLeaseSelected: 'Privatleasing vald',\n    financialLoanSelected: 'Bill\u00E5n valt',\n    financialCashSet: 'Kontant betalning satt',\n    financialLeaseSet: 'Privatleasing satt',\n    financialLoanSet: 'Bill\u00E5n satt',\n    financialEdit: 'Redigera finansiering',\n  },\n  loan: {\n    title: 'Bill\u00E5n',\n    description: 'Finansiera bilen med bill\u00E5n via {{name}}.',\n    creditScoringInfo:\n      'G\u00F6r din l\u00E5neans\u00F6kan h\u00E4r - och f\u00E5 besked direkt. Kom ih\u00E5g, k\u00F6pet \u00E4r inte bindande f\u00F6rr\u00E4n du signerat det definitiva aff\u00E4rsf\u00F6rslaget som tas fram av {{name}}.',\n    instruction:\n      'Ange din t\u00E4nkta kontantinsats och hur m\u00E5nga m\u00E5nader du vill l\u00E4gga upp ditt l\u00E5n p\u00E5.',\n    downPaymentTitle: 'Kontantinsats',\n    downPaymentInfoTitle: 'Hur mycket av dina egna pengar vill du l\u00E4gga?',\n    downPaymentInfoDescription:\n      'Kontantinsatsen \u00E4r en del av bilens pris som du betalar med egna pengar. Den beh\u00F6ver vara minst 20% av priset p\u00E5 bilen. Kontantinsatsen betalar du senare i samband med avtalsskrivning hos {{name}}. Ifall du har en inbytesbil kan du betala kontantinsatsen med den. Detta kommer du \u00F6verens om tillsammans med {{name}} vid avtalsskrivning.',\n    durationTitle: 'Avbetalning',\n    residualTitle: 'Restv\u00E4rde',\n    errorOccurred: 'Ett fel uppstod, f\u00F6rs\u00F6k igen.',\n    proceedButton: 'G\u00E5 vidare',\n  },\n  loanDetails: {\n    disclaimerText:\n      '*Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n    showDetails: 'Visa detaljer',\n    details: 'Detaljer',\n    repaymentPeriod: 'Avbetalningsperoid',\n    months: 'm\u00E5n',\n    interest: 'R\u00E4nta',\n    effectiveInterest: 'Effektiv r\u00E4nta',\n    setupFee: 'Uppl\u00E4ggningskostnad',\n    administrationFee: 'Administrativa kostnader',\n    totalCreditCost: 'Total kreditkostnad',\n    disclaimerText1:\n      '*Det h\u00E4r \u00E4r inte den slutgiltiga offerten. R\u00E4ntan kan komma att \u00E4ndras ifall det sker justeringar i initial amorteringsplan, till\u00E4gg i utrustning eller andra \u00E4ndringar som p\u00E5verkar det initiala prisf\u00F6rslaget.',\n    disclaimerText2:\n      'Om marknadsr\u00E4ntan f\u00F6r\u00E4ndras kan m\u00E5nadskostnaden komma att \u00E4ndras i motsvarande m\u00E5n. M\u00E5nadskostnaden kan ocks\u00E5 komma att p\u00E5verkas utifr\u00E5n den kreditriskbed\u00F6mning som g\u00F6rs efter en kreditupplysning.',\n    moreInfo: 'Mer information om {{loanOrgName}}',\n  },\n  loanDetailsDetailed: {\n    showDetails: 'Visa detaljer',\n    details: 'Detaljer',\n    repaymentPeriod: 'Avbetalningsperoid',\n    months: 'm\u00E5n',\n    interest: 'R\u00E4nta',\n    effectiveInterest: 'Effektiv r\u00E4nta',\n    setupFee: 'Uppl\u00E4ggningskostnad',\n    administrationFee: 'Administrativa kostnader',\n    totalCreditCost: 'Total kreditkostnad',\n    disclaimerText1:\n      '*Det h\u00E4r \u00E4r inte den slutgiltiga offerten. R\u00E4ntan kan komma att \u00E4ndras ifall det sker justeringar i initial amorteringsplan, till\u00E4gg i utrustning eller andra \u00E4ndringar som p\u00E5verkar det initiala prisf\u00F6rslaget.',\n    disclaimerText2:\n      'Om marknadsr\u00E4ntan f\u00F6r\u00E4ndras kan m\u00E5nadskostnaden komma att \u00E4ndras i motsvarande m\u00E5n. M\u00E5nadskostnaden kan ocks\u00E5 komma att p\u00E5verkas utifr\u00E5n den kreditriskbed\u00F6mning som g\u00F6rs efter en kreditupplysning.',\n    moreInfo: 'Mer information om {{loanOrgName}}',\n  },\n  loanDetailsMonthlyCost: {\n    monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n    perMonth: 'kr/m\u00E5n*',\n  },\n  stageCompletedFinancial: {\n    downPayment: 'Kontantinsats',\n    loanAmount: 'L\u00E5nebelopp',\n    repaymentPeriod: 'Avbetalningsperoid',\n    months: 'm\u00E5n',\n    monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n    disclaimerText:\n      '*Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n    orderAlmostReady: 'Ordern \u00E4r snart klar, h\u00E4r ser du ditt l\u00E5nebesked:',\n    changeFinancing: '\u00C4ndra finansiering',\n    financing: 'Finansiering',\n    cash: 'Kontant',\n    lease: 'Privatleasing',\n  },\n  stageCompletedFinancialCreditAssessment: {\n    approved: 'Grattis! Din l\u00E5neans\u00F6kan har beviljats av {loanName}.',\n    approvedDescription:\n      'Slutf\u00F6r ordern genom att klicka dig igenom n\u00E4stkommande steg. Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n    assessManually:\n      'N\u00E4r ordern \u00E4r slutf\u00F6rd kommer vi att g\u00E5 igenom ditt \u00E4rende och \u00E5terkoppla till dig med ett l\u00E5nebesked.',\n    assessManuallyDescription:\n      'Din bil \u00E4r fortfarande inte reserverad. G\u00E5 vidare till n\u00E4sta steg f\u00F6r att slutf\u00F6ra ordern, men det \u00E4r inte s\u00E4kert att ditt l\u00E5n kommer att beviljas. Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n    declined: 'Vi kan tyv\u00E4rr inte bevilja din ans\u00F6kan om bill\u00E5n.',\n    declinedDescription:\n      'Det kan finnas olika sk\u00E4l till att en ans\u00F6kan nekas. Du kommer inom kort f\u00E5 ett brev med bekr\u00E4ftelse och mer information om just din ans\u00F6kan.',\n    declinedNextSteps:\n      'Ditt redan p\u00E5b\u00F6rjade k\u00F6p kan fortfarande genomf\u00F6ras och avslutas, f\u00F6r att g\u00E5 vidare kan du v\u00E4lja ett annat betals\u00E4tt.',\n    contactInfo: 'Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n  },\n  loanSummary: {\n    title: 'Bill\u00E5n',\n    description: 'Ordern \u00E4r snart klar, h\u00E4r ser du ditt l\u00E5nebesked:',\n    successMessage: 'Grattis! Din l\u00E5neans\u00F6kan har beviljats av {{loanName}}.',\n    notReserved:\n      'Bilen \u00E4r inte reserverad \u00E4nnu. Slutf\u00F6r ordern genom att klicka dig igenom n\u00E4stkommande steg. Har du fr\u00E5gor under tiden? Kontakta [handlaren] p\u00E5 tel [telefonnummer].',\n    downPayment: 'Kontantinsats',\n    loanAmount: 'L\u00E5nebelopp',\n    repaymentPeriod: 'Avbetalningsperoid',\n    monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n    disclaimer:\n      '*Ber\u00E4knat p\u00E5 X,XX % r\u00E4nta (effektivt X,XX %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n  },\n  summary: {\n    financing: 'Finansiering',\n    cash: 'Kontant',\n    loan: 'Bill\u00E5n',\n    leasing: 'Privatleasing',\n    changeButton: '\u00C4ndra',\n    centralStorageTitle: 'Centrallager',\n    dealerSelection: 'Val av handlare',\n    customerTitle: 'Kunduppgifter',\n    customerName: 'F\u00F6r- och efternamn',\n    customerSSN: 'Personnummer',\n    customerAddress: 'Adress',\n    customerEmail: 'E-post',\n    customerPhone: 'Telefonnummer',\n    deliveryTitle: 'Leverans',\n    deliveryMethod: 'Leveranss\u00E4tt',\n    homeDelivery: 'Hemleverans',\n    pickup: 'H\u00E4mta hos handlaren',\n    thankYou: 'Tack f\u00F6r din order!',\n    whatHappensNext: 'Det h\u00E4r h\u00E4nder nu:',\n    orderConfirmation: 'En orderbekr\u00E4ftelse kommer att skickas till din e-postadress {{email}}.*',\n    contactFromDealer:\n      '{{contactName}} tar kontakt med dig f\u00F6r att g\u00E5 igenom avtal, betalning och leverans.',\n    driveSafely: 'Klart! K\u00F6r f\u00F6rsiktigt ute p\u00E5 v\u00E4garna.',\n    orderConfirmationDisclaimer:\n      '*Orderbekr\u00E4ftelsen skickas normalt inom 10 minuter, men kan i undantagsfall dr\u00F6ja upp till 48 timmar.',\n    orderNumber: 'Ordernummer {{createdOrderId}}',\n    orderTitle: 'Din order',\n    paymentMethod: 'Betals\u00E4tt',\n    perMonth: 'kr/m\u00E5n',\n    lease: 'Privatleasing',\n    from: 'Fr\u00E5n',\n    accessories: 'Tillbeh\u00F6r',\n    insurance: 'F\u00F6rs\u00E4kring',\n    free: 'Gratis',\n    tradeInTitle: 'Inbytesbil',\n    mileage: 'Miltal',\n    description: 'Beskrivning',\n    condition: 'Bilens skick',\n    estimatedValue: 'Ungef\u00E4rligt v\u00E4rde',\n    no: 'Nej',\n  },\n  insurance: {\n    heading: 'Vill du teckna en f\u00F6rs\u00E4kring p\u00E5 din nya bil?',\n    description: 'Nedan visas f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar dig och din nya bil.',\n    proceedButton: 'G\u00E5 vidare',\n    backButton: 'Tillbaka',\n    logoAlt: 'Tillverkarens logotyp f\u00F6r {{title}}',\n    ifDescription:\n      'Ange din uppskattade k\u00F6rstr\u00E4cka f\u00F6r att se din f\u00F6rs\u00E4kringskostnad. D\u00E4refter presenterar vi f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar dig och din nya bil. I b\u00E5de hel- och halvf\u00F6rs\u00E4kring ing\u00E5r trafikf\u00F6rs\u00E4kring som \u00E4r obligatoriskt att ha. Ifall du har valt att finansiera bilen med ett bill\u00E5n \u00E4r priset du ser rabatterat.',\n    showInsurances: 'Visa f\u00F6rs\u00E4kringar',\n    ifAlert:\n      'Vi \u00E4r anknutna f\u00F6rs\u00E4kringsf\u00F6rmedlare till {{insuranceDisclaimerTitle}}, If Skadef\u00F6rs\u00E4kring. F\u00F6rs\u00E4kringsgivare \u00E4r If Skadef\u00F6rs\u00E4kring (publ). Vad detta inneb\u00E4r kan du l\u00E4sa mer om p\u00E5 f\u00F6rs\u00E4kringsf\u00F6rmedlarens hemsida.',\n    ifDisclaimer:\n      'Genom att du klickar p\u00E5 Visa f\u00F6rs\u00E4kringar s\u00E5 godk\u00E4nner du att vi skickar dina uppgifter vidare till {{insuranceDisclaimerTitle}} f\u00F6r att de ska kunna ge dig ett pris p\u00E5 f\u00F6rs\u00E4kring. Hur de hanterar dina personuppgifter kan du l\u00E4sa om p\u00E5 deras hemsida.',\n    skipButton: 'Hoppa \u00F6ver detta steg',\n    perMonth: 'kr/m\u00E5n',\n    addons: 'Tillval',\n    includes: 'F\u00F6rs\u00E4kringen inneh\u00E5ller',\n    update: 'Uppdatera',\n    select: 'V\u00E4lj',\n    estimatedMileage: 'Uppskattad k\u00F6rstr\u00E4cka',\n    edit: '\u00C4ndra',\n    fetchError: 'Det gick inte att h\u00E4mta f\u00F6rs\u00E4kringar.',\n    retry: 'F\u00F6rs\u00F6k igen',\n    title: 'F\u00F6rs\u00E4kring',\n    none: 'Ingen',\n    changeButtonTitle: '\u00C4ndra f\u00F6rs\u00E4kring',\n  },\n  tradeIn: {\n    title: 'Inbytesbil',\n    mileage: 'Miltal',\n    description: 'Beskrivning',\n    condition: 'Bilens skick',\n    estimatedValue: 'Ungef\u00E4rligt v\u00E4rde',\n    infoText: 'Vi skickar med uppgifter om din inbytesbil till bilhandlaren.',\n    infoDisclaimer:\n      'Observera att v\u00E4rderingen som utf\u00F6rs ger ett uppskattat inbytesv\u00E4rde. Det slutgiltliga v\u00E4rdet avg\u00F6rs n\u00E4r handlare kan bekr\u00E4fta bilens skick.',\n    no: 'Nej',\n    changeButtonTitle: '\u00C4ndra',\n    heading: 'Har du en inbytesbil?',\n    tradeInDescription:\n      'Har du en bil du vill byta in n\u00E4r du k\u00F6per din nya bil? H\u00E4r f\u00E5r du ett uppskattat ink\u00F6pspris av oss direkt online.',\n    yesButton: 'Jag har inbytesbil',\n    skipButton: 'Hoppa \u00F6ver detta steg',\n    veryGoodCondition: 'Mycket bra skick',\n    goodCondition: 'Bra skick',\n    okCondition: 'Helt okej skick',\n    noScratches: 'Inga repor eller skador',\n    serviced: 'Servad vid varje tillf\u00E4lle med st\u00E4mplar i serviceboken',\n    goodTires: 'D\u00E4ck med v\u00E4ldigt bra m\u00F6nsterdjup (5-8 mm)',\n    someScratches: 'N\u00E5gra mindre repor och/eller skador',\n    okTires: 'D\u00E4ck som inte beh\u00F6ver bytas (m\u00F6nsterdjup om 3-5 mm)',\n    manyScratches: 'Finns en del repor och skador',\n    notServiced: 'Inte servad vid varje tillf\u00E4lle',\n    badTires: 'D\u00E4ck som beh\u00F6ver bytas (m\u00F6nsterdjup under 3 mm)',\n    detailsHeading: 'Uppgifter om din inbytesbil',\n    detailsDescription:\n      'Ange registreringsnumret och aktuellt miltal f\u00F6r din inbytesbil s\u00E5 f\u00E5r du ett uppskattat ink\u00F6pspris av oss.',\n    registrationNumber: 'Registreringsnummer',\n    registrationNumberError:\n      'Ett giltig registreringsnummer i formatet ABC123 eller ABC12A m\u00E5ste anges',\n    registrationNumberPlaceholder: 'Ange registreringsnummer',\n    mileageError: 'Ett miltal mellan 0 till 80 000 mil m\u00E5ste anges',\n    mileagePlaceholder: 'Ange bilens miltal',\n    descriptionOptional: 'Beskrivning (valfritt)',\n    descriptionError: 'Beskrivningen \u00E4r inte giltig',\n    descriptionPlaceholder: 'Beskriv bilen',\n    fetchValue: 'H\u00E4mta uppskattat v\u00E4rde',\n    proceedButton: 'Anv\u00E4nd och g\u00E5 vidare',\n    fetchError:\n      'Tyv\u00E4rr fick vi ingen tr\u00E4ff p\u00E5 registreringsnummret du angav. V\u00E4nligen kontrollera att registreringsnummret st\u00E4mmer.',\n  },\n  vehicleInfo: 'Fordonsinformation',\n  orderCallback: {\n    thankYou: 'Tack f\u00F6r ditt k\u00F6p',\n    orderId: 'Order id',\n    waykeId: 'Wayke id',\n  },\n  howTo: {\n    heading: 'S\u00E5 h\u00E4r k\u00F6per du bilen online',\n    description:\n      'Hos oss kan du tryggt k\u00F6pa din n\u00E4sta bil online. Reservera bilen genom att klicka dig igenom v\u00E5rt k\u00F6pfl\u00F6de med f\u00F6ljande steg:',\n    timelineAriaLabel: 'Tillv\u00E4gag\u00E5ngss\u00E4tt',\n    customerHeading: 'Dina kunduppgifter',\n    centralStorageHeading: 'V\u00E4lj anl\u00E4ggning',\n    centralStorageDescription: 'V\u00E4lj vilken anl\u00E4ggning du vill k\u00F6pa bilen ifr\u00E5n.',\n    deliveryHeading: 'V\u00E4lj leveranss\u00E4tt',\n    tradeInHeading: 'Har du inbytesbil?',\n    tradeInDescription: 'F\u00E5 den v\u00E4rderad direkt online.',\n    financialHeading: '\u00C4gandeform',\n    insuranceHeading: 'Vill du teckna en f\u00F6rs\u00E4kring?',\n    insuranceDescription: 'Se f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar din nya bil.',\n    accessoriesHeading: 'Tillbeh\u00F6r',\n    accessoriesDescription: 'Best\u00E4ll extra utrustning till din bil.',\n    financialDescriptionAll:\n      'Denna bil kan du k\u00F6pa kontant, privatleasa eller finansiera med ett bill\u00E5n.',\n    financialDescriptionCashLease: 'Denna bil kan du k\u00F6pa kontant eller privatleasa.',\n    financialDescriptionCashLoan: 'Denna bil kan du k\u00F6pa kontant eller finansiera med ett bill\u00E5n',\n    financialDescriptionLoanLease: 'Denna bil kan du privatleasa eller finansiera med ett bill\u00E5n',\n    financialDescriptionCash: 'Denna bil kan du k\u00F6pa kontant.',\n    financialDescriptionLoan: 'Denna bil kan du finansiera med ett bill\u00E5n',\n    financialDescriptionLease: 'Denna bil kan du privatleasa.',\n    deliveryDescriptionBoth: 'Hemleverans eller h\u00E4mta hos handlaren.',\n    deliveryDescriptionPickup: 'H\u00E4mta hos handlaren.',\n    deliveryDescriptionHome: 'Hemleverans.',\n    paymentHeading: 'Genomf\u00F6r f\u00F6rskottsbetalning!',\n    paymentDescription:\n      'Genomf\u00F6r f\u00F6rskottskottsbetalning p\u00E5 5% av bilens v\u00E4rde. (Genomf\u00F6r betalning av deposition motsvarande 5% av bilens v\u00E4rde.)',\n    finalHeading: 'Klart!',\n    finalDescription:\n      'Efter att ordern \u00E4r genomf\u00F6rd tar {{contactName}} kontakt med dig s\u00E5 kommer ni tillsammans fram till detaljer kring betalning och skriver avtal.',\n  },\n  preview: {\n    heading: 'Vad roligt att du vill k\u00F6pa denna bil!',\n    proceedButton: 'G\u00E5 vidare',\n    checklistTitle: 'K\u00F6p online hos Wayke',\n    checklistAriaLabel: 'F\u00F6rdelar med att k\u00F6pa bilen online hos Wayke',\n    checklistItem1: 'Trygg hantering av personuppgifter',\n    checklistItem2: 'Reservera bilen nu - betalning och avtalsskrivning sker senare med handlaren',\n    checklistItem3: 'Inte bindande f\u00F6rr\u00E4n avtal skrivits ihop med handlaren',\n    checklistItem4: 'Bara kontrollerade bilar',\n    error: 'Ett fel uppstod och det gick inte att initiera modulen. F\u00F6rs\u00F6k igen.',\n    reserved:\n      'Bilen \u00E4r tyv\u00E4rr reserverad av en annan k\u00F6pare och kan d\u00E4rf\u00F6r inte reserveras just nu.',\n    unavailable: 'Bilen \u00E4r tyv\u00E4rr inte l\u00E4ngre tillg\u00E4nglig och kan d\u00E4rf\u00F6r inte reserveras.',\n  },\n};\n\nexport default svSE;\n", "import { MarketCode } from '../@types/MarketCode';\n\nexport const getLanguage = (marketCode?: MarketCode) => {\n  switch (marketCode) {\n    case 'NO':\n      return 'nb-NO';\n    case 'SE':\n      return 'sv-SE';\n    default:\n      return 'sv-SE';\n  }\n};\n", "import './styles/styles.scss';\n\nimport i18next, { initializeI18N } from '@i18n';\nimport { config, IOrderOptionsResponse } from '@wayke-se/ecom';\nimport packageJson from '../package.json';\nimport { CallbackOrder } from './@types/CallbackOrder';\nimport { EcomSdkConfig } from './@types/EcomSdkConfig';\nimport { MarketCode } from './@types/MarketCode';\nimport { ViewTypes } from './@types/Navigation';\nimport { Vehicle } from './@types/Vehicle';\nimport Modal from './Components/Modal/Modal';\nimport { creditAssessmentCancelSigning } from './Data/creditAssessmentCancelSigning';\nimport { reset, setId, setState } from './Redux/action';\nimport { ReducerState } from './Redux/reducer';\nimport { createStore, WaykeStore } from './Redux/store';\nimport watch, { unregisterAllSubscriptions } from './Redux/watch';\nimport ecomEvent, {\n  EcomEvent,\n  EcomStep,\n  EcomView,\n  getLastHistory,\n  registerEventListner,\n  unregisterEventListner,\n} from './Utils/ecomEvent';\nimport { unregisterAllIntervals } from './Utils/intervals';\nimport { StageMapKeys } from './Utils/stage';\nimport { useVwListner } from './Utils/vw';\nimport ConfirmClose from './Views/ConfirmClose';\nimport Main from './Views/Main';\nimport OrderCallback from './Views/OrderCallback';\nimport Preview from './Views/Preview';\nimport Summary from './Views/Summary';\n\nconst OrderIdQueryString = 'order';\nconst Payment3DSecurityCallback = 'wayke-ecom-web-payment';\nconst OrderWaykeIdQueryString = 'wayke-ecom-web-id';\n\nexport const WAYKE_ECOM_MODAL_ID = 'wayke-ecom-modal';\n\nconst TEST_HOST = 'ecom.wayketech.se';\nconst PROD_HOST = 'ecom.wayke.se';\nconst resolveCdnMedia = (url: string) => {\n  const _url = new URL(url);\n  switch (_url.host) {\n    case PROD_HOST:\n      return 'https://cdn.wayke.se';\n    case TEST_HOST:\n      return 'https://test-cdn.wayketech.se';\n    default:\n      return undefined;\n  }\n};\n\nexport interface AppState {\n  stage: number;\n  order?: IOrderOptionsResponse;\n}\n\ninterface AppProps {\n  rootId?: string;\n  id: string;\n  vehicle?: Vehicle;\n  ecomSdkConfig: EcomSdkConfig;\n  logo?: string;\n  logoX2?: string;\n  onEvent?: (view: EcomView, event: EcomEvent, currentStep?: EcomStep, data?: any) => void;\n  marketCode?: MarketCode;\n}\n\nclass App {\n  private root: HTMLElement;\n  private readonly props: AppProps;\n  private view: ViewTypes;\n  private stageOrderList: StageMapKeys[];\n  private readonly cdnMedia?: string;\n  private readonly contexts: {\n    store: WaykeStore;\n    modal?: Modal;\n    lastTrigger?: HTMLElement; // The element that triggered the modal\n    unsubribeVwListner?: () => void;\n  } = {\n    store: createStore(),\n  };\n  private marketCode: MarketCode;\n\n  constructor(props: AppProps) {\n    if (!props.id) throw 'Missing id';\n    this.props = props;\n    this.marketCode = props.marketCode || 'SE';\n    initializeI18N(this.marketCode);\n\n    if (!window.process) {\n      window.process = {\n        ...((window.process || {}) as NodeJS.Process),\n        env: {},\n      };\n    }\n\n    config.bind(props.ecomSdkConfig);\n    this.cdnMedia = resolveCdnMedia(props.ecomSdkConfig.api.address);\n    const createdRoot = document.createElement('div');\n    createdRoot.className = 'waykeecom-root';\n\n    if (this.marketCode === 'NO') {\n      createdRoot.setAttribute('data-theme', 'drive');\n    }\n\n    this.root = createdRoot;\n    if (this.props.rootId) {\n      const rootNode = document.getElementById(this.props.rootId);\n      if (!rootNode) throw 'Missing element with id wayke-ecom';\n      rootNode.appendChild(createdRoot);\n    } else {\n      document.body.appendChild(this.root);\n    }\n\n    this.root.dataset.version = packageJson.version;\n\n    // Stage order setup\n    this.stageOrderList = [\n      'centralStorage',\n      'customer',\n      'financial',\n      'tradeIn',\n      'accessories',\n      'insurance',\n      'delivery',\n    ];\n\n    setId(props.id)(this.contexts.store.dispatch);\n\n    this.view = this.contexts.store.getState().navigation.view;\n    watch<ViewTypes>(\n      this.contexts.store,\n      'navigation.view',\n      (newVal) => {\n        this.view = newVal;\n        if (newVal !== 'preview') {\n          this.render();\n        }\n      },\n      true\n    );\n\n    const params = new URLSearchParams(location.search);\n    const orderUrl = params.get(OrderIdQueryString) || undefined;\n    const payment3dSecurityCallback = !!params.get(Payment3DSecurityCallback);\n    const waykeId = params.get(OrderWaykeIdQueryString);\n    if (waykeId && waykeId === this.props.id && (orderUrl || payment3dSecurityCallback)) {\n      if (payment3dSecurityCallback) {\n        const stateAsString = sessionStorage.getItem('wayke-ecom-state');\n        sessionStorage.removeItem('wayke-ecom-state');\n        const state = stateAsString\n          ? (JSON.parse(stateAsString) as unknown as ReducerState | undefined)\n          : undefined;\n        if (state) {\n          this.view = state.navigation.view;\n          setState({ ...state, stateLoadedFromSession: true } as unknown as ReducerState)(\n            this.contexts.store.dispatch\n          );\n        }\n      } else if (orderUrl) {\n        this.render({\n          orderUrl,\n          id: waykeId,\n        });\n      }\n    }\n  }\n\n  close() {\n    const lastEvent = getLastHistory();\n    if (lastEvent) {\n      ecomEvent(lastEvent.view, EcomEvent.CLOSE, lastEvent.currentStep);\n    }\n    const { caseId } = this.contexts.store.getState();\n    const params = new URLSearchParams(location.search);\n    const orderId = params.get(OrderIdQueryString);\n    const orderWaykeId = params.get(OrderWaykeIdQueryString);\n    let urlChanged = false;\n    if (orderId) {\n      params.delete(OrderIdQueryString);\n      urlChanged = true;\n      location.search = params.toString();\n    }\n\n    if (orderWaykeId) {\n      params.delete(OrderWaykeIdQueryString);\n      urlChanged = true;\n    }\n\n    if (urlChanged) {\n      location.search = params.toString();\n    }\n\n    this.root.innerHTML = '';\n    this.contexts?.unsubribeVwListner?.();\n\n    unregisterAllIntervals();\n    unregisterAllSubscriptions();\n    if (caseId) {\n      creditAssessmentCancelSigning(caseId);\n    }\n    sessionStorage.removeItem('wayke-ecom-state');\n    reset(this.props.id)(this.contexts.store.dispatch);\n    if (this.props.onEvent) {\n      unregisterEventListner(this.props.onEvent);\n    }\n\n    // Set focus back to the element that triggered the modal\n    if (this.contexts.lastTrigger) {\n      this.contexts.lastTrigger.focus();\n      this.contexts.lastTrigger = undefined;\n    }\n  }\n\n  destroy() {\n    this.close();\n    this.root.remove();\n  }\n\n  private closeWithConfirm() {\n    const { navigation, createdOrderId } = this.contexts.store.getState();\n    const firstView = navigation.view === 'preview';\n    unregisterAllIntervals();\n    if (firstView || createdOrderId) {\n      this.close();\n      return;\n    }\n\n    this.contexts.modal = new Modal(this.root, {\n      title: i18next.t('glossary.modalTitle'),\n      id: WAYKE_ECOM_MODAL_ID,\n      logo: this.props.logo,\n      logoX2: this.props.logoX2,\n      marketCode: this.marketCode,\n    });\n\n    const lastEvent = getLastHistory();\n    if (lastEvent) {\n      ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_ACTIVE);\n    }\n    new ConfirmClose(this.contexts.modal.content, {\n      onConfirmClose: () => {\n        const lastEvent = getLastHistory();\n        ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_CONFIRMED, lastEvent.currentStep);\n        this.close();\n      },\n      onAbortClose: () => {\n        const lastEvent = getLastHistory();\n        ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_ABORTED, lastEvent.currentStep);\n        this.render();\n      },\n    });\n  }\n\n  start() {\n    if (this.props.onEvent) {\n      registerEventListner(this.props.onEvent);\n    }\n\n    ecomEvent(EcomView.PREVIEW, EcomEvent.START);\n    this.render();\n  }\n\n  private focusModal() {\n    if (this.contexts.modal?.content) {\n      this.contexts.modal.content.setAttribute('tabindex', '-1');\n      this.contexts.modal.content.focus();\n    }\n  }\n\n  private render(callbackOrder?: CallbackOrder) {\n    if (!this.contexts.lastTrigger) {\n      this.contexts.lastTrigger = document.activeElement as HTMLElement;\n    }\n    if (!this.contexts.unsubribeVwListner) {\n      this.contexts.unsubribeVwListner = useVwListner();\n    }\n    this.contexts.modal = new Modal(this.root, {\n      title: i18next.t('glossary.modalTitle'),\n      id: WAYKE_ECOM_MODAL_ID,\n      logo: this.props.logo,\n      logoX2: this.props.logoX2,\n      onClose: () => this.closeWithConfirm(),\n      marketCode: this.marketCode,\n    });\n\n    if (this.contexts.modal.content) {\n      this.contexts.modal.content.innerHTML = '';\n\n      if (callbackOrder) {\n        new OrderCallback(this.contexts.modal.content, {\n          store: this.contexts.store,\n          callbackOrder,\n          onClose: () => this.close(),\n        });\n\n        // Set focus to the modal to trap focus\n        this.focusModal();\n\n        return;\n      }\n\n      switch (this.view) {\n        case 'preview':\n          new Preview(this.contexts.modal.content, {\n            store: this.contexts.store,\n            stageOrderList: this.stageOrderList,\n            vehicle: this.props.vehicle,\n            cdnMedia: this.cdnMedia,\n          });\n          break;\n        case 'main':\n          new Main(this.contexts.modal.content, {\n            store: this.contexts.store,\n            cdnMedia: this.cdnMedia,\n            marketCode: this.marketCode,\n          });\n          break;\n        case 'summary':\n          new Summary(this.contexts.modal.content, {\n            store: this.contexts.store,\n            cdnMedia: this.cdnMedia,\n            onClose: () => this.close(),\n            marketCode: this.marketCode,\n          });\n          break;\n        default:\n          throw 'Unknown view...';\n      }\n\n      // Set focus to the modal to trap focus\n      this.focusModal();\n    }\n  }\n}\n\nexport default App;\n", "{\n  \"name\": \"@wayke-se/ecom-web\",\n  \"version\": \"2.1.1\",\n  \"description\": \"Wayke Ecom Web\",\n  \"type\": \"module\",\n  \"module\": \"dist/index.mjs\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"homepage\": \"https://github.com/wayke-se/wayke-ecom-web\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/wayke-se/wayke-ecom-web.git\"\n  },\n  \"scripts\": {\n    \"start\": \"node ./esbuild/start.js\",\n    \"clip\": \"node ./esbuild/clip-ui.js && node ./clip-ui/start.js\",\n    \"build\": \"npm run clean && node ./esbuild/lib.js && node ./esbuild/cdn.js && npm run build:types\",\n    \"build:types\": \"tsc --project tsconfig.build.json --declaration --emitDeclarationOnly --outDir dist\",\n    \"clean\": \"rimraf build && rimraf dist && rimraf dist-cdn\",\n    \"test\": \"npm run lint && npm run typecheck\",\n    \"typecheck\": \"tsc -noEmit\",\n    \"typecheck:watch\": \"tsc -noEmit -watch\",\n    \"lint\": \"npx @biomejs/biome check\",\n    \"lint:fix\": \"npx @biomejs/biome check --write\",\n    \"stylelint\": \"stylelint '**/*.scss'\",\n    \"prepare\": \"husky\"\n  },\n  \"author\": \"Wayke\",\n  \"license\": \"ISC\",\n  \"lint-staged\": {\n    \"*.{js,ts}\": [\n      \"npx @biomejs/biome check\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@biomejs/biome\": \"2.4.16\",\n    \"@ourstudio/clip-ui\": \"^0.0.11\",\n    \"@types/node\": \"^25.9.1\",\n    \"@types/object-path\": \"^0.11.1\",\n    \"@types/sanitize-html\": \"^2.16.1\",\n    \"esbuild\": \"^0.28.0\",\n    \"esbuild-sass-plugin\": \"^3.7.0\",\n    \"husky\": \"^9.1.7\",\n    \"lint-staged\": \"^17.0.5\",\n    \"rimraf\": \"^6.1.3\",\n    \"stylelint\": \"^17.12.0\",\n    \"stylelint-config-prettier-scss\": \"^1.0.0\",\n    \"stylelint-config-standard-scss\": \"^17.0.0\",\n    \"typescript\": \"^6.0.3\"\n  },\n  \"dependencies\": {\n    \"@wayke-se/ecom\": \"^4.6.1\",\n    \"i18next\": \"^26.3.0\",\n    \"marked\": \"^18.0.4\",\n    \"object-path\": \"^0.11.8\",\n    \"redux\": \"^5.0.1\",\n    \"sanitize-html\": \"^2.17.4\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"engines\": {\n    \"node\": \">=24.0.0\"\n  },\n  \"volta\": {\n    \"node\": \"24\"\n  }\n}\n", "export function trapFocus(modalElement: HTMLElement) {\n  modalElement.addEventListener('keydown', (e: KeyboardEvent) => {\n    if (e.key === 'Tab') {\n      const focusableSelector =\n        'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n      const focusableElements = modalElement.querySelectorAll<HTMLElement>(focusableSelector);\n      if (focusableElements.length === 0) return;\n      const firstElement = focusableElements[0];\n      const lastElement = focusableElements[focusableElements.length - 1];\n      if (e.shiftKey) {\n        if (document.activeElement === firstElement) {\n          e.preventDefault();\n          lastElement.focus();\n        }\n      } else {\n        if (document.activeElement === lastElement) {\n          e.preventDefault();\n          firstElement.focus();\n        }\n      }\n    }\n  });\n}\n", "interface Attribute {\n  key: string;\n  value: string;\n}\n\nexport interface HtmlNodeSettings {\n  htmlTag: keyof HTMLElementTagNameMap;\n  className?: string;\n  id?: string;\n  attributes?: Attribute[];\n}\n\nclass HtmlNode {\n  private element: HTMLElement;\n  node: HTMLElement;\n\n  constructor(element: HTMLElement | null | undefined, settings?: HtmlNodeSettings) {\n    if (!element) throw 'Missing element';\n    if (!settings) {\n      // Attch only to given node\n      this.element = element;\n      this.node = element;\n      return;\n    }\n\n    // Append to given node\n    this.element = element;\n    const existingElement = settings.id\n      ? this.element.querySelector<HTMLElement>(`#${settings.id}`)\n      : undefined;\n\n    if (existingElement) {\n      // Reuse node\n      existingElement.className = settings.className || '';\n      settings.attributes?.forEach((attribute) => {\n        existingElement.setAttribute(attribute.key, attribute.value);\n      });\n      this.node = existingElement;\n    } else {\n      const item = document.createElement(settings.htmlTag);\n      if (settings.id) {\n        item.id = settings.id;\n      }\n      item.className = settings.className || '';\n      settings.attributes?.forEach((attribute) => {\n        item.setAttribute(attribute.key, attribute.value);\n      });\n      element.appendChild(item);\n\n      this.node = item;\n    }\n  }\n}\n\nexport default HtmlNode;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalBodyProps {\n  id: string;\n}\n\nclass ModalBody extends HtmlNode {\n  constructor(element: HTMLElement, { id }: ModalBodyProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal__body',\n      id,\n    });\n  }\n}\n\nexport default ModalBody;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalCenterProps {\n  id: string;\n}\nclass ModalCenter extends HtmlNode {\n  constructor(element: HTMLElement, { id }: ModalCenterProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal__center',\n      id,\n    });\n  }\n}\n\nexport default ModalCenter;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonCloseProps {\n  readonly title: string;\n  readonly id?: string;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonClose extends HtmlNode {\n  private readonly props: ButtonCloseProps;\n\n  constructor(element: HTMLElement | null, props: ButtonCloseProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { title, id, onClick } = this.props;\n\n    this.node.innerHTML = `\n      <button\n        title=\"${title}\"\n        ${id ? `id=\"${id}\"` : ''}\n        class=\"waykeecom-modal__close-btn\"\n      >\n        <span class=\"waykeecom-sr-only\">${title}</span>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 16 16\"\n          class=\"waykeecom-icon\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M9.1 8l5.9 5.9-1.1 1.1L8 9.1 2.1 15 1 13.9 6.9 8 1 2.1 2.1 1 8 6.9 13.9 1 15 2.1 9.1 8z\" />\n        </svg>\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonClose;\n", "import i18next from '@i18n';\nimport ButtonClose from '../Button/ButtonClose';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalCloseProps {\n  readonly id: string;\n  readonly onClose?: () => void;\n}\nclass ModalClose extends HtmlNode {\n  private readonly props: ModalCloseProps;\n\n  constructor(element: HTMLElement, props: ModalCloseProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal__close',\n      id: props.id,\n    });\n\n    this.props = props;\n    this.render();\n\n    // Add keydown listener for Escape key if onClose is provided\n    if (this.props.onClose) {\n      window.addEventListener('keydown', this.handleKeydown);\n    }\n  }\n\n  private handleKeydown = (event: KeyboardEvent): void => {\n    if (event.key === 'Escape') {\n      this.props.onClose && this.props.onClose();\n    }\n  };\n\n  render() {\n    const { onClose } = this.props;\n    this.node.innerHTML = '';\n\n    if (onClose) {\n      new ButtonClose(this.node, {\n        title: i18next.t('glossary.closeModal'),\n        onClick: () => onClose(),\n      });\n    }\n  }\n}\n\nexport default ModalClose;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalContainerProps {\n  id: string;\n}\nclass ModalContainer extends HtmlNode {\n  constructor(element: HTMLElement, { id }: ModalContainerProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal__container',\n      id,\n    });\n  }\n}\n\nexport default ModalContainer;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalDialogProps {\n  id: string;\n}\nclass ModalDialog extends HtmlNode {\n  constructor(element: HTMLElement, { id }: ModalDialogProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal__dialog',\n      id,\n    });\n  }\n}\n\nexport default ModalDialog;\n", "import { MarketCode } from '../@types/MarketCode';\n\ninterface LogotypeProps {\n  market: MarketCode;\n  className?: string;\n}\n\nexport const getWordmarkLogotype = ({ market, className }: LogotypeProps) => {\n  switch (market) {\n    case 'SE':\n      return `\n        <svg ${!!className ? `class=\"${className}\"` : ''} viewBox=\"0 0 548.95 123.3\" preserveAspectRatio=\"xMinYMid\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n          <title>Wayke</title>\n          <g>\n            <path d=\"M275.16,48.31l-18.69,53.3h-12L219.59,28h15.08l16.84,52.57,18-52.88h12.29l18.08,53L316.68,28h13.64l-24.17,73.65H293.75Z\"></path>\n            <path d=\"M348.51,102c-12.8,0-26.41-9.45-26.41-27s13.61-27,26.41-27c5.12,0,12.39,2,16,7.48l.76,1.16V49h12.92v52.29H365.26V93.18l-.77,1.22C361,100,353,102,348.51,102Zm1.92-41.62c-7.37,0-15,5.48-15,14.65a14.67,14.67,0,0,0,15,14.65c7.39,0,14.87-5,14.87-14.65S357.63,60.36,350.42,60.36Z\"></path>\n            <path d=\"M408.36,123.3H395.14l9.92-22.93L381.51,49h14.88l15.39,35.53L427.16,49h13.43Z\"></path>\n            <path d=\"M456.35,77.54V101.3h-13V25.83h13V70.31l24-21.28h17.25L469.78,73.41,499,101.3H481.34Z\"></path>\n            <path d=\"M548.95,75.88v1.45H507.43c.52,8.16,6.5,14.36,15.18,14.36,8.37,0,11.78-4.23,12.71-5.68h13c-.83,5.37-8,16.63-25.72,16.63-16.94,0-28.4-11.77-28.4-27.47,0-16.22,11.36-27.47,27.37-27.47S548.95,58.84,548.95,75.88Zm-41.11-7.64h27.27c-2-6.61-6.82-10.33-13.53-10.33C514.45,57.92,509.49,61.73,507.84,68.24Z\"></path>\n          </g>\n          <g>\n            <circle cx=\"4.25\" cy=\"39.68\" r=\"4.25\"></circle>\n            <circle cx=\"25.15\" cy=\"68.03\" r=\"4.96\"></circle>\n            <circle cx=\"46.04\" cy=\"96.38\" r=\"6.38\"></circle>\n            <circle cx=\"66.93\" cy=\"68.03\" r=\"7.09\"></circle>\n            <circle cx=\"87.82\" cy=\"39.68\" r=\"8.5\"></circle>\n            <circle cx=\"108.72\" cy=\"68.03\" r=\"10.63\"></circle>\n            <circle cx=\"129.61\" cy=\"96.38\" r=\"12.76\"></circle>\n            <circle cx=\"150.5\" cy=\"68.03\" r=\"13.47\"></circle>\n            <circle cx=\"171.4\" cy=\"39.68\" r=\"14.17\"></circle>\n            <circle cx=\"129.61\" cy=\"39.68\" r=\"12.05\"></circle>\n            <circle cx=\"66.93\" cy=\"11.34\" r=\"7.09\"></circle>\n            <circle cx=\"150.5\" cy=\"11.34\" r=\"11.34\"></circle>\n            <circle cx=\"108.72\" cy=\"11.34\" r=\"10.63\"></circle>\n            <circle cx=\"46.04\" cy=\"39.68\" r=\"6.38\"></circle>\n            <circle cx=\"25.15\" cy=\"11.34\" r=\"4.96\"></circle>\n          </g>\n        </svg>\n      `;\n    case 'NO':\n      return `\n        <svg ${!!className ? `class=\"${className}\"` : ''} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 93\" preserveAspectRatio=\"xMinYMid\">\n          <title>Drive</title>\n          <path d=\"M234.501 0h21.343l7.478 74.395h3.583L295.466 0h21.343l-35.754 92.987h-36.947L234.501 0ZM221.882 18.631 224.504 0h-20.681l-2.609 18.631h20.668ZM198.617 37.12 190.763 93h20.668l7.854-55.88h-20.668ZM185.817 32.543C188.491 13.95 176.482 0 154.464 0h-46.022l-2.597 18.631h45.919c9.334 0 14.54 5.986 13.333 13.95-1.207 7.965-7.867 13.951-17.202 13.951h-25.302l1.298-9.373h-20.668l-7.79 55.867h20.681l3.895-27.888h23.368c3.739 9.554 7.478 18.462 11.477 27.888h22.07l-12.983-31.884a36.086 36.086 0 0 0 14.785-11.381 35.881 35.881 0 0 0 7.091-17.218ZM47.087 0H13.073L5.206 55.893h20.629l5.193-37.3h13.385c16.682 0 27.081 11.959 24.81 27.9A32.546 32.546 0 0 1 58.14 66.55a32.796 32.796 0 0 1-21.595 7.845H2.61L.013 93h34c28.679 0 52.151-20.583 55.89-46.545C93.642 20.493 75.765 0 47.087 0ZM325.975 0l-2.623 18.592h73.987L400 0h-74.025ZM336.101 74.395l2.674-18.592h42.024l2.661-18.606h-62.717L312.888 93h74.039l2.544-18.605h-53.37Z\"/>\n        </svg>\n      `;\n  }\n};\n\n// Receive symbol logotype based on current market\n\nexport const getSymbolLogotype = ({ market, className }: LogotypeProps) => {\n  switch (market) {\n    case 'SE':\n      return `\n        <svg ${!!className ? `class=\"${className}\"` : ''} viewBox=\"0 0 185.57 109.13\" preserveAspectRatio=\"xMinYMid\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n          <title>Wayke</title>\n          <circle cx=\"4.25\" cy=\"39.68\" r=\"4.25\"></circle>\n          <circle cx=\"25.15\" cy=\"68.03\" r=\"4.96\"></circle>\n          <circle cx=\"46.04\" cy=\"96.38\" r=\"6.38\"></circle>\n          <circle cx=\"66.93\" cy=\"68.03\" r=\"7.09\"></circle>\n          <circle cx=\"87.82\" cy=\"39.68\" r=\"8.5\"></circle>\n          <circle cx=\"108.72\" cy=\"68.03\" r=\"10.63\"></circle>\n          <circle cx=\"129.61\" cy=\"96.38\" r=\"12.76\"></circle>\n          <circle cx=\"150.5\" cy=\"68.03\" r=\"13.47\"></circle>\n          <circle cx=\"171.4\" cy=\"39.68\" r=\"14.17\"></circle>\n          <circle cx=\"129.61\" cy=\"39.68\" r=\"12.05\"></circle>\n          <circle cx=\"66.93\" cy=\"11.34\" r=\"7.09\"></circle>\n          <circle cx=\"150.5\" cy=\"11.34\" r=\"11.34\"></circle>\n          <circle cx=\"108.72\" cy=\"11.34\" r=\"10.63\"></circle>\n          <circle cx=\"46.04\" cy=\"39.68\" r=\"6.38\"></circle>\n          <circle cx=\"25.15\" cy=\"11.34\" r=\"4.96\"></circle>\n        </svg>\n      `;\n    case 'NO':\n      return `\n        <svg ${!!className ? `class=\"${className} waykeecom-modal__norway-footer-logo\"` : ''} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 37 38\">\n          <title>Drive</title>\n          <path d=\"M19.27 0H5.348L2.126 22.838h8.445l2.126-15.241h5.479c6.83 0 11.086 4.886 10.156 11.4a13.292 13.292 0 0 1-4.537 8.195 13.441 13.441 0 0 1-8.84 3.206H1.063L0 38h13.919c11.74 0 21.349-8.41 22.88-19.018C38.328 8.373 31.01 0 19.27 0Z\" />\n        </svg>\n      `;\n  }\n};\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport { getSymbolLogotype } from '../../Templates/Logotype';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalFooterProps {\n  readonly id: string;\n  readonly marketCode: MarketCode;\n}\nclass ModalFooter extends HtmlNode {\n  private readonly props: ModalFooterProps;\n\n  constructor(element: HTMLElement, props: ModalFooterProps) {\n    super(element, {\n      htmlTag: 'footer',\n      className: 'waykeecom-modal__footer',\n      id: props.id,\n    });\n\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    this.node.innerHTML = `\n      <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n        <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n          ${getSymbolLogotype({\n            market: this.props.marketCode,\n            className: 'waykeecom-modal__footer-logo',\n          })}     \n        </div>\n        <div class=\"waykeecom-hstack__item\">\n          Powered by <a href=\"${i18next.t('glossary.homeUrl')}\" title=\"${i18next.t('glossary.goToHome')}\" target=\"_blank\" rel=\"noopener noreferer\" class=\"waykeecom-link waykeecom-link--no-external-icon waykeecom-link--current-color waykeecom-link--underline\">${i18next.t('glossary.company')}</a>\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default ModalFooter;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport { getWordmarkLogotype } from '../../Templates/Logotype';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalHeaderProps {\n  readonly title: string;\n  readonly id: string;\n  readonly logo?: string;\n  readonly logoX2?: string;\n  readonly onClose?: () => void;\n  readonly marketCode: MarketCode;\n}\n\nclass ModalHeader extends HtmlNode {\n  private readonly props: ModalHeaderProps;\n\n  constructor(element: HTMLElement, props: ModalHeaderProps) {\n    super(element, {\n      htmlTag: 'header',\n      className: 'waykeecom-modal__header',\n      id: props.id,\n    });\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { title, logo, logoX2, onClose } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-header\">\n        <div class=\"waykeecom-header__logo\">\n          <h2 class=\"waykeecom-no-margin\">\n          ${\n            logo\n              ? `\n                <img\n                  src=\"${logo}\"\n                  ${logoX2 ? `srcset=\"${logoX2} 2x\"` : ''}\n                  alt=\"${title}\"\n                  class=\"waykevaluation-image\"\n                />\n              `\n              : getWordmarkLogotype({\n                  market: this.props.marketCode,\n                  className: 'waykevaluation-header__logo--svg',\n                })\n          }\n          </h2>\n        </div>\n      </div>\n    `;\n    if (onClose) {\n      this.node.querySelectorAll<HTMLButtonElement>('button').forEach((button) => {\n        button.addEventListener('click', () => onClose());\n      });\n    }\n  }\n}\n\nexport default ModalHeader;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport { trapFocus } from '../../Utils/trapFocus';\nimport HtmlNode from '../Extension/HtmlNode';\nimport ModalBody from './ModalBody';\nimport ModalCenter from './ModalCenter';\nimport ModalClose from './ModalClose';\nimport ModalContainer from './ModalContainer';\nimport ModalDialog from './ModalDialog';\nimport ModalFooter from './ModalFooter';\nimport ModalHeader from './ModalHeader';\n\ninterface ModalProps {\n  readonly title: string;\n  readonly id: string;\n  readonly logo?: string;\n  readonly logoX2?: string;\n  readonly onClose?: () => void;\n  readonly marketCode: MarketCode;\n}\n\nclass Modal extends HtmlNode {\n  private readonly props: ModalProps;\n  content: HTMLElement;\n\n  constructor(element: HTMLElement, props: ModalProps) {\n    super(element, {\n      htmlTag: 'div',\n      className: 'waykeecom-modal',\n      attributes: [\n        {\n          key: 'role',\n          value: 'dialog',\n        },\n        { key: 'aria-modal', value: 'true' },\n        { key: 'aria-labelledby', value: 'wayke-ecom-title' },\n      ],\n      id: props.id,\n    });\n    this.props = props;\n    this.content = this.render();\n    trapFocus(this.node); // Trap focus within the modal\n  }\n\n  render() {\n    const { title, id, onClose } = this.props;\n    const container = new ModalContainer(this.node, { id: `${id}-container` });\n    const center = new ModalCenter(container.node, { id: `${id}-center` });\n    const dialog = new ModalDialog(center.node, { id: `${id}-dialog` });\n    new ModalClose(dialog.node, { id: `${id}-close`, onClose });\n    new ModalHeader(dialog.node, {\n      title,\n      logo: this.props.logo,\n      logoX2: this.props.logoX2,\n      onClose,\n      id: `${id}-header`,\n      marketCode: this.props.marketCode,\n    });\n    const body = new ModalBody(dialog.node, {\n      id: `${id}-body`,\n    });\n    new ModalFooter(dialog.node, {\n      id: `${id}-footer`,\n      marketCode: this.props.marketCode,\n    });\n\n    return body.node;\n  }\n}\n\nexport default Modal;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentCancelSigning = (caseId: string) => {\n  const request = creditAssessment.cancelSigning(caseId);\n  return request;\n};\n", "import { ICreditAssessmentStatusResponse } from '@wayke-se/ecom';\nimport { OrderOptionsResponse } from '@wayke-se/ecom/dist-types/orders/order-options-response';\nimport { PaymentLookupResponse } from '@wayke-se/ecom/dist-types/payments/payment-lookup-response';\nimport { VehicleLookupResponse } from '@wayke-se/ecom/dist-types/vehicles/vehicle-lookup-response';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { VehicleLookup } from '../@types/VehicleLookup';\n\nexport const convertPaymentLookupResponse = (plr: PaymentLookupResponse): PaymentLookup => {\n  const response: PaymentLookup = {\n    costs: plr.getCosts(),\n    fees: plr.getFees(),\n    interests: plr.getInterests(),\n    durationSpec: plr.getDurationSpec(),\n    downPaymentSpec: plr.getDownPaymentSpec(),\n    residualValueSpec: plr.getResidualValueSpec(),\n    totalResidualValue: plr.getTotalResidualValue(),\n    publicURL: plr.getPublicURL(),\n    shouldUseCreditScoring: plr.shouldUseCreditScoring(),\n    financialProductCode: plr.getFinancialProductCode(),\n    price: plr.getPrice(),\n    creditAmount: plr.getCreditAmount(),\n    hasPrivacyPolicy: plr.hasPrivacyPolicy(),\n    privacyPolicyUrl: plr.getPrivacyPolicyUrl(),\n    moneyLaunderingInformationURL: plr.getMoneyLaunderingInformationURL(),\n    financialOptionId: plr.getFinancialOptionId(),\n  };\n  return response;\n};\n\nexport const convertCreditAssessmentStatusResponse = (cCAr: ICreditAssessmentStatusResponse) => {\n  const response: ICreditAssessmentStatus = {\n    status: cCAr.getStatus(),\n    hasPendingSigning: cCAr.hasPendingSigning(),\n    hintCode: cCAr.getHintCode(),\n    signingMessage: cCAr.getSigningMessage(),\n    shouldRenewSigning: cCAr.shouldRenewSigning(),\n    isSigned: cCAr.isSigned(),\n    address: undefined, // cCAr.getAddress(),\n    pendingScoring: cCAr.hasPendingScoring(),\n    isScored: cCAr.isScored(),\n    hasScoringError: cCAr.hasScoringError(),\n    scoringId: cCAr.getScoringId(),\n    recommendation: cCAr.getRecommendation(),\n    decision: cCAr.getDecision(),\n    isAccepted: cCAr.isAccepted(),\n  };\n  return response;\n};\n\nexport const convertOrderOptionsResponse = (cOOR: OrderOptionsResponse) => {\n  const response: OrderOptions = {\n    orderVehicle: cOOR.getOrderVehicle(),\n    accessories: cOOR.getAccessories(),\n    requiresDealerSelection: cOOR.requiresDealerSelection(),\n    dealerSites: cOOR.getDealerSites(),\n    paymentOptions: cOOR.getPaymentOptions().map((option) => ({\n      ...option,\n      loanDetails: option.loanDetails\n        ? convertPaymentLookupResponse(option.loanDetails)\n        : undefined,\n    })),\n    deliveryOptions: cOOR.getDeliveryOptions(),\n    insuranceOption: cOOR.getInsuranceOption(),\n    orderConditions: cOOR.getOrderConditions(),\n    orderReturnConditions: cOOR.getOrderReturnConditions(),\n    conditionsPdfUri: cOOR.getConditionsPdfUri(),\n    contactInformation: cOOR.getContactInformation(),\n    allowsTradeIn: cOOR.allowsTradeIn(),\n    isUnavailable: cOOR.isUnavailable(),\n    isReserved: cOOR.isReserved(),\n    isPaymentRequired: cOOR.isPaymentRequired(),\n  };\n  return response;\n};\n\nexport const convertVehicleLookupResponse = (cVLR: VehicleLookupResponse): VehicleLookup => {\n  const response: VehicleLookup = {\n    vehicle: cVLR.getVehicle(),\n  };\n\n  return response;\n};\n", "import {\n  DrivingDistance,\n  IAddress,\n  IAvailableInsuranceOption,\n  IInsuranceAddon,\n  IInsuranceOption,\n  IVehicle,\n  PaymentType,\n} from '@wayke-se/ecom';\nimport { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport { PaymentLookupResponse } from '@wayke-se/ecom/dist-types/payments/payment-lookup-response';\nimport { Dispatch } from 'redux';\nimport { BaseAction } from '../@types/BaseAction';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { PartialCustomer } from '../@types/Customer';\nimport { ViewTypes } from '../@types/Navigation';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { StageTypes } from '../@types/Stages';\nimport { TradeInCarData } from '../@types/TradeIn';\nimport { Vehicle } from '../@types/Vehicle';\nimport { convertPaymentLookupResponse } from '../Utils/convert';\nimport { ReducerState } from './reducer';\n\nexport const RESET = 'RESET';\nexport type RESET_TYPE = BaseAction<typeof RESET> & {\n  id: string;\n};\nexport const reset = (id: string) => (dispatch: Dispatch) => dispatch({ type: RESET, id });\n\nexport const SET_ORDER = 'SET_ORDER';\nexport type SET_ORDER_TYPE = BaseAction<typeof SET_ORDER> & {\n  order: OrderOptions;\n  vehicle?: Vehicle;\n};\nexport const setOrder = (order: OrderOptions, vehicle?: Vehicle) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_ORDER, order, vehicle });\n\nexport const SET_ID = 'SET_ID';\nexport type SET_ID_TYPE = BaseAction<typeof SET_ID> & {\n  id: string;\n};\nexport const setId = (id: string) => (dispatch: Dispatch) => dispatch({ type: SET_ID, id });\n\nexport const SET_CONTACT_EMAIL_AND_PHONE = 'SET_CONTACT_EMAIL_AND_PHONE';\nexport type SET_CONTACT_EMAIL_AND_PHONE_TYPE = BaseAction<typeof SET_CONTACT_EMAIL_AND_PHONE> & {\n  value: PartialCustomer;\n};\nexport const setContactAndPhone = (value: PartialCustomer) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_CONTACT_EMAIL_AND_PHONE, value });\n\nexport const SET_SOCIAL_ID_AND_ADDRESS = 'SET_SOCIAL_ID_AND_ADDRESS';\nexport type SET_SOCIAL_ID_AND_ADDRESS_TYPE = BaseAction<typeof SET_SOCIAL_ID_AND_ADDRESS> & {\n  socialId: string;\n  address: IAddress;\n  lastStage: boolean;\n};\nexport const setSocialIdAndAddress =\n  (socialId: string, address: IAddress, lastStage: boolean) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_SOCIAL_ID_AND_ADDRESS, socialId, address, lastStage });\n\nexport const SET_ADDRESS = 'SET_ADDRESS';\nexport type SET_ADDRESS_TYPE = BaseAction<typeof SET_ADDRESS> & {\n  address: IAddress;\n  lastStage: boolean;\n};\nexport const setAddress = (address: IAddress, lastStage: boolean) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_ADDRESS, address, lastStage });\n\nexport const SET_HOME_DELIVERY = 'SET_HOME_DELIVERY';\nexport type SET_HOME_DELIVERY_TYPE = BaseAction<typeof SET_HOME_DELIVERY> & {\n  homeDelivery: boolean;\n  lastStage: boolean;\n};\nexport const setHomeDelivery =\n  (homeDelivery: boolean, lastStage: boolean) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_HOME_DELIVERY, homeDelivery, lastStage });\n\nexport const SET_DEALER = 'SET_DEALER';\nexport type SET_DEALER_TYPE = BaseAction<typeof SET_DEALER> & {\n  dealer: string;\n  lastStage: boolean;\n};\nexport const setDealer = (dealer: string, lastStage: boolean) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_DEALER, dealer, lastStage });\n\nexport const INIT_TRADE_IN = 'INIT_TRADE_IN';\nexport type INIT_TRADE_IN_TYPE = BaseAction<typeof INIT_TRADE_IN> & {\n  lastStage: boolean;\n};\nexport const initTradeIn = (lastStage: boolean) => (dispatch: Dispatch) =>\n  dispatch({ type: INIT_TRADE_IN, lastStage });\n\nexport const SET_TRADE_IN = 'SET_TRADE_IN';\nexport type SET_TRADE_IN_TYPE = BaseAction<typeof SET_TRADE_IN> & {\n  lastStage: boolean;\n  tradeIn?: TradeInCarData;\n  tradeInVehicle?: IVehicle;\n};\nexport const setTradeIn =\n  (lastStage: boolean, tradeIn?: TradeInCarData | undefined, tradeInVehicle?: IVehicle) =>\n  (dispatch: Dispatch) =>\n    dispatch({ type: SET_TRADE_IN, lastStage, tradeIn, tradeInVehicle });\n\nexport const SET_FINANCIAL = 'SET_FINANCIAL';\nexport type SET_FINANCIAL_TYPE = BaseAction<typeof SET_FINANCIAL> & {\n  paymentType: PaymentType;\n  lastStage: boolean;\n};\nexport const setFinancial =\n  (paymentType: PaymentType, lastStage: boolean) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_FINANCIAL, paymentType, lastStage });\n\nexport const SET_PAYMENT_LOOKUP_RESPONSE = 'SET_PAYMENT_LOOKUP_RESPONSE';\nexport type SET_PAYMENT_LOOKUP_RESPONSE_TYPE = BaseAction<typeof SET_PAYMENT_LOOKUP_RESPONSE> & {\n  paymentLookupResponse: PaymentLookup;\n};\nexport const setPaymentLookupResponse =\n  (paymentLookupResponse: PaymentLookupResponse) => (dispatch: Dispatch) =>\n    dispatch({\n      type: SET_PAYMENT_LOOKUP_RESPONSE,\n      paymentLookupResponse: convertPaymentLookupResponse(paymentLookupResponse),\n    });\n\nexport const RESET_PAYMENT_LOOKUP_RESPONSE = 'RESET_PAYMENT_LOOKUP_RESPONSE';\nexport type RESET_PAYMENT_LOOKUP_RESPONSE_TYPE = BaseAction<typeof RESET_PAYMENT_LOOKUP_RESPONSE>;\nexport const resetPaymentLookupResponse = () => (dispatch: Dispatch) =>\n  dispatch({\n    type: RESET_PAYMENT_LOOKUP_RESPONSE,\n  });\n\nexport const SET_DRIVING_DISTANCE = 'SET_DRIVING_DISTANCE';\nexport type SET_DRIVING_DISTANCE_TYPE = BaseAction<typeof SET_DRIVING_DISTANCE> & {\n  drivingDistance: DrivingDistance;\n};\n\nexport const setDrivingDistance = (drivingDistance: DrivingDistance) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_DRIVING_DISTANCE, drivingDistance });\n\nexport const COMPLETE_STAGE = 'COMPLETE_STAGE';\nexport type COMPLETE_STAGE_TYPE = BaseAction<typeof COMPLETE_STAGE> & {\n  lastStage: boolean;\n};\nexport const completeStage = (lastStage: boolean) => (dispatch: Dispatch) =>\n  dispatch({ type: COMPLETE_STAGE, lastStage });\n\nexport const SET_OR_REMOVE_INSURANCE = 'SET_OR_REMOVE_INSURANCE';\nexport type SET_OR_REMOVE_INSURANCE_TYPE = BaseAction<typeof SET_OR_REMOVE_INSURANCE> & {\n  insurance?: IInsuranceOption;\n};\nexport const addOrRemoveInsurance = (insurance?: IInsuranceOption) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_OR_REMOVE_INSURANCE, insurance });\n\nexport const SET_OR_REMOVE_INSURANCE_ADDONS = 'SET_OR_REMOVE_INSURANCE_ADDONS';\nexport type SET_OR_REMOVE_INSURANCE_ADDONS_TYPE = BaseAction<\n  typeof SET_OR_REMOVE_INSURANCE_ADDONS\n> & {\n  insurance: IInsuranceOption;\n  insuranceAddons: IInsuranceAddon[];\n};\nexport const addOrRemoveInsuranceAddon =\n  (insurance: IInsuranceOption, insuranceAddons: IInsuranceAddon[]) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_OR_REMOVE_INSURANCE_ADDONS, insurance, insuranceAddons });\n\nexport const SET_OR_REMOVE_FREE_INSURANCE = 'SET_OR_REMOVE_FREE_INSURANCE';\nexport type SET_OR_REMOVE_FREE_INSURANCE_TYPE = BaseAction<typeof SET_OR_REMOVE_FREE_INSURANCE> & {\n  freeInsurance?: IAvailableInsuranceOption;\n};\nexport const addOrRemoveFreeInsurance =\n  (freeInsurance: IAvailableInsuranceOption) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_OR_REMOVE_FREE_INSURANCE, freeInsurance });\n\nexport const SET_OR_REMOVE_ACCESSORY = 'SET_OR_REMOVE_ACCESSORY';\nexport type SET_OR_REMOVE_ACCESSORY_TYPE = BaseAction<typeof SET_OR_REMOVE_ACCESSORY> & {\n  accessory: IAccessory;\n};\nexport const addOrRemoveAccessory = (accessory: IAccessory) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_OR_REMOVE_ACCESSORY, accessory });\n\nexport const GO_TO = 'GO_TO';\nexport type GO_TO_TYPE = BaseAction<typeof GO_TO> & {\n  view: ViewTypes;\n  index?: number;\n  subStage?: number;\n};\nexport const goTo = (view: ViewTypes, index?: number, subStage?: number) => (dispatch: Dispatch) =>\n  dispatch({ type: GO_TO, view, index, subStage });\n\nexport const SET_STAGES = 'SET_STAGES';\nexport type SET_STAGES_TYPE = BaseAction<typeof SET_STAGES> & {\n  stages: StageTypes[];\n};\nexport const setStages = (stages: StageTypes[]) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_STAGES, stages });\n\nexport const SET_CREATED_ORDER_ID = 'SET_CREATED_ORDER_ID';\nexport type SET_CREATED_ORDER_ID_TYPE = BaseAction<typeof SET_CREATED_ORDER_ID> & {\n  id: string | null | undefined;\n  payment?: { type: string; url: string };\n};\nexport const setCreatedOrderId =\n  (id: string | null | undefined, payment?: { type: string; url: string }) =>\n  (dispatch: Dispatch) =>\n    dispatch({ type: SET_CREATED_ORDER_ID, id, payment });\n\nexport const SET_CREDIT_ASSESSMENT_RESPONSE = 'SET_CREDIT_ASSESSMENT_RESPONSE';\nexport type SET_CREDIT_ASSESSMENT_RESPONSE_TYPE = BaseAction<\n  typeof SET_CREDIT_ASSESSMENT_RESPONSE\n> & {\n  caseId?: string;\n  creditAssessmentResponse?: ICreditAssessmentStatus;\n};\nexport const setCreditAssessmentResponse =\n  (caseId?: string, creditAssessmentResponse?: ICreditAssessmentStatus) => (dispatch: Dispatch) =>\n    dispatch({ type: SET_CREDIT_ASSESSMENT_RESPONSE, caseId, creditAssessmentResponse });\n\nexport const SET_STATE = 'SET_STATE';\nexport type SET_STATE_TYPE = BaseAction<typeof SET_STATE> & {\n  state: ReducerState;\n};\nexport const setState = (state: ReducerState) => (dispatch: Dispatch) =>\n  dispatch({ type: SET_STATE, state });\n\nexport type Action =\n  | RESET_TYPE\n  | SET_ORDER_TYPE\n  | SET_ID_TYPE\n  | SET_CONTACT_EMAIL_AND_PHONE_TYPE\n  | SET_SOCIAL_ID_AND_ADDRESS_TYPE\n  | SET_ADDRESS_TYPE\n  | SET_HOME_DELIVERY_TYPE\n  | SET_DEALER_TYPE\n  | INIT_TRADE_IN_TYPE\n  | SET_TRADE_IN_TYPE\n  | SET_FINANCIAL_TYPE\n  | SET_PAYMENT_LOOKUP_RESPONSE_TYPE\n  | RESET_PAYMENT_LOOKUP_RESPONSE_TYPE\n  | SET_DRIVING_DISTANCE_TYPE\n  | SET_OR_REMOVE_INSURANCE_ADDONS_TYPE\n  | SET_OR_REMOVE_INSURANCE_TYPE\n  | SET_OR_REMOVE_FREE_INSURANCE_TYPE\n  | SET_OR_REMOVE_ACCESSORY_TYPE\n  | GO_TO_TYPE\n  | SET_STAGES_TYPE\n  | COMPLETE_STAGE_TYPE\n  | SET_CREATED_ORDER_ID_TYPE\n  | SET_CREDIT_ASSESSMENT_RESPONSE_TYPE\n  | SET_STATE_TYPE;\n", "import { createStore as createReduxStore, Store } from 'redux';\nimport { Action } from './action';\n\nimport reducers, { ReducerState } from './reducer';\n\nexport type WaykeStore = Store<ReducerState, Action>;\nexport const createStore = () => createReduxStore(reducers);\n", "import {\n  DrivingDistance,\n  IAddress,\n  IAvailableInsuranceOption,\n  IInsuranceOption,\n  IVehicle,\n  PaymentType,\n} from '@wayke-se/ecom';\nimport { IAccessory, IOrderVehicle } from '@wayke-se/ecom/dist-types/orders/types';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { Customer } from '../@types/Customer';\nimport { Insurance } from '../@types/Insurance';\nimport { Navigation } from '../@types/Navigation';\nimport { OrderOptions, PaymentOption } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { StageTypes } from '../@types/Stages';\nimport { TradeInCarDataPartial } from '../@types/TradeIn';\nimport { isSame } from '../Utils/compare';\nimport {\n  Action,\n  COMPLETE_STAGE,\n  GO_TO,\n  INIT_TRADE_IN,\n  RESET,\n  RESET_PAYMENT_LOOKUP_RESPONSE,\n  SET_ADDRESS,\n  SET_CONTACT_EMAIL_AND_PHONE,\n  SET_CREATED_ORDER_ID,\n  SET_CREDIT_ASSESSMENT_RESPONSE,\n  SET_DEALER,\n  SET_DRIVING_DISTANCE,\n  SET_FINANCIAL,\n  SET_HOME_DELIVERY,\n  SET_ID,\n  SET_OR_REMOVE_ACCESSORY,\n  SET_OR_REMOVE_FREE_INSURANCE,\n  SET_OR_REMOVE_INSURANCE,\n  SET_OR_REMOVE_INSURANCE_ADDONS,\n  SET_ORDER,\n  SET_PAYMENT_LOOKUP_RESPONSE,\n  SET_SOCIAL_ID_AND_ADDRESS,\n  SET_STAGES,\n  SET_STATE,\n  SET_TRADE_IN,\n} from './action';\n\nlet mock = {};\ntry {\n  //mock = require('../../statemock.json');\n} catch (_e) {\n  mock = {};\n}\n\nexport interface ReducerState {\n  id: string;\n  topNavigation: Navigation;\n  navigation: Navigation;\n  vehicle?: IOrderVehicle;\n  order?: OrderOptions;\n  customer: Customer;\n  address?: IAddress;\n  homeDelivery: boolean;\n  wantTradeIn?: boolean;\n  tradeIn?: TradeInCarDataPartial;\n  tradeInVehicle?: IVehicle;\n  paymentType?: PaymentType;\n  paymentLookupResponse?: PaymentLookup;\n  stages?: StageTypes[];\n  accessories: IAccessory[];\n  drivingDistance: DrivingDistance;\n  insurance?: IInsuranceOption;\n  insuranceAddOns?: Insurance;\n  freeInsurance?: IAvailableInsuranceOption;\n  createdOrderId?: string | null;\n  creditAssessmentResponse?: ICreditAssessmentStatus;\n  caseId?: string;\n  dealer?: string;\n  payment?: { type: string; url: string };\n  stateLoadedFromSession?: boolean;\n}\n\nconst initNavigation: Navigation = {\n  view: 'preview',\n  stage: 1,\n  subStage: 1,\n};\n\nconst initialState: ReducerState = {\n  id: '',\n  topNavigation: {\n    ...initNavigation,\n  },\n  navigation: {\n    ...initNavigation,\n  },\n  customer: {\n    email: '',\n    phone: '',\n    givenName: '',\n    surname: '',\n    socialId: '',\n  },\n  homeDelivery: false,\n  accessories: [],\n  drivingDistance: DrivingDistance.Between0And1000,\n  ...mock,\n};\n\nconst getNextNavigationState = (currentStage: number, lastStage: boolean): Navigation =>\n  lastStage\n    ? { view: 'summary', stage: 1, subStage: 1 }\n    : { view: 'main', stage: currentStage + 1, subStage: 1 };\n\nconst getNextTopNavigationState = (currentTopNavigation: Navigation, nextNavigation: Navigation) =>\n  nextNavigation.view === 'main'\n    ? currentTopNavigation.stage < nextNavigation.stage\n      ? nextNavigation\n      : next.topNavigation\n    : { ...currentTopNavigation, stage: currentTopNavigation.stage + 1 }; // all stages are completed\n\nconst resolveDefaultPaymentOption = (paymentOptions?: PaymentOption[]) => {\n  if (!paymentOptions) return undefined;\n  // If only cash payment is available, pre select\n  const paymentType =\n    paymentOptions?.length === 1 && paymentOptions?.[0].type === PaymentType.Cash\n      ? PaymentType.Cash\n      : undefined;\n  return paymentType;\n};\n\nlet next: ReducerState;\nlet index: number;\nconst reducer = (state = initialState, action: Action): ReducerState => {\n  let navigation: Navigation;\n  let topNavigation: Navigation;\n  next = { ...state };\n\n  switch (action.type) {\n    case RESET:\n      return { ...initialState, id: action.id };\n    case SET_STAGES:\n      return { ...next, stages: action.stages };\n    case SET_ID:\n      return { ...next, id: action.id };\n    case SET_ORDER:\n      return {\n        ...state,\n        order: action.order,\n        paymentType: resolveDefaultPaymentOption(action.order?.paymentOptions),\n        vehicle: { ...action.order.orderVehicle, ...(action.vehicle || {}) },\n      };\n    case SET_CONTACT_EMAIL_AND_PHONE:\n      const clean: ReducerState = {\n        ...next,\n        customer: { ...state.customer, email: action.value.email, phone: action.value.phone },\n        navigation: { view: 'main', stage: state.navigation.stage, subStage: 2 },\n      };\n\n      delete clean.wantTradeIn;\n      delete clean.tradeIn;\n      delete clean.tradeInVehicle;\n      clean.paymentType = resolveDefaultPaymentOption(state.order?.paymentOptions);\n      delete clean.paymentLookupResponse;\n      delete clean.insurance;\n      delete clean.insuranceAddOns;\n      delete clean.freeInsurance;\n      delete clean.dealer;\n      clean.accessories = [];\n\n      return clean;\n    case SET_SOCIAL_ID_AND_ADDRESS:\n      navigation = getNextNavigationState(next.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        address: action.address,\n        customer: { ...state.customer, socialId: action.socialId },\n      };\n\n      return next;\n    case SET_ADDRESS:\n      navigation = getNextNavigationState(next.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        address: action.address,\n        customer: { ...state.customer },\n      };\n\n      return next;\n\n    case SET_DEALER:\n      navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n      topNavigation = { ...navigation }; // reset current stage\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        dealer: action.dealer,\n      };\n\n      delete next.wantTradeIn;\n      delete next.tradeIn;\n      delete next.tradeInVehicle;\n      next.paymentType = resolveDefaultPaymentOption(state.order?.paymentOptions);\n      delete next.paymentLookupResponse;\n      delete next.insurance;\n      delete next.insuranceAddOns;\n      delete next.freeInsurance;\n      next.accessories = [];\n\n      return next;\n\n    case SET_HOME_DELIVERY:\n      navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        homeDelivery: action.homeDelivery,\n      };\n\n      return next;\n\n    case INIT_TRADE_IN:\n      navigation = { view: 'main', stage: state.navigation.stage, subStage: 1 };\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n      next = {\n        ...state,\n        navigation,\n        wantTradeIn: true,\n        topNavigation,\n        tradeIn: state.tradeIn || {\n          registrationNumber: '',\n          mileage: '',\n          description: '',\n        },\n      };\n      return next;\n\n    case SET_TRADE_IN:\n      navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        wantTradeIn: !!action.tradeIn,\n        tradeIn: action.tradeIn,\n        tradeInVehicle: action.tradeInVehicle,\n      };\n\n      return next;\n\n    case SET_FINANCIAL:\n      navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n      return {\n        ...next,\n        navigation,\n        topNavigation,\n        paymentType: action.paymentType,\n      };\n\n    case RESET_PAYMENT_LOOKUP_RESPONSE:\n      return { ...next, paymentLookupResponse: undefined };\n\n    case SET_PAYMENT_LOOKUP_RESPONSE:\n      return { ...next, paymentLookupResponse: action.paymentLookupResponse };\n\n    case SET_DRIVING_DISTANCE:\n      return { ...next, drivingDistance: action.drivingDistance };\n\n    case COMPLETE_STAGE:\n      navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n      };\n\n      return next;\n\n    case SET_OR_REMOVE_INSURANCE_ADDONS:\n      next.insurance = action.insurance;\n      next.insuranceAddOns = {\n        insurance: action.insurance.name,\n        addOns: action.insuranceAddons,\n      };\n      return next;\n\n    case SET_OR_REMOVE_INSURANCE:\n      if (!isSame(next.insurance, action.insurance)) {\n        next.insurance = action.insurance;\n      } else {\n        next.insurance = undefined;\n      }\n\n      if (next.insuranceAddOns?.insurance) {\n        next.insuranceAddOns = undefined;\n      }\n\n      return next;\n\n    case SET_OR_REMOVE_FREE_INSURANCE:\n      if (!isSame(next.freeInsurance, action.freeInsurance)) {\n        next.freeInsurance = action.freeInsurance;\n      } else {\n        next.freeInsurance = undefined;\n      }\n\n      return next;\n\n    case SET_OR_REMOVE_ACCESSORY:\n      index = next.accessories.findIndex((accessory) => accessory.id === action.accessory.id);\n      next.accessories = [...next.accessories];\n\n      if (index > -1) {\n        next.accessories.splice(index, 1);\n      } else {\n        next.accessories.push(action.accessory);\n      }\n\n      return { ...next, accessories: [...next.accessories] };\n\n    case GO_TO:\n      return {\n        ...state,\n        navigation: { view: action.view, stage: action.index || 1, subStage: action.subStage || 1 },\n      };\n\n    case SET_CREATED_ORDER_ID:\n      if (action.payment) {\n        navigation = { view: 'main', stage: state.navigation.stage, subStage: 2 };\n      } else {\n        navigation = getNextNavigationState(state.navigation.stage, true);\n      }\n      topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n      next = {\n        ...state,\n        navigation,\n        topNavigation,\n        createdOrderId: action.id,\n        payment: action.payment,\n      };\n\n      return next;\n\n    case SET_CREDIT_ASSESSMENT_RESPONSE:\n      return {\n        ...next,\n        caseId: action.caseId,\n        creditAssessmentResponse: action.creditAssessmentResponse,\n      };\n\n    case SET_STATE:\n      return { ...action.state };\n    default:\n      return state;\n  }\n};\n\nexport type RootState = ReturnType<typeof reducer>;\n\nexport default reducer;\n", "export const isSame = (a: any, b: any) =>\n  a !== undefined && b !== undefined\n    ? JSON.stringify(a).localeCompare(JSON.stringify(b)) === 0\n    : a === b;\n", "import { get as getValue } from 'object-path';\nimport { ReducerState } from './reducer';\n\nimport { WaykeStore } from './store';\n\nconst defaultCompare = (a: any, b: any) => {\n  return a === b;\n};\n\nconst reduxWatch = <T>(\n  getState: () => ReducerState,\n  objectPath: FieldPath,\n  compare?: (a: any, b: any) => boolean\n) => {\n  const selectedCompare = compare || defaultCompare;\n  let currentValue = getValue(getState(), objectPath);\n\n  return (fn: (newValue: T, oldValue: T, pathToField: FieldPath) => void) => {\n    return () => {\n      const newValue = getValue(getState(), objectPath);\n      if (!selectedCompare(currentValue, newValue)) {\n        const oldValue = currentValue;\n        currentValue = newValue;\n        fn(newValue, oldValue, objectPath);\n      }\n    };\n  };\n};\n\nconst subscriptions: (() => void)[] = [];\n\nconst registerSubsription = (s: () => void) => {\n  subscriptions.push(s);\n  return s;\n};\n\nexport const unregisterAllSubscriptions = () => subscriptions.forEach((s) => s());\n\ntype FieldPath = string | number | Array<string | number>;\n\nconst watch = <T>(\n  store: WaykeStore,\n  path: FieldPath,\n  callback: (newValue: T, oldValue: T, pathToField: FieldPath) => void,\n  doNotRegister?: boolean\n) => {\n  const w = reduxWatch<T>(store.getState, path);\n  if (doNotRegister) {\n    store.subscribe(w(callback));\n  } else {\n    return registerSubsription(store.subscribe(w(callback)));\n  }\n};\n\nexport default watch;\n", "export enum EcomEvent {\n  START = 'START',\n  CLOSE = 'CLOSE',\n  CONFIRM_CLOSE_ACTIVE = 'CONFIRM_CLOSE_ACTIVE',\n  CONFIRM_CLOSE_CONFIRMED = 'CONFIRM_CLOSE_CONFIRMED',\n  CONFIRM_CLOSE_ABORTED = 'CONFIRM_CLOSE_ABORTED',\n\n  PREVIEW_PROCEED = 'PREVIEW_PROCEED',\n\n  CENTRAL_STORAGE_ACTIVE = 'CENTRAL_STORAGE_ACTIVE',\n  CENTRAL_STORAGE_EDIT = 'CENTRAL_STORAGE_EDIT',\n  CENTRAL_STORAGE_SELECTED = 'CENTRAL_STORAGE_SELECTED',\n  CENTRAL_STORAGE_SET = 'CENTRAL_STORAGE_SET',\n\n  CUSTOMER_ACTIVE = 'CUSTOMER_ACTIVE',\n  CUSTOMER_EDIT = 'CUSTOMER_EDIT',\n  CUSTOMER_EMAIL_AND_PHONE_SET = 'CUSTOMER_EMAIL_AND_PHONE_SET',\n  CUSTOMER_ADDRESS_BY_SSN_REQUESTED = 'CUSTOMER_ADDRESS_BY_SSN_REQUESTED',\n  CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED = 'CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED',\n  CUSTOMER_ADDRESS_BY_SSN_FAILED = 'CUSTOMER_ADDRESS_BY_SSN_FAILED',\n  CUSTOMER_ADDRESS_SET = 'CUSTOMER_ADDRESS_SET',\n  CUSTOMER_ADDRESS_EDIT = 'CUSTOMER_ADDRESS_EDIT',\n\n  FINANCIAL_INFORMATION_TOGGLE = 'FINANCIAL_INFORMATION_TOGGLE',\n  FINANCIAL_ACTIVE = 'FINANCIAL_ACTIVE',\n  FINANCIAL_EDIT = 'FINANCIAL_EDIT',\n  FINANCIAL_CASH_SELECTED = 'FINANCIAL_CASH_SELECTED',\n  FINANCIAL_LOAN_SELECTED = 'FINANCIAL_LOAN_SELECTED',\n  FINANCIAL_LEASE_SELECTED = 'FINANCIAL_LEASE_SELECTED',\n  FINANCIAL_CASH_SET = 'FINANCIAL_CASH_SET',\n  FINANCIAL_LEASE_SET = 'FINANCIAL_LEASE_SET',\n  FINANCIAL_LOAN_SET = 'FINANCIAL_LOAN_SET',\n  FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_HOUSEHOLD_COST_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_HOUSEHOLD_COST_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE',\n  FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE',\n  FINANCIAL_CREDIT_SCORING_ABORTED = 'FINANCIAL_CREDIT_SCORING_ABORTED',\n  FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED',\n  FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED',\n  FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED',\n  FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED',\n  FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED',\n  FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED',\n  FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED',\n  FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED',\n  FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED',\n  FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED',\n  FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED = 'FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED',\n  FINANCIAL_CREDIT_SCORING_SIGNING_SCORED = 'FINANCIAL_CREDIT_SCORING_SIGNING_SCORED',\n\n  TRADE_IN_ACTIVE = 'TRADE_IN_ACTIVE',\n  TRADE_IN_EDIT = 'TRADE_IN_EDIT',\n  TRADE_IN_SELECTED = 'TRADE_IN_SELECTED',\n  TRADE_IN_SKIPPED = 'TRADE_IN_SKIPPED',\n  TRADE_IN_CONDITION_VERY_GOOD_SELECTED = 'TRADE_IN_CONDITION_VERY_GOOD_SELECTED',\n  TRADE_IN_CONDITION_GOOD_SELECTED = 'TRADE_IN_CONDITION_GOOD_SELECTED',\n  TRADE_IN_CONDITION_OK_SELECTED = 'TRADE_IN_CONDITION_OK_SELECTED',\n  TRADE_IN_VALUATION_REQUESTED = 'TRADE_IN_VALUATION_REQUESTED',\n  TRADE_IN_VALUATION_SUCCEEDED = 'TRADE_IN_VALUATION_SUCCEEDED',\n  TRADE_IN_VALUATION_FAILED = 'TRADE_IN_VALUATION_FAILED',\n  TRADE_IN_SET = 'TRADE_IN_SET',\n\n  INSURANCE_ACTIVE = 'INSURANCE_ACTIVE',\n  INSURANCE_EDIT = 'INSURANCE_EDIT',\n  INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED',\n  INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED',\n  INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED',\n  INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED',\n  INSURANCE_MILEAGE_OVER_2500_SELECTED = 'INSURANCE_MILEAGE_OVER_2500_SELECTED',\n  INSURANCE_EDIT_MILEAGE = 'INSURANCE_EDIT_MILEAGE',\n  INSURANCE_SKIPPED = 'INSURANCE_SKIPPED',\n  INSURANCE_SHOW = 'INSURANCE_SHOW',\n  INSURANCE_SET = 'INSURANCE_SET',\n  INSURANCE_SELECTED = 'INSURANCE_SELECTED',\n  INSURANCE_UNSELECTED = 'INSURANCE_UNSELECTED',\n  INSURANCE_ADDON_SELECTED = 'INSURANCE_ADDON_SELECTED',\n  INSURANCE_ADDON_UNSELECTED = 'INSURANCE_ADDON_UNSELECTED',\n  INSURANCE_GET_INSURANCES_REQUESTED = 'INSURANCE_GET_INSURANCES_REQUESTED',\n  INSURANCE_GET_INSURANCES_SUCCEEDED = 'INSURANCE_GET_INSURANCES_SUCCEEDED',\n  INSURANCE_GET_INSURANCES_FAILED = 'INSURANCE_GET_INSURANCES_FAILED',\n  INSURANCE_INFORMATION_TOGGLE = 'INSURANCE_INFORMATION_TOGGLE',\n  INSURANCE_ARROW = 'INSURANCE_ARROW',\n\n  DELIVERY_ACTIVE = 'DELIVERY_ACTIVE',\n  DELIVERY_EDIT = 'DELIVERY_EDIT',\n  DELIVERY_DEALER_SELECTED = 'DELIVERY_DEALER_SELECTED',\n  DELIVERY_HOME_SELECTED = 'DELIVERY_HOME_SELECTED',\n  DELIVERY_DEALER_SET = 'DELIVERY_DEALER_SET',\n  DELIVERY_HOME_SET = 'DELIVERY_HOME_SET',\n\n  ACCESSORY_ACTIVE = 'ACCESSORY_ACTIVE',\n  ACCESSORY_EDIT = 'ACCESSORY_EDIT',\n  ACCESSORY_EXPOSURE = 'ACCESSORY_EXPOSURE',\n  ACCESSORY_SKIPPED = 'ACCESSORY_SKIPPED',\n  ACCESSORY_SELECTED = 'ACCESSORY_SELECTED',\n  ACCESSORY_UNSELECTED = 'ACCESSORY_UNSELECTED',\n  ACCESSORY_INFORMATION_OPEN = 'ACCESSORY_INFORMATION_OPEN',\n  ACCESSORY_INFORMATION_CLOSE = 'ACCESSORY_INFORMATION_CLOSE',\n  ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING = 'ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING',\n  ACCESSORY_ARROWS = 'ACCESSORY_ARROWS',\n\n  CONFIRMATION_BANKID_ABORTED = 'CONFIRMATION_BANKID_ABORTED',\n  CONFIRMATION_BANKID_INIT_REQUESTED = 'CONFIRMATION_BANKID_INIT_REQUESTED',\n  CONFIRMATION_BANKID_INIT_SUCCEEDED = 'CONFIRMATION_BANKID_INIT_SUCCEEDED',\n  CONFIRMATION_BANKID_INIT_FAILED = 'CONFIRMATION_BANKID_INIT_FAILED',\n  CONFIRMATION_BANKID_STATUS_QR_REQUESTED = 'CONFIRMATION_BANKID_STATUS_QR_REQUESTED',\n  CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED',\n  CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18 = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18',\n  CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH',\n  CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED',\n  CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SHOULD_RENEW = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SHOULD_RENEW',\n  CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED',\n  CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18 = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18',\n  CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH',\n  CONFIRMATION_CREATE_ORDER_REQUESTED = 'CONFIRMATION_CREATE_ORDER_REQUESTED',\n  CONFIRMATION_CREATE_ORDER_SUCCEEDED = 'CONFIRMATION_CREATE_ORDER_SUCCEEDED',\n  CONFIRMATION_CREATE_ORDER_FAILED = 'CONFIRMATION_CREATE_ORDER_FAILED',\n  CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST',\n  CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED',\n  CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED',\n\n  SUMMARY_ACTIVE = 'SUMMARY_ACTIVE',\n}\n\nexport enum EcomStep {\n  CENTRAL_STORAGE = 'CENTRAL_STORAGE',\n\n  CUSTOMER_EMAIL_AND_PHONE = 'CUSTOMER_EMAIL_AND_PHONE',\n  CUSTOMER_ADDRESS = 'CUSTOMER_ADDRESS',\n\n  FINANCIAL = 'FINANCIAL',\n  FINANCIAL_CREDIT_SCORING = 'FINANCIAL_CREDIT_SCORING',\n\n  TRADE_IN = 'TRADE_IN',\n  TRADE_IN_DETAILS = 'TRADE_IN_DETAILS',\n\n  INSURANCE = 'INSURANCE',\n  INSURANCE_IF = 'INSURANCE_IF',\n\n  DELIVERY = 'DELIVERY',\n\n  ACCESSORY = 'ACCESSORY',\n\n  CONFIRMATION = 'CONFIRMATION',\n}\n\nexport enum EcomView {\n  PREVIEW = 'PREVIEW',\n  MAIN = 'MAIN',\n  SUMMARY = 'SUMMARY',\n}\n\ntype Listner = (\n  view: EcomView,\n  ecomEvent: EcomEvent,\n  currentStep?: EcomStep,\n  data?: { [key: string]: any }\n) => void;\n\nconst listners: Listner[] = [];\n\nexport const registerEventListner = (fn: Listner) => {\n  listners.push(fn);\n};\n\nexport const unregisterEventListner = (fn: Listner) => {\n  const index = listners.findIndex((f) => f === fn);\n  if (index > -1) {\n    listners.splice(index, 1);\n  }\n};\n\ninterface EventHistory {\n  view: EcomView;\n  ecomEvent: EcomEvent;\n  currentStep?: EcomStep;\n  data?: { [key: string]: any };\n}\n\nexport const eventHistory: EventHistory[] = [];\nexport const getLastHistory = () => eventHistory[eventHistory.length - 1];\nconst ecomEvent = (\n  view: EcomView,\n  ecomEvent: EcomEvent,\n  currentStep?: EcomStep,\n  data?: { [key: string]: any }\n) => {\n  eventHistory.push({ view, ecomEvent, currentStep });\n  listners.forEach((fn) => fn(view, ecomEvent, currentStep, data));\n};\n\nexport default ecomEvent;\n", "const intervals: { [key: string]: number | undefined } = {};\n\nexport const registerInterval = (key: string, interval: number) => {\n  intervals[key] = interval;\n};\n\nexport const unregisterAllIntervals = () => {\n  Object.keys(intervals).forEach((key) => {\n    clearInterval(intervals[key]);\n    delete intervals[key];\n  });\n};\n", "const setVw = () => {\n  const vw = document.documentElement.clientWidth / 100;\n  document.documentElement.style.setProperty('--waykeecom-vw', `${vw}px`);\n};\n\nexport const useVwListner = () => {\n  setVw();\n  window.addEventListener('resize', setVw);\n\n  return () => window.removeEventListener('resize', setVw);\n};\n", "type LoaderType = 'inline';\n\ninterface LoaderProps {\n  type?: LoaderType;\n}\n\nconst getType = (type?: LoaderType) => {\n  switch (type) {\n    case 'inline':\n      return 'waykeecom-loader--inline-block';\n    default:\n      return '';\n  }\n};\n\nconst Loader = (props?: LoaderProps) => {\n  const classList = ['waykeecom-loader'];\n  const classType = getType(props?.type);\n  if (classType) {\n    classList.push(classType);\n  }\n\n  return `\n  <div class=\"${classList.join(' ')}\" role=\"status\">\n    <div class=\"waykeecom-loader__spinner\" aria-hidden=\"true\"></div>\n    <div class=\"waykeecom-sr-only\">Laddar...</div>\n  </div>\n`;\n};\n\nexport default Loader;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass Button extends HtmlNode {\n  private readonly props: ButtonProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  isDisabled() {\n    return this.props.disabled;\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { title, id, disabled, loading, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`}\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n      >\n        <span class=\"waykeecom-button__content\">${title}</span>\n        ${\n          loading\n            ? `\n              <span class=\"waykeecom-button__content\">\n                ${Loader({ type: 'inline' })}\n              </span>`\n            : ''\n        }\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default Button;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAltProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAlt extends HtmlNode {\n  private readonly props: ButtonAltProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonAltProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  isDisabled() {\n    return this.props.disabled;\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { title, id, disabled, loading, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`}\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-alt\"\n      >\n        <span class=\"waykeecom-button__content\">${title}</span>\n        ${\n          loading\n            ? `\n              <span class=\"waykeecom-button__content\">\n                ${Loader({ type: 'inline' })}\n              </span>`\n            : ''\n        }\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonAlt;\n", "import i18next from '@i18n';\nimport Button from '../../Components/Button/Button';\nimport ButtonAlt from '../../Components/Button/ButtonAlt';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\n\nconst CONFIRM_CLOSE_NODE = 'confirm-close-node';\nconst ABORT_CLOSE_NODE = 'abort-close-node';\n\ninterface ConfirmCloseProps {\n  readonly onConfirmClose: () => void;\n  readonly onAbortClose: () => void;\n}\n\nclass ConfirmClose extends HtmlNode {\n  private readonly props: ConfirmCloseProps;\n  constructor(element: HTMLElement, props: ConfirmCloseProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  render() {\n    const { onConfirmClose, onAbortClose } = this.props;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-hstack waykeecom-hstack--spacing-2 waykeecom-hstack--align-center\">\n            <div class=\"waykeecom-hstack__item\" aria-hidden=\"true\">\n              <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--error\">\n                <svg\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  viewBox=\"0 0 16 16\"\n                  class=\"waykeecom-icon\"\n                  data-icon=\"Exclamation mark\"\n                >\n                  <path d=\"M7.1 9.6 6.7 2h2.7L9 9.6H7.1zM8 11c-.8 0-1.5.7-1.5 1.5S7.2 14 8 14s1.5-.7 1.5-1.5S8.8 11 8 11z\" />\n                </svg>\n              </div>\n            </div>\n            <div class=\"waykeecom-hstack__item\">\n              <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('confirmClose.heading')}</h3>\n            </div>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('confirmClose.message')}</p>\n          </div>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${ABORT_CLOSE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${CONFIRM_CLOSE_NODE}\"></div>\n      </div>\n    `;\n\n    new Button(this.node.querySelector<HTMLDivElement>(`#${ABORT_CLOSE_NODE}`), {\n      title: i18next.t('confirmClose.abortButton'),\n      onClick: () => onAbortClose(),\n    });\n\n    new ButtonAlt(this.node.querySelector<HTMLDivElement>(`#${CONFIRM_CLOSE_NODE}`), {\n      title: i18next.t('confirmClose.confirmButton'),\n      onClick: () => onConfirmClose(),\n    });\n  }\n}\n\nexport default ConfirmClose;\n", "export const toCdnMedia = (url: string, cdn?: string) => {\n  if (!cdn) return url;\n  const asUrl = new URL(url);\n  return `${cdn}${asUrl.pathname}`;\n};\n", "import { Vehicle } from '../@types/Vehicle';\n\nexport const removeSpaces = (value: string | number) => value.toString().replace(/\\s/g, '');\n\ninterface PrettyNumberSettings {\n  postfix?: string | number;\n  prefix?: string | number;\n  decimals?: number;\n}\n\nconst formatDecimals = (value: number, decimals: number) => {\n  if (!decimals) return value;\n  const upper = Math.pow(10, decimals);\n  return (Math.round(value * upper) / upper).toFixed(decimals);\n};\n\nexport const prettyNumber = (value: number | null | undefined, settings?: PrettyNumberSettings) => {\n  if (value === undefined || value === null) return '???';\n  const formattedValue = formatDecimals(\n    value,\n    settings?.decimals !== undefined ? settings.decimals : 0\n  );\n  return `${settings?.prefix ? `${settings.prefix}` : ''}${removeSpaces(formattedValue).replace(\n    /\\B(?=(\\d{3})+(?!\\d))/g,\n    ' '\n  )}${settings?.postfix ? ` ${settings.postfix}` : ''}`;\n};\n\nconst removeParts = (orginal: string, remove: string) => {\n  const orginalSplitt = orginal.split(' ');\n  const removeSplitted = remove.split(' ').map((x) => x.toLowerCase());\n  return orginalSplitt.filter((x) => !removeSplitted.includes(x.toLowerCase())).join(' ');\n};\n\nexport const formatShortDescription = (vehicle?: Vehicle) => {\n  if (!vehicle) return undefined;\n  return removeParts(vehicle.shortDescription || '', vehicle.title || '');\n};\n", "import { OrderOptions } from '../@types/OrderOptions';\nimport { Vehicle } from '../@types/Vehicle';\nimport { toCdnMedia } from '../Utils/cdn';\nimport { formatShortDescription, prettyNumber } from '../Utils/format';\n\ninterface ItemTileSmallProps {\n  vehicle?: Vehicle;\n  order?: OrderOptions;\n  cdnMedia?: string;\n}\n\nconst ItemTileSmall = ({ vehicle, order, cdnMedia }: ItemTileSmallProps) => {\n  const imageUrl = vehicle?.imageUrls?.[0];\n  const vehicleTitle = vehicle?.title;\n  const price = prettyNumber(vehicle?.price || NaN);\n\n  const sellerName = order?.contactInformation?.name;\n\n  return `\n  <div class=\"waykeecom-preview-card\">\n  ${\n    imageUrl\n      ? `\n    <div class=\"waykeecom-preview-card__media\">\n      <img src=\"${toCdnMedia(imageUrl, cdnMedia)}?spec=200x&format=webp\" alt=\"\" class=\"waykeecom-preview-card__image\" />\n    </div>\n    `\n      : ''\n  }\n    <dl class=\"waykeecom-preview-card__body\">\n      <dt class=\"waykeecom-sr-only\">S\u00E4ljare</dt>\n      <dd class=\"waykeecom-preview-card__seller\">${sellerName}</dd>\n      <dt class=\"waykeecom-sr-only\">Modell</dt>\n      <dd class=\"waykeecom-preview-card__heading\">\n        <span class=\"waykeecom-preview-card__title\">${vehicleTitle}</span> ${formatShortDescription(\n          vehicle\n        )}\n      </dd>\n      <dt class=\"waykeecom-sr-only\">Pris</dt>\n      <dd class=\"waykeecom-preview-card__price\">${price} kr</dd>\n    </dl>\n  </div>\n`;\n};\n\nexport default ItemTileSmall;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonArrowRightProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonArrowRight extends HtmlNode {\n  private readonly props: ButtonArrowRightProps;\n\n  constructor(element: HTMLElement | null, props: ButtonArrowRightProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  isDisabled() {\n    return this.props.disabled;\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { title, id, disabled, loading, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`}\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n      >\n        <span class=\"waykeecom-button__content\">${title}</span>\n        <span class=\"waykeecom-button__content\">\n          ${\n            loading\n              ? Loader({ type: 'inline' })\n              : `\n                <svg\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  viewBox=\"0 0 16 16\"\n                  class=\"waykeecom-icon\"\n                  data-icon=\"Arrow right\"\n                >\n                  <path d=\"m15.2 8.8-4.8 4.8-1.7-1.7 2.7-2.7H1.2C.5 9.2 0 8.7 0 8s.5-1.2 1.2-1.2h10.2L8.7 4.1l1.7-1.7 4.8 4.8.8.8-.8.8z\" />\n                </svg>`\n          }\n        </span>\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonArrowRight;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonSkipProps {\n  title: string;\n  id?: string;\n  onClick?: (e: Event) => void;\n}\n\nclass ButtonSkip extends HtmlNode {\n  private readonly props: ButtonSkipProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonSkipProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { title, id, onClick } = this.props;\n\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-clear\"\n      >\n      <span class=\"waykeecom-button__content\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"Skip\"\n          >\n            <path d=\"m14.5 7-4.7 4.7-1.4-1.4L10.6 8H6.5c-1.1 0-2 .9-2 2v2c0 .6-.4 1-1 1s-1-.4-1-1v-2c0-2.2 1.8-4 4-4h4.1L8.3 3.7l1.4-1.4L14.5 7z\" />\n          </svg>\n        </span>\n        <span class=\"waykeecom-button__content\">${title}</span>\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonSkip;\n", "export interface KeyValueListItemImage {\n  src: string;\n  srcSet?: string;\n  alt: string;\n}\nexport interface KeyValueListItemProps {\n  key: string | number;\n  value: string | number;\n  image?: KeyValueListItemImage;\n}\n\nconst KeyValueListItem = ({ key, value, image }: KeyValueListItemProps) => `\n  <li class=\"waykeecom-key-value-list__item\">\n    ${\n      image\n        ? `<div class=\"waykeecom-key-value-list__key\">\n            <img src=\"${image.src}\" ${image.srcSet ? `srcSet=\"${image.srcSet}\"` : ''} alt=\"${\n              image.alt\n            }\" class=\"waykeecom-key-value-list__key-image\" />\n            <div class=\"waykeecom-key-value-list__key-label\">${key}</div>\n          </div>`\n        : `<div class=\"waykeecom-key-value-list__key\">${key}</div>`\n    }\n    <div class=\"waykeecom-key-value-list__value\">${value}</div>\n  </li>\n`;\n\nexport default KeyValueListItem;\n", "import i18next from '@i18n';\nimport KeyValueListItem, { KeyValueListItemProps } from '../Templates/KeyValueListItem';\nimport HtmlNode from './Extension/HtmlNode';\n\ninterface StageCompletedProps {\n  keyValueList: KeyValueListItemProps[];\n  changeButtonTitle: string;\n  onEdit?: () => void;\n}\n\nclass StageCompleted extends HtmlNode {\n  private props;\n\n  constructor(element: HTMLDivElement, props: StageCompletedProps) {\n    super(element, { htmlTag: 'div' });\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { keyValueList, changeButtonTitle, onEdit } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--1\">\n        <ul class=\"waykeecom-key-value-list\">\n          ${keyValueList\n            .map((keyValue) =>\n              KeyValueListItem({\n                key: keyValue.key,\n                image: keyValue.image,\n                value: keyValue.value,\n              })\n            )\n            .join('')}\n        </ul>\n      </div>\n      ${\n        onEdit\n          ? `\n          <div class=\"waykeecom-stack waykeecom-stack--1\">\n            <div class=\"waykeecom-align waykeecom-align--end\">\n              <button type=\"button\" title=\"${changeButtonTitle}\" class=\"waykeecom-link\">${i18next.t('glossary.change')}</button>\n            </div>\n          </div>\n          `\n          : ''\n      }\n    `;\n\n    if (onEdit) {\n      this.node.querySelector('button')?.addEventListener('click', () => onEdit());\n    }\n  }\n}\n\nexport default StageCompleted;\n", "interface ListItemProps {\n  title: string;\n  active?: boolean;\n  completed?: boolean;\n  id: string;\n  index: number;\n}\n\nconst ListItem = (element: HTMLElement, props: ListItemProps) => {\n  const { title, active, completed, id } = props;\n  const existingListItem = document.getElementById(id);\n\n  const item = existingListItem ? existingListItem : document.createElement('li');\n  //item.setAttribute('aria-label', title);\n\n  if (!existingListItem) {\n    item.setAttribute('id', id);\n  }\n\n  const className = ['waykeecom-stepper__item'];\n  item.removeAttribute('aria-current');\n  item.removeAttribute('aria-disabled');\n\n  if (active) {\n    className.push('waykeecom-stepper__item--is-active');\n    item.setAttribute('aria-current', 'step');\n  } else if (completed) {\n    className.push('waykeecom-stepper__item--is-complete');\n  } else {\n    className.push('waykeecom-stepper__item--is-disabled');\n    item.setAttribute('aria-disabled', 'true');\n  }\n\n  item.className = className.join(' ');\n  item.innerHTML = `\n    <header class=\"waykeecom-stepper__header\">\n      <div class=\"waykeecom-stepper__icon\" aria-hidden=\"true\">\n        <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--success\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"Check\"\n          >\n            <path d=\"M12.3 3.3 6 9.6 3.7 7.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l3 3c.4.4 1 .4 1.4 0l7-7c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0z\"/>\n          </svg>\n        </div>\n      </div>\n      <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">\n        <span class=\"waykeecom-stepper__stage\">\n          Steg ${props.index} \u2013\n        </span>\n        ${title}\n        ${completed ? '<span class=\"waykeecom-sr-only\">(F\u00E4rdigst\u00E4llt)</span>' : ''}\n      </h3>\n    </header>\n    <div class=\"waykeecom-stepper__body\"></div>\n  `;\n\n  if (!existingListItem) {\n    element.appendChild(item);\n  }\n\n  const content = item.querySelector<HTMLDivElement>('.waykeecom-stepper__body');\n  if (!content) throw 'Err no element';\n  return content;\n};\n\nexport default ListItem;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ArrowProps {\n  direction: 'left' | 'right';\n  hide?: boolean;\n  onClick: () => void;\n}\n\nclass Arrow extends HtmlNode {\n  private props: ArrowProps;\n\n  constructor(element: HTMLElement | null, props: ArrowProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  hide(hide: boolean) {\n    if (this.props.hide !== hide) {\n      this.props.hide = hide;\n      this.render();\n    }\n  }\n\n  private render() {\n    if (this.props.hide) {\n      this.node.innerHTML = '';\n      return;\n    }\n\n    const { title, dataIcon, path } =\n      this.props.direction === 'left'\n        ? {\n            title: i18next.t('glossary.showPrevious'),\n            dataIcon: 'Chevron left',\n            path: '<path d=\"m5.4 7 5.2-5 1 1-5.2 5 5.2 5-1.1 1-5.2-5-1-1 1.1-1z\" />',\n          }\n        : {\n            title: i18next.t('glossary.showNext'),\n            dataIcon: 'Chevron right',\n            path: '<path d=\"m10.5 9-5.2 5-1-1 5.2-5-5.2-5 1.1-1 5.2 5 1 1-1.1 1z\" />',\n          };\n\n    this.node.innerHTML = `\n      <button type=\"button\" title=\"${title}\" class=\"waykeecom-icon-button\">\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 16 16\"\n          class=\"waykeecom-icon\"\n          data-icon=\"${dataIcon}\"\n        >\n          ${path}\n        </svg>\n      </button>\n    `;\n\n    this.node\n      .querySelector<HTMLUListElement>(`button`)\n      ?.addEventListener('click', () => this.props.onClick());\n  }\n}\n\nexport default Arrow;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport Arrow from './Arrow';\n\nconst getRightVariables = (ref: HTMLUListElement | undefined | null) => {\n  const itemWidth = ref?.children?.[0]?.clientWidth || 0;\n  const scrollWidth = ref?.scrollWidth || 0;\n  const scrollLeft = ref?.scrollLeft || 0;\n  const overflowElementWidth = ref?.offsetWidth || 0;\n  const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n  return {\n    itemWidth,\n    scrollWidth,\n    scrollLeft,\n    overflowElementWidth,\n    overflowElementScrollWidth,\n  };\n};\ninterface OverflowGridListProps {\n  id: string;\n  onClick?: () => void;\n}\n\nclass OverflowGridList extends HtmlNode {\n  private readonly props: OverflowGridListProps;\n  overflowElement?: HTMLUListElement | null;\n  private timeout?: NodeJS.Timeout;\n  private contexts: {\n    left?: Arrow;\n    right?: Arrow;\n  } = {};\n\n  constructor(element: HTMLElement, props: OverflowGridListProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-overflow-grid' });\n    this.props = props;\n    this.render();\n  }\n\n  onPrev() {\n    if (this.props.onClick) {\n      this.props.onClick();\n    }\n    const listRef = this.overflowElement;\n    if (listRef) {\n      const itemWidth = listRef.children?.[0]?.clientWidth || 0;\n      const scrollLeft = listRef.scrollLeft || 0;\n      if (scrollLeft > 0) {\n        this.contexts.right?.hide(false);\n        const left = scrollLeft - itemWidth;\n        listRef.scroll({\n          left,\n          behavior: 'smooth',\n        });\n        if (left <= 0) {\n          this.contexts.left?.hide(true);\n        }\n      }\n    }\n  }\n\n  onNext() {\n    if (this.props.onClick) {\n      this.props.onClick();\n    }\n    const listRef = this.overflowElement;\n    if (listRef) {\n      const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(listRef);\n      if (overflowElementScrollWidth !== scrollLeft) {\n        this.contexts.left?.hide(false);\n        const left = scrollLeft + itemWidth;\n        listRef.scroll({\n          left,\n          behavior: 'smooth',\n        });\n        if (left >= overflowElementScrollWidth) {\n          this.contexts.right?.hide(true);\n        }\n      }\n    }\n  }\n\n  scrollHandler() {\n    clearTimeout(this.timeout as unknown as number);\n    this.timeout = setTimeout(() => {\n      const listRef = this.overflowElement;\n      if (listRef) {\n        const scrollWidth = listRef.scrollWidth || 0;\n        if (scrollWidth <= listRef.offsetWidth) return;\n\n        const scrollLeft = listRef.scrollLeft || 0;\n        this.contexts.left?.hide(scrollLeft <= 0);\n\n        const overflowElementWidth = listRef.offsetWidth || 0;\n        const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n        this.contexts.right?.hide(overflowElementScrollWidth === scrollLeft);\n      }\n    }, 50);\n  }\n\n  render() {\n    const PREV_ID = `${this.props.id}-prev`;\n    const NEXT_ID = `${this.props.id}-next`;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-overflow-grid__nav waykeecom-overflow-grid__nav--prev\" id=\"${PREV_ID}\"></div>\n      <div class=\"waykeecom-overflow-grid__nav waykeecom-overflow-grid__nav--next\" id=\"${NEXT_ID}\"></div>\n      <div class=\"waykeecom-overflow-grid__list-wrapper\">\n        <ul class=\"waykeecom-overflow-grid__list\" id=\"${this.props.id}\"></ul>\n      </div>\n    `;\n\n    this.overflowElement =\n      this.node.querySelector<HTMLUListElement>(`#${this.props.id}`) || undefined;\n    this.overflowElement?.addEventListener('scroll', () => this.scrollHandler());\n\n    this.contexts.left = new Arrow(this.node.querySelector<HTMLUListElement>(`#${PREV_ID}`), {\n      direction: 'left',\n      hide: true,\n      onClick: () => this.onPrev(),\n    });\n\n    this.contexts.right = new Arrow(this.node.querySelector<HTMLUListElement>(`#${NEXT_ID}`), {\n      direction: 'right',\n      hide: true,\n      onClick: () => this.onNext(),\n    });\n\n    setTimeout(() => {\n      const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(\n        this.overflowElement\n      );\n      const left = scrollLeft + itemWidth;\n      const rightHide =\n        overflowElementScrollWidth === scrollLeft && left >= overflowElementScrollWidth;\n      this.contexts.right?.hide(rightHide);\n    }, 50);\n  }\n}\n\nexport default OverflowGridList;\n", "import i18next from '@i18n';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAddRemoveProps {\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly selected?: boolean;\n  readonly fullSize?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAddRemove extends HtmlNode {\n  private readonly props: ButtonAddRemoveProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonAddRemoveProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  isDisabled() {\n    return this.props.disabled;\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { id, disabled, loading, selected, fullSize, onClick } = this.props;\n\n    const title = selected ? i18next.t('glossary.chosen') : i18next.t('glossary.add');\n\n    const buttonClassName = [\n      'waykeecom-button',\n      fullSize ? 'waykeecom-button--full-width' : 'waykeecom-button--size-small',\n    ];\n    if (selected) {\n      buttonClassName.push('waykeecom-button--success');\n    } else {\n      buttonClassName.push('waykeecom-button--action-alt');\n    }\n\n    const selectedIcon = selected\n      ? '<path d=\"M12.3 3.3 6 9.6 3.7 7.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l3 3c.4.4 1 .4 1.4 0l7-7c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0z\"/>'\n      : '<path d=\"M14 7v2H9v5H7V9H2V7h5V2h2v5h5z\" />';\n\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`} \n        class=\"${buttonClassName.join(' ')}\"\n      >\n        <span class=\"waykeecom-button__content\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"${selected ? 'Check' : 'Plus'}\"\n          >\n            ${selectedIcon}\n          </svg>\n        </span>\n        <span class=\"waykeecom-button__content\">${title}</span>\n        ${\n          loading\n            ? `<span class=\"waykeecom-button__content\">${Loader({ type: 'inline' })}</div>`\n            : ''\n        }\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonAddRemove;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAsLinkProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAsLink extends HtmlNode {\n  private readonly props: ButtonAsLinkProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonAsLinkProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  disabled(disable: boolean) {\n    this.props.disabled = !disable;\n    this.render();\n  }\n\n  render() {\n    const { title, id, disabled, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        class=\"waykeecom-link\"\n        ${disabled ? `disabled=\"\"` : ''}\n      >\n        ${title}\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonAsLink;\n", "import i18next from '@i18n';\nimport ButtonAddRemove from '../Button/ButtonAddRemove';\nimport ButtonAsLink from '../Button/ButtonAsLink';\nimport HtmlNode from '../Extension/HtmlNode';\n\nconst BUTTON_ADD_REMOVE = 'button-add-remove';\nconst BUTTON_ADD_REMOVE_NODE = `${BUTTON_ADD_REMOVE}-node`;\n\nconst READ_MORE = 'read-more';\nconst READ_MORE_NODE = `${READ_MORE}-node`;\n\ninterface GridItemProps {\n  readonly id?: string;\n  readonly title: string;\n  readonly image?: string;\n  readonly logo?: string;\n  readonly price?: string;\n  readonly priceDetails?: { key: string; value: string }[];\n  readonly description?: string;\n  readonly selected?: boolean;\n  readonly onClick: () => void;\n  readonly onInfo?: () => void;\n  readonly inViewPort?: () => void;\n}\n\nclass GridItem extends HtmlNode {\n  private readonly props: GridItemProps;\n  private hasBeenInViewPort = false;\n\n  constructor(element: HTMLElement, props: GridItemProps, id: string) {\n    super(element, { htmlTag: 'li', className: 'waykeecom-overflow-grid__item', id });\n    this.props = props;\n    this.render();\n    this.attachInViewportTrigger();\n  }\n\n  private attachInViewportTrigger() {\n    if (this.props.inViewPort && !this.hasBeenInViewPort) {\n      const observer = new IntersectionObserver(\n        (changes) => {\n          if (!this.hasBeenInViewPort) {\n            for (const change of changes) {\n              if (change.intersectionRatio === 1) {\n                this.hasBeenInViewPort = true;\n                if (this.props.inViewPort) {\n                  this.props.inViewPort();\n                }\n              }\n            }\n          }\n        },\n        { threshold: [1] }\n      );\n      observer.observe(this.node);\n    }\n  }\n\n  render() {\n    const { id, title, image, logo, price, priceDetails, description, selected, onClick, onInfo } =\n      this.props;\n\n    const onInfoId = id && onInfo ? `${READ_MORE_NODE}-${id}` : undefined;\n    const addRemoveButtonNodeId = id ? `${BUTTON_ADD_REMOVE_NODE}-${id}` : undefined;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-tile\">\n        ${image ? `<img src=\"${image}\" alt=\"${title}\" class=\"waykeecom-tile__hero\" />` : ''}\n        <div class=\"waykeecom-tile__body\">\n          <div class=\"waykeecom-tile__header\">\n            <div class=\"waykeecom-tile__title\">${title}</div>\n            <div class=\"waykeecom-tile__image\">\n              <div class=\"waykeecom-logo\">\n                <img src=\"${logo}\" alt=\"\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n              </div>\n            </div>\n          </div>\n          ${price ? `<div class=\"waykeecom-tile__price\">${price}</div>` : ''}\n          ${\n            priceDetails?.length\n              ? `<div class=\"waykeecom-tile__price-disclaimer\">+ ${priceDetails\n                  .map((d) => `${d.key} (${d.value})`)\n                  .join(', ')}</div>`\n              : ''\n          }\n          <div class=\"waykeecom-tile__description\">\n            ${description || ''}\n          </div>\n          ${\n            onInfoId\n              ? `\n                <div class=\"waykeecom-tile__read-more\" id=\"${onInfoId}\"></div>`\n              : ''\n          }\n        </div>\n        <div class=\"waykeecom-tile__footer\" id=\"${addRemoveButtonNodeId}\"></div>\n      </div>\n    `;\n\n    if (onInfo) {\n      new ButtonAsLink(this.node.querySelector(`#${onInfoId}`), {\n        title: i18next.t('glossary.readMore'),\n        onClick: () => onInfo(),\n      });\n    }\n\n    new ButtonAddRemove(this.node.querySelector(`#${addRemoveButtonNodeId}`), {\n      selected,\n      onClick: () => onClick(),\n    });\n  }\n}\n\nexport default GridItem;\n", "export const createPortal = () => {\n  destroyPortal();\n  const el = document.getElementById('wayke-ecom-modal-body');\n  if (el) {\n    (el.firstElementChild as HTMLDivElement).setAttribute('hidden', '');\n  }\n  const element = document.createElement('div');\n  element.className = 'waykeecom-portal';\n  el?.appendChild(element);\n  return element;\n};\n\nexport const destroyPortal = () => {\n  const el = document.getElementById('wayke-ecom-modal-body');\n  if (el) {\n    (el.firstElementChild as HTMLDivElement).removeAttribute('hidden');\n  }\n  el?.childNodes.forEach((node, index) => {\n    if (index > 0) {\n      node.remove();\n    }\n  });\n};\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAsLinkArrowLeftProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAsLinkArrowLeft extends HtmlNode {\n  private readonly props: ButtonAsLinkArrowLeftProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonAsLinkArrowLeftProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  disabled(disable: boolean) {\n    this.props.disabled = !disable;\n    this.render();\n  }\n\n  render() {\n    const { title, id, disabled, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        class=\"waykeecom-link waykeecom-link--has-content\"\n        ${disabled && `disabled=\"\"`}\n      >\n        <span class=\"waykeecom-link__content\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"Arrow left\"\n          >\n            <path d=\"m.8 7.2 4.8-4.8 1.7 1.7-2.7 2.7h10.2c.7 0 1.2.5 1.2 1.2s-.5 1.2-1.2 1.2H4.6l2.7 2.7-1.7 1.7L.8 8.8 0 8l.8-.8z\"/>\n          </svg>\n        </span>\n        <span class=\"waykeecom-link__content\">${title}</span>\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonAsLinkArrowLeft;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonClearProps {\n  readonly title: string;\n  readonly id?: string;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonClear extends HtmlNode {\n  private readonly props: ButtonClearProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonClearProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { title, id, onClick } = this.props;\n\n    this.node.innerHTML = `\n      <button type=\"button\" id=\"${id}\" title=\"${title}\" class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-clear\">\n        ${title}\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonClear;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ArrowProps {\n  direction: 'left' | 'right';\n  hide?: boolean;\n  onClick: () => void;\n}\n\nclass Arrow extends HtmlNode {\n  private props: ArrowProps;\n\n  constructor(element: HTMLElement | null, props: ArrowProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  hide(hide: boolean) {\n    if (this.props.hide !== hide) {\n      this.props.hide = hide;\n      this.render();\n    }\n  }\n\n  private render() {\n    if (this.props.hide) {\n      this.node.innerHTML = '';\n      return;\n    }\n\n    const { title, dataIcon, path } =\n      this.props.direction === 'left'\n        ? {\n            title: i18next.t('glossary.showPreviousImage'),\n            dataIcon: 'Chevron left',\n            path: '<path d=\"m5.4 7 5.2-5 1 1-5.2 5 5.2 5-1.1 1-5.2-5-1-1 1.1-1z\" />',\n          }\n        : {\n            title: i18next.t('glossary.showNextImage'),\n            dataIcon: 'Chevron right',\n            path: '<path d=\"m10.5 9-5.2 5-1-1 5.2-5-5.2-5 1.1-1 5.2 5 1 1-1.1 1z\" />',\n          };\n\n    this.node.innerHTML = `\n      <button type=\"button\" title=\"${title}\" class=\"waykeecom-icon-button\">\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 16 16\"\n          class=\"waykeecom-icon\"\n          data-icon=\"${dataIcon}\"\n        >\n          ${path}\n        </svg>\n      </button>\n    `;\n\n    this.node\n      .querySelector<HTMLUListElement>(`button`)\n      ?.addEventListener('click', () => this.props.onClick());\n  }\n}\n\nexport default Arrow;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport Arrow from './Arrow';\n\ninterface Media {\n  url: string;\n  alt: string;\n}\n\ninterface GalleryProps {\n  id: string;\n  media: Media[];\n  onGalleryImagePaging?: () => void;\n}\n\nconst getRightVariables = (ref: HTMLUListElement | undefined) => {\n  const itemWidth = ref?.children?.[0]?.clientWidth || 0;\n  const scrollWidth = ref?.scrollWidth || 0;\n  const scrollLeft = ref?.scrollLeft || 0;\n  const overflowElementWidth = ref?.offsetWidth || 0;\n  const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n  return {\n    itemWidth,\n    scrollWidth,\n    scrollLeft,\n    overflowElementWidth,\n    overflowElementScrollWidth,\n  };\n};\n\nclass Gallery extends HtmlNode {\n  private readonly props: GalleryProps;\n  private timeout?: NodeJS.Timeout;\n  private contexts: {\n    overflowElement?: HTMLUListElement;\n    left?: Arrow;\n    right?: Arrow;\n  } = {};\n\n  constructor(element: HTMLElement | null, props: GalleryProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-overflow-gallery' });\n    this.props = props;\n    this.render();\n  }\n\n  onPrev() {\n    const listRef = this.contexts.overflowElement;\n    if (listRef) {\n      const itemWidth = listRef?.clientWidth || 0;\n      const scrollLeft = listRef.scrollLeft || 0;\n      if (scrollLeft > 0) {\n        this.contexts.right?.hide(false);\n        const left = scrollLeft - itemWidth;\n        listRef.scroll({\n          left,\n          behavior: 'smooth',\n        });\n        if (left <= 0) {\n          this.contexts.left?.hide(true);\n        }\n        if (this.props.onGalleryImagePaging) {\n          this.props.onGalleryImagePaging();\n        }\n      }\n    }\n  }\n\n  onNext() {\n    const listRef = this.contexts.overflowElement;\n    if (listRef) {\n      const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(listRef);\n      if (overflowElementScrollWidth !== scrollLeft) {\n        this.contexts.left?.hide(false);\n        const left = scrollLeft + itemWidth;\n        listRef.scroll({\n          left,\n          behavior: 'smooth',\n        });\n        if (left >= overflowElementScrollWidth) {\n          this.contexts.right?.hide(true);\n        }\n        if (this.props.onGalleryImagePaging) {\n          this.props.onGalleryImagePaging();\n        }\n      }\n    }\n  }\n\n  scrollHandler() {\n    clearTimeout(this.timeout as unknown as number);\n    this.timeout = setTimeout(() => {\n      const listRef = this.contexts.overflowElement;\n      if (listRef) {\n        const scrollWidth = listRef.scrollWidth || 0;\n        if (scrollWidth <= listRef.offsetWidth) return;\n\n        const scrollLeft = listRef.scrollLeft || 0;\n        this.contexts.left?.hide(scrollLeft <= 0);\n\n        const overflowElementWidth = listRef.offsetWidth || 0;\n        const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n        this.contexts.right?.hide(overflowElementScrollWidth === scrollLeft);\n      }\n    }, 50);\n  }\n\n  render() {\n    const PREV_ID = `${this.props.id}-prev`;\n    const NEXT_ID = `${this.props.id}-next`;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-overflow-gallery__nav waykeecom-overflow-gallery__nav--prev\" id=\"${PREV_ID}\"></div>\n      <div class=\"waykeecom-overflow-gallery__nav waykeecom-overflow-gallery__nav--next\" id=\"${NEXT_ID}\"></div>\n      <ul class=\"waykeecom-overflow-gallery__list\" id=\"${this.props.id}\">\n      ${this.props.media\n        .map(\n          (m) => `\n            <li class=\"waykeecom-overflow-gallery__item\">\n              <img src=\"${m.url}\" alt=\"${m.alt}\" class=\"waykeecom-overflow-gallery__image\" />\n            </li>\n          `\n        )\n        .join('')}\n      </ul>\n    `;\n\n    this.contexts.overflowElement =\n      this.node.querySelector<HTMLUListElement>(`#${this.props.id}`) || undefined;\n    this.contexts.overflowElement?.addEventListener('scroll', () => this.scrollHandler());\n\n    this.contexts.left = new Arrow(this.node.querySelector<HTMLUListElement>(`#${PREV_ID}`), {\n      direction: 'left',\n      hide: true,\n      onClick: () => this.onPrev(),\n    });\n\n    this.contexts.right = new Arrow(this.node.querySelector<HTMLUListElement>(`#${NEXT_ID}`), {\n      direction: 'right',\n      hide: true,\n      onClick: () => this.onNext(),\n    });\n\n    setTimeout(() => {\n      const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(\n        this.contexts.overflowElement\n      );\n      const left = scrollLeft + itemWidth;\n      const rightHide =\n        overflowElementScrollWidth === scrollLeft && left >= overflowElementScrollWidth;\n      this.contexts.right?.hide(rightHide);\n    }, 50);\n  }\n}\n\nexport default Gallery;\n", "import { marked } from 'marked';\nimport sanitizeHtml from 'sanitize-html';\n\nexport const asHtml = (s?: string) =>\n  sanitizeHtml(marked.parse(s || '', { async: false }), {\n    allowedTags: [...sanitizeHtml.defaults.allowedTags, 'img'],\n    allowedAttributes: {\n      ...sanitizeHtml.defaults.allowedAttributes,\n      a: [...(sanitizeHtml.defaults.allowedAttributes.a || []), 'rel'],\n      img: ['src', 'srcset', 'alt', 'title', 'width', 'height', 'loading'],\n    },\n    selfClosing: [...sanitizeHtml.defaults.selfClosing, 'img'],\n    transformTags: {\n      a: sanitizeHtml.simpleTransform('a', { target: '_blank', rel: 'noopener noreferrer' }, true),\n    },\n  });\n", "import { WAYKE_ECOM_MODAL_ID } from '../App';\n\nexport const scrollTop = () => {\n  const elementScrollDesktop = document.getElementById(WAYKE_ECOM_MODAL_ID);\n  const elementScrollMobile = document.getElementById(`${WAYKE_ECOM_MODAL_ID}-dialog`);\n  if (elementScrollDesktop) {\n    elementScrollDesktop.scrollTop = 0;\n  }\n  if (elementScrollMobile) {\n    elementScrollMobile.scrollTop = 0;\n  }\n};\n", "import i18next from '@i18n';\nimport { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport ButtonAddRemove from '../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport Gallery from '../../../Components/Gallery/Gallery';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { asHtml } from '../../../Utils/parser';\nimport { scrollTop } from '../../../Utils/scroll';\n\nconst BUTTON_TOP_LEFT_NODE = 'accessory-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'accessory-button-bottom-left-node';\nconst BUTTON_ACCESSORY_ADD_REMOVE_NODE = 'accessory-add-remove-node';\nconst ACCESSORY_GALLERY_NODE = 'accessory-gallery-node';\n\ninterface AccessoryItemInfoProps {\n  readonly accessory: IAccessory;\n  readonly selected: boolean;\n  readonly onClick: () => void;\n  readonly onClose: () => void;\n}\n\nclass AccessoryItemInfo extends HtmlNode {\n  private readonly props: AccessoryItemInfoProps;\n\n  constructor(element: HTMLElement, props: AccessoryItemInfoProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  private onGalleryImagePaging() {\n    const { accessory } = this.props;\n    ecomEvent(\n      EcomView.MAIN,\n      EcomEvent.ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING,\n      EcomStep.ACCESSORY,\n      {\n        id: accessory.id,\n        label: accessory.name,\n      }\n    );\n  }\n\n  render() {\n    const { accessory, selected, onClick, onClose } = this.props;\n    const { name, media, logoUrl, price, shortDescription, longDescription, salePrice } = accessory;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n\n        <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n            <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${name}</h3>\n          </div>\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n            <div class=\"waykeecom-logo\">\n              <img src=\"${logoUrl}\" alt=\"${i18next.t('accessoryItemInfo.logoAlt')} ${name}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n            </div>\n          </div>\n        </div>\n\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCESSORY_GALLERY_NODE}\"></div>\n      \n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        ${\n          salePrice\n            ? `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(salePrice, {\n                postfix: 'kr',\n              })}<span class=\"waykeecom-text waykeecom-text--tone-alt waykeecom-text--line-through\"> (${prettyNumber(\n                price,\n                {\n                  postfix: 'kr',\n                }\n              )})</span></div>`\n            : `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(price, {\n                postfix: 'kr',\n              })}</div>`\n        }\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n          <p class=\"waykeecom-content__p\">${shortDescription}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${asHtml(longDescription)}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_ACCESSORY_ADD_REMOVE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n      </div>\n    `;\n\n    new Gallery(this.node.querySelector(`#${ACCESSORY_GALLERY_NODE}`), {\n      id: `gallery-${accessory.id}`,\n      media: media.map((m, i) => ({ url: m.url, alt: `Bild ${i + 1}` })),\n      onGalleryImagePaging: () => this.onGalleryImagePaging(),\n    });\n\n    new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n      title: i18next.t('accessoryItemInfo.backButton'),\n      onClick: () => onClose(),\n    });\n\n    new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n      title: i18next.t('accessoryItemInfo.backButton'),\n      onClick: () => onClose(),\n    });\n\n    new ButtonAddRemove(this.node.querySelector(`#${BUTTON_ACCESSORY_ADD_REMOVE_NODE}`), {\n      selected,\n      fullSize: true,\n      onClick: () => onClick(),\n    });\n\n    scrollTop();\n  }\n}\n\nexport default AccessoryItemInfo;\n", "import { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\n\nimport GridItem from '../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveAccessory } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport AccessoryItemInfo from './AccessoryItemInfo';\n\ninterface AccessoryItemProps {\n  readonly store: WaykeStore;\n  readonly accessory: IAccessory;\n  readonly key: string;\n}\n\nclass AccessoryItem extends HtmlNode {\n  private readonly props: AccessoryItemProps;\n  private displayInfo = false;\n  private exposureTracked = false;\n\n  constructor(element: HTMLElement, props: AccessoryItemProps) {\n    super(element);\n    this.props = props;\n\n    watch<IAccessory[]>(this.props.store, 'accessories', (newValue, oldValue) => {\n      if (\n        newValue.some((x) => x.id === this.props.accessory.id) !==\n        oldValue.some((x) => x.id === this.props.accessory.id)\n      ) {\n        this.render();\n      }\n    });\n\n    this.render();\n  }\n\n  private onInfoOpen() {\n    const { accessory } = this.props;\n    ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_INFORMATION_OPEN, EcomStep.ACCESSORY, {\n      id: accessory.id,\n      label: accessory.name,\n    });\n    this.displayInfo = true;\n    this.render();\n  }\n\n  private onInfoClose() {\n    const { accessory } = this.props;\n    ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_INFORMATION_CLOSE, EcomStep.ACCESSORY, {\n      id: accessory.id,\n      label: accessory.name,\n    });\n    this.displayInfo = false;\n    destroyPortal();\n    this.render();\n    this.node.parentElement?.scrollIntoView();\n  }\n\n  private onClick() {\n    const { store, accessory } = this.props;\n    const state = store.getState();\n    const selected =\n      state.accessories.findIndex((_accessory) => _accessory.id === accessory.id) > -1;\n    ecomEvent(\n      EcomView.MAIN,\n      !selected ? EcomEvent.ACCESSORY_SELECTED : EcomEvent.ACCESSORY_UNSELECTED,\n      EcomStep.ACCESSORY,\n      {\n        id: accessory.id,\n        label: accessory.name,\n      }\n    );\n\n    addOrRemoveAccessory(this.props.accessory)(this.props.store.dispatch);\n  }\n\n  private trackExposure() {\n    const { accessory } = this.props;\n    this.exposureTracked = true;\n    ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_EXPOSURE, EcomStep.ACCESSORY, {\n      id: accessory.id,\n      label: accessory.name,\n    });\n  }\n\n  render() {\n    const { store, accessory, key } = this.props;\n    const state = store.getState();\n    const selected =\n      state.accessories.findIndex((_accessory) => _accessory.id === accessory.id) > -1;\n\n    if (this.displayInfo) {\n      new AccessoryItemInfo(createPortal(), {\n        accessory,\n        selected,\n        onClick: () => {\n          this.onInfoClose();\n          this.onClick();\n        },\n        onClose: () => this.onInfoClose(),\n      });\n    }\n\n    new GridItem(\n      this.node,\n      {\n        id: accessory.id,\n        title: accessory.name,\n        description: accessory.shortDescription,\n        logo: accessory.logoUrl,\n        image: accessory.media?.[0]?.url,\n        price: prettyNumber(accessory.price, { postfix: 'kr' }),\n        selected,\n        onClick: () => this.onClick(),\n        onInfo: () => this.onInfoOpen(),\n        inViewPort: this.exposureTracked ? undefined : () => this.trackExposure(),\n      },\n      key\n    );\n  }\n}\n\nexport default AccessoryItem;\n", "import { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\n\nimport OverflowGridList from '../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport AccessoryItem from './AccessoryItem';\n\ninterface AccessoryListProps {\n  readonly store: WaykeStore;\n  readonly accessories: IAccessory[];\n}\n\nclass AccessoryList extends HtmlNode {\n  private readonly props: AccessoryListProps;\n\n  constructor(element: HTMLElement | null, props: AccessoryListProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  render() {\n    const { accessories, store } = this.props;\n    const listRef = new OverflowGridList(this.node, {\n      id: 'accessories-list',\n      onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_ARROWS, EcomStep.ACCESSORY),\n    });\n    const { overflowElement } = listRef;\n    if (overflowElement) {\n      overflowElement.innerHTML = '';\n      accessories.forEach(\n        (accessory, index) =>\n          new AccessoryItem(overflowElement, {\n            store,\n            accessory,\n            key: `accessory-${accessory.id}-${index}`,\n          })\n      );\n    }\n  }\n}\n\nexport default AccessoryList;\n", "import i18next from '@i18n';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { completeStage, goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport AccessoryList from './AccessoryList';\n\nconst PROCEED = 'button-accessories-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst SKIP = 'button-accessories-skip';\nconst SKIP_NODE = `${SKIP}-node`;\n\nconst ACCESSORY_GRID_LIST_NODE = 'accessory-grid-list-node';\n\ninterface AccessoriesProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n}\n\nclass Accessories extends HtmlNode {\n  private readonly props: AccessoriesProps;\n\n  constructor(element: HTMLElement, props: AccessoriesProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private onProceed() {\n    completeStage(this.props.lastStage)(this.props.store.dispatch);\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_EDIT, EcomStep.ACCESSORY);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, index } = this.props;\n    const state = store.getState();\n\n    const completed = state.topNavigation.stage > index;\n    const active = state.navigation.stage === index;\n    if (active) {\n      ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_ACTIVE, EcomStep.ACCESSORY);\n    }\n    const content = ListItem(this.node, {\n      completed,\n      title: i18next.t('accessories.title'),\n      active,\n      id: 'accessories',\n      index: index,\n    });\n\n    const part = document.createElement('div');\n\n    if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n      new StageCompleted(content, {\n        keyValueList: !!state.accessories.length\n          ? state.accessories.map((accessory) => ({\n              key: accessory.name,\n              image: accessory.media[0]\n                ? {\n                    src: `${accessory.media[0].url}?w=32&h=32`,\n                    srcSet: `${accessory.media[0].url}?w=64&h=64 2x`,\n                    alt: accessory.name,\n                  }\n                : undefined,\n              value: prettyNumber(accessory.price, { postfix: 'kr' }),\n            }))\n          : [\n              {\n                key: i18next.t('accessories.title'),\n                value: i18next.t('accessories.noSelected'),\n              },\n            ],\n        changeButtonTitle: i18next.t('accessories.changeButtonTitle'),\n        onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n      });\n    } else if (state.navigation.stage === index) {\n      const accessories = state.order?.accessories || [];\n\n      part.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('accessories.heading')}</h4>\n            <div class=\"waykeecom-content\">\n              <p class=\"waykeecom-content__p\">${i18next.t('accessories.description')}</p>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCESSORY_GRID_LIST_NODE}\"></div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_NODE}\"></div>\n      </div>\n      `;\n\n      new AccessoryList(part.querySelector<HTMLDivElement>(`#${ACCESSORY_GRID_LIST_NODE}`), {\n        store,\n        accessories,\n      });\n\n      new ButtonArrowRight(part.querySelector(`#${PROCEED_NODE}`), {\n        id: PROCEED,\n        title: i18next.t('accessories.proceedButton'),\n        onClick: () => this.onProceed(),\n      });\n\n      new ButtonSkip(part.querySelector<HTMLDivElement>(`#${SKIP_NODE}`), {\n        title: i18next.t('accessories.skipButton'),\n        onClick: () => this.onProceed(),\n      });\n    }\n\n    content.appendChild(part);\n    if (state.navigation.stage === index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default Accessories;\n", "import HtmlNode from '../Extension/HtmlNode';\n\nconst errorInputClassName = 'waykeecom-input-error';\n\ninterface InputErrorProps {\n  error?: boolean;\n  id?: string;\n  readonly errorMessage: string;\n}\n\nclass InputError extends HtmlNode {\n  private readonly props: InputErrorProps;\n\n  constructor(element: HTMLElement, props: InputErrorProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  setError(error: boolean) {\n    this.props.error = error;\n    this.render();\n  }\n\n  render() {\n    const { error, errorMessage } = this.props;\n    const errorNode = this.node.querySelector(`.${errorInputClassName}`);\n    if (errorNode) {\n      if (!error) {\n        errorNode.remove();\n      }\n    } else {\n      if (error) {\n        const errorElement = document.createElement('div');\n        errorElement.className = errorInputClassName;\n        errorElement.setAttribute('aria-live', 'assertive');\n        errorElement.innerHTML = errorMessage;\n        this.node.appendChild(errorElement);\n\n        if (this.props.id) {\n          errorElement.id = this.props.id;\n        }\n      }\n    }\n  }\n}\n\nexport default InputError;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\nconst helpClassName = 'waykeecom-input-label__help';\nconst foldoutClassName = 'waykeecom-input-label__foldout';\n\ninterface InputInformationProps {\n  readonly information?: string;\n  readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputInformation extends HtmlNode {\n  private readonly props: InputInformationProps;\n  private open: boolean = false;\n\n  constructor(element: HTMLElement | null | undefined, props: InputInformationProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  onClick() {\n    this.open = !this.open;\n    if (this.props.onClickInformation) {\n      this.props.onClickInformation(this.open);\n    }\n    this.render();\n  }\n\n  render() {\n    const { information } = this.props;\n    if (information) {\n      const existHelp = this.node.querySelector(`.${helpClassName}`);\n      const existFoldout = this.node.querySelector(`.${foldoutClassName}`);\n\n      const label = existHelp || document.createElement('div');\n      if (!existHelp) {\n        label.className = helpClassName;\n      }\n\n      if (this.open) {\n        label.innerHTML = `\n          <button class=\"waykeecom-input-label__help-btn\" title=\"${i18next.t('glossary.whatDoesThisMean')}\">\n            <span class=\"waykeecom-sr-only\">${i18next.t('glossary.closeHelp')}</span>\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              viewBox=\"0 0 16 16\"\n              class=\"waykeecom-icon\"\n              aria-hidden=\"true\"\n              data-icon=\"Close circle\"\n            >\n              <path d=\"M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm3.5-8.1L9.4 8l2.1 2.1-1.4 1.4L8 9.4l-2.1 2.1-1.4-1.4L6.6 8 4.5 5.9l1.4-1.4L8 6.6l2.1-2.1 1.4 1.4z\" />\n            </svg>\n          </button>\n        `;\n        const informationElement = document.createElement('div');\n        informationElement.className = foldoutClassName;\n        informationElement.innerHTML = information;\n        label.parentNode?.appendChild(informationElement);\n      } else {\n        existFoldout?.remove();\n        label.innerHTML = `\n          <button class=\"waykeecom-input-label__help-btn\" title=\"${i18next.t('glossary.whatDoesThisMean')}\">\n            <span class=\"waykeecom-sr-only\">${i18next.t('glossary.showHelp')}</span>\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              viewBox=\"0 0 16 16\"\n              class=\"waykeecom-icon\"\n              aria-hidden=\"true\"\n              data-icon=\"Questionmark circle\"\n            >\n              <path d=\"M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.4-3.8h1.9V12H6.6v-1.8zm3.8-3.4c0 1-.5 1.5-1.4 2l-.4.3c-.3.1-.3.2-.3.4v.1H6.7v-.3c0-.6.1-.9.8-1.3l.7-.4c.3-.2.6-.4.6-.8s-.3-.7-.7-.7c-.5 0-.8.3-.8.8v.3H5.7v-.4c0-1.2.8-2 2.3-2 1.5 0 2.4.7 2.4 2z\" />\n            </svg>\n          </button>\n        `;\n      }\n\n      label.querySelector('button')?.addEventListener('click', () => this.onClick());\n      if (!existHelp) {\n        this.node.appendChild(label);\n      }\n    }\n  }\n}\n\nexport default InputInformation;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface InputRadioFieldProps {\n  readonly title: string;\n  readonly value: string;\n  readonly name: string;\n  readonly description?: string;\n  readonly meta?: string;\n  readonly id: string;\n  readonly checked: boolean;\n  readonly disabled?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass InputRadioField extends HtmlNode {\n  private readonly props: InputRadioFieldProps;\n\n  constructor(element: HTMLDivElement | null, props: InputRadioFieldProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { id, title, value, name, checked, meta, description, disabled, onClick } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-selection\" role=\"radio\">\n        <input\n          type=\"radio\"\n          id=\"${id}\"\n          value=\"${value}\"\n          name=\"${name}\"\n          ${checked ? 'checked=\"true\"' : ''}\n          ${disabled ? 'disabled=\"\"' : ''} \n          class=\"waykeecom-input-selection__input\"\n        />\n        <div class=\"waykeecom-input-selection__header\">\n          <label for=\"${id}\" class=\"waykeecom-input-selection__label\">${title}</label>\n          ${meta ? `<div class=\"waykeecom-input-selection__meta\">${meta}</div>` : ''}\n        </div>\n        ${\n          description\n            ? `\n              <label for=\"${id}\" class=\"waykeecom-input-selection__description\">\n                ${description}\n              </label>\n            `\n            : ''\n        }\n      </div>\n    `;\n\n    const input = this.node.querySelector(`#${id}`);\n    if (input) {\n      if (onClick) {\n        input.addEventListener('click', onClick);\n      }\n    }\n  }\n}\n\nexport default InputRadioField;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\nimport InputRadioField from './InputRadioField';\n\nexport interface RadioItem {\n  id: string;\n  value: string;\n  title?: string;\n  description?: string;\n  meta?: string;\n}\n\ninterface InputRadioGroupProps {\n  readonly title?: string;\n  readonly name: string;\n  readonly checked?: string;\n  readonly options: RadioItem[];\n  error?: boolean;\n  information?: string;\n  footer?: string;\n  readonly errorMessage?: string;\n  readonly onClick: (e: Event) => void;\n  readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputRadioGroup extends HtmlNode {\n  private readonly props: InputRadioGroupProps;\n  private contexts: {\n    error?: InputError;\n  } = {};\n\n  constructor(element: HTMLElement | null, props: InputRadioGroupProps) {\n    super(element);\n\n    this.props = props;\n    this.render();\n  }\n\n  private updateBorder() {\n    const border = this.node.querySelector('.waykeecom-input-text');\n    if (border) {\n      if (this.props.error) {\n        border?.classList.add('waykeecom-input-text--has-error');\n      } else {\n        border?.classList.remove('waykeecom-input-text--has-error');\n      }\n    }\n  }\n\n  setError(error: boolean) {\n    this.props.error = error;\n    this.updateBorder();\n    this.contexts.error?.setError(error);\n  }\n\n  render() {\n    const {\n      title,\n      options,\n      name,\n      checked,\n      error,\n      errorMessage,\n      information,\n      footer,\n      onClick,\n      onClickInformation,\n    } = this.props;\n    this.node.innerHTML = `\n     <fieldset class=\"waykeecom-input-group\" role=\"radiogroup\" aria-required=\"true\">\n       ${\n         title\n           ? `<legend class=\"waykeecom-input-label\"><div class=\"waykeecom-input-label__label\">${title}</div></legend>`\n           : ''\n}\n        ${options\n          .map((option) => `<div class=\"waykeecom-input-group__item\" id=\"${option.id}-node\"></div>`)\n          .join('')}\n          ${footer ? `<div class=\"waykeecom-input-group__footer\">${footer}</div>` : ''}\n      </fieldset>\n    `;\n\n    this.updateBorder();\n    if (errorMessage) {\n      this.contexts.error = new InputError(this.node, {\n        error,\n        errorMessage,\n      });\n    }\n\n    options.forEach(\n      (option) =>\n        new InputRadioField(this.node.querySelector<HTMLDivElement>(`#${option.id}-node`), {\n          id: option.id,\n          name,\n          title: option.title || option.value,\n          value: option.value,\n          checked: checked === option.value,\n          description: option.description,\n          meta: option.meta,\n          onClick: (e) => onClick(e),\n        })\n    );\n\n    if (information) {\n      new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n        information,\n        onClickInformation,\n      });\n    }\n  }\n}\n\nexport default InputRadioGroup;\n", "import { orders } from '@wayke-se/ecom';\n\nexport const getOrder = (id: string, dealer?: string) => {\n  const request = dealer\n    ? orders.newOptionsRequest().forVehicle(id).forDealer(dealer)\n    : orders.newOptionsRequest().forVehicle(id);\n  return orders.getOptions(request.build());\n};\n", "type Tones = 'success' | 'warning' | 'error' | 'info';\n\ninterface AlertProps {\n  tone?: Tones;\n  children?: string | Element;\n  polite?: boolean;\n}\n\nconst Alert = ({ tone, children, polite }: AlertProps) => `\n  <div class=\"waykeecom-alert ${tone ? `waykeecom-alert--${tone}` : ''}\" role=\"${polite ? 'status' : 'alert'}\" ${polite ? 'aria-live=\"polite\"' : ''}>\n    <div class=\"waykeecom-alert__icon\">\n      <div class=\"waykeecom-alert__icon-badge\">\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 16 16\"\n          class=\"waykeecom-icon\"\n          data-icon=\"Info\"\n        >\n          <path d=\"M7 6h2v8H7V6zm0-4v2h2V2H7z\" />\n        </svg>\n      </div>\n    </div>\n    <div class=\"waykeecom-alert__content\">\n     ${children}\n    </div>\n  </div>\n`;\n\nexport default Alert;\n", "import i18next from '@i18n';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { getOrder } from '../../../Data/getOrder';\nimport { goTo, setDealer, setOrder } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport ListItem from '../../../Templates/ListItem';\nimport { convertOrderOptionsResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\n\nconst PROCEED = 'button-central-storage-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst CENTRAL_STORAGE_BRANCH = 'central-storage-branch';\nconst CENTRAL_STORAGE_BRANCH_NODE = `${CENTRAL_STORAGE_BRANCH}-node`;\n\ninterface CentralStorageProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n}\n\nclass CentralStorage extends HtmlNode {\n  private readonly props: CentralStorageProps;\n  private selectedDealer?: string;\n  private requestError = false;\n  private notOrderable?: 'reserved' | 'unavailable';\n  private contexts: {\n    proceedButton?: ButtonArrowRight;\n  } = {};\n\n  constructor(element: HTMLElement, props: CentralStorageProps) {\n    super(element);\n    this.props = props;\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.selectedDealer = this.props.store.getState().dealer;\n\n    this.render();\n  }\n\n  private async updateOrder(selectedDealer: string) {\n    if (this.requestError) {\n      this.requestError = false;\n      this.render();\n    }\n    const { id, vehicle } = this.props.store.getState();\n    try {\n      this.contexts.proceedButton?.loading(true);\n\n      const order = await getOrder(id, selectedDealer);\n      const convertedOrder = convertOrderOptionsResponse(order);\n\n      if (convertedOrder.isReserved || convertedOrder.isUnavailable) {\n        this.notOrderable = convertedOrder.isReserved ? 'reserved' : 'unavailable';\n        this.contexts.proceedButton?.loading(false);\n        this.render();\n        return;\n      }\n      this.notOrderable = undefined;\n\n      ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_SET, EcomStep.CENTRAL_STORAGE);\n      setOrder(convertedOrder, vehicle);\n      setDealer(selectedDealer, this.props.lastStage)(this.props.store.dispatch);\n\n      this.contexts.proceedButton?.loading(false);\n    } catch (_e) {\n      this.contexts.proceedButton?.loading(false);\n      this.requestError = true;\n      this.render();\n    }\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const value = currentTarget.value;\n    this.selectedDealer = value;\n    this.contexts.proceedButton?.disabled(false);\n    ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_SELECTED, EcomStep.CENTRAL_STORAGE);\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_EDIT, EcomStep.CENTRAL_STORAGE);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  private onProceed() {\n    if (this.selectedDealer) {\n      this.updateOrder(this.selectedDealer);\n    }\n  }\n\n  render() {\n    const { order, navigation, topNavigation, createdOrderId } = this.props.store.getState();\n    const { index } = this.props;\n    const dealers = order?.dealerSites || [];\n\n    const completed = topNavigation.stage > index;\n    const active = navigation.stage === index;\n\n    if (active) {\n      ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_ACTIVE, EcomStep.CENTRAL_STORAGE);\n    }\n\n    const content = ListItem(this.node, {\n      completed,\n      active,\n      title: i18next.t('centralStorage.title'),\n      id: 'central-storage',\n      index: index,\n    });\n\n    if (\n      (navigation.stage > index || (completed && navigation.stage !== index)) &&\n      this.selectedDealer\n    ) {\n      const dealer = dealers.find((x) => x.id === this.selectedDealer);\n      new StageCompleted(content, {\n        keyValueList: [\n          {\n            key: i18next.t('centralStorage.dealerSelection'),\n            value: dealer?.name || '',\n          },\n        ],\n        changeButtonTitle: i18next.t('centralStorage.changeButtonTitle'),\n        onEdit: !createdOrderId ? () => this.onEdit() : undefined,\n      });\n    } else if (navigation.stage === index) {\n      content.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('centralStorage.heading')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('centralStorage.description')}</p>\n        </div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${CENTRAL_STORAGE_BRANCH_NODE}\"></div>\n\n      ${\n        this.requestError\n          ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n              tone: 'error',\n              children: i18next.t('centralStorage.errorMessage'),\n            })}</div>`\n          : ''\n      }\n\n      ${\n        this.notOrderable\n          ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n              tone: 'warning',\n              children: i18next.t(\n                this.notOrderable === 'reserved' ? 'preview.reserved' : 'preview.unavailable'\n              ),\n            })}</div>`\n          : ''\n      }\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n    `;\n\n      const options: RadioItem[] = dealers.map((dealer) => {\n        const address =\n          !dealer.location?.address || !dealer.location?.city\n            ? i18next.t('centralStorage.addressMissing')\n            : `${dealer.location?.address}, ${dealer.location?.city}`;\n\n        return {\n          id: `central-storage-${dealer.id}`,\n          value: dealer.id,\n          title: dealer.name,\n          description: `\n            <div class=\"waykeecom-box\">\n              <div class=\"waykeecom-icon-content\">\n                <div class=\"waykeecom-icon-content__icon\">\n                  <svg\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    viewBox=\"0 0 16 16\"\n                    class=\"waykeecom-icon\"\n                    data-icon=\"Location pin\"\n                  >\n                    <path d=\"M12.2 2C11.1.9 9.6.3 8 .3S4.9.9 3.8 2C2.6 3.2 2 4.7 2 6.3 2 9 5.3 12.9 7.3 15l.7.7.7-.7c2-2.1 5.3-6 5.3-8.7 0-1.6-.6-3.1-1.8-4.3zM8 12.8C5.5 10 4 7.6 4 6.3c0-1.1.4-2.1 1.2-2.9.7-.7 1.7-1.1 2.8-1.1 1.1 0 2.1.4 2.8 1.2.8.7 1.2 1.7 1.2 2.8 0 1.3-1.5 3.7-4 6.5zm2-6.5c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z\" />\n                  </svg>\n                </div>\n                <div class=\"waykeecom-icon-content__content\">\n                  <div class=\"waykeecom-icon-content__meta\">\n                    ${address}\n                  </div>\n                </div>\n              </div>\n            </div>`,\n        } as RadioItem;\n      });\n\n      new InputRadioGroup(\n        content.querySelector<HTMLDivElement>(`#${CENTRAL_STORAGE_BRANCH_NODE}`),\n        {\n          checked: this.selectedDealer,\n          name: 'dealer',\n          options,\n          onClick: (e) => this.onChange(e),\n        }\n      );\n\n      this.contexts.proceedButton = new ButtonArrowRight(\n        content.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n        {\n          title: i18next.t('centralStorage.proceedButton'),\n          id: PROCEED,\n          disabled: !this.selectedDealer,\n          onClick: () => this.onProceed(),\n        }\n      );\n    }\n\n    if (navigation.stage === index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default CentralStorage;\n", "export const maskText = (text: string) => {\n  if (text.length < 2) {\n    return text;\n  }\n  if (text.length === 2) {\n    return `${text.substring(0, 1)}***`;\n  }\n  if (text.length === 3) {\n    return `${text.substring(0, 2)}***`;\n  }\n  return `${text.substring(0, 3)}***`;\n};\n\nexport const maskSSn = (ssn: string) => `${ssn.substring(0, ssn.length - 4)}****`;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\n\ninterface InputFieldProps {\n  readonly title: string;\n  readonly value: string;\n  readonly name: string;\n  readonly id: string;\n  readonly unit?: string;\n  readonly min?: number;\n  error?: boolean;\n  errorMessage?: string;\n  readonly placeholder?: string;\n  readonly information?: string;\n  readonly type?: string;\n  readonly autocomplete?: string;\n  readonly pattern?: string;\n  readonly inputmode?: string;\n  readonly help?: string;\n  readonly onChange?: (e: Event) => void;\n  readonly onBlur?: (e: Event) => void;\n  readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputField extends HtmlNode {\n  private readonly props: InputFieldProps;\n  private contexts: {\n    error?: InputError;\n  } = {};\n\n  constructor(element: HTMLElement | null, props: InputFieldProps) {\n    super(element);\n\n    this.props = props;\n    this.render();\n  }\n\n  private updateBorder() {\n    const border = this.node.querySelector('.waykeecom-input-text');\n    if (border) {\n      if (this.props.error) {\n        border?.classList.add('waykeecom-input-text--has-error');\n      } else {\n        border?.classList.remove('waykeecom-input-text--has-error');\n      }\n    }\n  }\n\n  setError(error: boolean, errorMessage?: string) {\n    this.props.error = error;\n    if (errorMessage) {\n      this.props.errorMessage = errorMessage;\n    }\n    this.updateBorder();\n    this.contexts.error?.setError(error);\n\n    const { id } = this.props;\n    if (error) {\n      document.getElementById(id)?.setAttribute('aria-invalid', 'true');\n      document.getElementById(id)?.setAttribute('aria-describedby', `${id}-error`);\n    } else {\n      document.getElementById(id)?.removeAttribute('aria-invalid');\n      document.getElementById(id)?.removeAttribute('aria-describedby');\n    }\n  }\n\n  private render() {\n    const {\n      id,\n      title,\n      type,\n      name,\n      min,\n      value,\n      autocomplete,\n      placeholder,\n      unit,\n      error,\n      errorMessage,\n      information,\n      pattern,\n      inputmode,\n      help,\n      onChange,\n      onBlur,\n      onClickInformation,\n    } = this.props;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-label\">\n        <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n      </div>\n      <div class=\"waykeecom-input-text\">\n        <input\n          ${type ? `type=\"${type}\"` : 'type=\"text\"'}\n          ${type === 'number' ? `pattern=\"[0-9]*\" inputmode=\"numeric\"` : ''}\n          id=\"${id}\"\n          ${pattern ? `pattern=\"${pattern}\"` : ''}\n          ${inputmode ? `inputmode=\"${inputmode}\"` : ''}\n          value=\"${value}\"\n          name=\"${name}\"\n          ${min !== undefined ? `min=\"${min}\"` : ''}\n          ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n          ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n          ${help ? `aria-describedby=\"${id}-help\"` : ''}\n          class=\"waykeecom-input-text__input\"\n        />\n        ${unit ? `<div class=\"waykeecom-input-text__unit\">${unit}</div>` : ''}\n      </div>\n      ${help ? `<div class=\"waykeecom-input-help\" id=\"${id}-help\">${help}</div>` : ''}\n    `;\n\n    this.updateBorder();\n\n    if (errorMessage) {\n      this.contexts.error = new InputError(this.node, {\n        error,\n        errorMessage,\n        id: `${id}-error`,\n      });\n    }\n\n    if (information) {\n      new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n        information,\n        onClickInformation,\n      });\n    }\n\n    const input = this.node.querySelector('input');\n    if (input) {\n      if (onChange) {\n        input.addEventListener('input', onChange);\n      }\n      if (onBlur) {\n        input.addEventListener('blur', onBlur);\n      }\n    }\n  }\n}\n\nexport default InputField;\n", "export const regexEmail = /\\S+@\\S+\\.\\S+/;\nexport const regexPhoneNumberVariant = /^[0-9\\-\\+\\(\\)\\ ]+$/;\nexport const regexZip = /^[0-9\\ \\-]+$/;\nexport const regexPersonalNumber = /^(19|20)(\\d{6}(-|\\s)\\d{4}|(?!19|20)\\d{10})$/;\nexport const regexRegistrationNumberSweden = /[a-zA-Z]{3}\\d{2}(d||[a-zA-Z]){1}/;\nexport const regexRegistrationNumberNorway = /^[A-Z]{2}\\d{5}$/;\nexport const regexNumber = /\\D/g;\n", "import { MarketCode } from '../@types/MarketCode';\nimport {\n  regexEmail,\n  regexNumber,\n  regexPersonalNumber,\n  regexPhoneNumberVariant,\n  regexRegistrationNumberNorway,\n  regexRegistrationNumberSweden,\n  regexZip,\n} from './regex';\n\nexport const validationMethods = {\n  requiredEmail: (s: string) => {\n    return regexEmail.test(s);\n  },\n  requiredTelephone: (s: string) => {\n    return regexPhoneNumberVariant.test(s);\n  },\n  requiredSsn: (s: string) => {\n    return regexPersonalNumber.test(s);\n  },\n  requiredSsnOver18: (s: string) => {\n    if (validationMethods.requiredSsn(s)) {\n      const cleaned = s.replace(regexNumber, '');\n      const nonLast = cleaned.slice(0, 8);\n      const asDate = `${nonLast.slice(0, 4)}-${nonLast.slice(4, 6)}-${nonLast.slice(6, 8)}`;\n\n      const years =\n        new Date(new Date().valueOf() - new Date(asDate).valueOf()).getFullYear() - 1970;\n\n      return years > 17;\n    }\n    return false;\n  },\n  requiredZip: (s: string) => {\n    return regexZip.test(s);\n  },\n  requiredNumberOrStringNumberInRange: (s: string | number, from: number, to: number) => {\n    const number = parseInt(s.toString(), 10);\n    if (isNaN(number)) {\n      return false;\n    }\n\n    return number >= from && number <= to;\n  },\n  requiredNumber: (s?: string | number | null) =>\n    s !== null && s !== undefined && !Number.isNaN(+s),\n  requiredNumberGreaterOrEqualThanZero: (s?: string | number | null) => {\n    if (s === undefined || s === null) {\n      return false;\n    }\n    const f = parseInt(s.toString(), 10);\n    return !Number.isNaN(f) && f >= 0;\n  },\n  optionalNumberGreaterOrEqualThanZero: (s?: string | number | null) => {\n    if (s === undefined || s === null || (typeof s === 'string' && !s)) {\n      return true;\n    }\n    const f = parseInt(s.toString(), 10);\n    return !Number.isNaN(f) && f >= 0;\n  },\n  optionalNumber: (s?: string | number | null) =>\n    s === null || s === undefined || !Number.isNaN(+s),\n  requiredRegistrationNumber: (s?: string, marketCode?: MarketCode) => {\n    if (!s) {\n      return false;\n    }\n\n    const trimmed = s.replace(' ', '');\n\n    const hasCorrectLength = marketCode === 'SE' ? trimmed.length === 6 : trimmed.length === 7;\n    const isRegexMatch =\n      marketCode === 'SE'\n        ? regexRegistrationNumberSweden.test(trimmed)\n        : regexRegistrationNumberNorway.test(trimmed);\n\n    return hasCorrectLength && isRegexMatch;\n  },\n  requiredMileage: (s?: string) => {\n    return validationMethods.requiredNumberOrStringNumberInRange(s || '', 0, 80000);\n  },\n  optionalString: (s?: string) => {\n    return !!s || !s;\n  },\n  requiredCondition: (s?: string) => {\n    return ['VeryGood', 'Good', 'Ok'].includes(s || '');\n  },\n  requiredAssessmentMaritalStatus: (s?: string) => {\n    return ['married', 'single', 'commonLaw'].includes(s || '');\n  },\n  requiredAssessmentEmplyment: (s?: string) => {\n    return [\n      'other',\n      'retired',\n      'fullTimeEmployed',\n      'student',\n      'temporarilyEmployed',\n      'selfEmployed',\n    ].includes(s || '');\n  },\n  requiredHousingType: (s?: string) => {\n    return ['singleFamily', 'condominium', 'apartment'].includes(s || '');\n  },\n  requiredName: (s?: string) => {\n    return !!s;\n  },\n  requiredCity: (s?: string) => {\n    return !!s;\n  },\n  requiredStreet: (s?: string) => {\n    return !!s;\n  },\n  requiredStreet2: (_s?: string) => {\n    return true;\n  },\n};\n", "import i18next from '@i18n';\nimport { Customer, PartialCustomer } from '../../../@types/Customer';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { goTo, setContactAndPhone } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst EMAIL_NODE = 'contact-email-node';\nconst EMAIL_INPUT_ID = 'contact-email';\n\nconst PHONE_NODE = 'contact-phone-node';\nconst PHONE_INPUT_ID = 'contact-phone';\n\nconst PROCEED_NODE = 'contact-proceed-node';\nconst PROCEED = 'contact-proceed';\n\nconst validation = {\n  email: validationMethods.requiredEmail,\n  phone: validationMethods.requiredTelephone,\n};\n\nexport interface PartialCustomerValidation {\n  email: boolean;\n  phone: boolean;\n}\n\ninterface Part1EmailAndPhoneState {\n  value: PartialCustomer;\n  validation: PartialCustomerValidation;\n  interact: PartialCustomerValidation;\n}\n\nconst initalState = (customer?: Customer): Part1EmailAndPhoneState => {\n  const value = {\n    email: customer?.email || '',\n    phone: customer?.phone || '',\n  };\n  return {\n    value,\n    validation: {\n      email: validation.email(value.email),\n      phone: validation.phone(value.phone),\n    },\n    interact: { email: false, phone: false },\n  };\n};\n\ninterface EmailAndPhoneProps {\n  readonly store: WaykeStore;\n}\n\nclass EmailAndPhone extends HtmlNode {\n  private readonly props: EmailAndPhoneProps;\n  private state: Part1EmailAndPhoneState;\n  private contexts: {\n    email?: InputField;\n    phone?: InputField;\n    button?: ButtonArrowRight;\n  } = {};\n\n  constructor(element: HTMLDivElement, props: EmailAndPhoneProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n\n    const state = this.props.store.getState();\n    this.state = initalState(state.customer);\n\n    this.render();\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof PartialCustomerValidation;\n\n    const value = currentTarget.value;\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onBlur(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof PartialCustomerValidation;\n\n    this.state.interact[name] = true;\n    this.state.validation[name] = validation[name](this.state.value[name]);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private updateUiError(name: keyof PartialCustomer) {\n    this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n  }\n\n  private updateProceedButton() {\n    this.contexts.button?.disabled(!this.state.validation.email || !this.state.validation.phone);\n  }\n\n  private onProceed() {\n    ecomEvent(\n      EcomView.MAIN,\n      EcomEvent.CUSTOMER_EMAIL_AND_PHONE_SET,\n      EcomStep.CUSTOMER_EMAIL_AND_PHONE\n    );\n    setContactAndPhone({\n      email: this.state.value.email.trim(),\n      phone: this.state.value.phone.trim(),\n    })(this.props.store.dispatch);\n  }\n\n  private onChangeContacts() {\n    ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_EDIT, EcomStep.CUSTOMER_EMAIL_AND_PHONE);\n    goTo('main', 1)(this.props.store.dispatch);\n  }\n\n  render() {\n    const subStage = this.props.store.getState().navigation.subStage;\n\n    if (subStage > 1) {\n      const keyValueItems: { key: string; value: string }[] = [\n        { key: i18next.t('customer.email'), value: this.state.value.email },\n        { key: i18next.t('customer.phone'), value: this.state.value.phone },\n      ];\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n          </ul>\n        </div>\n      `;\n\n      if (subStage <= 2) {\n        this.node.innerHTML += `\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <div class=\"waykeecom-align waykeecom-align--end\">\n              <button type=\"button\" title=\"${i18next.t('customer.changeContactsButton')}\" class=\"waykeecom-link\" id=\"change-contacts\">${i18next.t('customer.changeContactsButton')}</button>\n            </div>\n          </div>\n        `;\n      }\n    } else {\n      this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.contactInfoTitle')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('customer.contactInfoDescription')}</p>\n        </div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${EMAIL_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PHONE_NODE}\"></div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n    `;\n\n      this.contexts.email = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${EMAIL_NODE}`),\n        {\n          title: i18next.t('customer.email'),\n          value: this.state.value.email,\n          id: EMAIL_INPUT_ID,\n          error: this.state.interact.email && !this.state.validation.email,\n          errorMessage: i18next.t('customer.emailErrorMessage'),\n          name: 'email',\n          autocomplete: 'email',\n          placeholder: i18next.t('customer.emailPlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.phone = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${PHONE_NODE}`),\n        {\n          title: i18next.t('customer.phone'),\n          value: this.state.value.phone,\n          id: PHONE_INPUT_ID,\n          error: this.state.interact.phone && !this.state.validation.phone,\n          errorMessage: i18next.t('customer.phoneErrorMessage'),\n          name: 'phone',\n          autocomplete: 'tel',\n          placeholder: i18next.t('customer.phonePlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.button = new ButtonArrowRight(\n        this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n        {\n          title: i18next.t('customer.proceedButton'),\n          id: PROCEED,\n          disabled: !(this.state.validation.email && this.state.validation.phone),\n          onClick: () => this.onProceed(),\n        }\n      );\n    }\n\n    this.node\n      .querySelector('#change-contacts')\n      ?.addEventListener('click', () => this.onChangeContacts());\n  }\n}\n\nexport default EmailAndPhone;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface DisclaimerProps {\n  readonly text: string;\n}\nclass DisclaimerPadlock extends HtmlNode {\n  private readonly props: DisclaimerProps;\n\n  constructor(element: HTMLElement | null, props: DisclaimerProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    this.node.innerHTML = `\n      <div class=\"waykeecom-disclaimer\">\n        <div class=\"waykeecom-disclaimer__icon\" aria-hidden=\"true\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"Padlock\"\n          >\n            <path d=\"M13 6h-1V4c0-2.2-1.8-4-4-4S4 1.8 4 4v2H3c-1.1 0-2 .9-2 2v8h14V8c0-1.1-.9-2-2-2zM6 4c0-1.1.9-2 2-2s2 .9 2 2v2H6V4zm7 10H3V8h10v6z\" />\n          </svg>\n        </div>\n        <span class=\"waykeecom-disclaimer__text\">${this.props.text}</span>\n      </div>\n    `;\n  }\n}\n\nexport default DisclaimerPadlock;\n", "import { customers } from '@wayke-se/ecom';\n\nexport const getAddressBySsn = (ssn: string) => {\n  const request = customers.newAddressLookupRequest().forCustomer(ssn).build();\n\n  return customers.lookupAddress(request);\n};\n", "export const renderConditional = (condition: boolean, content: string) =>\n  condition ? content : '';\n", "import i18next from '@i18n';\nimport { Customer, CustomerSocialId } from '../../../@types/Customer';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { getAddressBySsn } from '../../../Data/getAddress';\nimport { setSocialIdAndAddress } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { regexNumber } from '../../../Utils/regex';\nimport { renderConditional } from '../../../Utils/render';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst SOCIAL_ID_NODE = 'contact-socialId-node';\nconst SOCIAL_ID_INPUT_ID = 'contact-socialId';\nconst SOCIAL_ID_INFO = 'contact-social-id-info';\n\nconst PROCEED = `${SOCIAL_ID_INPUT_ID}-proceed`;\nconst PROCEED_NODE = `${SOCIAL_ID_INPUT_ID}-proceed-node`;\nconst DISCLAIMER_NODE = `${SOCIAL_ID_INPUT_ID}-disclaimer-node`;\n\nconst validation = {\n  socialId: validationMethods.requiredSsnOver18,\n};\n\nexport interface SocialIdValidation {\n  socialId: boolean;\n}\n\ninterface Part2SocialIdState {\n  value: CustomerSocialId;\n  validation: SocialIdValidation;\n  interact: SocialIdValidation;\n}\n\nconst initalState = (customer?: Customer): Part2SocialIdState => {\n  const value = {\n    socialId: customer?.socialId || '',\n  };\n  return {\n    value,\n    validation: {\n      socialId: validation.socialId(value.socialId),\n    },\n    interact: { socialId: false },\n  };\n};\n\ninterface FullAddressBySocialIdProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n}\n\nclass FullAddressBySocialId extends HtmlNode {\n  private readonly props: FullAddressBySocialIdProps;\n  private state: Part2SocialIdState;\n  private requestError: boolean = false;\n  private contexts: {\n    socialId?: InputField;\n    buttonFetch?: ButtonArrowRight;\n    buttonLinkToggle?: ButtonAsLink;\n  } = {};\n\n  constructor(element: HTMLElement, props: FullAddressBySocialIdProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n\n    const state = this.props.store.getState();\n    this.state = initalState(state.customer);\n\n    this.render();\n  }\n\n  private async onFetchAddress() {\n    const { store, lastStage } = this.props;\n    this.requestError = false;\n    this.render();\n\n    try {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CUSTOMER_ADDRESS_BY_SSN_REQUESTED,\n        EcomStep.CUSTOMER_ADDRESS\n      );\n      this.contexts.buttonFetch?.loading(true);\n\n      const response = await getAddressBySsn(this.state.value.socialId);\n\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED,\n        EcomStep.CUSTOMER_ADDRESS\n      );\n      const address = response.getAddress();\n      setSocialIdAndAddress(\n        this.state.value.socialId.replace(regexNumber, ''),\n        address,\n        lastStage\n      )(store.dispatch);\n      ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_SET, EcomStep.CUSTOMER_ADDRESS);\n    } catch (_e) {\n      this.requestError = true;\n      ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_BY_SSN_FAILED, EcomStep.CUSTOMER_ADDRESS);\n    } finally {\n      this.contexts.buttonFetch?.loading(false);\n      this.render();\n    }\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof CustomerSocialId;\n    const value = currentTarget.value;\n\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onBlur(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof CustomerSocialId;\n\n    this.state.interact[name] = true;\n    this.state.validation[name] = validation[name](this.state.value[name]);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private updateUiError(name: keyof SocialIdValidation) {\n    this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n  }\n\n  private updateProceedButton() {\n    this.contexts.buttonFetch?.disabled(!this.state.validation.socialId);\n  }\n\n  render() {\n    const policy = 'https://www.wayke.se/trygghet-naer-det-kommer-till-dina-personuppgifter';\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <hr class=\"waykeecom-separator\" />\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.personalInfoTitle')}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('customer.personalInfoDescription')}</p>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_NODE}\"></div>\n\n        ${renderConditional(\n          this.requestError,\n          `\n          <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_NODE}\">\n            ${Alert({\n              tone: 'error',\n              children: i18next.t('customer.fetchErrorMessage'),\n            })}\n          </div>`\n        )}\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_INFO}\">\n          ${Alert({\n            tone: 'info',\n            children: `\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <p class=\"waykeecom-content__p\">${i18next.t('customer.fetchInfoMessage')}</p>\n                <ul class=\"waykeecom-content__ul\">\n                  <li class=\"waykeecom-content__li\">${i18next.t('customer.name')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('customer.registeredAddress')}</li>\n                </ul>\n              </div>\n            `,\n          })}\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PROCEED_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DISCLAIMER_NODE}\"></div>\n        </div>\n      </div>\n    `;\n\n    this.contexts.socialId = new InputField(\n      this.node.querySelector<HTMLDivElement>(`#${SOCIAL_ID_NODE}`),\n      {\n        title: 'Personnummer',\n        value: this.state.value.socialId,\n        id: SOCIAL_ID_INPUT_ID,\n        error: this.state.interact.socialId && !this.state.validation.socialId,\n        errorMessage: i18next.t('customer.socialIdErrorMessage'),\n        name: 'socialId',\n        placeholder: i18next.t('customer.socialIdPlaceholder'),\n        pattern: '[0-9]*',\n        inputmode: 'numeric',\n        onChange: (e) => this.onChange(e),\n        onBlur: (e) => this.onBlur(e),\n      }\n    );\n\n    Object.keys(this.state.value).forEach((key) =>\n      this.updateUiError(key as keyof CustomerSocialId)\n    );\n\n    this.contexts.buttonFetch = new ButtonArrowRight(\n      this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n      {\n        title: i18next.t('customer.fetchButton'),\n        id: PROCEED,\n        disabled: !this.state.validation.socialId,\n        onClick: () => this.onFetchAddress(),\n      }\n    );\n\n    new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_NODE}`), {\n      text: i18next.t('customer.policyText', {\n        policy,\n        link: `<a href=\"${policy}\" title=\"${i18next.t('confirmation.privacyPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.privacyPolicy')}</a>`,\n        interpolation: { escapeValue: false },\n      }),\n    });\n\n    this.updateProceedButton();\n  }\n}\n\nexport default FullAddressBySocialId;\n", "import i18next from '@i18n';\nimport { IAddress } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { goTo, setAddress, setContactAndPhone } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst GIVENNAME_NODE = 'contact-givenname-node';\nconst GIVENNAME_INPUT_ID = 'contact-givenname';\nconst SURNAME_NODE = 'contact-surname-node';\nconst SURNAME_INPUT_ID = 'contact-surname';\nconst STREET_NODE = 'contact-street-node';\nconst STREET_INPUT_ID = 'contact-street';\nconst STREET2_NODE = 'contact-street2-node';\nconst STREET2_INPUT_ID = 'contact-street2';\nconst POSTALCODE_NODE = 'contact-postalcode-node';\nconst POSTALCODE_INPUT_ID = 'contact-postalcode';\nconst CITY_NODE = 'contact-city-node';\nconst CITY_INPUT_ID = 'contact-city';\n\nconst PROCEED_NODE = 'contact-proceed-node';\nconst PROCEED = 'contact-proceed';\n\nconst validation = {\n  givenName: validationMethods.requiredName,\n  surname: validationMethods.requiredName,\n  street: validationMethods.requiredStreet,\n  street2: validationMethods.requiredStreet2,\n  postalCode: validationMethods.requiredZip,\n  city: validationMethods.requiredCity,\n};\n\nexport interface PartialAddressValidation {\n  givenName: boolean;\n  surname: boolean;\n  street: boolean;\n  street2: boolean;\n  postalCode: boolean;\n  city: boolean;\n}\n\ninterface AddressState {\n  value: IAddress;\n  validation: PartialAddressValidation;\n  interact: PartialAddressValidation;\n}\n\nconst initalState = (address?: IAddress): AddressState => {\n  const value = {\n    givenName: address?.givenName || '',\n    surname: address?.surname || '',\n    street: address?.street || '',\n    street2: address?.street2 || '',\n    postalCode: address?.postalCode || '',\n    city: address?.city || '',\n  };\n  return {\n    value,\n    validation: {\n      givenName: validation.givenName(value.givenName),\n      surname: validation.surname(value.surname),\n      street: validation.street(value.street),\n      street2: validation.street2(value.street2),\n      postalCode: validation.postalCode(value.postalCode),\n      city: validation.city(value.city),\n    },\n    interact: {\n      givenName: false,\n      surname: false,\n      street: false,\n      street2: false,\n      postalCode: false,\n      city: false,\n    },\n  };\n};\n\ninterface FullAddressFormProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n}\n\nclass FullAddressForm extends HtmlNode {\n  private readonly props: FullAddressFormProps;\n  private state: AddressState;\n  private contexts: {\n    givenName?: InputField;\n    surname?: InputField;\n    street?: InputField;\n    street2?: InputField;\n    postalCode?: InputField;\n    city?: InputField;\n    button?: ButtonArrowRight;\n  } = {};\n\n  constructor(element: HTMLElement, props: FullAddressFormProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n\n    const state = this.props.store.getState();\n    this.state = initalState(state.address);\n\n    this.render();\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof PartialAddressValidation;\n\n    const value = currentTarget.value;\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onBlur(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof PartialAddressValidation;\n\n    this.state.interact[name] = true;\n    this.state.validation[name] = validation[name](this.state.value[name]);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private updateUiError(name: keyof Omit<IAddress, 'name' | 'distance'>) {\n    this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n  }\n\n  private updateProceedButton() {\n    this.contexts.button?.disabled(\n      !this.state.validation.givenName ||\n        !this.state.validation.surname ||\n        !this.state.validation.street ||\n        !this.state.validation.street2 ||\n        !this.state.validation.postalCode ||\n        !this.state.validation.city\n    );\n  }\n\n  private onProceed() {\n    ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_SET, EcomStep.CUSTOMER_ADDRESS);\n\n    setAddress(\n      {\n        givenName: this.state.value.givenName.trim(),\n        surname: this.state.value.surname.trim(),\n        name: `${this.state.value.givenName.trim()} ${this.state.value.surname.trim()}`,\n        street: this.state.value.street.trim(),\n        street2: this.state.value.street2.trim(),\n        postalCode: this.state.value.postalCode.trim(),\n        city: this.state.value.city.trim(),\n      },\n      this.props.lastStage\n    )(this.props.store.dispatch);\n  }\n\n  private onChangeAddress() {\n    ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_EDIT, EcomStep.CUSTOMER_ADDRESS);\n    goTo('main', 2)(this.props.store.dispatch);\n  }\n\n  render() {\n    const subStage = this.props.store.getState().navigation.subStage;\n\n    if (subStage > 2) {\n      const keyValueItems: { key: string; value: string }[] = [\n        { key: i18next.t('customer.givenName'), value: this.state.value.givenName },\n        { key: i18next.t('customer.surname'), value: this.state.value.surname },\n        { key: i18next.t('customer.street'), value: this.state.value.street },\n        { key: i18next.t('customer.street2'), value: this.state.value.street2 },\n        { key: i18next.t('customer.postalCode'), value: this.state.value.postalCode },\n        { key: i18next.t('customer.city'), value: this.state.value.city },\n      ];\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n          </ul>\n        </div>\n      `;\n\n      if (subStage <= 2) {\n        this.node.innerHTML += `\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <div class=\"waykeecom-align waykeecom-align--end\">\n              <button type=\"button\" title=\"${i18next.t('customer.changeContactsButton')}\" class=\"waykeecom-link\" id=\"change-address\">${i18next.t('customer.changeContactsButton')}</button>\n            </div>\n          </div>\n        `;\n      }\n    } else {\n      this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.contactInfoTitle')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('customer.contactInfoDescription')}</p>\n        </div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${GIVENNAME_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${SURNAME_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${STREET_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${STREET2_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${POSTALCODE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CITY_NODE}\"></div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n    `;\n\n      this.contexts.givenName = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${GIVENNAME_NODE}`),\n        {\n          title: i18next.t('customer.givenName'),\n          value: this.state.value.givenName,\n          id: GIVENNAME_INPUT_ID,\n          error: this.state.interact.givenName && !this.state.validation.givenName,\n          errorMessage: i18next.t('customer.givenNameErrorMessage'),\n          name: 'givenName',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.givenNamePlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.surname = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${SURNAME_NODE}`),\n        {\n          title: i18next.t('customer.surname'),\n          value: this.state.value.surname,\n          id: SURNAME_INPUT_ID,\n          error: this.state.interact.surname && !this.state.validation.surname,\n          errorMessage: i18next.t('customer.surnameErrorMessage'),\n          name: 'surname',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.surnamePlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.street = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${STREET_NODE}`),\n        {\n          title: i18next.t('customer.street'),\n          value: this.state.value.street,\n          id: STREET_INPUT_ID,\n          error: this.state.interact.street && !this.state.validation.street,\n          errorMessage: i18next.t('customer.streetErrorMessage'),\n          name: 'street',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.streetPlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.street2 = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${STREET2_NODE}`),\n        {\n          title: i18next.t('customer.street2'),\n          value: this.state.value.street2,\n          id: STREET2_INPUT_ID,\n          error: this.state.interact.street2 && !this.state.validation.street2,\n          errorMessage: i18next.t('customer.street2ErrorMessage'),\n          name: 'street2',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.street2Placeholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.postalCode = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${POSTALCODE_NODE}`),\n        {\n          title: i18next.t('customer.postalCode'),\n          value: this.state.value.postalCode,\n          id: POSTALCODE_INPUT_ID,\n          error: this.state.interact.postalCode && !this.state.validation.postalCode,\n          errorMessage: i18next.t('customer.postalCodeErrorMessage'),\n          name: 'postalCode',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.postalCodePlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.city = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${CITY_NODE}`),\n        {\n          title: i18next.t('customer.city'),\n          value: this.state.value.city,\n          id: CITY_INPUT_ID,\n          error: this.state.interact.city && !this.state.validation.city,\n          errorMessage: i18next.t('customer.cityErrorMessage'),\n          name: 'city',\n          autocomplete: 'text',\n          placeholder: i18next.t('customer.cityPlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.button = new ButtonArrowRight(\n        this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n        {\n          title: i18next.t('customer.proceedButton'),\n          id: PROCEED,\n          disabled: !(\n            this.state.validation.givenName &&\n            this.state.validation.surname &&\n            this.state.validation.street &&\n            this.state.validation.street2 &&\n            this.state.validation.postalCode &&\n            this.state.validation.city\n          ),\n          onClick: () => this.onProceed(),\n        }\n      );\n    }\n\n    this.node\n      .querySelector('#change-address')\n      ?.addEventListener('click', () => this.onChangeAddress());\n  }\n}\n\nexport default FullAddressForm;\n", "import i18next from '@i18n';\nimport { Customer } from '../../../@types/Customer';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem, { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport FullAddressBySocialId from './FullAddressBySocialId';\nimport FullAddressForm from './FullAddressForm';\n\ninterface FullAddressProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\nclass FullAddress extends HtmlNode {\n  private readonly props: FullAddressProps;\n  private state: Customer;\n\n  constructor(element: HTMLDivElement, props: FullAddressProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n\n    const state = this.props.store.getState();\n    this.state = state.customer;\n\n    this.render();\n  }\n\n  render() {\n    const { store, lastStage } = this.props;\n    const subStage = store.getState().navigation.subStage;\n    if (subStage > 2) {\n      const keyValueItems: KeyValueListItemProps[] = [\n        { key: i18next.t('customer.socialId'), value: this.state.socialId },\n      ];\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <ul class=\"waykeecom-key-value-list\">\n          ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n          </ul>\n        </div>\n      `;\n    } else if (this.props.marketCode === 'SE') {\n      this.node.innerHTML = '';\n      new FullAddressBySocialId(this.node, {\n        store,\n        lastStage,\n      });\n    } else {\n      this.node.innerHTML = '';\n      new FullAddressForm(this.node, {\n        store,\n        lastStage,\n      });\n    }\n  }\n}\n\nexport default FullAddress;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { maskSSn, maskText } from '../../../Utils/mask';\nimport EmailAndPhone from './EmailAndPhone';\nimport FullAddress from './FullAddress';\n\ninterface CustomerProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\n\nclass Customer extends HtmlNode {\n  private readonly props: CustomerProps;\n\n  constructor(element: HTMLElement, props: CustomerProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private onChange() {\n    ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_EDIT, EcomStep.CUSTOMER_EMAIL_AND_PHONE);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, index, lastStage } = this.props;\n    const state = this.props.store.getState();\n\n    const completed = state.topNavigation.stage > index;\n\n    const active = state.navigation.stage === index && !state.createdOrderId;\n    if (active) {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CUSTOMER_ACTIVE,\n        state.navigation.subStage === 1\n          ? EcomStep.CUSTOMER_EMAIL_AND_PHONE\n          : EcomStep.CUSTOMER_ADDRESS\n      );\n    }\n    const content = ListItem(this.node, {\n      completed,\n      title: i18next.t('customer.title'),\n      active,\n      id: 'customer',\n      index: index,\n    });\n    content.innerHTML = '';\n\n    const part1 = document.createElement('div');\n    part1.className = 'waykeecom-stack waykeecom-stack--2';\n    const part2 = document.createElement('div');\n    part2.className = 'waykeecom-stack waykeecom-stack--2';\n\n    if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n      const keyValueList: { key: string; value: string }[] = [\n        { key: i18next.t('customer.email'), value: state.customer.email },\n        { key: i18next.t('customer.phone'), value: state.customer.phone },\n        ...(this.props.marketCode === 'SE'\n          ? [{ key: i18next.t('customer.socialId'), value: maskSSn(state.customer.socialId) }]\n          : []),\n        ...(state.address\n          ? [\n              {\n                key: i18next.t('customer.name'),\n                value:\n                  this.props.marketCode === 'SE'\n                    ? `${maskText(state.address.givenName)} ${maskText(state.address.surname)}`\n                    : `${state.address.givenName} ${state.address.surname}`,\n              },\n              { key: i18next.t('customer.address'), value: state.address.street },\n              { key: i18next.t('customer.postalCode'), value: state.address.postalCode },\n              { key: i18next.t('customer.city'), value: state.address.city },\n            ]\n          : []),\n      ];\n      new StageCompleted(content, {\n        keyValueList,\n        changeButtonTitle: i18next.t('customer.changeButtonTitle'),\n        onEdit: !state.createdOrderId ? () => this.onChange() : undefined,\n      });\n    } else if (state.navigation.stage === index) {\n      new EmailAndPhone(content, { store });\n      if (state.navigation.subStage > 1) {\n        new FullAddress(content, { store, lastStage, marketCode: this.props.marketCode });\n      }\n    }\n    if (state.navigation.stage === index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default Customer;\n", "import i18next from '@i18n';\nimport { DeliveryType } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioField from '../../../Components/Input/InputRadioField';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { goTo, setHomeDelivery } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport ListItem from '../../../Templates/ListItem';\nimport { getTotalDeliveryCost } from '../../../Utils/delivery';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\n\nconst RADIO_HOME_TRUE = 'radio-home-delivery-true';\nconst RADIO_HOME_TRUE_NODE = `${RADIO_HOME_TRUE}-node`;\n\nconst RADIO_HOME_FALSE = 'radio-home-delivery-false';\nconst RADIO_HOME_FALSE_NODE = `${RADIO_HOME_FALSE}-node`;\n\nconst PROCEED = 'button-home-delivery-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\ninterface DeliveryProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n}\n\nclass Delivery extends HtmlNode {\n  private readonly props: DeliveryProps;\n  private homeDelivery: boolean;\n\n  constructor(element: HTMLElement, props: DeliveryProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    const state = this.props.store.getState();\n    this.homeDelivery = state.homeDelivery;\n    this.render();\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const value = currentTarget.value === 'true';\n    this.homeDelivery = value;\n    ecomEvent(\n      EcomView.MAIN,\n      this.homeDelivery ? EcomEvent.DELIVERY_HOME_SELECTED : EcomEvent.DELIVERY_DEALER_SELECTED,\n      EcomStep.DELIVERY\n    );\n  }\n\n  private onProceed() {\n    setHomeDelivery(this.homeDelivery, this.props.lastStage)(this.props.store.dispatch);\n    ecomEvent(\n      EcomView.MAIN,\n      this.homeDelivery ? EcomEvent.DELIVERY_HOME_SET : EcomEvent.DELIVERY_DEALER_SET,\n      EcomStep.DELIVERY\n    );\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.DELIVERY_EDIT, EcomStep.DELIVERY);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, index } = this.props;\n    const state = store.getState();\n    if (!state.order) throw 'Missing order...';\n\n    const contactInformation = state.order.contactInformation;\n    if (!contactInformation) throw 'Missing dealer contact information';\n\n    const completed = state.topNavigation.stage > index;\n    const active = state.navigation.stage === index;\n    if (active) {\n      ecomEvent(EcomView.MAIN, EcomEvent.DELIVERY_ACTIVE, EcomStep.DELIVERY);\n    }\n    const content = ListItem(this.node, {\n      completed,\n      title: i18next.t('delivery.title'),\n      active,\n      id: 'delivery',\n      index: index,\n    });\n\n    if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n      new StageCompleted(content, {\n        keyValueList: [\n          {\n            key: i18next.t('delivery.deliveryMethod'),\n            value: state.homeDelivery\n              ? i18next.t('delivery.homeDelivery')\n              : i18next.t('delivery.pickup'),\n          },\n        ],\n        changeButtonTitle: i18next.t('delivery.changeDeliveryMethod'),\n        onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n      });\n    } else if (state.navigation.stage === index) {\n      const part = document.createElement('div');\n      part.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('delivery.heading')}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('delivery.description', { name: contactInformation.name })}</p>\n          </div>\n        </div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <fieldset class=\"waykeecom-input-group\" role=\"radiogroup\" aria-required=\"true\" aria-label=\"${i18next.t('delivery.deliveryMethod')}\">\n            <div class=\"waykeecom-input-group__item\" id=\"${RADIO_HOME_FALSE_NODE}\"></div>\n            <div class=\"waykeecom-input-group__item\" id=\"${RADIO_HOME_TRUE_NODE}\"></div>\n          </fieldset>\n        </div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n      `;\n\n      const deliveryOptions = state.order.deliveryOptions;\n      deliveryOptions.forEach((deliveryOption) => {\n        const addressDistance = state.address?.distance;\n        const totalDeliveryCost = getTotalDeliveryCost(addressDistance, deliveryOption) || 0;\n\n        switch (deliveryOption.type) {\n          case DeliveryType.Pickup:\n            new InputRadioField(part.querySelector<HTMLInputElement>(`#${RADIO_HOME_FALSE_NODE}`), {\n              id: RADIO_HOME_TRUE,\n              name: 'homeDelivery',\n              title: i18next.t('delivery.pickup'),\n              value: 'false',\n              description: `\n                <div class=\"waykeecom-box\">\n                  <div class=\"waykeecom-icon-content\">\n                    <div class=\"waykeecom-icon-content__icon\">\n                      <svg\n                        xmlns=\"http://www.w3.org/2000/svg\"\n                        viewBox=\"0 0 16 16\"\n                        class=\"waykeecom-icon\"\n                        data-icon=\"Location pin\"\n                      >\n                        <path d=\"M12.2 2C11.1.9 9.6.3 8 .3S4.9.9 3.8 2C2.6 3.2 2 4.7 2 6.3 2 9 5.3 12.9 7.3 15l.7.7.7-.7c2-2.1 5.3-6 5.3-8.7 0-1.6-.6-3.1-1.8-4.3zM8 12.8C5.5 10 4 7.6 4 6.3c0-1.1.4-2.1 1.2-2.9.7-.7 1.7-1.1 2.8-1.1 1.1 0 2.1.4 2.8 1.2.8.7 1.2 1.7 1.2 2.8 0 1.3-1.5 3.7-4 6.5zm2-6.5c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z\" />\n                      </svg>\n                    </div>\n                    <div class=\"waykeecom-icon-content__content\">\n                      <div class=\"waykeecom-icon-content__label\">${contactInformation.name}</div>\n                      <div class=\"waykeecom-icon-content__meta\">\n                        ${contactInformation.address}, ${contactInformation.city}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              `,\n              meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${\n                totalDeliveryCost === 0\n                  ? i18next.t('delivery.free')\n                  : prettyNumber(totalDeliveryCost, {\n                      postfix: 'kr',\n                    })\n              }</div>`,\n              checked: !this.homeDelivery,\n              onClick: (e) => this.onChange(e),\n            });\n            break;\n          case DeliveryType.Delivery:\n            const distance = state.address?.distance?.value || 0;\n            const maxDistance = deliveryOption.unitPrice || 0;\n\n            const tooFarAway = distance > maxDistance;\n\n            new InputRadioField(part.querySelector<HTMLInputElement>(`#${RADIO_HOME_TRUE_NODE}`), {\n              id: RADIO_HOME_FALSE,\n              name: 'homeDelivery',\n              title: i18next.t('delivery.homeDelivery'),\n              value: 'true',\n              disabled: tooFarAway,\n              description: `<div class=\"waykeecom-box\">\n                <div class=\"waykeecom-stack waykeecom-stack--2\">${i18next.t('delivery.toYourAddress')}</div>\n                ${\n                  tooFarAway\n                    ? `<div class=\"waykeecom-stack waykeecom-stack--2\">${Alert({\n                        tone: 'info',\n                        children: i18next.t('delivery.tooFarAway'),\n                      })}</div>`\n                    : ''\n                }</div>`,\n              meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${\n                tooFarAway\n                  ? '-'\n                  : prettyNumber(totalDeliveryCost, {\n                      postfix: 'kr',\n                    })\n              }</div>`,\n              checked: this.homeDelivery,\n              onClick: (e) => this.onChange(e),\n            });\n            break;\n          default:\n            break;\n        }\n      });\n\n      new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n        title: i18next.t('delivery.proceedButton'),\n        id: PROCEED,\n        onClick: () => this.onProceed(),\n      });\n\n      content.appendChild(part);\n      if (state.navigation.stage === index) {\n        content.parentElement?.scrollIntoView();\n      }\n    }\n  }\n}\n\nexport default Delivery;\n", "import { IDeliveryOption, IDistance } from '@wayke-se/ecom';\n\nexport const getDeliveryDistance = (\n  distance: IDistance | null | undefined,\n  deliveryOption: IDeliveryOption\n) => {\n  if (!distance) return undefined;\n\n  if (distance.unit === 'm' && deliveryOption.unit === 'km')\n    return Math.round(distance.value / 1000);\n\n  if (distance.unit === 'km' && deliveryOption.unit === 'm') return distance.value * 1000;\n\n  return distance.value;\n};\n\nexport const getTotalDeliveryCost = (\n  distance: IDistance | null | undefined,\n  deliveryOption: IDeliveryOption\n) => {\n  const deliveryDistance = getDeliveryDistance(distance, deliveryOption);\n  if (!deliveryDistance) return undefined;\n\n  if (!deliveryOption.unitPrice) return undefined;\n\n  return deliveryOption.startupCost + deliveryOption.unitPrice * deliveryDistance;\n};\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport { goTo, resetPaymentLookupResponse, setFinancial } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport { Image } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { formatShortDescription, prettyNumber } from '../../../Utils/format';\nimport { DISCLAIMER_WRAPPER_NODE } from './CreditAssessment';\nimport Loan from './Loan';\nimport StageCompletedFinancial from './StageCompletedFinancial';\nimport { extractLoanIndex, extractPaymentType } from './utils';\n\nconst PROCEED = 'button-financial-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst FINANCIAL_OPTION_ID = 'financial-option';\nconst FINANCIAL_OPTION_NODE = `${FINANCIAL_OPTION_ID}-node`;\n\nconst FINANCIAL_OPTION_SECOND_ID = 'financial-option-second';\nconst FINANCIAL_OPTION_SECOND_NODE = `${FINANCIAL_OPTION_SECOND_ID}-node`;\n\nconst RADIO_FINANCIAL_CASH = 'radio-financial-cash';\nconst RADIO_FINANCIAL_LOAN = 'radio-financial-loan';\nconst RADIO_FINANCIAL_LEASE = 'radio-financial-lease';\n\nconst PAYMENT_NODE = 'payment-node';\nconst PAYMENT_NODE_DISCLAIMER = DISCLAIMER_WRAPPER_NODE;\n\ninterface FinancialProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\n\nclass Financial extends HtmlNode {\n  private readonly props: FinancialProps;\n  private paymentType?: PaymentType;\n\n  constructor(element: HTMLElement, props: FinancialProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      const state = this.props.store.getState();\n      this.paymentType = state.paymentType;\n      this.render();\n    });\n\n    const state = this.props.store.getState();\n    const { paymentType } = state;\n\n    this.paymentType = paymentType;\n    this.render();\n  }\n\n  private onChange(e: Event) {\n    resetPaymentLookupResponse()(this.props.store.dispatch);\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const value = currentTarget.value as PaymentType;\n    this.paymentType = value;\n\n    this.render(true);\n    const _paymentType = extractPaymentType(this.paymentType);\n\n    switch (_paymentType) {\n      case PaymentType.Cash:\n        ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_CASH_SELECTED, EcomStep.FINANCIAL);\n        break;\n      case PaymentType.Lease:\n        ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LEASE_SELECTED, EcomStep.FINANCIAL);\n        break;\n      case PaymentType.Loan:\n        ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LOAN_SELECTED, EcomStep.FINANCIAL);\n      default:\n        break;\n    }\n  }\n\n  private onProceed() {\n    const _paymentType = extractPaymentType(this.paymentType);\n    if (this.paymentType && _paymentType) {\n      switch (_paymentType) {\n        case PaymentType.Cash:\n          ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_CASH_SET, EcomStep.FINANCIAL);\n          break;\n        case PaymentType.Lease:\n          ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LEASE_SET, EcomStep.FINANCIAL);\n          break;\n        case PaymentType.Loan:\n          ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LOAN_SET, EcomStep.FINANCIAL);\n        default:\n          break;\n      }\n      setFinancial(this.paymentType, this.props.lastStage)(this.props.store.dispatch);\n    }\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_EDIT, EcomStep.FINANCIAL);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  render(preventScrollIntoView?: boolean) {\n    const state = this.props.store.getState();\n    const { id, order, paymentLookupResponse } = state;\n    if (!order) throw 'No order available';\n\n    const paymentOptions = order.paymentOptions;\n\n    const completed = state.topNavigation.stage > this.props.index;\n    const content = ListItem(this.node, {\n      completed,\n      title: i18next.t('financial.heading'),\n      active: state.navigation.stage === this.props.index,\n      id: 'financial',\n      index: this.props.index,\n    });\n\n    const part = document.createElement('div');\n\n    const _paymentType = extractPaymentType(this.paymentType);\n    if (\n      (state.navigation.stage > this.props.index ||\n        (completed && state.navigation.stage !== this.props.index)) &&\n      _paymentType\n    ) {\n      const loan = paymentOptions.find((x) => x.type === PaymentType.Loan);\n      new StageCompletedFinancial(content, {\n        store: this.props.store,\n        loan,\n        paymentType: _paymentType,\n        paymentLookupResponse: paymentLookupResponse || loan?.loanDetails,\n        onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n      });\n    } else if (state.navigation.stage === this.props.index) {\n      const vehicle = state.order?.orderVehicle;\n      const cash = paymentOptions.find((x) => x.type === PaymentType.Cash);\n      const loans = paymentOptions.filter((x) => {\n        switch (this.props.marketCode) {\n          case 'NO':\n            return x.type === PaymentType.Loan && !x.loanDetails?.shouldUseCreditScoring;\n          default:\n            return x.type === PaymentType.Loan;\n        }\n      });\n      const lease = paymentOptions.find((x) => x.type === PaymentType.Lease);\n\n      part.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('financial.howToFinance', { vehicleTitle: vehicle?.title, vehicleDescription: formatShortDescription(vehicle) })}</h4>\n        </div>\n\n        ${\n          cash || !!loans.length\n            ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${FINANCIAL_OPTION_NODE}\"></div>`\n            : ''\n        }\n        ${\n          lease\n            ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${FINANCIAL_OPTION_SECOND_NODE}\"></div>`\n            : ''\n        }\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\" role=\"form\" id=\"${PAYMENT_NODE}\" aria-describedby=\"${PAYMENT_NODE_DISCLAIMER}\"></div>\n        ${\n          _paymentType !== PaymentType.Loan\n            ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>`\n            : ''\n        }\n        \n      `;\n\n      content.appendChild(part);\n\n      const contactInformation = order.contactInformation;\n\n      const firstGroupOptions: RadioItem[] = [];\n      if (cash) {\n        firstGroupOptions.push({\n          id: RADIO_FINANCIAL_CASH,\n          value: PaymentType.Cash,\n          title: i18next.t('financial.cash'),\n          description: `\n            <div class=\"waykeecom-box\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <ul class=\"waykeecom-content__ul\">\n                  <li class=\"waykeecom-content__li\">${i18next.t('financial.cashDescription', { contactName: contactInformation?.name })}</li>\n                </ul>\n              </div>\n            </div>`,\n          meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(cash.price, {\n            postfix: cash.unit,\n          })}</div>`,\n        });\n      }\n\n      loans.forEach((loan, index) => {\n        const loanPrice = loan.price;\n        const duration = loan.loanDetails?.durationSpec.default;\n        const interest = loan.loanDetails?.interests.interest || NaN;\n        const getCreditAmount = loan.loanDetails?.creditAmount || NaN;\n        const shouldUseCreditScoring = loan.loanDetails?.shouldUseCreditScoring;\n\n        firstGroupOptions.push({\n          id: `${RADIO_FINANCIAL_LOAN}-${index}`,\n          value: `${PaymentType.Loan}-${index}`,\n          title: loan.name,\n          description: `\n          <div class=\"waykeecom-box\">\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <ul class=\"waykeecom-content__ul\">\n                ${\n                  shouldUseCreditScoring\n                    ? `\n                  <li class=\"waykeecom-content__li\">\n                    <div>\n                      <span class=\"waykeecom-text waykeecom-text--valign-middle\">${i18next.t('financial.loanApplicationOnline')} </span>\n                      <img src=\"${Image.bankid}\" alt=\"BankID logotyp\" class=\"waykeecom-image waykeecom-image--inline\" aria-hidden=\"true\" />\n                      <span class=\"waykeecom-text waykeecom-text--valign-middle\">${i18next.t('financial.loanApplicationResponse')}</span>\n                    </div>\n                  </li>\n                  `\n                    : ''\n                }\n                  <li class=\"waykeecom-content__li\">${i18next.t('financial.paymentAtContract', { contactName: contactInformation?.name })}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('financial.calculatedOn', { creditAmount: prettyNumber(getCreditAmount, { postfix: 'kr' }), duration, interest: prettyNumber(interest * 100, { decimals: 2 }) })}</li>\n                </ul>\n              </div>\n            </div>\n            ${\n              loan.logo\n                ? `<div class=\"waykeecom-stack waykeecom-stack--2\">\n                  <div class=\"waykeecom-align waykeecom-align--center\">\n                    <img src=\"${loan.logo}\" alt=\"${loan.name} logotyp\" class=\"waykeecom-image waykeecom-image--loan-logo\" />\n                  </div>\n                </div>`\n                : ''\n            }\n          </div>\n          `,\n          meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(loanPrice, {\n            postfix: loan.unit,\n          })}</div>`,\n        });\n      });\n\n      if (cash || !!loans.length) {\n        new InputRadioGroup(part.querySelector<HTMLDivElement>(`#${FINANCIAL_OPTION_NODE}`), {\n          title: i18next.t('financial.buyCar'),\n          checked: this.paymentType as string,\n          name: 'paymentType',\n          information: `\n            <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n              <p class=\"waykeecom-content__p\">${i18next.t('financial.buyCarDescription')}</p>\n            </div>\n          `,\n          footer:\n            this.props.marketCode === 'SE'\n              ? `\n              <div class=\"waykeecom-box\" role=\"status\" aria-live=\"polite\">\n              <div class=\"waykeecom-creditor-disclaimer\">\n                <div class=\"waykeecom-creditor-disclaimer__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                      stroke-width=\"4\"\n                      stroke-linecap=\"round\"\n                      stroke-linejoin=\"round\"\n                    />\n                  </svg>\n                </div>\n                <div class=\"waykeecom-creditor-disclaimer__body\">\n                  <div class=\"waykeecom-creditor-disclaimer__heading\">Att l\u00E5na kostar pengar!</div>\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                    <a\n                      href=\"https://www.konsumentverket.se/\"\n                      title=\"Konsumentverket\"\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer nofollow\"\n                      class=\"waykeecom-link waykeecom-link--no-external-icon\"\n                    >\n                      konsumentverket.se\n                    </a>.\n                  </p>\n                </div>\n              </div>\n            </div>\n          `\n              : '',\n          options: firstGroupOptions,\n          onClick: (e) => this.onChange(e),\n          onClickInformation: () => {\n            ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_INFORMATION_TOGGLE, EcomStep.FINANCIAL);\n          },\n        });\n      }\n\n      const secondGroupOptions: RadioItem[] = [];\n      if (lease) {\n        secondGroupOptions.push({\n          id: RADIO_FINANCIAL_LEASE,\n          title: i18next.t('financial.privateLeasing'),\n          value: PaymentType.Lease,\n          meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${i18next.t('financial.from')} ${prettyNumber(\n            lease?.price,\n            {\n              postfix: lease.unit,\n            }\n          )}</div>`,\n        });\n        new InputRadioGroup(\n          part.querySelector<HTMLDivElement>(`#${FINANCIAL_OPTION_SECOND_NODE}`),\n          {\n            title: i18next.t('financial.leaseCar'),\n            checked: this.paymentType as string,\n            name: 'paymentType',\n            information: `\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <p class=\"waykeecom-content__p\">${i18next.t('financial.leaseCarDescription')}</p>\n              </div>\n            `,\n            options: secondGroupOptions,\n            onClick: (e) => this.onChange(e),\n          }\n        );\n      }\n\n      const paymentNode = part.querySelector<HTMLDivElement>(`#${PAYMENT_NODE}`);\n      if (paymentNode) {\n        const _paymentType = extractPaymentType(this.paymentType);\n        const loanIndex = extractLoanIndex(this.paymentType);\n\n        if (loans.length && _paymentType === PaymentType.Loan && loanIndex !== undefined) {\n          new Loan(paymentNode, {\n            store: this.props.store,\n            loan: JSON.parse(JSON.stringify(loans[loanIndex])),\n            vehicleId: id,\n            paymentLookupResponse,\n            onProceed: () => this.onProceed(),\n          });\n        } else {\n          new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n            title: i18next.t('financial.proceed'),\n            id: PROCEED,\n            disabled: !this.paymentType,\n            onClick: () => this.onProceed(),\n          });\n        }\n      }\n    }\n\n    if (!preventScrollIntoView && state.navigation.stage === this.props.index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default Financial;\n", "import { DrivingDistance } from '@wayke-se/ecom';\nimport { VehicleCondition } from '../@types/TradeIn';\n\nexport const Image = {\n  bankid: 'https://cdn.wayke.se/public-assets/bankid-logo.svg',\n  illustrations: {\n    payment: 'https://cdn.wayke.se/public-assets/payment.svg',\n  },\n};\n\nexport const translateTradeInCondition = {\n  [VehicleCondition.VeryGood]: 'Mycket bra',\n  [VehicleCondition.Good]: 'Bra',\n  [VehicleCondition.Ok]: 'Ok',\n};\n\nexport const translateDrivingDistance = {\n  [DrivingDistance.Between0And1000]: '0\u20131000 mil',\n  [DrivingDistance.Between1000And1500]: '1000\u20131500 mil',\n  [DrivingDistance.Between1500And2000]: '1500\u20132000 mil',\n  [DrivingDistance.Between2000And2500]: '2000\u20132500 mil',\n  [DrivingDistance.Over2500]: '2500+ mil',\n};\n", "import i18next from '@i18n';\nimport {\n  AuthMethod,\n  Employment,\n  HousingType,\n  ICreditAssessmentHouseholdEconomy,\n  ICreditAssessmentInquiry,\n  MaritalStatus,\n  PaymentType,\n} from '@wayke-se/ecom';\nimport { ICreditAssessmentStatus } from '../../../@types/CreditAssessmentStatus';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport Accordion from '../../../Components/Accordion';\nimport BankIdSign from '../../../Components/BankId/BankIdSign';\nimport ButtonBankId from '../../../Components/Button/ButtonBankId';\nimport Disclaimer from '../../../Components/Disclaimer/Disclaimer';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport InputRadioGroup from '../../../Components/Input/InputRadioGroup';\nimport InputSelect from '../../../Components/Input/InputSelect';\nimport { creditAssessmentCancelSigning } from '../../../Data/creditAssessmentCancelSigning';\nimport { creditAssessmentDecline } from '../../../Data/creditAssessmentDecline';\nimport { creditAssessmentGetStatus } from '../../../Data/creditAssessmentGetStatus';\nimport { creditAssessmentNewCase } from '../../../Data/creditAssessmentNewCase';\nimport { creditAssessmentSignCase } from '../../../Data/creditAssessmentSignCase';\nimport { setCreditAssessmentResponse } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport { convertCreditAssessmentStatusResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { registerInterval } from '../../../Utils/intervals';\nimport { isMobile } from '../../../Utils/isMobile';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport { scrollTop } from '../../../Utils/scroll';\nimport { validationMethods } from '../../../Utils/validationMethods';\nimport CreditAssessmentResult from './CreditAssessmentResult';\nimport createTerm from './utils';\n\nconst MARITAL_STATUS = `credit-assessment-martial-status`;\nconst MARITAL_STATUS_NODE = `${MARITAL_STATUS}-node`;\n\nconst INCOME = `credit-assessment-income`;\nconst INCOME_NODE = `${INCOME}-node`;\n\nconst EMPLOYMENT = `credit-assessment-employment`;\nconst EMPLOYMENT_NODE = `${EMPLOYMENT}-node`;\n\nconst HOUSEHOLD_CHILDREN = `credit-assessment-household-children`;\nconst HOUSEHOLD_CHILDREN_NODE = `${HOUSEHOLD_CHILDREN}-node`;\n\nconst HOUSING_COST = `credit-assessment-housing-cost`;\nconst HOUSING_COST_NODE = `${HOUSING_COST}-node`;\n\nconst DEBT_SPECIFICATION_CARD_CREDIT = `credit-assessment-debt-specification-card-credit`;\nconst DEBT_SPECIFICATION_CARD_CREDIT_NODE = `${DEBT_SPECIFICATION_CARD_CREDIT}-node`;\n\nconst DEBT_SPECIFICATION_CAR_LOAN = `credit-assessment-debt-specification-car-loan`;\nconst DEBT_SPECIFICATION_CAR_LOAN_NODE = `${DEBT_SPECIFICATION_CAR_LOAN}-node`;\n\nconst DEBT_SPECIFICATION_COLLATERAL = `credit-assessment-debt-specification-collateral`;\nconst DEBT_SPECIFICATION_COLLATERAL_NODE = `${DEBT_SPECIFICATION_COLLATERAL}-node`;\n\nconst DEBT_SPECIFICATION_LEASING_FEES = `credit-assessment-debt-specification-leasing-fees`;\nconst DEBT_SPECIFICATION_LEASING_FEES_NODE = `${DEBT_SPECIFICATION_LEASING_FEES}-node`;\n\nconst DEBT_SPECIFICATION_PRIVATE_LOAN = `credit-assessment-debt-specification-private-loan`;\nconst DEBT_SPECIFICATION_PRIVATE_LOAN_NODE = `${DEBT_SPECIFICATION_PRIVATE_LOAN}-node`;\n\nconst HOUSING_TYPE = `credit-assessment-housing-type`;\nconst HOUSING_TYPE_NODE = `${HOUSING_TYPE}-node`;\n\nconst PERFORM_APPLICATION = `credit-assessment-perform-application`;\nconst PERFORM_APPLICATION_NODE = `${PERFORM_APPLICATION}-node`;\n\nexport const DISCLAIMER_WRAPPER_NODE = `credit-assessment-disclaimer`;\nconst DISCLAIMER_NODE = `disclaimer-node`;\nconst DISCLAIMER_SAFE_NODE = `disclaimer-safe-node`;\n\nconst WHY_DESCRIPTION = `why-description-node`;\n\nexport interface CreditAssessmentHouseholdEconomyValidation {\n  maritalStatus: boolean;\n  income: boolean;\n  employment: boolean;\n  householdChildren: boolean;\n  housingCost: boolean;\n  'debtSpecification.cardCredits': boolean;\n  'debtSpecification.vehicleLoan': boolean;\n  'debtSpecification.collateral': boolean;\n  'debtSpecification.leasingFees': boolean;\n  'debtSpecification.privateLoan': boolean;\n  housingType: boolean;\n}\n\ninterface CreditAssessmentHouseholdEconomy {\n  maritalStatus: string;\n  income: string;\n  employment: string;\n  householdChildren: string;\n  housingCost: string;\n  'debtSpecification.cardCredits': string;\n  'debtSpecification.vehicleLoan': string;\n  'debtSpecification.collateral': string;\n  'debtSpecification.leasingFees': string;\n  'debtSpecification.privateLoan': string;\n  housingType: string;\n}\n\ninterface CreditAssessmentHouseholdEconomyState {\n  value: CreditAssessmentHouseholdEconomy;\n  validation: CreditAssessmentHouseholdEconomyValidation;\n  interact: CreditAssessmentHouseholdEconomyValidation;\n}\n\nconst validation = {\n  maritalStatus: validationMethods.requiredAssessmentMaritalStatus,\n  income: validationMethods.requiredNumberGreaterOrEqualThanZero,\n  employment: validationMethods.requiredAssessmentEmplyment,\n  householdChildren: validationMethods.requiredNumberGreaterOrEqualThanZero,\n  housingCost: validationMethods.requiredNumberGreaterOrEqualThanZero,\n  'debtSpecification.cardCredits': validationMethods.optionalNumberGreaterOrEqualThanZero,\n  'debtSpecification.vehicleLoan': validationMethods.optionalNumberGreaterOrEqualThanZero,\n  'debtSpecification.collateral': validationMethods.optionalNumberGreaterOrEqualThanZero,\n  'debtSpecification.leasingFees': validationMethods.optionalNumberGreaterOrEqualThanZero,\n  'debtSpecification.privateLoan': validationMethods.optionalNumberGreaterOrEqualThanZero,\n  housingType: validationMethods.requiredHousingType,\n};\n\nconst mock: ICreditAssessmentHouseholdEconomy = {\n  maritalStatus: MaritalStatus.Married,\n  income: 50000,\n  employment: Employment.FullTimeEmployed,\n  householdChildren: -1,\n  housingCost: 2000,\n  debtSpecification: {\n    cardCredits: 0,\n    vehicleLoan: 0,\n    collateral: 0,\n    leasingFees: 0,\n    privateLoan: 0,\n  },\n  housingType: HousingType.Apartment,\n};\n\nconst getMock = (): ICreditAssessmentHouseholdEconomy | undefined => {\n  return location.hostname === 'localhost' ? { ...mock } : undefined;\n};\n\nconst initalState = (\n  creditAssessmentHouseholdEconomy?: ICreditAssessmentHouseholdEconomy\n): CreditAssessmentHouseholdEconomyState => {\n  const value: CreditAssessmentHouseholdEconomy = {\n    maritalStatus: creditAssessmentHouseholdEconomy?.maritalStatus || '',\n    income: creditAssessmentHouseholdEconomy?.income.toString() || '',\n    employment: creditAssessmentHouseholdEconomy?.employment.toString() || '',\n    householdChildren: creditAssessmentHouseholdEconomy?.householdChildren.toString() || '-1',\n    housingCost: creditAssessmentHouseholdEconomy?.housingCost.toString() || '',\n    'debtSpecification.cardCredits':\n      creditAssessmentHouseholdEconomy?.debtSpecification.cardCredits.toString() || '',\n    'debtSpecification.vehicleLoan':\n      creditAssessmentHouseholdEconomy?.debtSpecification.vehicleLoan.toString() || '',\n    'debtSpecification.collateral':\n      creditAssessmentHouseholdEconomy?.debtSpecification.collateral.toString() || '',\n    'debtSpecification.leasingFees':\n      creditAssessmentHouseholdEconomy?.debtSpecification.leasingFees.toString() || '',\n    'debtSpecification.privateLoan':\n      creditAssessmentHouseholdEconomy?.debtSpecification.privateLoan.toString() || '',\n    housingType: creditAssessmentHouseholdEconomy?.housingType.toString() || '',\n  };\n  return {\n    value,\n    validation: {\n      maritalStatus: validation.maritalStatus(value.maritalStatus),\n      income: validation.income(value.income),\n      employment: validation.employment(value.employment),\n      householdChildren: validation.householdChildren(value.householdChildren),\n      housingCost: validation.housingCost(value.housingCost),\n      'debtSpecification.cardCredits': validation['debtSpecification.cardCredits'](\n        value['debtSpecification.cardCredits']\n      ),\n      'debtSpecification.vehicleLoan': validation['debtSpecification.vehicleLoan'](\n        value['debtSpecification.vehicleLoan']\n      ),\n      'debtSpecification.collateral': validation['debtSpecification.collateral'](\n        value['debtSpecification.collateral']\n      ),\n      'debtSpecification.leasingFees': validation['debtSpecification.leasingFees'](\n        value['debtSpecification.leasingFees']\n      ),\n      'debtSpecification.privateLoan': validation['debtSpecification.privateLoan'](\n        value['debtSpecification.privateLoan']\n      ),\n      housingType: validation.housingType(value.housingType),\n    },\n    interact: {\n      maritalStatus: false,\n      income: false,\n      employment: false,\n      householdChildren: false,\n      housingCost: false,\n      'debtSpecification.cardCredits': false,\n      'debtSpecification.vehicleLoan': false,\n      'debtSpecification.collateral': false,\n      'debtSpecification.leasingFees': false,\n      'debtSpecification.privateLoan': false,\n      housingType: false,\n    },\n  };\n};\n\ninterface CreditAssessmentProps {\n  readonly store: WaykeStore;\n  readonly loan: PaymentOption;\n  readonly paymentLookupResponse: PaymentLookup;\n  readonly onProceed: () => void;\n}\n\nclass CreditAssessment extends HtmlNode {\n  private readonly props: CreditAssessmentProps;\n  private state: CreditAssessmentHouseholdEconomyState;\n  private bankidStatusInterval?: NodeJS.Timeout;\n  private view: number = 1;\n  private contexts: {\n    maritalStatus?: InputRadioGroup;\n    income?: InputField;\n    employment?: InputRadioGroup;\n    householdChildren?: InputSelect;\n    householdIncome?: InputField;\n    housingCost?: InputField;\n    'debtSpecification.cardCredits'?: InputField;\n    'debtSpecification.vehicleLoan'?: InputField;\n    'debtSpecification.collateral'?: InputField;\n    'debtSpecification.leasingFees'?: InputField;\n    'debtSpecification.privateLoan'?: InputField;\n    housingType?: InputRadioGroup;\n    performApplicationButton?: ButtonBankId;\n    bankId?: BankIdSign;\n  } = {};\n  private caseError?: string;\n  private bankidError = false;\n  private signed = false;\n  private creditAssessmentResponse?: ICreditAssessmentStatus;\n\n  constructor(element: HTMLDivElement | undefined | null, props: CreditAssessmentProps) {\n    super(element);\n    this.props = props;\n    this.state = initalState(getMock());\n\n    this.render();\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof CreditAssessmentHouseholdEconomyValidation;\n\n    const value = currentTarget.value;\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onBlur(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof CreditAssessmentHouseholdEconomyValidation;\n\n    this.state.interact[name] = true;\n    this.state.validation[name] = validation[name](this.state.value[name]);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onChangeSelect(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as 'householdChildren';\n\n    const value = currentTarget.value;\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n\n    this.updateProceedButton();\n  }\n\n  private onChangeRadio(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as keyof Omit<\n      CreditAssessmentHouseholdEconomyValidation,\n      | 'income'\n      | 'householdIncome'\n      | 'housingCost'\n      | 'householdChildren'\n      | 'debtSpecification.cardCredits'\n      | 'debtSpecification.vehicleLoan'\n      | 'debtSpecification.collateral'\n      | 'debtSpecification.leasingFees'\n      | 'debtSpecification.privateLoan'\n    >;\n\n    const value = currentTarget.value;\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n\n    if (name === 'housingType') {\n      if ((currentTarget.value as HousingType) === HousingType.SingleFamily) {\n        this.state.value.housingCost = '0';\n        this.state.validation.housingCost = validation.housingCost(this.state.value.housingCost);\n      } else {\n        this.state.value.housingCost = '';\n        this.state.validation.housingCost = validation.housingCost(this.state.value.housingCost);\n      }\n      this.render();\n    }\n\n    this.updateProceedButton();\n  }\n\n  private updateUiError(name: keyof CreditAssessmentHouseholdEconomyValidation) {\n    this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n  }\n\n  private updateProceedButton() {\n    this.contexts.performApplicationButton?.disabled(\n      !this.state.validation.maritalStatus ||\n        !this.state.validation.income ||\n        !this.state.validation.employment ||\n        !this.state.validation.householdChildren ||\n        !this.state.validation.housingCost ||\n        !this.state.validation['debtSpecification.cardCredits'] ||\n        !this.state.validation['debtSpecification.vehicleLoan'] ||\n        !this.state.validation['debtSpecification.collateral'] ||\n        !this.state.validation['debtSpecification.leasingFees'] ||\n        !this.state.validation['debtSpecification.privateLoan'] ||\n        !this.state.validation.housingType\n    );\n  }\n\n  private async onAbort() {\n    ecomEvent(\n      EcomView.MAIN,\n      EcomEvent.FINANCIAL_CREDIT_SCORING_ABORTED,\n      EcomStep.FINANCIAL_CREDIT_SCORING\n    );\n    const { store } = this.props;\n    this.view = 1;\n    if (this.bankidStatusInterval) {\n      clearInterval(this.bankidStatusInterval);\n    }\n\n    const caseId = store.getState().caseId;\n    if (caseId) {\n      await creditAssessmentCancelSigning(caseId);\n      await creditAssessmentDecline(caseId);\n      setCreditAssessmentResponse()(store.dispatch);\n    }\n    destroyPortal();\n    this.creditAssessmentResponse = undefined;\n    this.render(true);\n  }\n\n  private bankIdStatus(caseId: string, method: AuthMethod, supressTracking = false) {\n    if (!supressTracking) {\n      ecomEvent(\n        EcomView.MAIN,\n        method === AuthMethod.SameDevice\n          ? EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED\n          : EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED,\n        EcomStep.FINANCIAL_CREDIT_SCORING\n      );\n    }\n    const loan = this.props.store\n      .getState()\n      .order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n    this.bankidStatusInterval = setInterval(async () => {\n      try {\n        const response = await creditAssessmentGetStatus(caseId);\n        const status = response.getStatus();\n        if (!this.signed && status === 'signed') {\n          ecomEvent(\n            EcomView.MAIN,\n            method === AuthMethod.SameDevice\n              ? EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED\n              : EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED,\n            EcomStep.FINANCIAL_CREDIT_SCORING\n          );\n\n          this.signed = true;\n          this.contexts.bankId?.setTitle(\n            i18next.t('creditAssessment.waitingFor', { name: loan?.name })\n          );\n          this.contexts.bankId?.setDescription(\n            i18next.t('creditAssessment.fetchingInfo', { name: loan?.name })\n          );\n          this.contexts.bankId?.setFinalizing(true);\n          ecomEvent(\n            EcomView.MAIN,\n            EcomEvent.FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED,\n            EcomStep.FINANCIAL_CREDIT_SCORING\n          );\n        }\n\n        if (status === 'signingFailed') {\n          clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n          this.contexts.bankId?.setFinalizing(false);\n          this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.errorOccurred'));\n          return;\n        }\n\n        if (response.isScored()) {\n          ecomEvent(\n            EcomView.MAIN,\n            EcomEvent.FINANCIAL_CREDIT_SCORING_SIGNING_SCORED,\n            EcomStep.FINANCIAL_CREDIT_SCORING\n          );\n          if (this.bankidStatusInterval) {\n            clearInterval(this.bankidStatusInterval);\n          }\n          this.view = 3;\n          this.creditAssessmentResponse = convertCreditAssessmentStatusResponse(response);\n          setCreditAssessmentResponse(\n            caseId,\n            this.creditAssessmentResponse\n          )(this.props.store.dispatch);\n          destroyPortal();\n          this.render();\n        } else if (response.hasScoringError()) {\n          clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n          this.contexts.bankId?.setFinalizing(false);\n          this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.errorOccurred'));\n        }\n        if (!this.signed && method === AuthMethod.QrCode) {\n          const qrCode = response.getQrCode() as string;\n          this.contexts.bankId?.update(method, qrCode);\n        }\n      } catch (_e) {\n        clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n        this.contexts.bankId?.setFinalizing(false);\n        this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.bankIdStatusError'));\n      }\n    }, 1000);\n    registerInterval('bankidStatusInterval-credit', this.bankidStatusInterval as unknown as number);\n  }\n\n  private async onStartBankIdAuth(method: AuthMethod, supressTracking = false) {\n    const caseId = this.props.store.getState().caseId;\n    if (!caseId) throw 'Missing caseID';\n    if (this.bankidStatusInterval) {\n      clearInterval(this.bankidStatusInterval);\n    }\n\n    try {\n      if (!supressTracking) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED,\n          EcomStep.FINANCIAL_CREDIT_SCORING\n        );\n      }\n      this.contexts.bankId?.update(method);\n      const response = await creditAssessmentSignCase({ caseId, method });\n      if (!supressTracking) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED,\n          EcomStep.FINANCIAL_CREDIT_SCORING\n        );\n      }\n      this.bankIdStatus(caseId, method, supressTracking);\n\n      if (method === AuthMethod.SameDevice) {\n        const autoLaunchUrl = response.getAutoLaunchUrl() as string;\n        this.contexts.bankId?.update(method, autoLaunchUrl);\n      } else {\n        const qrCode = response.getQrCode() as string;\n        this.contexts.bankId?.update(method, qrCode);\n      }\n    } catch (_e) {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED,\n        EcomStep.FINANCIAL_CREDIT_SCORING\n      );\n      if (this.bankidStatusInterval) {\n        clearInterval(this.bankidStatusInterval);\n      }\n      this.bankidError = true;\n      this.view = 1;\n      destroyPortal();\n      this.render(true);\n    }\n  }\n\n  private async startBankId(method: AuthMethod) {\n    const { store } = this.props;\n    this.caseError = undefined;\n    this.bankidError = false;\n    this.signed = false;\n    const currentCaseId = store.getState().caseId;\n    if (this.bankidStatusInterval) {\n      clearInterval(this.bankidStatusInterval);\n      if (currentCaseId) {\n        await creditAssessmentCancelSigning(currentCaseId);\n        await creditAssessmentDecline(currentCaseId);\n        setCreditAssessmentResponse()(store.dispatch);\n      }\n    }\n\n    if (currentCaseId) {\n      const caseId = await this.newCreditAssessmentCase();\n      setCreditAssessmentResponse(caseId)(store.dispatch);\n      this.onStartBankIdAuth(method);\n    } else {\n      try {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED,\n          EcomStep.FINANCIAL_CREDIT_SCORING\n        );\n        const caseId = await this.newCreditAssessmentCase();\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED,\n          EcomStep.FINANCIAL_CREDIT_SCORING\n        );\n        if (caseId) {\n          setCreditAssessmentResponse(caseId)(store.dispatch);\n          this.onStartBankIdAuth(method);\n        }\n      } catch (_e) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED,\n          EcomStep.FINANCIAL_CREDIT_SCORING\n        );\n      }\n    }\n  }\n\n  private async newCreditAssessmentCase() {\n    try {\n      const { store, loan, paymentLookupResponse: initialPaymentLookupResponse } = this.props;\n\n      this.contexts.performApplicationButton?.disabled(true);\n      const { customer, paymentLookupResponse: updatePaymentLookupResponse } = store.getState();\n\n      const paymentLookupResponse = updatePaymentLookupResponse || initialPaymentLookupResponse;\n\n      const { monthlyCost } = paymentLookupResponse.costs;\n      const { interest } = paymentLookupResponse.interests;\n\n      const downPayment = paymentLookupResponse.downPaymentSpec.current;\n      const duration = paymentLookupResponse.durationSpec.current;\n      const creditAmount = paymentLookupResponse.creditAmount;\n      const price = paymentLookupResponse.price;\n      const financialProductId = paymentLookupResponse.financialProductCode as string;\n\n      const householdEconomy: ICreditAssessmentHouseholdEconomy = {\n        employment: this.state.value.employment as Employment,\n        householdChildren: parseInt(this.state.value.householdChildren, 10),\n        housingCost: parseInt(this.state.value.housingCost || '0', 10),\n        housingType: this.state.value.housingType as HousingType,\n        income: parseInt(this.state.value.income || '0', 10),\n        maritalStatus: this.state.value.maritalStatus as MaritalStatus,\n        debtSpecification: {\n          cardCredits: parseInt(this.state.value['debtSpecification.cardCredits'] || '0', 10),\n          vehicleLoan: parseInt(this.state.value['debtSpecification.vehicleLoan'] || '0', 10),\n          collateral: parseInt(this.state.value['debtSpecification.collateral'] || '0', 10),\n          leasingFees: parseInt(this.state.value['debtSpecification.leasingFees'] || '0', 10),\n          privateLoan: parseInt(this.state.value['debtSpecification.privateLoan'] || '0', 10),\n        },\n      };\n\n      const assessmentCase: ICreditAssessmentInquiry = {\n        customer: {\n          ...customer,\n        },\n        householdEconomy,\n        externalId: loan.externalId as string,\n        loan: {\n          downPayment,\n          interestRate: interest,\n          credit: creditAmount,\n          financialProductId,\n          monthlyCost,\n          price,\n          term: createTerm(duration),\n        },\n      };\n\n      const response = await creditAssessmentNewCase(assessmentCase);\n      return response.caseId;\n    } catch (e) {\n      if (this.bankidStatusInterval) {\n        clearInterval(this.bankidStatusInterval);\n      }\n      this.caseError = (e as { message?: string })?.message || '';\n      this.view = 1;\n      this.render(true);\n      return;\n    } finally {\n      this.contexts.performApplicationButton?.disabled(false);\n    }\n  }\n\n  private render(scrollIntoView?: boolean) {\n    const { store, paymentLookupResponse: initialPaymentLookupResponse, onProceed } = this.props;\n\n    const mobile = isMobile();\n    const { order, paymentLookupResponse: updatePaymentLookupResponse } = store.getState();\n    const paymentLookupResponse = updatePaymentLookupResponse || initialPaymentLookupResponse;\n\n    const loan = order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n    const creditAmount = paymentLookupResponse.creditAmount;\n    const branchName = order?.contactInformation?.name;\n    if (this.view === 3 && this.creditAssessmentResponse) {\n      new CreditAssessmentResult(createPortal(), {\n        store,\n        creditAssessmentResponse: this.creditAssessmentResponse,\n        onProceed: () => {\n          destroyPortal();\n          onProceed();\n        },\n        onGoBack: () => this.onAbort(),\n      });\n    } else if (this.view === 2) {\n      this.contexts.bankId = new BankIdSign(createPortal(), {\n        method: mobile ? AuthMethod.SameDevice : AuthMethod.QrCode,\n        descriptionQrCode: i18next.t('creditAssessment.descriptionQrCode'),\n        descriptionSameDevice: i18next.t('creditAssessment.descriptionSameDevice'),\n        onAbort: () => this.onAbort(),\n        onStart: (method: AuthMethod) => this.startBankId(method),\n      });\n      scrollTop();\n    } else {\n      this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h5 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('creditAssessment.loanApplication')}</h5>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.loanApplicationDescription', { name: loan?.name })}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-balloon waykeecom-balloon--info\" id=\"${WHY_DESCRIPTION}\"></div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.maritalStatus')}</h5>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${MARITAL_STATUS_NODE}\"></div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.employment')}</h5>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${EMPLOYMENT_NODE}\"></div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.children')}</h5>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSEHOLD_CHILDREN_NODE}\"></div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.income')}</h5>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${INCOME_NODE}\"></div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.housingType')}</h5>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.housingTypeDescription')}</p>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSING_TYPE_NODE}\"></div>\n      </div>\n\n      ${\n        this.state.value.housingType !== HousingType.SingleFamily\n          ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.housingCost')}</h5>\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSING_COST_NODE}\"></div>\n          </div>\n          `\n          : ''\n      }\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.debtsAndLiabilities')}</h5>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.debtsAndLiabilitiesDescription')}</p>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_PRIVATE_LOAN_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_CAR_LOAN_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_LEASING_FEES_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_CARD_CREDIT_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_COLLATERAL_NODE}\"></div>\n      </div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <hr class=\"waykeecom-separator\" />\n      </div>\n\n      <dl class=\"waykeecom-stack waykeecom-stack--3 waykeecom-text waykeecom-text--align-center\">\n        <dt class=\"waykeecom-stack waykeecom-stack--1 waykeecom-text waykeecom-text--tone-alt waykeecom-text--size-small\">${i18next.t('creditAssessment.totalLoanAmount')}</dt>\n        <dd class=\"waykeecom-stack waykeecom-stack--1 waykeecom-heading waykeecom-heading--2 waykeecom-no-margin\">${prettyNumber(creditAmount, { postfix: 'kr' })}</dd>\n      </dl>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        ${Alert({\n          tone: 'info',\n          polite: true,\n          children: i18next.t('creditAssessment.noPaymentInfo', { name: branchName }),\n        })}\n      </div>\n\n      ${\n        this.caseError\n          ? `\n            <div class=\"waykeecom-stack waykeecom-stack--3\">\n              ${Alert({\n                tone: 'error',\n                children: i18next.t('creditAssessment.caseError', { caseError: this.caseError }),\n              })}\n            </div>\n          `\n          : ''\n      }\n\n      ${\n        this.bankidError\n          ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            ${Alert({\n              tone: 'error',\n              children: i18next.t('creditAssessment.bankIdError'),\n            })}\n          </div>\n          `\n          : ''\n      }\n      \n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PERFORM_APPLICATION_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DISCLAIMER_WRAPPER_NODE}\">\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_SAFE_NODE}\"></div>\n        </div>\n      </div>\n    `;\n\n      this.contexts.maritalStatus = new InputRadioGroup(\n        this.node.querySelector<HTMLDivElement>(`#${MARITAL_STATUS_NODE}`),\n        {\n          checked: this.state.value.maritalStatus as string,\n          name: 'maritalStatus',\n          options: [\n            {\n              id: `maritalStatus-${1}`,\n              value: MaritalStatus.Married,\n              title: i18next.t('creditAssessment.married'),\n            },\n            {\n              id: `maritalStatus-${2}`,\n              value: MaritalStatus.CommonLaw,\n              title: i18next.t('creditAssessment.commonLaw'),\n            },\n            {\n              id: `maritalStatus-${3}`,\n              value: MaritalStatus.Single,\n              title: i18next.t('creditAssessment.single'),\n            },\n          ],\n          onClick: (e) => this.onChangeRadio(e),\n        }\n      );\n\n      this.contexts.income = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${INCOME_NODE}`),\n        {\n          title: i18next.t('creditAssessment.incomePerMonth'),\n          value: this.state.value.income,\n          id: INCOME,\n          error: this.state.interact.income && !this.state.validation.income,\n          errorMessage: i18next.t('creditAssessment.incomeError'),\n          name: 'income',\n          autocomplete: 'off',\n          unit: 'kr',\n          placeholder: '',\n          type: 'number',\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.employment = new InputRadioGroup(\n        this.node.querySelector<HTMLDivElement>(`#${EMPLOYMENT_NODE}`),\n        {\n          checked: this.state.value.employment as string,\n          name: 'employment',\n          options: [\n            {\n              id: `employment-${1}`,\n              value: Employment.FullTimeEmployed,\n              title: i18next.t('creditAssessment.fullTimeEmployed'),\n            },\n            {\n              id: `employment-${2}`,\n              value: Employment.TemporarilyEmployed,\n              title: i18next.t('creditAssessment.temporarilyEmployed'),\n            },\n            {\n              id: `employment-${3}`,\n              value: Employment.SelfEmployed,\n              title: i18next.t('creditAssessment.selfEmployed'),\n            },\n            {\n              id: `employment-${4}`,\n              value: Employment.Retired,\n              title: i18next.t('creditAssessment.retired'),\n            },\n            {\n              id: `employment-${5}`,\n              value: Employment.Student,\n              title: i18next.t('creditAssessment.student'),\n            },\n            {\n              id: `employment-${6}`,\n              value: Employment.Other,\n              title: i18next.t('creditAssessment.other'),\n            },\n          ],\n          onClick: (e) => this.onChangeRadio(e),\n        }\n      );\n\n      this.contexts.housingType = new InputRadioGroup(\n        this.node.querySelector<HTMLDivElement>(`#${HOUSING_TYPE_NODE}`),\n        {\n          title: i18next.t('creditAssessment.housingType'),\n          checked: this.state.value.housingType as string,\n          name: 'housingType',\n          options: [\n            {\n              id: `housingType-${1}`,\n              value: HousingType.SingleFamily,\n              title: i18next.t('creditAssessment.singleFamily'),\n            },\n            {\n              id: `housingType-${2}`,\n              value: HousingType.Condominium,\n              title: i18next.t('creditAssessment.condominium'),\n            },\n            {\n              id: `housingType-${3}`,\n              value: HousingType.Apartment,\n              title: i18next.t('creditAssessment.apartment'),\n            },\n          ],\n          onClick: (e) => this.onChangeRadio(e),\n        }\n      );\n\n      this.contexts.income = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${INCOME_NODE}`),\n        {\n          title: i18next.t('creditAssessment.incomePerMonth'),\n          value: this.state.value.income,\n          id: INCOME,\n          error: this.state.interact.income && !this.state.validation.income,\n          errorMessage: i18next.t('creditAssessment.incomeError'),\n          name: 'income',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          help: i18next.t('creditAssessment.incomeDescription'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.householdChildren = new InputSelect(\n        this.node.querySelector<HTMLDivElement>(`#${HOUSEHOLD_CHILDREN_NODE}`),\n        {\n          title: i18next.t('creditAssessment.childrenUnder18'),\n          value: this.state.value.householdChildren,\n          name: 'householdChildren',\n          error: this.state.interact.householdChildren && !this.state.validation.householdChildren,\n          errorMessage: i18next.t('creditAssessment.childrenError'),\n          options: [\n            {\n              value: '-1',\n              title: i18next.t('creditAssessment.selectChildren'),\n              disabled: true,\n            },\n            {\n              value: '0',\n            },\n            {\n              value: '1',\n            },\n            {\n              value: '2',\n            },\n            {\n              value: '3',\n            },\n            {\n              value: '4',\n            },\n            {\n              value: '5',\n            },\n            {\n              value: '6',\n            },\n            {\n              value: '7',\n            },\n            {\n              value: '8',\n            },\n            {\n              value: '9',\n            },\n            {\n              value: '10',\n              title: i18next.t('creditAssessment.tenOrMore'),\n            },\n          ],\n          onChange: (e) => this.onChangeSelect(e),\n        }\n      );\n\n      const housingCostNode = this.node.querySelector<HTMLDivElement>(`#${HOUSING_COST_NODE}`);\n      if (housingCostNode) {\n        this.contexts.housingCost = new InputField(housingCostNode, {\n          title:\n            this.state.value.housingType === HousingType.Condominium\n              ? i18next.t('creditAssessment.myPartOfMonthlyFee')\n              : this.state.value.housingType === HousingType.Apartment\n                ? i18next.t('creditAssessment.myPartOfMonthlyRent')\n                : i18next.t('creditAssessment.housingCost'),\n          value: this.state.value.housingCost,\n          id: HOUSING_COST,\n          error: this.state.interact.housingCost && !this.state.validation.housingCost,\n          errorMessage: i18next.t('creditAssessment.housingCostError'),\n          name: 'housingCost',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.excludingInterest'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        });\n      }\n\n      this.contexts['debtSpecification.cardCredits'] = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_CARD_CREDIT_NODE}`),\n        {\n          title: i18next.t('creditAssessment.cardCredits'),\n          value: this.state.value['debtSpecification.cardCredits'],\n          id: DEBT_SPECIFICATION_CARD_CREDIT,\n          error:\n            this.state.interact['debtSpecification.cardCredits'] &&\n            !this.state.validation['debtSpecification.cardCredits'],\n          errorMessage: i18next.t('creditAssessment.cardCreditsError'),\n          name: 'debtSpecification.cardCredits',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.totalDebt'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        }\n      );\n\n      this.contexts['debtSpecification.vehicleLoan'] = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_CAR_LOAN_NODE}`),\n        {\n          title: i18next.t('creditAssessment.vehicleLoan'),\n          value: this.state.value['debtSpecification.vehicleLoan'],\n          id: DEBT_SPECIFICATION_CAR_LOAN,\n          error:\n            this.state.interact['debtSpecification.vehicleLoan'] &&\n            !this.state.validation['debtSpecification.vehicleLoan'],\n          errorMessage: i18next.t('creditAssessment.vehicleLoanError'),\n          name: 'debtSpecification.vehicleLoan',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.totalDebt'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        }\n      );\n\n      this.contexts['debtSpecification.collateral'] = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_COLLATERAL_NODE}`),\n        {\n          title: i18next.t('creditAssessment.collateral'),\n          value: this.state.value['debtSpecification.collateral'],\n          id: DEBT_SPECIFICATION_COLLATERAL,\n          error:\n            this.state.interact['debtSpecification.collateral'] &&\n            !this.state.validation['debtSpecification.collateral'],\n          errorMessage: i18next.t('creditAssessment.collateralError'),\n          name: 'debtSpecification.collateral',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.totalAmount'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        }\n      );\n\n      this.contexts['debtSpecification.leasingFees'] = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_LEASING_FEES_NODE}`),\n        {\n          title: i18next.t('creditAssessment.leasingFees'),\n          value: this.state.value['debtSpecification.leasingFees'],\n          id: DEBT_SPECIFICATION_LEASING_FEES,\n          error:\n            this.state.interact['debtSpecification.leasingFees'] &&\n            !this.state.validation['debtSpecification.leasingFees'],\n          errorMessage: i18next.t('creditAssessment.leasingFeesError'),\n          name: 'debtSpecification.leasingFees',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.totalAmount'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        }\n      );\n\n      this.contexts['debtSpecification.privateLoan'] = new InputField(\n        this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_PRIVATE_LOAN_NODE}`),\n        {\n          title: i18next.t('creditAssessment.privateLoan'),\n          value: this.state.value['debtSpecification.privateLoan'],\n          id: DEBT_SPECIFICATION_PRIVATE_LOAN,\n          error:\n            this.state.interact['debtSpecification.privateLoan'] &&\n            !this.state.validation['debtSpecification.privateLoan'],\n          errorMessage: i18next.t('creditAssessment.privateLoanError'),\n          name: 'debtSpecification.privateLoan',\n          autocomplete: 'off',\n          placeholder: '',\n          unit: 'kr',\n          type: 'number',\n          min: 0,\n          help: i18next.t('creditAssessment.totalDebt'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n          onClickInformation: () => {\n            ecomEvent(\n              EcomView.MAIN,\n              EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE,\n              EcomStep.FINANCIAL\n            );\n          },\n        }\n      );\n\n      this.contexts.performApplicationButton = new ButtonBankId(\n        this.node.querySelector<HTMLDivElement>(`#${PERFORM_APPLICATION_NODE}`),\n        {\n          title: i18next.t('creditAssessment.performLoanApplication'),\n          id: PERFORM_APPLICATION,\n          disabled: !(\n            this.state.validation.maritalStatus &&\n            this.state.validation.income &&\n            this.state.validation.employment &&\n            this.state.validation.householdChildren &&\n            this.state.validation.housingCost\n          ),\n          onClick: () => {\n            this.view = 2;\n            this.render();\n          },\n        }\n      );\n\n      new Disclaimer(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_NODE}`), {\n        text: i18next.t('creditAssessment.disclaimer', {\n          name: loan?.name,\n          privacyPolicyUrl: loan?.loanDetails?.privacyPolicyUrl,\n          link: `<a href=\"${loan?.loanDetails?.privacyPolicyUrl}\" title=\"\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('creditAssessment.dataProtectionPolicy')}</a>`,\n          interpolation: { escapeValue: false },\n        }),\n      });\n\n      new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_SAFE_NODE}`), {\n        text: i18next.t('creditAssessment.disclaimerSafe'),\n      });\n\n      new Accordion(this.node.querySelector<HTMLDivElement>(`#${WHY_DESCRIPTION}`), {\n        id: 'accordion-why-description',\n        title: `\n          <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-1\">\n            <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n              <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--info-alt\">\n                <svg\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  viewBox=\"0 0 16 16\"\n                  class=\"waykeecom-icon\"\n                  data-icon=\"Info\"\n                >\n                 <path d=\"M7 6h2v8H7V6zm0-4v2h2V2H7z\" />\n                </svg>\n              </div>\n            </div>\n            <div class=\"waykeecom-hstack__item\">${i18next.t('creditAssessment.whyAnswer')}</div>\n          </div>`,\n        description: `<div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.whyAnswerDescription', { name: loan?.name, link: `<a href=\"${loan?.loanDetails?.moneyLaunderingInformationURL}\" title=\"\" target=\"_blank\" rel=\"noopener norefferer\" class=\"waykeecom-link\">${i18next.t('creditAssessment.readMore')}</a>` })}</p>\n          </div>`,\n        onClick: () => {\n          ecomEvent(\n            EcomView.MAIN,\n            EcomEvent.FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE,\n            EcomStep.FINANCIAL\n          );\n        },\n      });\n\n      if (scrollIntoView || this.caseError || this.bankidError) {\n        this.node.querySelector(`#${PERFORM_APPLICATION_NODE}`)?.scrollIntoView();\n      }\n    }\n  }\n}\n\nexport default CreditAssessment;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface AccordionProps {\n  readonly id: string;\n  readonly title: string;\n  readonly description: string;\n  readonly append?: boolean;\n  readonly onClick?: () => void;\n}\n\nclass Accordion extends HtmlNode {\n  private readonly props: AccordionProps;\n\n  constructor(element: HTMLElement | null, props: AccordionProps) {\n    super(element, props.append ? { htmlTag: 'div', className: 'waykeecom-accordion' } : undefined);\n    this.props = props;\n\n    this.render();\n  }\n\n  render() {\n    const { title, description, onClick } = this.props;\n\n    const content = `\n      <input\n        type=\"checkbox\"\n        id=\"${this.props.id}\"\n        class=\"waykeecom-accordion__checkbox\"\n      />\n      <label class=\"waykeecom-accordion__header\" for=\"${this.props.id}\">\n        <div class=\"waykeecom-accordion__header-title\">${title}</div>\n        <div class=\"waykeecom-accordion__header-icon\" aria-hidden=\"true\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            viewBox=\"0 0 16 16\"\n            class=\"waykeecom-icon\"\n            data-icon=\"Chevron down\"\n          >\n            <path d=\"M6.7 11.4 0 4.6l1.3-1.4L8 10.1l6.7-6.9L16 4.6l-6.7 6.9L8 12.8l-1.3-1.4z\" />\n          </svg>\n        </div>\n      </label>\n      <div class=\"waykeecom-accordion__body\">${description}</div>\n    `;\n\n    if (this.props.append) {\n      this.node.innerHTML = content;\n    }\n\n    this.node.innerHTML = `\n      ${content}\n    `;\n\n    if (onClick) {\n      this.node.querySelector('input')?.addEventListener('click', () => onClick());\n    }\n  }\n}\n\nexport default Accordion;\n", "import { AuthMethod } from '@wayke-se/ecom';\nimport Loader from '../../Templates/Loader';\nimport { isMobile } from '../../Utils/isMobile';\nimport { scrollTop } from '../../Utils/scroll';\nimport ButtonAsLink from '../Button/ButtonAsLink';\nimport HtmlNode from '../Extension/HtmlNode';\nimport BankIdSignQrCode from './BankIdSignQrCode';\nimport BankIdSignSameDevice from './BankIdSignSameDevice';\n\nconst BANKID_START_NODE = `bankid-start-node`;\nconst BANKID_START = `bankid-start`;\n\nconst ABORT = 'bankid-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\nconst AUTH_METHOD_NODE = 'bankid-auth-method-node';\n\ninterface BankIdSignProps {\n  qrCode?: string;\n  autoLaunchUrl?: string;\n  method: AuthMethod;\n  errorMessage?: string;\n  descriptionQrCode: string;\n  descriptionSameDevice: string;\n  info?: string;\n  title?: string;\n  description?: string;\n  finalizing?: boolean;\n  readonly onStart: (method: AuthMethod) => void;\n  readonly onAbort: () => void;\n  readonly onSameDeviceClick?: () => void;\n}\n\nclass BankIdSign extends HtmlNode {\n  private readonly props: BankIdSignProps;\n\n  constructor(element: HTMLElement, props: BankIdSignProps) {\n    super(element);\n    this.props = props;\n\n    /**\n     * setTimeout allows the instance to be created so that if onStart method fails,\n     * it can access the instance method of setErrorMessage\n     */\n    setTimeout(() => {\n      const mobile = isMobile();\n      if (mobile) {\n        this.props.onStart(AuthMethod.SameDevice);\n      } else {\n        this.props.onStart(AuthMethod.QrCode);\n      }\n    }, 1);\n\n    this.render();\n    scrollTop();\n  }\n\n  update(method: AuthMethod, value?: string) {\n    this.props.errorMessage = undefined;\n    this.props.method = method;\n    switch (method) {\n      case AuthMethod.QrCode:\n        this.props.autoLaunchUrl = undefined;\n        this.props.qrCode = value || this.props.qrCode;\n        break;\n      case AuthMethod.SameDevice:\n        this.props.qrCode = undefined;\n        this.props.autoLaunchUrl = value || this.props.autoLaunchUrl;\n        break;\n      default:\n        break;\n    }\n    this.render();\n  }\n\n  setErrorMessage(errorMessage?: string) {\n    this.props.errorMessage = errorMessage;\n    this.render();\n  }\n\n  setInfo(info?: string) {\n    if (info !== this.props.info) {\n      this.props.info = info;\n      this.render();\n    }\n  }\n\n  setTitle(title?: string) {\n    if (title !== this.props.title) {\n      this.props.title = title;\n      this.render();\n    }\n  }\n\n  setDescription(description?: string) {\n    if (description !== this.props.description) {\n      this.props.description = description;\n      this.render();\n    }\n  }\n\n  setFinalizing(finalizing?: boolean) {\n    if (finalizing !== this.props.finalizing) {\n      this.props.finalizing = finalizing;\n      this.render();\n    }\n  }\n\n  render() {\n    const {\n      qrCode,\n      autoLaunchUrl,\n      method,\n      errorMessage,\n      descriptionQrCode,\n      descriptionSameDevice,\n      info,\n      title,\n      description,\n      finalizing,\n      onStart,\n      onAbort,\n    } = this.props;\n\n    const methodTitle = title\n      ? title\n      : method === AuthMethod.QrCode\n        ? '\u00D6ppna BankID och scanna QR-koden'\n        : 'Skriv in din s\u00E4kerhetskod i BankID-appen';\n\n    const methodDescription = description\n      ? description\n      : method === AuthMethod.QrCode\n        ? descriptionQrCode\n        : descriptionSameDevice;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-text waykeecom-text--align-center\">\n        <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${methodTitle}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${methodDescription}</p>\n          </div>\n        </div>\n        ${info ? ` <div class=\"waykeecom-stack waykeecom-stack--4\">${info}</div>` : ''}\n\n        ${\n          !finalizing\n            ? `\n              <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${AUTH_METHOD_NODE}\"></div>\n            `\n            : `<div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>`\n        }\n        <div class=\"waykeecom-stack waykeecom-stack--4\">\n          ${\n            !finalizing\n              ? `\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${BANKID_START_NODE}\"></div>\n          `\n              : ''\n          }\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ABORT_NODE}\"></div>\n        </div>\n      </div>\n    `;\n\n    if (!finalizing) {\n      if (method === AuthMethod.SameDevice) {\n        new BankIdSignSameDevice(this.node.querySelector<HTMLDivElement>(`#${AUTH_METHOD_NODE}`), {\n          autoLaunchUrl,\n          errorMessage,\n          onClick: () => this.props?.onSameDeviceClick?.(),\n        });\n      } else if (method === AuthMethod.QrCode) {\n        new BankIdSignQrCode(this.node.querySelector<HTMLDivElement>(`#${AUTH_METHOD_NODE}`), {\n          qrCode,\n          errorMessage,\n        });\n      }\n      const toggleMethodTitle =\n        method === AuthMethod.SameDevice\n          ? 'Mitt BankID \u00E4r p\u00E5 en annan enhet'\n          : '\u00D6ppna BankID p\u00E5 den h\u00E4r enheten';\n      new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${BANKID_START_NODE}`), {\n        title: toggleMethodTitle,\n        id: BANKID_START,\n        onClick: () =>\n          onStart(method === AuthMethod.SameDevice ? AuthMethod.QrCode : AuthMethod.SameDevice),\n      });\n    }\n\n    new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${ABORT_NODE}`), {\n      title: 'Avbryt',\n      id: ABORT,\n      onClick: () => onAbort(),\n    });\n  }\n}\n\nexport default BankIdSign;\n", "export const isMobile = () =>\n  /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n", "import Alert from '../../Templates/Alert';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface BankIdSignQrCodeProps {\n  readonly qrCode?: string;\n  readonly errorMessage?: string;\n}\n\nclass BankIdSignQrCode extends HtmlNode {\n  private readonly props: BankIdSignQrCodeProps;\n\n  constructor(element: HTMLElement | null, props: BankIdSignQrCodeProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { qrCode, errorMessage } = this.props;\n    if (errorMessage) {\n      this.node.innerHTML = Alert({\n        tone: 'error',\n        children: errorMessage,\n      });\n      return;\n    }\n\n    this.node.innerHTML = `\n      ${\n        qrCode\n          ? `\n            <div class=\"waykeecom-stack waykeecom-stack--4\">\n              <div class=\"waykeecom-align waykeecom-align--center\">\n                <img src=\"data:image/png;base64, ${qrCode}\" alt=\"BankID QR\" class=\"waykeecom-qr\" />\n              </div>\n            </div>`\n          : ''\n      }\n      <div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>`;\n  }\n}\n\nexport default BankIdSignQrCode;\n", "// import Attach from '../Extension/Attach';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode, { HtmlNodeSettings } from '../Extension/HtmlNode';\n\ninterface ButtonBankIdProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly htmlNodesettings?: HtmlNodeSettings;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonBankId extends HtmlNode {\n  private readonly props: ButtonBankIdProps;\n\n  constructor(element: HTMLElement | null, props: ButtonBankIdProps) {\n    super(element, props.htmlNodesettings);\n    this.props = props;\n    this.render();\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { title, id, disabled, loading, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`}\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n      >\n        <span class=\"waykeecom-button__content\">\n          ${\n            loading\n              ? Loader({ type: 'inline' })\n              : `\n                <svg\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                  viewBox=\"0 0 16 16\"\n                  class=\"waykeecom-icon\"\n                  data-icon=\"BankID\"\n                >\n                  <path d=\"M4.6 11.3h-4c.1-.5 1.1-6.8 1.1-7.2h.7c.5 0 .9-.2 1.1-.6.2-.3.1-.7-.2-.9 0-.1-.1-.2-.1-.3 0-.2.4-.5.9-.5.3 0 .5.1.7.2.1 0 .1.1.1.2s-.2.3-.3.4c-.6.4-.5.8-.5 1 .1.3.6.5.9.5h.7L5 8.3c-.2 1.6-.4 2.8-.4 3zm-2.3 2.8c.4.1.5.4.5.7-.1.5-.5.8-1 .8H0l.4-2.8H2c.7 0 .9.4.8.7 0 .2-.2.4-.5.6zm-.4.6c0-.2-.1-.4-.4-.4h-.3l-.2.9h.3c.4 0 .5-.2.6-.5zm.1-1.1c0-.2-.1-.4-.4-.4h-.3l-.1.7h.3c.3 0 .5-.1.5-.3zm9.2 2h1l.4-2.8h-1l-.4 2.8zm-1.1-2.2-.8.7.2-1.4h-.8l-.4 2.8h.8l.2-1 .6 1H11l-.8-1.2 1-.9h-1.1zM5.3 15l-.2.6c-.4 0-.6 0-.7-.2-.2.1-.5.2-.7.2-.5 0-.6-.2-.6-.5 0-.1.1-.3.2-.4.3-.2.9-.3 1.2-.4 0-.2-.1-.3-.3-.3-.3 0-.5.1-.9.4l.1-.6c.3-.2.7-.4 1.1-.4.5 0 .9.2.8.7l-.1.6c-.1.3-.1.3.1.3zm-1-.4c-.2.1-.6.1-.7.4 0 .1.1.2.2.2s.3-.1.4-.1v-.2l.1-.3zm11.4-.4c-.1.6-.6 1.3-1.5 1.3h-1.6l.4-2.8h1.4c1.1.1 1.4.9 1.3 1.5zm-1.5-.7h-.3l-.2 1.5h.3c.5 0 .7-.2.8-.7 0-.5-.1-.8-.6-.8zm-6.8-.1c-.3 0-.5.1-.7.3v-.3h-.8l-.3 2.1h.8l.2-1.3c.1-.2.2-.2.4-.2s.2.1.2.3L7 15.5h.8l.2-1.3c.1-.5-.1-.8-.6-.8zm2.9-13h-4l-.5 3.4h.7c.4 0 .7-.2.9-.4.1-.1.1-.2.1-.2 0-.1-.1-.2-.2-.3-.3-.2-.4-.5-.4-.6v-.1c.1-.3.6-.7 1.2-.7.4 0 .7.1.9.3.2.1.2.4.2.6-.1.2-.4.4-.5.5-.4.3-.4.5-.3.6 0 .2.3.3.6.3h1c1.4 0 2.2.7 1.9 2.2-.2 1.4-1.3 2-2.6 2l-.5 3.3h.8c3.2 0 5.8-2.1 6.3-5.3.6-4-1.9-5.6-5.6-5.6z\"/>\n                </svg>`\n          }\n        </span>\n        <span class=\"waykeecom-button__content\">${title}</span>\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonBankId;\n", "import Alert from '../../Templates/Alert';\nimport Loader from '../../Templates/Loader';\nimport { Image } from '../../Utils/constants';\nimport ButtonBankId from '../Button/ButtonBankId';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface BankIdSignSameDeviceProps {\n  readonly autoLaunchUrl?: string;\n  readonly errorMessage?: string;\n  onClick?: () => void;\n}\n\nclass BankIdSignSameDevice extends HtmlNode {\n  private readonly props: BankIdSignSameDeviceProps;\n\n  constructor(element: HTMLElement | null, props: BankIdSignSameDeviceProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { autoLaunchUrl, errorMessage } = this.props;\n    if (errorMessage) {\n      this.node.innerHTML = Alert({\n        tone: 'error',\n        children: errorMessage,\n      });\n      return;\n    }\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--4\">\n        <div class=\"waykeecom-align waykeecom-align--center\">\n          <img src=\"${Image.bankid}\" alt=\"BankID logotyp\" class=\"waykeecom-image\" style=\"width: 130px\" />\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>\n      `;\n\n    new ButtonBankId(this.node, {\n      title: '\u00D6ppna BankID',\n      disabled: !autoLaunchUrl,\n      onClick: () => {\n        window.open(autoLaunchUrl, '_blank');\n        if (this.props.onClick) {\n          this.props.onClick();\n        }\n      },\n      htmlNodesettings: {\n        htmlTag: 'div',\n        className: 'waykeecom-stack waykeecom-stack--4',\n      },\n    });\n  }\n}\n\nexport default BankIdSignSameDevice;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface DisclaimerProps {\n  readonly text: string;\n}\nclass Disclaimer extends HtmlNode {\n  private readonly props: DisclaimerProps;\n\n  constructor(element: HTMLElement | null, props: DisclaimerProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    this.node.innerHTML = `\n      <div class=\"waykeecom-disclaimer\">\n        <div class=\"waykeecom-disclaimer__text\">\n          ${this.props.text}\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default Disclaimer;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\n\nexport interface SelectItem {\n  value: string;\n  title?: string;\n  disabled?: boolean;\n}\n\ninterface InputSelectProps {\n  readonly title: string;\n  readonly name: string;\n  readonly id?: string;\n  error?: boolean;\n  errorMessage?: string;\n  readonly value?: string;\n  readonly options: SelectItem[];\n  readonly onChange: (e: Event) => void;\n}\n\nclass InputSelect extends HtmlNode {\n  private readonly props: InputSelectProps;\n  private contexts: {\n    error?: InputError;\n  } = {};\n\n  constructor(element: HTMLElement | null, props: InputSelectProps) {\n    super(element);\n\n    this.props = props;\n    this.render();\n  }\n\n  private updateBorder() {\n    const border = this.node.querySelector('.waykeecom-input-text');\n    if (border) {\n      if (this.props.error) {\n        border?.classList.add('waykeecom-input-text--has-error');\n      } else {\n        border?.classList.remove('waykeecom-input-text--has-error');\n      }\n    }\n  }\n\n  setError(error: boolean, errorMessage?: string) {\n    this.props.error = error;\n    if (errorMessage) {\n      this.props.errorMessage = errorMessage;\n    }\n    this.updateBorder();\n    this.contexts.error?.setError(error);\n  }\n\n  private render() {\n    const { id, options, value, name, title, error, errorMessage, onChange } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-label\">\n        <label for=\"wayke-estimated-mileage\" class=\"waykeecom-input-label__label\">${title}</label>\n      </div>\n      <select\n        class=\"waykeecom-select\"\n        id=\"wayke-estimated-mileage\"\n        ${name ? `name=\"${name}\"` : ''}\n        ${id ? `id=\"${id}\"` : ''}\n      >\n        ${options\n          .map(\n            (option) =>\n              `<option\n                value=\"${option.value}\"\n                ${option.disabled ? `disabled` : ''}\n                ${option.value === value ? `selected=\"selected\"` : ''}\n                >${option.title || option.value}</option>`\n          )\n          .join('')}\n      </select>\n    `;\n\n    this.updateBorder();\n    if (errorMessage) {\n      this.contexts.error = new InputError(this.node, {\n        error,\n        errorMessage,\n      });\n    }\n\n    this.node.querySelector('select')?.addEventListener('change', (e) => onChange(e));\n  }\n}\n\nexport default InputSelect;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentDecline = (caseId: string) => {\n  const request = creditAssessment.decline(caseId);\n  return request;\n};\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentGetStatus = (caseId: string) => {\n  const request = creditAssessment.getStatus(caseId);\n  return request;\n};\n", "import { creditAssessment, ICreditAssessmentInquiry } from '@wayke-se/ecom';\n\nexport const creditAssessmentNewCase = (inquiry: ICreditAssessmentInquiry) => {\n  const request = creditAssessment.newCase(inquiry);\n  return request;\n};\n", "import { creditAssessment, ICreditAssessmentSignRequest } from '@wayke-se/ecom';\n\nexport const creditAssessmentSignCase = (creditAssessmentCase: ICreditAssessmentSignRequest) => {\n  const request = creditAssessment.signCase(creditAssessmentCase);\n  return request;\n};\n", "import { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport { ICreditAssessmentStatus } from '../../../@types/CreditAssessmentStatus';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport CreditAssessmentApproved from './CreditAssessmentApproved';\nimport CreditAssessmentAssessManually from './CreditAssessmentAssessManually';\nimport CreditAssessmentRejected from './CreditAssessmentRejected';\n\ninterface CreditAssessmentResultProps {\n  readonly store: WaykeStore;\n  readonly creditAssessmentResponse: ICreditAssessmentStatus;\n  readonly onProceed: () => void;\n  readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentResult extends HtmlNode {\n  private readonly props: CreditAssessmentResultProps;\n  constructor(element: HTMLElement, props: CreditAssessmentResultProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, creditAssessmentResponse, onProceed, onGoBack } = this.props;\n    const decision = creditAssessmentResponse.recommendation;\n\n    if (decision === CreditAssessmentRecommendation.Approve) {\n      new CreditAssessmentApproved(this.node, {\n        store,\n        onProceed: () => onProceed(),\n        onGoBack: () => onGoBack(),\n      });\n    } else if (decision === CreditAssessmentRecommendation.AssessManually) {\n      new CreditAssessmentAssessManually(this.node, {\n        store,\n        onProceed: () => onProceed(),\n        onGoBack: () => onGoBack(),\n      });\n    } else {\n      new CreditAssessmentRejected(this.node, {\n        store,\n        onGoBack: () => onGoBack(),\n      });\n    }\n  }\n}\n\nexport default CreditAssessmentResult;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-approved-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst PROCEED = 'assessment-approved-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst ABORT = 'assessment-approved-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentApprovedProps {\n  readonly store: WaykeStore;\n  readonly onProceed: () => void;\n  readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentApproved extends HtmlNode {\n  private readonly props: CreditAssessmentApprovedProps;\n  constructor(element: HTMLElement, props: CreditAssessmentApprovedProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, onProceed, onGoBack } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n      <div class=\"waykeecom-stack waykeecom-stack--4\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PROCEED_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ABORT_NODE}\"></div>\n      </div>\n    `;\n\n    new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n      store,\n      decision: CreditAssessmentRecommendation.Approve,\n    });\n\n    new ButtonArrowRight(this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n      title: i18next.t('creditAssessment.proceedButton'),\n      id: PROCEED,\n      onClick: () => onProceed(),\n    });\n\n    new ButtonAsLink(this.node.querySelector(`#${ABORT_NODE}`), {\n      title: i18next.t('creditAssessment.abortButton'),\n      id: ABORT,\n      onClick: () => onGoBack(),\n    });\n  }\n}\n\nexport default CreditAssessmentApproved;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation, PaymentType } from '@wayke-se/ecom';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\n\ninterface StageCompletedFinancialCreditAssessmentProps {\n  readonly store: WaykeStore;\n  readonly decision: CreditAssessmentRecommendation;\n}\n\nclass StageCompletedFinancialCreditAssessment extends HtmlNode {\n  private readonly props: StageCompletedFinancialCreditAssessmentProps;\n\n  constructor(element: HTMLElement | null, props: StageCompletedFinancialCreditAssessmentProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, decision } = this.props;\n    const state = store.getState();\n    const { order } = state;\n    const loan = order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n    const contactInformation = order?.contactInformation;\n\n    if (decision === CreditAssessmentRecommendation.Approve) {\n      this.node.innerHTML = `\n      ${Alert({\n        tone: 'success',\n        children: `\n          <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n            <p class=\"waykeecom-content__p\"><strong>${i18next.t('stageCompletedFinancialCreditAssessment.approved', { loanName: loan?.name })}</strong></p>\n            <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.approvedDescription', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n          </div>\n        `,\n      })}\n    `;\n    } else if (decision === CreditAssessmentRecommendation.AssessManually) {\n      this.node.innerHTML = `\n      ${Alert({\n        tone: 'warning',\n        children: `\n          <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n            <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('stageCompletedFinancialCreditAssessment.assessManually')}</span></p>\n            <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.assessManuallyDescription', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n          </div>\n        `,\n      })}\n    `;\n    } else {\n      this.node.innerHTML = `\n        ${Alert({\n          tone: 'error',\n          children: `\n            <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n              <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('stageCompletedFinancialCreditAssessment.declined')}</span></p>\n              <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.declinedDescription')}</p>\n              <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.declinedNextSteps')}</p>\n              <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.contactInfo', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n            </div>\n          `,\n        })}\n      `;\n    }\n  }\n}\n\nexport default StageCompletedFinancialCreditAssessment;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonClear from '../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-assess-manually-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst PROCEED = 'assessment-assess-manually-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst ABORT = 'assessment-assess-manually-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentAssessManuallyProps {\n  readonly store: WaykeStore;\n  readonly onProceed: () => void;\n  readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentAssessManually extends HtmlNode {\n  private readonly props: CreditAssessmentAssessManuallyProps;\n  constructor(element: HTMLElement, props: CreditAssessmentAssessManuallyProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, onProceed, onGoBack } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n      <div class=\"waykeecom-stack waykeecom-stack--4\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${ABORT_NODE}\"></div>\n      </div>\n    `;\n\n    new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n      store,\n      decision: CreditAssessmentRecommendation.AssessManually,\n    });\n\n    new ButtonArrowRight(this.node.querySelector(`#${PROCEED_NODE}`), {\n      title: i18next.t('creditAssessment.proceedButton'),\n      id: PROCEED,\n      onClick: () => onProceed(),\n    });\n\n    new ButtonClear(this.node.querySelector(`#${ABORT_NODE}`), {\n      title: i18next.t('creditAssessment.abortButton'),\n      id: ABORT,\n      onClick: () => onGoBack(),\n    });\n  }\n}\n\nexport default CreditAssessmentAssessManually;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport Button from '../../../Components/Button/Button';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-rejected-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst ABORT = 'assessment-rejected-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentRejectedProps {\n  readonly store: WaykeStore;\n  readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentRejected extends HtmlNode {\n  private props: CreditAssessmentRejectedProps;\n  constructor(element: HTMLElement, props: CreditAssessmentRejectedProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, onGoBack } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n      <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${ABORT_NODE}\"></div>\n    `;\n\n    new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n      store,\n      decision: CreditAssessmentRecommendation.Reject,\n    });\n\n    new Button(this.node.querySelector(`#${ABORT_NODE}`), {\n      title: i18next.t('creditAssessment.abortButton'),\n      id: ABORT,\n      onClick: () => onGoBack(),\n    });\n  }\n}\n\nexport default CreditAssessmentRejected;\n", "import { PaymentType } from '@wayke-se/ecom';\n\nconst createTerm = (months: number) => {\n  const isPositive = months > 0;\n  const factorOf12 = months % 12 === 0;\n\n  const isInvalid = !isPositive || !factorOf12;\n  if (isInvalid) {\n    throw new TypeError('Invalid months for creating creidt assessment term');\n  }\n\n  return `${months}months`;\n};\n\nexport default createTerm;\n\nexport const extractPaymentType = (s?: string): PaymentType | undefined => {\n  if (!s) return undefined;\n  const index = s.indexOf('-');\n  if (index === -1) return s as PaymentType;\n  return s.slice(0, index) as PaymentType;\n};\n\nexport const extractLoanIndex = (s?: string): number | undefined => {\n  if (!s) return undefined;\n  const index = s.indexOf('-');\n  return parseInt(s.slice(index + 1), 10);\n};\n", "import Alert from '../../Templates/Alert';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ErrorAlertProps {\n  error?: string | Element;\n}\n\nclass ErrorAlert extends HtmlNode {\n  private readonly props: ErrorAlertProps;\n  private error?: string | Element;\n\n  constructor(element: HTMLElement | null, props: ErrorAlertProps) {\n    super(element);\n    this.props = props;\n    this.error = props.error;\n\n    this.render();\n  }\n\n  update(error?: string | Element) {\n    this.error = error;\n    this.render();\n  }\n\n  render() {\n    if (!this.error) {\n      this.node.innerHTML = '';\n      return;\n    }\n\n    this.node.innerHTML = Alert({\n      tone: 'error',\n      children: this.error,\n    });\n  }\n}\n\nexport default ErrorAlert;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputInformation from './InputInformation';\n\nconst respectStep = (value: number, step?: number) => {\n  if (!step) return value;\n\n  return Math.round(value / step) * step;\n};\n\ninterface InputRangeProps {\n  title: string;\n  value: number;\n  min: number;\n  max: number;\n  step?: number;\n  name: string;\n  id: string;\n  information?: string;\n  unit?: string;\n  disabled?: boolean;\n  onChange?: (e: Event) => void;\n  onBlur?: (e: Event) => void;\n  onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputRange extends HtmlNode {\n  private readonly props: InputRangeProps;\n  private value: number;\n  private inputFieldValue: number;\n  private min: number;\n  private max: number;\n  private rangeSpan: number;\n  private isDisabled?: boolean;\n  private currentValueInPercentage: number;\n  private contexts: {\n    rangeSlider?: HTMLInputElement;\n  } = {};\n\n  constructor(element: HTMLDivElement | null, props: InputRangeProps) {\n    super(element);\n\n    this.props = props;\n    this.value = props.value;\n    this.min = props.min;\n    this.max = props.max;\n    this.isDisabled = props.disabled;\n    this.inputFieldValue = this.value;\n    this.rangeSpan = this.max - this.min;\n    this.currentValueInPercentage = parseInt(\n      (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n      10\n    );\n\n    this.render();\n  }\n\n  update(value: number, min: number, max: number) {\n    this.value = value;\n    this.inputFieldValue = value;\n    this.min = min;\n    this.max = max;\n    this.rangeSpan = max - min;\n    this.isDisabled = !this.rangeSpan;\n    const percentage = parseInt((100 * ((this.value - min) / this.rangeSpan)).toString(), 10);\n    this.currentValueInPercentage = !isNaN(percentage) ? percentage : 0;\n    this.render();\n  }\n\n  disabled(disabled: boolean) {\n    if (this.isDisabled !== disabled) {\n      this.isDisabled = disabled;\n      this.render();\n    }\n  }\n\n  onOpenInformation() {\n    const foldout = this.node.querySelector<HTMLDivElement>('.input-label__foldout');\n    if (foldout) {\n      foldout.style.display = '';\n    }\n  }\n\n  onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    this.inputFieldValue = currentTarget.valueAsNumber;\n  }\n\n  onBlur(e: Event) {\n    const inputFieldValueAsNumber = this.inputFieldValue;\n    if (\n      !isNaN(inputFieldValueAsNumber) &&\n      inputFieldValueAsNumber >= this.min &&\n      inputFieldValueAsNumber <= this.max\n    ) {\n      const modifiedNumberInRespectWithSteps = respectStep(\n        inputFieldValueAsNumber,\n        this.props.step\n      );\n      this.value = modifiedNumberInRespectWithSteps;\n      if (this.props.onChange && e.currentTarget) {\n        (e.currentTarget as HTMLInputElement).value = modifiedNumberInRespectWithSteps.toString();\n        this.props.onChange(e);\n      }\n\n      this.inputFieldValue = this.value;\n      this.currentValueInPercentage = parseInt(\n        (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n        10\n      );\n\n      this.render();\n    } else {\n      this.inputFieldValue = this.value;\n      this.updateInputField();\n    }\n  }\n\n  onFocus(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    currentTarget.value = this.value.toString();\n  }\n\n  onInput(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    this.value = parseInt(currentTarget.value, 10);\n    this.inputFieldValue = this.value;\n\n    this.currentValueInPercentage = parseInt(\n      (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n      10\n    );\n\n    this.updateInputField();\n    this.updateRangeSliderColor(currentTarget);\n  }\n\n  updateRangeSliderColor(element?: HTMLInputElement) {\n    const elem = element || this.node.querySelector<HTMLInputElement>(`#${this.props.id}`);\n    if (elem) {\n      elem.style.setProperty('--percentage', `${this.currentValueInPercentage}%`);\n    }\n  }\n\n  updateInputField() {\n    const inputField = this.node.querySelector<HTMLInputElement>(`#${this.props.id}-input`);\n    if (inputField) {\n      inputField.value = this.inputFieldValue.toString();\n    }\n  }\n\n  render() {\n    const { title, step, name, id, information, unit, onChange, onClickInformation } = this.props;\n    const allowSlider = this.min !== this.max;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-label\">\n        <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n      </div>\n      <div role=\"range\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <div class=\"waykeecom-input-text\">\n            <input\n              type=\"number\"\n              pattern=\"[0-9]*\"\n              id=\"${id}-input\"\n              value=\"${this.inputFieldValue}\"\n              name=\"${name}\"\n              autocomplete=\"off\"\n              class=\"waykeecom-input-text__input\"\n              ${(step === 0 || this.isDisabled || !allowSlider) && `disabled=\"\"`}\n              min=\"${this.min}\"\n              max=\"${this.max}\"\n              ${step !== undefined && `step=\"${step}\"`}\n            />\n            ${unit ? `<div class=\"waykeecom-input-text__unit\">${unit}</div>` : ''}\n          </div>\n        </div>\n        ${\n          allowSlider\n            ? `\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <div class=\"waykeecom-input-range\">\n                <input\n                  type=\"range\"\n                  id=\"${id}\"\n                  min=\"${this.min}\"\n                  max=\"${this.max}\"\n                  ${step !== undefined && `step=\"${step}\"`}\n                  value=\"${this.value}\"\n                  name=\"${name}\"\n                  class=\"waykeecom-input-range__input\"\n                  ${this.isDisabled && `disabled=\"\"`}\n                />\n              </div>\n            </div>\n            `\n            : ''\n        }\n      </div>\n    `;\n\n    if (information) {\n      new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n        information,\n        onClickInformation,\n      });\n    }\n\n    if (allowSlider) {\n      this.contexts.rangeSlider = this.node.querySelector<HTMLInputElement>(`#${id}`) || undefined;\n      if (this.contexts.rangeSlider) {\n        if (onChange) {\n          this.contexts.rangeSlider.addEventListener('change', onChange);\n        }\n        this.contexts.rangeSlider.addEventListener('input', (e) => this.onInput(e));\n        this.updateRangeSliderColor(this.contexts.rangeSlider);\n      }\n\n      const inputField = this.node.querySelector(`#${id}-input`);\n      if (inputField) {\n        inputField.addEventListener('change', (e) => this.onChange(e));\n        inputField.addEventListener('blur', (e) => this.onBlur(e));\n      }\n    }\n  }\n}\n\nexport default InputRange;\n", "import { payments } from '@wayke-se/ecom';\n\ninterface PaymentRequest {\n  vehicleId: string;\n  downPayment: number;\n  duration: number;\n  residual?: number;\n  dealerId?: string;\n  financialOptionId?: string;\n}\n\nexport const getPayment = ({\n  vehicleId,\n  dealerId,\n  downPayment,\n  duration,\n  residual,\n  financialOptionId,\n}: PaymentRequest) => {\n  const request = payments\n    .newLookupRequest()\n    .forVehicle(vehicleId)\n    .withDownPayment(downPayment)\n    .withDuration(duration);\n\n  if (financialOptionId) {\n    request.withFinancialOptionId(financialOptionId);\n  }\n\n  if (residual !== undefined) {\n    request.withResidualValue(residual);\n  }\n\n  if (dealerId !== undefined) {\n    request.forDealer(dealerId);\n  }\n\n  return payments.lookupPayment(request.build());\n};\n", "import { Image } from '../../Utils/constants';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface PieChartProps {\n  percentage: number;\n}\n\nclass PieChart extends HtmlNode {\n  private props: PieChartProps;\n\n  constructor(element: HTMLElement | null | undefined, props: PieChartProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  update(props: PieChartProps) {\n    this.props = props;\n    this.node\n      .querySelector(`.waykeecom-pie-chart__chart-data`)\n      ?.setAttribute('stroke-dasharray', `calc(${this.props.percentage} * 31.4 / 100) 31.4`);\n  }\n\n  render() {\n    const { percentage } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-pie-chart\">\n        <svg height=\"20\" width=\"20\" viewBox=\"0 0 20 20\" class=\"waykeecom-pie-chart__chart\">\n          <circle r=\"10\" cx=\"10\" cy=\"10\" class=\"waykeecom-pie-chart__chart-data-base\" />\n          <circle r=\"5\" cx=\"10\" cy=\"10\" fill=\"transparent\"\n            stroke-width=\"10\"\n            stroke-dasharray=\"calc(${percentage} * 31.4 / 100) 31.4\"\n            transform=\"rotate(-90) translate(-20)\"\n            class=\"waykeecom-pie-chart__chart-data waykeecom-pie-chart__chart-data--1\"\n            id=\"loan-details-circle\"\n          />\n        </svg>\n        <div class=\"waykeecom-pie-chart__overlay\">\n          <img src=\"${Image.illustrations.payment}\" alt=\"Illustration av betalning\" class=\"waykeecom-pie-chart__illustration\" />\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default PieChart;\n", "import HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\ninterface LoanDetailsBasicProps {\n  downPayment: number;\n  creditAmount: number;\n  downPaymentPercentage: number;\n  creditAmountPercentage: number;\n}\n\nclass LoanDetailsBasic extends HtmlNode {\n  private props: LoanDetailsBasicProps;\n\n  constructor(element: HTMLElement | null | undefined, props: LoanDetailsBasicProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  update(props: LoanDetailsBasicProps) {\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { downPayment, creditAmount, downPaymentPercentage, creditAmountPercentage } = this.props;\n    this.node.innerHTML = `\n      <ul class=\"waykeecom-key-value-list\">\n        ${KeyValueListItem({\n          key: `\n            <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n              <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n                <div class=\"waykeecom-chart-indicator waykeecom-chart-indicator--secondary\"></div>\n              </div>\n              <div class=\"waykeecom-hstack__item\">\n                Kontantinsats (${downPaymentPercentage} %)\n              </div>\n            </div>\n          `,\n          value: prettyNumber(downPayment, { postfix: 'kr' }),\n        })}\n        ${KeyValueListItem({\n          key: `\n            <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n              <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n                <div class=\"waykeecom-chart-indicator waykeecom-chart-indicator--primary\"></div>\n              </div>\n              <div class=\"waykeecom-hstack__item\">\n                L\u00E5n (${creditAmountPercentage} %)\n              </div>\n            </div>\n          `,\n          value: prettyNumber(creditAmount, { postfix: 'kr' }),\n        })}\n      </ul>\n    `;\n  }\n}\n\nexport default LoanDetailsBasic;\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\nlet persistedShowDetails = false;\n\ninterface LoanDetailsDetailedProps {\n  duration: number;\n  administrationFee?: number;\n  setupFee?: number;\n  totalCreditCost: number;\n  interest: number;\n  effectiveInterest: number;\n  publicUrl?: string;\n  loanOrgName?: string;\n}\n\nclass LoanDetailsDetailed extends HtmlNode {\n  private props: LoanDetailsDetailedProps;\n  private showDetails = persistedShowDetails;\n\n  constructor(element: HTMLElement | null | undefined, props: LoanDetailsDetailedProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  private onDetails(e: Event) {\n    const value = (e.currentTarget as HTMLInputElement).checked;\n    persistedShowDetails = value;\n    this.showDetails = value;\n  }\n\n  update(props: LoanDetailsDetailedProps) {\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const {\n      duration,\n      administrationFee,\n      setupFee,\n      totalCreditCost,\n      interest,\n      effectiveInterest,\n      publicUrl,\n      loanOrgName,\n    } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-accordion\">\n        <input\n          type=\"checkbox\"\n          id=\"finance-details-accordion\"\n          class=\"waykeecom-accordion__checkbox\"\n          ${this.showDetails ? `checked=\"true\"` : ''}\n        />\n        <label class=\"waykeecom-accordion__header\" for=\"finance-details-accordion\" tabindex=\"0\" aria-label=\"${i18next.t('loanDetails.showDetails')}\">\n          <div class=\"waykeecom-accordion__header-title\">${i18next.t('loanDetails.details')}</div>\n          <div class=\"waykeecom-accordion__header-icon\" aria-hidden=\"true\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              viewBox=\"0 0 16 16\"\n              class=\"waykeecom-icon\"\n              data-icon=\"Chevron down\"\n            >\n              <path d=\"M6.7 11.4 0 4.6l1.3-1.4L8 10.1l6.7-6.9L16 4.6l-6.7 6.9L8 12.8l-1.3-1.4z\" />\n            </svg>\n          </div>\n        </label>\n        <div class=\"waykeecom-accordion__body\">\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <ul class=\"waykeecom-key-value-list\">\n              ${KeyValueListItem({\n                key: i18next.t('loanDetails.repaymentPeriod'),\n                value: `${duration} ${i18next.t('loanDetails.months')}`,\n              })}\n\n              ${KeyValueListItem({\n                key: i18next.t('loanDetails.interest'),\n                value: prettyNumber(interest * 100, { postfix: '%', decimals: 2 }),\n              })}\n\n              ${KeyValueListItem({\n                key: i18next.t('loanDetails.effectiveInterest'),\n                value: prettyNumber(effectiveInterest * 100, { postfix: '%', decimals: 2 }),\n              })}\n\n              ${\n                setupFee !== undefined &&\n                KeyValueListItem({\n                  key: i18next.t('loanDetails.setupFee'),\n                  value: prettyNumber(setupFee, { postfix: 'kr' }),\n                })\n              }\n\n              ${\n                administrationFee !== undefined &&\n                KeyValueListItem({\n                  key: i18next.t('loanDetails.administrationFee'),\n                  value: prettyNumber(administrationFee, { postfix: 'kr' }),\n                })\n              }\n              ${KeyValueListItem({\n                key: i18next.t('loanDetails.totalCreditCost'),\n                value: prettyNumber(totalCreditCost, { postfix: 'kr' }),\n              })}\n            </ul>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <div class=\"waykeecom-disclaimer-text\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <p class=\"waykeecom-content__p\">${i18next.t('loanDetails.disclaimerText1')}</p>\n                <p class=\"waykeecom-content__p\">${i18next.t('loanDetails.disclaimerText2')}</p>\n              </div>\n            </div>\n          </div>\n          ${\n            publicUrl\n              ? `\n                <div class=\"waykeecom-stack waykeecom-stack--2\">\n                  <a\n                    href=\"${publicUrl}\"\n                    title=\"${i18next.t('loanDetails.moreInfo', { loanOrgName })}\"\n                    rel=\"noopener noreferrer\"\n                    target=\"_blank\"\n                    class=\"waykeecom-link\"\n                  >\n                    ${i18next.t('loanDetails.moreInfo', { loanOrgName })}\n                  </a>\n                </div>\n              `\n              : ''\n          }\n        </div>\n      </div>\n    </div>\n    `;\n\n    this.node.querySelector(`input`)?.addEventListener('click', (e) => this.onDetails(e));\n  }\n}\n\nexport default LoanDetailsDetailed;\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\ninterface LoanDetailsMonthlyCostProps {\n  monthlyCost: number;\n}\n\nclass LoanDetailsMonthlyCost extends HtmlNode {\n  private props: LoanDetailsMonthlyCostProps;\n\n  constructor(element: HTMLElement | null | undefined, props: LoanDetailsMonthlyCostProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  update(props: LoanDetailsMonthlyCostProps) {\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { monthlyCost } = this.props;\n    this.node.innerHTML = `\n      <ul class=\"waykeecom-key-value-list waykeecom-key-value-list--large-value\">\n        ${KeyValueListItem({\n          key: i18next.t('loanDetailsMonthlyCost.monthlyCost'),\n          value: prettyNumber(monthlyCost, {\n            postfix: i18next.t('loanDetailsMonthlyCost.perMonth'),\n          }),\n        })}\n      </ul>\n    `;\n  }\n}\n\nexport default LoanDetailsMonthlyCost;\n", "import i18next from '@i18n';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport PieChart from '../../../Components/Chart/PieChart';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { prettyNumber } from '../../../Utils/format';\nimport LoanDetailsBasic from './LoanDetailsBasic';\nimport LoanDetailsDetailed from './LoanDetailsDetailed';\nimport LoanDetailsMonthlyCost from './LoanDetailsMonthlyCost';\n\nconst LOAN_DETAILS_MONTHLY_COST_NODE = 'finance-details-monthly-cost';\nconst LOAN_DETAILS_PIE_CHART_NODE = 'finance-details-pie-chart-node';\nconst LOAN_DETAILS_BASIC_NODE = 'finance-details-basic';\nconst LOAN_DETAILS_DETAILED_NODE = 'finance-details-detailed';\n\ninterface LoanDetailsProps {\n  paymentLookupResponse: PaymentLookup;\n  loan: PaymentOption;\n}\n\nclass LoanDetails extends HtmlNode {\n  private props: LoanDetailsProps;\n  private contexts: {\n    loanDetailsMontlyCost?: LoanDetailsMonthlyCost;\n    pieChart?: PieChart;\n    loanDetailsBasic?: LoanDetailsBasic;\n    loanDetailsDetailed?: LoanDetailsDetailed;\n  } = {};\n\n  constructor(element: HTMLElement | null | undefined, props: LoanDetailsProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  private extractProps() {\n    const { loan, paymentLookupResponse } = this.props;\n    const { monthlyCost, totalCreditCost } = paymentLookupResponse.costs;\n    const { interest, effectiveInterest } = paymentLookupResponse.interests;\n\n    const downPayment = paymentLookupResponse.downPaymentSpec.current;\n    const duration = paymentLookupResponse.durationSpec.current;\n    const { administrationFee, setupFee } = paymentLookupResponse.fees;\n    const creditAmount = paymentLookupResponse.creditAmount;\n\n    const publicUrl = paymentLookupResponse.publicURL;\n\n    const total = downPayment + creditAmount;\n    const downPaymentPercentage = Math.round((downPayment / total) * 100);\n    const creditAmountPercentage = Math.round((creditAmount / total) * 100);\n\n    return {\n      duration,\n      downPayment,\n      administrationFee,\n      setupFee,\n      totalCreditCost,\n      interest,\n      effectiveInterest,\n      creditAmount,\n      total,\n      publicUrl,\n      monthlyCost,\n      loanOrgName: loan.name,\n      loanOrgLogo: loan.logo,\n      downPaymentPercentage,\n      creditAmountPercentage,\n    };\n  }\n\n  update(props: LoanDetailsProps) {\n    this.props = props;\n\n    const {\n      duration,\n      downPayment,\n      administrationFee,\n      setupFee,\n      monthlyCost,\n      totalCreditCost,\n      interest,\n      effectiveInterest,\n      creditAmount,\n      publicUrl,\n      loanOrgName,\n      downPaymentPercentage,\n      creditAmountPercentage,\n    } = this.extractProps();\n\n    this.contexts.loanDetailsMontlyCost?.update({ monthlyCost });\n    this.contexts.pieChart?.update({ percentage: creditAmountPercentage });\n    this.contexts.loanDetailsBasic?.update({\n      downPayment,\n      creditAmount,\n      downPaymentPercentage,\n      creditAmountPercentage,\n    });\n    this.contexts.loanDetailsDetailed?.update({\n      duration,\n      administrationFee,\n      setupFee,\n      totalCreditCost,\n      interest,\n      effectiveInterest,\n      publicUrl,\n      loanOrgName,\n    });\n  }\n\n  render() {\n    const {\n      duration,\n      downPayment,\n      administrationFee,\n      setupFee,\n      totalCreditCost,\n      interest,\n      effectiveInterest,\n      creditAmount,\n      publicUrl,\n      loanOrgName,\n      loanOrgLogo,\n      monthlyCost,\n      downPaymentPercentage,\n      creditAmountPercentage,\n    } = this.extractProps();\n\n    const disclaimerText = i18next.t('loanDetails.disclaimerText', {\n      interest: prettyNumber(interest * 100, { decimals: 2 }),\n      effectiveInterest: prettyNumber(effectiveInterest * 100, { decimals: 2 }),\n    });\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stepper__break\">\n        <div class=\"waykeecom-shadow-box\">\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <img src=\"${loanOrgLogo}\" alt=\"${loanOrgName} logotyp\" class=\"waykeecom-image waykeecom-image--loan-logo\" />\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${LOAN_DETAILS_MONTHLY_COST_NODE}\"></div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <div class=\"waykeecom-disclaimer-text\">${disclaimerText}</div>\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${LOAN_DETAILS_PIE_CHART_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${LOAN_DETAILS_BASIC_NODE}\"></div>\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <hr class=\"waykeecom-separator\" />\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${LOAN_DETAILS_DETAILED_NODE}\"></div>\n          </div>\n        </div>\n      </div>\n    `;\n\n    this.contexts.loanDetailsMontlyCost = new LoanDetailsMonthlyCost(\n      this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_MONTHLY_COST_NODE}`),\n      {\n        monthlyCost,\n      }\n    );\n\n    this.contexts.pieChart = new PieChart(\n      this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_PIE_CHART_NODE}`),\n      {\n        percentage: creditAmountPercentage,\n      }\n    );\n\n    this.contexts.loanDetailsBasic = new LoanDetailsBasic(\n      this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_BASIC_NODE}`),\n      {\n        downPayment,\n        creditAmount,\n        downPaymentPercentage,\n        creditAmountPercentage,\n      }\n    );\n\n    this.contexts.loanDetailsDetailed = new LoanDetailsDetailed(\n      this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_DETAILED_NODE}`),\n      {\n        duration,\n        administrationFee,\n        setupFee,\n        totalCreditCost,\n        interest,\n        effectiveInterest,\n        publicUrl,\n        loanOrgName,\n      }\n    );\n  }\n}\n\nexport default LoanDetails;\n", "import i18next from '@i18n';\nimport { IPaymentRangeSpec } from '@wayke-se/ecom';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ErrorAlert from '../../../Components/ErrorAlert';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRange from '../../../Components/Input/InputRange';\nimport { getPayment } from '../../../Data/getPayment';\nimport { setPaymentLookupResponse } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport { convertPaymentLookupResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport CreditAssessment, { DISCLAIMER_WRAPPER_NODE } from './CreditAssessment';\nimport LoanDetails from './LoanDetails';\n\nconst DOWNPAYMENT_RANGE_NODE = 'downpayment-range-node';\nconst DOWNPAYMENT_RANGE = 'downpayment-range';\n\nconst DURATION_RANGE_NODE = 'duration-range-node';\nconst DURATION_RANGE = 'duration-range';\n\nconst RESIDUAL_RANGE_NODE = 'residual-range-node';\nconst RESIDUAL_RANGE = 'residual-range';\n\nconst LOAN_DETAILS_id = 'loan-details';\nconst LOAN_DETAILS_NODE = `${LOAN_DETAILS_id}-node`;\n\nconst CREDIT_ASSESMENT_NODE = 'credit-assessment-node';\n\nconst PROCEED = 'credit-assessment-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\nconst ERROR_NODE = 'loan-error-node';\n\ninterface PaymentState {\n  vehicleId: string;\n  dealerId: string;\n  downPayment: IPaymentRangeSpec;\n  duration: IPaymentRangeSpec;\n  residual: IPaymentRangeSpec;\n  financialOptionId?: string;\n}\n\ninterface LoanProps {\n  readonly store: WaykeStore;\n  readonly loan: PaymentOption;\n  readonly vehicleId: string;\n  readonly paymentLookupResponse?: PaymentLookup;\n  readonly onProceed: () => void;\n}\n\ntype LoanNames = 'downPayment' | 'duration' | 'residual';\n\nclass Loan extends HtmlNode {\n  private readonly props: LoanProps;\n  private paymentState: PaymentState;\n  private previousState: PaymentState;\n  private paymentLookupResponse: PaymentLookup;\n  private contexts: {\n    downPayment?: InputRange;\n    duration?: InputRange;\n    residual?: InputRange;\n    loanDetails?: LoanDetails;\n    proceedButton?: ButtonArrowRight;\n    errorAlert?: ErrorAlert;\n  } = {};\n\n  constructor(element: HTMLDivElement, props: LoanProps) {\n    super(element);\n    this.props = props;\n    const loanDetails = this.props.loan.loanDetails;\n    if (!loanDetails) throw 'err';\n    this.paymentLookupResponse = this.props.paymentLookupResponse || loanDetails;\n\n    this.paymentState = {\n      vehicleId: this.props.vehicleId,\n      dealerId: '',\n      downPayment: this.paymentLookupResponse.downPaymentSpec,\n      duration: this.paymentLookupResponse.durationSpec,\n      residual: this.paymentLookupResponse.residualValueSpec,\n      financialOptionId: this.paymentLookupResponse.financialOptionId,\n    };\n    this.previousState = JSON.parse(JSON.stringify(this.paymentState));\n\n    this.render();\n  }\n\n  private async payment() {\n    this.contexts.downPayment?.disabled(true);\n    this.contexts.duration?.disabled(true);\n    this.contexts.residual?.disabled(true);\n    this.contexts.proceedButton?.disabled(true);\n    try {\n      const response = await getPayment({\n        vehicleId: this.paymentState.vehicleId,\n        downPayment: this.paymentState.downPayment.current,\n        duration: this.paymentState.duration.current,\n        residual: this.paymentState.residual?.current,\n        financialOptionId: this.paymentState.financialOptionId,\n      });\n      this.previousState = JSON.parse(JSON.stringify(this.paymentState));\n      this.paymentLookupResponse = convertPaymentLookupResponse(response);\n      this.paymentState = {\n        ...this.paymentState,\n        downPayment: this.paymentLookupResponse.downPaymentSpec,\n        duration: this.paymentLookupResponse.durationSpec,\n        residual: this.paymentLookupResponse.residualValueSpec,\n        financialOptionId: this.paymentLookupResponse.financialOptionId,\n      };\n\n      setPaymentLookupResponse(response)(this.props.store.dispatch);\n      this.update();\n\n      this.contexts.errorAlert?.update(undefined);\n      this.contexts.downPayment?.update(\n        this.paymentState.downPayment.current,\n        this.paymentState.downPayment.min,\n        this.paymentState.downPayment.max\n      );\n      this.contexts.residual?.update(\n        parseInt(`${this.paymentState.residual.current * 100}`, 10),\n        parseInt(`${this.paymentState.residual.min * 100}`, 10),\n        parseInt(`${this.paymentState.residual.max * 100}`, 10)\n      );\n      this.contexts.duration?.update(\n        this.paymentState.duration.current,\n        this.paymentState.duration.min,\n        this.paymentState.duration.max\n      );\n    } catch (_e) {\n      this.contexts.errorAlert?.update(i18next.t('loan.errorOccurred'));\n      this.contexts.downPayment?.disabled(false);\n      this.contexts.duration?.disabled(false);\n      this.contexts.residual?.disabled(false);\n\n      /*Roll back to previous state */\n      this.contexts.downPayment?.update(\n        this.previousState.downPayment.current,\n        this.previousState.downPayment.min,\n        this.previousState.downPayment.max\n      );\n\n      this.contexts.residual?.update(\n        parseInt(`${this.previousState.residual.current * 100}`, 10),\n        parseInt(`${this.previousState.residual.min * 100}`, 10),\n        parseInt(`${this.previousState.residual.max * 100}`, 10)\n      );\n      this.contexts.duration?.update(\n        this.previousState.duration.current,\n        this.previousState.duration.min,\n        this.previousState.duration.max\n      );\n    } finally {\n      this.contexts.downPayment?.disabled(false);\n      this.contexts.duration?.disabled(false);\n      this.contexts.residual?.disabled(false);\n      this.contexts.proceedButton?.disabled(false);\n    }\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as LoanNames;\n    const value = currentTarget.value;\n    currentTarget.value = value;\n    this.paymentState[name].current =\n      name === 'residual' ? parseInt(value, 10) / 100 : parseInt(value, 10);\n    this.payment();\n  }\n\n  private update() {\n    this.contexts.loanDetails?.update({\n      loan: this.props.loan,\n      paymentLookupResponse: this.paymentLookupResponse,\n    });\n  }\n\n  render() {\n    const { store, loan, onProceed } = this.props;\n    const { order } = store.getState();\n    const name = order?.contactInformation?.name;\n    const shouldUseCreditScoring = loan.loanDetails?.shouldUseCreditScoring;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <hr class=\"waykeecom-separator\" />\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h5 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('loan.title')}</h5>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('loan.description', { name: loan?.name })}${\n            shouldUseCreditScoring ? ` ${i18next.t('loan.creditScoringInfo', { name })}` : ''\n          }</p>\n          <p class=\"waykeecom-content__p\">${i18next.t('loan.instruction')}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DOWNPAYMENT_RANGE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DURATION_RANGE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${RESIDUAL_RANGE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ERROR_NODE}\"></div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${LOAN_DETAILS_NODE}\"></div>\n      </div>\n      ${\n        shouldUseCreditScoring\n          ? `\n            <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${CREDIT_ASSESMENT_NODE}\"></div>\n          `\n          : `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>`\n      }\n    `;\n\n    this.contexts.downPayment = new InputRange(\n      this.node.querySelector<HTMLDivElement>(`#${DOWNPAYMENT_RANGE_NODE}`),\n      {\n        title: i18next.t('loan.downPaymentTitle'),\n        value: this.paymentState.downPayment.current,\n        id: DOWNPAYMENT_RANGE,\n        name: 'downPayment',\n        onChange: (e) => this.onChange(e),\n        min: this.paymentState.downPayment.min,\n        max: this.paymentState.downPayment.max,\n        unit: 'kr',\n        information: `\n          <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n            <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('loan.downPaymentInfoTitle')}</span></p>\n            <p class=\"waykeecom-content__p\">${i18next.t('loan.downPaymentInfoDescription', { name })}</p>\n          </div>\n        `,\n        onClickInformation: () => {\n          ecomEvent(\n            EcomView.MAIN,\n            EcomEvent.FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE,\n            EcomStep.FINANCIAL\n          );\n        },\n      }\n    );\n\n    this.contexts.duration = new InputRange(\n      this.node.querySelector<HTMLDivElement>(`#${DURATION_RANGE_NODE}`),\n      {\n        title: i18next.t('loan.durationTitle'),\n        value: this.paymentState.duration.current,\n        id: DURATION_RANGE,\n        name: 'duration',\n        onChange: (e) => this.onChange(e),\n        min: this.paymentState.duration.min,\n        max: this.paymentState.duration.max,\n        step: this.paymentState.duration.step,\n        unit: 'm\u00E5n',\n      }\n    );\n\n    if (this.paymentState.residual) {\n      this.contexts.residual = new InputRange(\n        this.node.querySelector<HTMLDivElement>(`#${RESIDUAL_RANGE_NODE}`),\n        {\n          title: i18next.t('loan.residualTitle'),\n          value: parseInt(`${this.paymentState.residual.current * 100}`, 10),\n          id: RESIDUAL_RANGE,\n          name: 'residual',\n          onChange: (e) => this.onChange(e),\n          min: parseInt(`${this.paymentState.residual.min * 100}`, 10),\n          max: parseInt(`${this.paymentState.residual.max * 100}`, 10),\n          step: parseInt(`${this.paymentState.residual.step * 100}`, 10),\n          unit: '%',\n        }\n      );\n    }\n\n    this.contexts.errorAlert = new ErrorAlert(\n      this.node.querySelector<HTMLDivElement>(`#${ERROR_NODE}`),\n      {}\n    );\n\n    this.contexts.loanDetails = new LoanDetails(\n      this.node.querySelector<HTMLDivElement>(`#${LOAN_DETAILS_NODE}`),\n      {\n        loan,\n        paymentLookupResponse: this.paymentLookupResponse,\n      }\n    );\n\n    if (shouldUseCreditScoring) {\n      new CreditAssessment(this.node.querySelector<HTMLDivElement>(`#${CREDIT_ASSESMENT_NODE}`), {\n        store,\n        loan,\n        paymentLookupResponse: this.paymentLookupResponse,\n        onProceed: () => onProceed(),\n      });\n    } else {\n      this.contexts.proceedButton = new ButtonArrowRight(\n        this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n        {\n          title: i18next.t('loan.proceedButton'),\n          id: PROCEED,\n          onClick: () => onProceed(),\n        }\n      );\n    }\n  }\n}\n\nexport default Loan;\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem, { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst CREDIT_ASSESSMENT_RESULT = 'credit-assessment-result';\nconst CREDIT_ASSESSMENT_RESULT_NODE = `${CREDIT_ASSESSMENT_RESULT}-node`;\n\ninterface StageCompletedFinancialProps {\n  readonly store: WaykeStore;\n  readonly loan?: PaymentOption;\n  readonly paymentLookupResponse?: PaymentLookup;\n  readonly paymentType: PaymentType;\n  readonly onEdit?: () => void;\n}\n\nclass StageCompletedFinancial extends HtmlNode {\n  private readonly props: StageCompletedFinancialProps;\n\n  constructor(element: HTMLDivElement, props: StageCompletedFinancialProps) {\n    super(element, { htmlTag: 'div' });\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, paymentType, loan, paymentLookupResponse, onEdit } = this.props;\n    const loanDetails = loan?.loanDetails;\n\n    if (paymentType === PaymentType.Loan) {\n      const state = this.props.store.getState();\n      const currentPaymentLookupResponse = paymentLookupResponse || loanDetails;\n      if (!loanDetails || !currentPaymentLookupResponse) throw 'Missing loan';\n\n      const downPayment = currentPaymentLookupResponse.downPaymentSpec.current;\n      const creditAmount = currentPaymentLookupResponse.creditAmount;\n      const duration = currentPaymentLookupResponse.durationSpec.current;\n      const { interest, effectiveInterest } = currentPaymentLookupResponse.interests;\n      const { monthlyCost } = currentPaymentLookupResponse.costs;\n\n      const keyValueList: KeyValueListItemProps[] = [\n        {\n          key: i18next.t('stageCompletedFinancial.downPayment'),\n          value: prettyNumber(downPayment, {\n            postfix: 'kr',\n          }),\n        },\n        {\n          key: i18next.t('stageCompletedFinancial.loanAmount'),\n          value: prettyNumber(creditAmount, {\n            postfix: 'kr',\n          }),\n        },\n        {\n          key: i18next.t('stageCompletedFinancial.repaymentPeriod'),\n          value: `${duration} ${i18next.t('stageCompletedFinancial.months')}`,\n        },\n        {\n          key: i18next.t('stageCompletedFinancial.monthlyCost'),\n          value: prettyNumber(monthlyCost, { postfix: 'kr*' }),\n        },\n      ];\n\n      const decision = state.creditAssessmentResponse?.recommendation;\n      const disclaimerText = i18next.t('stageCompletedFinancial.disclaimerText', {\n        interest: prettyNumber(interest * 100, { decimals: 2 }),\n        effectiveInterest: prettyNumber(effectiveInterest * 100, { decimals: 2 }),\n      });\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${loan.name}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancial.orderAlmostReady')}</p>\n          </div>\n        </div>\n        ${\n          decision\n            ? `<div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CREDIT_ASSESSMENT_RESULT_NODE}\"></div>`\n            : ''\n        }\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-stack waykeecom-stack--1\">\n            <ul class=\"waykeecom-key-value-list\">\n              ${keyValueList.map((kv) => KeyValueListItem(kv)).join('')}\n            </ul>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--1\">\n            <div class=\"waykeecom-disclaimer-text\">${disclaimerText}</div>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <div class=\"waykeecom-align waykeecom-align--end\">\n            <button type=\"button\" title=\"${i18next.t('stageCompletedFinancial.changeFinancing')}\" class=\"waykeecom-link\">${i18next.t('stageCompletedFinancial.changeFinancing')}</button>\n          </div>\n        </div>\n      `;\n\n      if (decision) {\n        new StageCompletedFinancialCreditAssessment(\n          this.node.querySelector(`#${CREDIT_ASSESSMENT_RESULT_NODE}`),\n          {\n            store,\n            decision,\n          }\n        );\n      }\n    } else {\n      this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--1\">\n        <ul class=\"waykeecom-key-value-list\">\n          ${KeyValueListItem({\n            key: i18next.t('stageCompletedFinancial.financing'),\n            value:\n              paymentType === PaymentType.Cash\n                ? i18next.t('stageCompletedFinancial.cash')\n                : i18next.t('stageCompletedFinancial.lease'),\n          })}\n        </ul>\n      </div>\n      ${\n        onEdit\n          ? `\n          <div class=\"waykeecom-stack waykeecom-stack--1\">\n            <div class=\"waykeecom-align waykeecom-align--end\">\n              <button type=\"button\" title=\"${i18next.t('stageCompletedFinancial.changeFinancing')}\" class=\"waykeecom-link\">${i18next.t('stageCompletedFinancial.changeFinancing')}</button>\n            </div>\n          </div>\n          `\n          : ''\n      }\n    `;\n    }\n\n    if (onEdit) {\n      this.node.querySelector('button')?.addEventListener('click', () => onEdit());\n    }\n  }\n}\n\nexport default StageCompletedFinancial;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport ButtonAddRemove from '../../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { asHtml } from '../../../../Utils/parser';\nimport { scrollTop } from '../../../../Utils/scroll';\n\nconst BUTTON_TOP_LEFT_NODE = 'insurance-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'insurance-button-bottom-left-node';\nconst BUTTON_INSURANCE_ADD_REMOVE_NODE = 'insurance-add-remove-node';\n\ninterface InsuranceItemInfoProps {\n  readonly freeInsurance: IAvailableInsuranceOption;\n  readonly selected: boolean;\n  readonly onClick: () => void;\n  readonly onClose: () => void;\n}\n\nclass InsuranceItemInfo extends HtmlNode {\n  private readonly props: InsuranceItemInfoProps;\n\n  constructor(element: HTMLElement, props: InsuranceItemInfoProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { freeInsurance, selected, onClose, onClick } = this.props;\n    const { title, description, logo, longDescription } = freeInsurance;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n            <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${title}</h3>\n          </div>\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n            <div class=\"waykeecom-logo\">\n              <img src=\"${logo}\" alt=\"${i18next.t('insurance.logoAlt', { title })}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n          <p class=\"waykeecom-content__p\">${description}</p>\n        </div>\n      </div>\n      ${\n        longDescription\n          ? `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${asHtml(longDescription)}</p>\n          </div>\n        </div>\n      `\n          : ''\n      }\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_INSURANCE_ADD_REMOVE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n      </div>\n    `;\n\n    new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n      title: i18next.t('insurance.backButton'),\n      onClick: () => onClose(),\n    });\n\n    new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n      title: i18next.t('insurance.backButton'),\n      onClick: () => onClose(),\n    });\n\n    new ButtonAddRemove(this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`), {\n      selected,\n      fullSize: true,\n      onClick: () => onClick(),\n    });\n\n    scrollTop();\n  }\n}\n\nexport default InsuranceItemInfo;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport GridItem from '../../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveFreeInsurance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { createPortal, destroyPortal } from '../../../../Utils/portal';\nimport InsuranceItemInfo from './InsuranceItemInfo';\n\ninterface InsuranceItemProps {\n  readonly store: WaykeStore;\n  readonly freeInsurance: IAvailableInsuranceOption;\n  readonly key: string;\n}\n\nclass InsuranceItem extends HtmlNode {\n  private readonly props: InsuranceItemProps;\n  private displayInfo = false;\n\n  constructor(element: HTMLElement, props: InsuranceItemProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'freeInsurance', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private onInfoOpen() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE);\n    this.displayInfo = true;\n    this.render();\n  }\n\n  private onInfoClose() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE);\n    this.displayInfo = false;\n    destroyPortal();\n    this.render();\n    this.node.parentElement?.scrollIntoView();\n  }\n\n  private onClick() {\n    const { freeInsurance } = this.props.store.getState();\n    if (freeInsurance && this.props.freeInsurance !== freeInsurance) {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE);\n    } else {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE);\n    }\n\n    addOrRemoveFreeInsurance(this.props.freeInsurance)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, freeInsurance, key } = this.props;\n    const state = store.getState();\n    const logo = state.order?.insuranceOption?.logo;\n\n    const selected = state.freeInsurance\n      ? JSON.stringify(state.freeInsurance).localeCompare(\n          JSON.stringify(this.props.freeInsurance)\n        ) === 0\n      : false;\n\n    if (this.displayInfo) {\n      new InsuranceItemInfo(createPortal(), {\n        freeInsurance,\n        selected,\n        onClick: () => {\n          this.onInfoClose();\n          this.onClick();\n        },\n        onClose: () => this.onInfoClose(),\n      });\n    }\n\n    new GridItem(\n      this.node,\n      {\n        logo,\n        id: key,\n        title: freeInsurance.title,\n        description: freeInsurance.description,\n        selected,\n        onClick: () => this.onClick(),\n        onInfo: () => this.onInfoOpen(),\n      },\n      key\n    );\n  }\n}\n\nexport default InsuranceItem;\n", "import { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport OverflowGridList from '../../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceItem from './InsuranceItem';\n\ninterface InsuranceListProps {\n  readonly store: WaykeStore;\n  readonly insurances: IAvailableInsuranceOption[];\n}\n\nclass InsuranceList extends HtmlNode {\n  private readonly props: InsuranceListProps;\n\n  constructor(element: HTMLElement | null, props: InsuranceListProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  render() {\n    const { store, insurances } = this.props;\n    const listRef = new OverflowGridList(this.node, {\n      id: 'insurance-list',\n      onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ARROW, EcomStep.INSURANCE),\n    });\n    const { overflowElement } = listRef;\n    if (overflowElement) {\n      overflowElement.innerHTML = '';\n      insurances.forEach(\n        (freeInsurance, index) =>\n          new InsuranceItem(overflowElement, {\n            store,\n            freeInsurance,\n            key: `insurance-${index}`,\n          })\n      );\n    }\n  }\n}\n\nexport default InsuranceList;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { completeStage } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceList from './InsuranceList';\n\nconst INSURANCE_GRID_LIST_NODE = 'insurance-grid-list-node';\n\nconst PROCEED_INSURANCE = 'button-insurances-proceed';\nconst PROCEED_INSURANCE_NODE = `${INSURANCE_GRID_LIST_NODE}-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\ninterface DefaultInsuranceProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n  readonly insurance: IAvailableInsuranceOption;\n}\n\nclass DefaultInsurance extends HtmlNode {\n  private readonly props: DefaultInsuranceProps;\n\n  constructor(element: HTMLElement, props: DefaultInsuranceProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n  private onProceed() {\n    const { freeInsurance } = this.props.store.getState();\n\n    completeStage(this.props.lastStage)(this.props.store.dispatch);\n    ecomEvent(\n      EcomView.MAIN,\n      !!freeInsurance ? EcomEvent.INSURANCE_SET : EcomEvent.INSURANCE_SKIPPED,\n      EcomStep.INSURANCE\n    );\n  }\n\n  render() {\n    const { store, insurance } = this.props;\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('insurance.description')}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_GRID_LIST_NODE}\"></div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_INSURANCE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n      </div>\n    `;\n\n    new InsuranceList(this.node.querySelector<HTMLElement>(`#${INSURANCE_GRID_LIST_NODE}`), {\n      store,\n      insurances: [insurance],\n    });\n\n    new ButtonArrowRight(this.node.querySelector<HTMLElement>(`#${PROCEED_INSURANCE_NODE}`), {\n      id: PROCEED_INSURANCE,\n      title: i18next.t('insurance.proceedButton'),\n      onClick: () => this.onProceed(),\n    });\n  }\n}\n\nexport default DefaultInsurance;\n", "import i18next from '@i18n';\nimport { DrivingDistance } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport ButtonSkip from '../../../../Components/Button/ButtonSkip';\nimport Disclaimer from '../../../../Components/Disclaimer/Disclaimer';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport InputSelect from '../../../../Components/Input/InputSelect';\nimport { setDrivingDistance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport Alert from '../../../../Templates/Alert';\nimport { translateDrivingDistance } from '../../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceView from './InsuranceView';\n\nconst DISTANCE = 'select-insurance-distance';\nconst DISTANCE_NODE = `${DISTANCE}-node`;\n\nconst INSURANCE_INFO_NODE = `insurance-info-node`;\n\nconst SHOW_INSURANCES = 'button-insurances-show';\nconst SHOW_INSURANCES_NODE = `${SHOW_INSURANCES}-node`;\nconst SHOW_INSURANCES_DISCLAIMER_NODE = `${SHOW_INSURANCES}-disclaimer-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\ninterface IfInsuranceProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n  readonly onSkip: () => void;\n}\n\nclass IfInsurance extends HtmlNode {\n  private readonly props: IfInsuranceProps;\n  private showInsurances = false;\n\n  constructor(element: HTMLElement, props: IfInsuranceProps) {\n    super(element);\n    this.props = props;\n    this.showInsurances = !!this.props.store.getState().insurance;\n    this.render();\n  }\n\n  private onChangeDistance(e: Event) {\n    this.showInsurances = false;\n    const currentTarget = e.currentTarget as HTMLSelectElement;\n    const distance = currentTarget.value as DrivingDistance;\n    setDrivingDistance(distance)(this.props.store.dispatch);\n    switch (distance) {\n      case DrivingDistance.Between0And1000:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED,\n          EcomStep.INSURANCE_IF\n        );\n        break;\n      case DrivingDistance.Between1000And1500:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED,\n          EcomStep.INSURANCE_IF\n        );\n        break;\n      case DrivingDistance.Between1500And2000:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED,\n          EcomStep.INSURANCE_IF\n        );\n        break;\n      case DrivingDistance.Between2000And2500:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED,\n          EcomStep.INSURANCE_IF\n        );\n        break;\n      case DrivingDistance.Over2500:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.INSURANCE_MILEAGE_OVER_2500_SELECTED,\n          EcomStep.INSURANCE_IF\n        );\n        break;\n      default:\n        break;\n    }\n  }\n\n  private onShowInsurances() {\n    this.showInsurances = true;\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SHOW, EcomStep.INSURANCE_IF);\n    this.render();\n  }\n\n  private onEdit() {\n    this.showInsurances = false;\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_EDIT_MILEAGE, EcomStep.INSURANCE_IF);\n    this.render();\n  }\n\n  render() {\n    const { store, lastStage, onSkip } = this.props;\n    const state = store.getState();\n\n    const insuranceDisclaimerTitle =\n      state.order?.insuranceOption?.title || '[Ok\u00E4nt f\u00F6rs\u00E4kringsbolag]';\n\n    if (this.showInsurances) {\n      new InsuranceView(this.node, {\n        store,\n        lastStage,\n        onEdit: () => this.onEdit(),\n      });\n    } else {\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('insurance.ifDescription')}</p>\n          </div>\n        </div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_INFO_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DISTANCE_NODE}\"></div>\n\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SHOW_INSURANCES_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SHOW_INSURANCES_DISCLAIMER_NODE}\"></div>\n        </div>\n      `;\n      new InputSelect(this.node.querySelector<HTMLDivElement>(`#${DISTANCE_NODE}`), {\n        id: DISTANCE,\n        title: i18next.t('insurance.showInsurances'),\n        name: 'distance',\n        value: state.drivingDistance,\n        options: [\n          {\n            value: DrivingDistance.Between0And1000,\n            title: translateDrivingDistance[DrivingDistance.Between0And1000],\n          },\n          {\n            value: DrivingDistance.Between1000And1500,\n            title: translateDrivingDistance[DrivingDistance.Between1000And1500],\n          },\n          {\n            value: DrivingDistance.Between1500And2000,\n            title: translateDrivingDistance[DrivingDistance.Between1500And2000],\n          },\n          {\n            value: DrivingDistance.Between2000And2500,\n            title: translateDrivingDistance[DrivingDistance.Between2000And2500],\n          },\n          {\n            value: DrivingDistance.Over2500,\n            title: translateDrivingDistance[DrivingDistance.Over2500],\n          },\n        ],\n        onChange: (e) => this.onChangeDistance(e),\n      });\n\n      new ButtonArrowRight(this.node.querySelector<HTMLDivElement>(`#${SHOW_INSURANCES_NODE}`), {\n        id: SHOW_INSURANCES,\n        title: i18next.t('insurance.showInsurances'),\n        onClick: () => this.onShowInsurances(),\n      });\n\n      const insuranceInfoNode = this.node.querySelector<HTMLDivElement>(`#${INSURANCE_INFO_NODE}`);\n      if (insuranceInfoNode) {\n        insuranceInfoNode.innerHTML = Alert({\n          tone: 'info',\n          polite: true,\n          children: i18next.t('insurance.ifAlert', { insuranceDisclaimerTitle }),\n        });\n      }\n\n      new Disclaimer(\n        this.node.querySelector<HTMLDivElement>(`#${SHOW_INSURANCES_DISCLAIMER_NODE}`),\n        {\n          text: i18next.t('insurance.ifDisclaimer', { insuranceDisclaimerTitle }),\n        }\n      );\n\n      new ButtonSkip(this.node.querySelector<HTMLDivElement>(`#${SKIP_INSURANCES_NODE}`), {\n        id: SKIP_INSURANCES,\n        title: i18next.t('insurance.skipButton'),\n        onClick: () => onSkip(),\n      });\n    }\n  }\n}\n\nexport default IfInsurance;\n", "import { DrivingDistance, insurances } from '@wayke-se/ecom';\nimport { WaykeStore } from '../Redux/store';\n\nexport const getInsurances = (store: WaykeStore, drivingDistance: DrivingDistance) => {\n  const state = store.getState();\n  if (!state.id) throw 'No id';\n\n  const request = insurances\n    .newInsuranceOptionsRequest()\n    .forCustomer(state.customer.socialId)\n    .forVehicle(state.id)\n    .withDrivingDistance(drivingDistance);\n\n  return insurances.getOptions(request.build());\n};\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonSuccessProps {\n  readonly title: string;\n  readonly id?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonSuccess extends HtmlNode {\n  private readonly props: ButtonSuccessProps;\n\n  constructor(element: HTMLDivElement | null, props: ButtonSuccessProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  isDisabled() {\n    return this.props.disabled;\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  loading(loading: boolean) {\n    if (this.props.loading !== loading) {\n      this.props.loading = loading;\n      this.props.disabled = loading;\n      this.render();\n    }\n  }\n\n  render() {\n    const { title, id, disabled, loading, onClick } = this.props;\n    this.node.innerHTML = `\n      <button\n        type=\"button\"\n        ${id ? `id=\"${id}\"` : ''}\n        title=\"${title}\"\n        ${disabled && `disabled=\"\"`}\n        class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--success\"\n      >\n        <span class=\"waykeecom-button__content\">${title}</span>\n        ${\n          loading\n            ? `\n              <span class=\"waykeecom-button__content\">\n                ${Loader({ type: 'inline' })}\n              </span>`\n            : ''\n        }\n      </button>\n    `;\n    if (onClick) {\n      this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n    }\n  }\n}\n\nexport default ButtonSuccess;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface InputCheckboxProps {\n  readonly title: string;\n  readonly value: string;\n  readonly name: string;\n  readonly description?: string;\n  readonly meta?: string;\n  readonly id: string;\n  checked: boolean;\n  readonly onClick?: (e: Event) => void;\n  readonly append?: boolean;\n  disabled?: boolean;\n}\n\nclass InputCheckbox extends HtmlNode {\n  private readonly props: InputCheckboxProps;\n\n  constructor(element: HTMLElement | null, props: InputCheckboxProps) {\n    super(\n      element,\n      props.append\n        ? {\n            htmlTag: 'div',\n            className: 'waykeecom-input-selection',\n            attributes: [{ key: 'role', value: 'checkbox' }],\n          }\n        : undefined\n    );\n    this.props = props;\n    this.render();\n  }\n\n  checked(checked: boolean) {\n    if (this.props.checked !== checked) {\n      this.props.checked = checked;\n      this.render();\n    }\n  }\n\n  disabled(disabled: boolean) {\n    if (this.props.disabled !== disabled) {\n      this.props.disabled = disabled;\n      this.render();\n    }\n  }\n\n  render() {\n    const { id, title, value, name, checked, meta, description, append, disabled, onClick } =\n      this.props;\n\n    const content = `\n        <input\n          type=\"checkbox\"\n          id=\"${id}\"\n          value=\"${value}\"\n          name=\"${name}\"\n          ${disabled ? 'disabled=\"\"' : ''}\n          ${checked ? 'checked=\"true\"' : ''}\n          class=\"waykeecom-input-selection__input\"\n        />\n        <div class=\"waykeecom-input-selection__header\">\n          <label for=\"${id}\" class=\"waykeecom-input-selection__label\">${title}</label>\n          ${meta ? `<div class=\"waykeecom-input-selection__meta\">${meta}</div>` : ''}\n        </div>\n        ${\n          description\n            ? `\n            <label for=\"${id}\" class=\"waykeecom-input-selection__description\">\n              ${description}\n            </label>\n          `\n            : ''\n        }\n  `;\n\n    if (append) {\n      this.node.innerHTML = content;\n    }\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-selection\" role=\"checkbox\">\n       ${content}\n      </div>\n    `;\n\n    const input = this.node.querySelector(`#${id}`);\n    if (input) {\n      if (onClick) {\n        input.addEventListener('click', onClick);\n      }\n    }\n  }\n}\n\nexport default InputCheckbox;\n", "import HtmlNode from '../../../../Components/Extension/HtmlNode';\n\nclass InsuracenAddonBox extends HtmlNode {\n  constructor(element: HTMLElement | null) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--1' });\n    this.render();\n  }\n\n  render() {\n    this.node.innerHTML = `<div class=\"waykeecom-box\"></div>`;\n\n    return this.node.querySelector<HTMLElement>('.waykeecom-box') as HTMLElement;\n  }\n}\n\nexport default InsuracenAddonBox;\n", "import i18next from '@i18n';\nimport { IInsuranceAddon, IInsuranceOption } from '@wayke-se/ecom';\nimport Accordion from '../../../../Components/Accordion';\nimport ButtonAddRemove from '../../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../../Components/Button/ButtonClear';\nimport ButtonSuccess from '../../../../Components/Button/ButtonSuccess';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../../Components/Input/InputCheckbox';\nimport { addOrRemoveInsuranceAddon } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../../Utils/format';\nimport { scrollTop } from '../../../../Utils/scroll';\nimport InsuracenAddonBox from './InsuranceAddonBox';\n\nconst BUTTON_TOP_LEFT_NODE = 'insurance-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'insurance-button-bottom-left-node';\nconst BUTTON_INSURANCE_ADD_REMOVE_NODE = 'insurance-add-remove-node';\n\nconst ADDONS_NODE = 'insurance-addons-node';\nconst ACCORDION_NODE = 'insurance-accordion-node';\n\nconst slugify = (text: string) => {\n  return text\n    .toString()\n    .toLowerCase()\n    .replace(/\\s+/g, '-') // Replace spaces with -\n    .replace(/[^\\w\\-]+/g, '') // Remove all non-word characters\n    .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n    .replace(/^-+/, '') // Trim - from start of text\n    .replace(/-+$/, ''); // Trim - from end of text\n};\n\ninterface InsuranceItemInfoProps {\n  readonly store: WaykeStore;\n  readonly insurance: IInsuranceOption;\n  readonly selected: boolean;\n  readonly onClose: () => void;\n}\n\nclass InsuranceItemInfo extends HtmlNode {\n  private readonly props: InsuranceItemInfoProps;\n  private initialAddons: IInsuranceAddon[] = [];\n  private addons: IInsuranceAddon[] = [];\n  private contexts: {\n    updateButton?: ButtonSuccess | ButtonAddRemove;\n    checkboxes: { [key: string]: InputCheckbox | undefined };\n  } = { checkboxes: {} };\n\n  constructor(element: HTMLElement, props: InsuranceItemInfoProps) {\n    super(element);\n    this.props = props;\n\n    const { insuranceAddOns } = this.props.store.getState();\n    if (!!insuranceAddOns?.insurance && insuranceAddOns.insurance === this.props.insurance.name) {\n      this.addons = [...insuranceAddOns.addOns];\n    }\n\n    this.initialAddons = [...this.addons];\n\n    this.render();\n  }\n\n  private static containChanges(_initialAddons: IInsuranceAddon[], _addons: IInsuranceAddon[]) {\n    const initialAddons = [..._initialAddons].sort();\n    const addons = [..._addons].sort();\n    return initialAddons.join().localeCompare(addons.join()) !== 0;\n  }\n\n  onClick(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const { name, checked } = currentTarget;\n    const selectedAddon = this.props.insurance.addOns.find((x) => x.name === name);\n\n    if (selectedAddon) {\n      Object.keys(this.contexts.checkboxes).forEach((key) => {\n        this.contexts.checkboxes[key]?.disabled(false);\n      });\n\n      if (checked) {\n        ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ADDON_SELECTED, EcomStep.INSURANCE_IF);\n        this.addons.push(selectedAddon);\n      } else {\n        ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ADDON_UNSELECTED, EcomStep.INSURANCE_IF);\n        const index = this.addons.findIndex((x) => x.name === selectedAddon.name);\n        if (index > -1) {\n          this.addons.splice(index, 1);\n        }\n      }\n\n      this.contexts.checkboxes[name]?.checked(checked);\n\n      [...new Set(this.addons.map((a) => a.exclude).flat())].forEach((exclude) =>\n        this.contexts.checkboxes[exclude as string]?.disabled(true)\n      );\n    }\n\n    const containChanges = InsuranceItemInfo.containChanges(this.initialAddons, this.addons);\n    this.contexts.updateButton?.disabled(this.props.selected ? !containChanges : false);\n    this.render();\n  }\n\n  onUpdate() {\n    const { insurance } = this.props.store.getState();\n    if (!insurance || (insurance && this.props.insurance.name !== insurance.name)) {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE_IF);\n    } else {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE_IF);\n    }\n\n    addOrRemoveInsuranceAddon(this.props.insurance, this.addons)(this.props.store.dispatch);\n    this.props.onClose();\n  }\n\n  render() {\n    const { insurance, selected, onClose } = this.props;\n    const { name, description, legalDescription, legalUrl, insuranceItems } = insurance;\n    const addons = insurance.addOns;\n\n    const containChanges = InsuranceItemInfo.containChanges(this.initialAddons, this.addons);\n\n    const price = this.addons.reduce((prev, curr) => {\n      return prev + curr.monthlyPrice;\n    }, insurance.price);\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n            <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${name}</h3>\n          </div>\n          ${\n            false\n              ? `\n          <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n            <div class=\"waykeecom-logo\">\n              <img src=\"${''}\" alt=\"${i18next.t('insurance.logoAlt', { title: name })}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n            </div>\n          </div>\n          `\n              : ''\n          }\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(price, {\n          postfix: i18next.t('insurance.perMonth'),\n        })}</div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n          <p class=\"waykeecom-content__p\">${description}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <a \n          href=\"${legalUrl}\"\n          rel=\"noopener noreferrer\"\n          target=\"_blank\"\n          class=\"waykeecom-link\"\n        >${legalDescription}</a>\n      </div>\n      ${\n        addons?.length\n          ? `<div class=\"waykeecom-stack waykeecom-stack--3\">\n              <fieldset class=\"waykeecom-input-group\">\n                <legend class=\"waykeecom-input-label\"><div class=\"waykeecom-input-label__label\">${i18next.t('insurance.addons')}</div></legend>\n                <div id=\"${ADDONS_NODE}\"></div>\n              </fieldset>\n            </div>`\n          : ''\n      }\n      ${\n        insuranceItems?.length\n          ? `\n            <div class=\"waykeecom-stack waykeecom-stack--3\">\n              <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('insurance.includes')}</h4>\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCORDION_NODE}\"></div>\n          `\n          : ''\n      }\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_INSURANCE_ADD_REMOVE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n      </div>\n    `;\n\n    new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n      title: i18next.t('insurance.backButton'),\n      onClick: () => onClose(),\n    });\n\n    if (!!addons?.length) {\n      const node = this.node.querySelector<HTMLElement>(`#${ADDONS_NODE}`);\n      addons.forEach((addon) => {\n        const subNode = new InsuracenAddonBox(node);\n        this.contexts.checkboxes[addon.name] = new InputCheckbox(subNode.render(), {\n          id: slugify(addon.name),\n          name: addon.name,\n          title: addon.title,\n          meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(\n            addon.monthlyPrice,\n            { postfix: i18next.t('insurance.perMonth') }\n          )}</div>`,\n          description: `<div class=\"waykeecom-text waykeecom-text--tone-alt\">${addon.description}</div>`,\n          append: true,\n          value: addon.name,\n          checked: this.addons.findIndex((x) => x.name === addon.name) > -1,\n          onClick: (e) => this.onClick(e),\n        });\n      });\n    }\n\n    if (!!insuranceItems?.length) {\n      const node = this.node.querySelector<HTMLElement>(`#${ACCORDION_NODE}`);\n      insuranceItems.forEach(\n        (ii) =>\n          new Accordion(node, {\n            id: ii.name,\n            title: ii.name,\n            description: ii.description,\n            append: true,\n          })\n      );\n    }\n\n    new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n      title: i18next.t('insurance.backButton'),\n      onClick: () => onClose(),\n    });\n\n    new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n      title: i18next.t('insurance.backButton'),\n      onClick: () => onClose(),\n    });\n\n    if (selected) {\n      this.contexts.updateButton = new ButtonSuccess(\n        this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`),\n        {\n          title: selected ? i18next.t('insurance.update') : i18next.t('insurance.select'),\n          disabled: selected ? !containChanges : undefined,\n          onClick: () => this.onUpdate(),\n        }\n      );\n    } else {\n      this.contexts.updateButton = new ButtonAddRemove(\n        this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`),\n        {\n          selected: false,\n          fullSize: true,\n          disabled: selected ? !containChanges : undefined,\n          onClick: () => this.onUpdate(),\n        }\n      );\n    }\n\n    scrollTop();\n  }\n}\n\nexport default InsuranceItemInfo;\n", "import i18next from '@i18n';\nimport { IInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport GridItem from '../../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveInsurance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../../Utils/format';\nimport { createPortal, destroyPortal } from '../../../../Utils/portal';\nimport InsuranceItemInfo from './InsuranceItemInfo';\n\ninterface InsuranceItemProps {\n  readonly store: WaykeStore;\n  readonly insurance: IInsuranceOption;\n  readonly key: string;\n}\n\nclass InsuranceItem extends HtmlNode {\n  private readonly props: InsuranceItemProps;\n  private displayInfo = false;\n\n  constructor(element: HTMLElement, props: InsuranceItemProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'insurance', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private onInfoOpen() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE_IF);\n    this.displayInfo = true;\n    this.render();\n  }\n\n  private onInfoClose() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE_IF);\n    this.displayInfo = false;\n    destroyPortal();\n    this.render();\n    this.node.parentElement?.scrollIntoView();\n  }\n\n  private onClick() {\n    const { insurance } = this.props.store.getState();\n    if (!insurance || (insurance && this.props.insurance.name !== insurance.name)) {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE_IF);\n    } else {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE_IF);\n    }\n\n    addOrRemoveInsurance(this.props.insurance)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, insurance, key } = this.props;\n    const state = store.getState();\n    const logo = state.order?.insuranceOption?.logo;\n    const selectedAddons =\n      state.insuranceAddOns?.insurance === insurance.name\n        ? state.insuranceAddOns.addOns.map((k) => {\n            return {\n              key: k?.title,\n              value: prettyNumber(k?.monthlyPrice, { postfix: i18next.t('insurance.perMonth') }),\n            };\n          })\n        : undefined;\n    const selected = state.insurance\n      ? JSON.stringify(state.insurance).localeCompare(JSON.stringify(insurance)) === 0\n      : false;\n    if (this.displayInfo) {\n      new InsuranceItemInfo(createPortal(), {\n        store: this.props.store,\n        insurance,\n        selected,\n        onClose: () => this.onInfoClose(),\n      });\n    }\n\n    new GridItem(\n      this.node,\n      {\n        logo,\n        selected,\n        id: key,\n        title: insurance.name,\n        description: insurance.description,\n        price: prettyNumber(insurance.price, { postfix: i18next.t('insurance.perMonth') }),\n        priceDetails: selectedAddons,\n        onClick: () => this.onClick(),\n        onInfo: () => this.onInfoOpen(),\n      },\n      key\n    );\n  }\n}\n\nexport default InsuranceItem;\n", "import { IInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport OverflowGridList from '../../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceItem from './InsuranceItem';\n\ninterface InsuranceListProps {\n  readonly store: WaykeStore;\n  readonly insurances: IInsuranceOption[];\n}\nclass InsuranceList extends HtmlNode {\n  private readonly props: InsuranceListProps;\n\n  constructor(element: HTMLDivElement | null, props: InsuranceListProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n  }\n\n  render() {\n    const { store, insurances } = this.props;\n    const listRef = new OverflowGridList(this.node, {\n      id: 'insurance-list',\n      onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ARROW, EcomStep.INSURANCE_IF),\n    });\n    const { overflowElement } = listRef;\n    if (overflowElement) {\n      overflowElement.innerHTML = '';\n      insurances.forEach(\n        (insurance, index) =>\n          new InsuranceItem(overflowElement, {\n            store,\n            insurance,\n            key: `insurance-${index}`,\n          })\n      );\n    }\n  }\n}\n\nexport default InsuranceList;\n", "import i18next from '@i18n';\nimport { IInsuranceOption } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { getInsurances } from '../../../../Data/getInsurances';\nimport { addOrRemoveInsurance, completeStage } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport Alert from '../../../../Templates/Alert';\nimport KeyValueListItem from '../../../../Templates/KeyValueListItem';\nimport Loader from '../../../../Templates/Loader';\nimport { translateDrivingDistance } from '../../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceList from './InsuranceList';\n\nconst INSURANCE_GRID_LIST_NODE = 'insurance-grid-list-node';\n\nconst PROCEED_INSURANCE = 'button-insurances-proceed';\nconst PROCEED_INSURANCE_NODE = `${INSURANCE_GRID_LIST_NODE}-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\nconst EDIT_DRIVING_DISTANCE = 'button-insurance-edit-driving-distance';\nconst EDIT_DRIVING_DISTANCE_NODE = `${EDIT_DRIVING_DISTANCE}-node`;\n\nconst IF_INSURANCE_CACHE: { [key: string]: IInsuranceOption[] | undefined } = {};\n\ninterface InsuranceViewProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n  readonly onEdit: () => void;\n}\n\nclass InsuranceView extends HtmlNode {\n  private readonly props: InsuranceViewProps;\n  private requestError: boolean = false;\n  private insurances?: IInsuranceOption[];\n  private contexts: {\n    buttonProceed?: ButtonArrowRight;\n    listners: ((() => void) | undefined)[];\n  } = { listners: [] };\n\n  constructor(element: HTMLElement, props: InsuranceViewProps) {\n    super(element);\n    this.props = props;\n\n    const drivingDistanceListner = watch(this.props.store, 'drivingDistance', () => {\n      this.fetchInsurance();\n    });\n    this.contexts.listners.push(drivingDistanceListner);\n\n    const customerIdListner = watch(this.props.store, 'customer.socialId', () => {\n      this.fetchInsurance();\n    });\n\n    this.contexts.listners.push(customerIdListner);\n\n    const insuranceListner = watch(this.props.store, 'insurance', () => {\n      this.contexts.buttonProceed?.disabled(!this.props.store.getState().insurance);\n    });\n    this.contexts.listners.push(insuranceListner);\n\n    this.fetchInsurance();\n    this.render();\n  }\n\n  private fetchInsurance() {\n    const state = this.props.store.getState();\n    if (state.customer.socialId) {\n      this.getInsurances();\n    }\n  }\n\n  private async getInsurances() {\n    const state = this.props.store.getState();\n    this.requestError = false;\n    this.render();\n\n    const cacheKey = `${state.customer.socialId}-${state.id}-${state.drivingDistance}`;\n    const cache = IF_INSURANCE_CACHE[cacheKey];\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_REQUESTED, EcomStep.INSURANCE_IF);\n    if (cache) {\n      this.insurances = cache;\n\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_SUCCEEDED, EcomStep.INSURANCE_IF);\n      this.render();\n      return;\n    }\n\n    try {\n      const response = await getInsurances(this.props.store, state.drivingDistance);\n\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_SUCCEEDED, EcomStep.INSURANCE_IF);\n      this.insurances = response.getInsuranceOptions();\n      IF_INSURANCE_CACHE[cacheKey] = this.insurances;\n    } catch (_e) {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_FAILED, EcomStep.INSURANCE_IF);\n      this.requestError = true;\n    } finally {\n      this.render();\n    }\n  }\n\n  private onEditDrivingDistance() {\n    this.contexts.listners.forEach((x) => x?.());\n    this.props.onEdit();\n  }\n\n  private onProceed() {\n    completeStage(this.props.lastStage)(this.props.store.dispatch);\n  }\n\n  private onSkipInsurances() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SKIPPED, EcomStep.INSURANCE_IF);\n    addOrRemoveInsurance()(this.props.store.dispatch);\n    completeStage(this.props.lastStage)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store } = this.props;\n    const state = store.getState();\n    const { insurance, drivingDistance } = state;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('insurance.ifDescription')}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${KeyValueListItem({\n              key: i18next.t('insurance.estimatedMileage'),\n              value: translateDrivingDistance[drivingDistance],\n            })}\n          </ul>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <div class=\"waykeecom-align waykeecom-align--end\" id=\"${EDIT_DRIVING_DISTANCE_NODE}\">\n            <button type=\"button\" title=\"${i18next.t('insurance.edit')}\" class=\"waykeecom-link\" >${i18next.t('insurance.edit')}</button>\n          </div>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_GRID_LIST_NODE}\"></div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_INSURANCE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n      </div>\n    `;\n\n    const insuranceListNode = this.node.querySelector<HTMLDivElement>(\n      `#${INSURANCE_GRID_LIST_NODE}`\n    );\n    if (insuranceListNode) {\n      if (this.requestError) {\n        insuranceListNode.innerHTML = Alert({\n          tone: 'error',\n          children: `${i18next.t('insurance.fetchError')} <button type=\"button\" title=\"${i18next.t('insurance.retry')}\" class=\"waykeecom-link waykeecom-link--align-baseline waykeecom-link--current-color\">${i18next.t('insurance.retry')}</button>.`,\n        });\n        insuranceListNode\n          .querySelector<HTMLButtonElement>('button')\n          ?.addEventListener('click', () => this.getInsurances());\n      } else {\n        const insurances = this.insurances;\n        if (insurances?.length) {\n          new InsuranceList(insuranceListNode, { store, insurances });\n        } else {\n          insuranceListNode.innerHTML = Loader();\n        }\n      }\n    }\n\n    new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${EDIT_DRIVING_DISTANCE_NODE}`), {\n      id: EDIT_DRIVING_DISTANCE,\n      title: i18next.t('insurance.edit'),\n      onClick: () => this.onEditDrivingDistance(),\n    });\n\n    this.contexts.buttonProceed = new ButtonArrowRight(\n      this.node.querySelector<HTMLDivElement>(`#${PROCEED_INSURANCE_NODE}`),\n      {\n        id: PROCEED_INSURANCE,\n        disabled: !insurance,\n        title: i18next.t('insurance.proceedButton'),\n        onClick: () => this.onProceed(),\n      }\n    );\n\n    new ButtonSkip(this.node.querySelector<HTMLDivElement>(`#${SKIP_INSURANCES_NODE}`), {\n      id: SKIP_INSURANCES,\n      title: i18next.t('insurance.skipButton'),\n      onClick: () => this.onSkipInsurances(),\n    });\n  }\n}\n\nexport default InsuranceView;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { addOrRemoveInsurance, completeStage, goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport ListItem from '../../../Templates/ListItem';\nimport { translateDrivingDistance } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport DefaultInsurance from './DefaultInsurance';\nimport IfInsurance from './IfInsurance';\n\ninterface InsuranceProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\n\nclass Insurance extends HtmlNode {\n  private readonly props: InsuranceProps;\n\n  constructor(element: HTMLElement, props: InsuranceProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private getStep() {\n    const { order } = this.props.store.getState();\n    return order?.insuranceOption?.institute === 'IF' ? EcomStep.INSURANCE_IF : EcomStep.INSURANCE;\n  }\n\n  private onSkipInsurances() {\n    addOrRemoveInsurance()(this.props.store.dispatch);\n    completeStage(this.props.lastStage)(this.props.store.dispatch);\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SKIPPED, this.getStep());\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_EDIT, this.getStep());\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, index, lastStage } = this.props;\n    const state = store.getState();\n\n    const completed = state.topNavigation.stage > index;\n    const active = state.navigation.stage === index;\n    if (active) {\n      ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ACTIVE, this.getStep());\n    }\n    const content = ListItem(this.node, {\n      completed,\n      title: i18next.t('insurance.title'),\n      active,\n      id: 'insurance',\n      index: index,\n    });\n\n    if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n      const keyValueOptions: KeyValueListItemProps[] = [];\n      if (state.insurance) {\n        keyValueOptions.push({\n          key: i18next.t('insurance.estimatedMileage'),\n          value: translateDrivingDistance[state.drivingDistance],\n        });\n        keyValueOptions.push({\n          key: state.insurance.name,\n          value: prettyNumber(state.insurance.price, { postfix: i18next.t('insurance.perMonth') }),\n        });\n\n        if (state.insuranceAddOns?.insurance === state.insurance.name) {\n          state.insuranceAddOns.addOns.forEach((addon) =>\n            keyValueOptions.push({\n              key: addon.title,\n              value: prettyNumber(addon.monthlyPrice, { postfix: i18next.t('insurance.perMonth') }),\n            })\n          );\n        }\n      } else if (state.freeInsurance) {\n        keyValueOptions.push({\n          key: i18next.t('insurance.title'),\n          value: state.freeInsurance.title,\n        });\n      } else {\n        keyValueOptions.push({\n          key: i18next.t('insurance.title'),\n          value: i18next.t('insurance.none'),\n        });\n      }\n\n      new StageCompleted(content, {\n        keyValueList: keyValueOptions,\n        changeButtonTitle: i18next.t('insurance.changeButtonTitle'),\n        onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n      });\n    } else if (state.navigation.stage === index) {\n      const insuranceOptions = state.order?.insuranceOption;\n      if (!insuranceOptions) throw 'Missing insurance';\n\n      switch (this.props.marketCode === 'SE' && insuranceOptions?.institute) {\n        case 'IF':\n          new IfInsurance(content, {\n            store,\n            lastStage,\n            onSkip: () => this.onSkipInsurances(),\n          });\n          break;\n        default:\n          new DefaultInsurance(content, {\n            store,\n            lastStage,\n            insurance: insuranceOptions,\n          });\n          break;\n      }\n    }\n    if (state.navigation.stage === index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default Insurance;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\n\ninterface InputTextareaProps {\n  readonly title: string;\n  readonly value: string;\n  readonly name: string;\n  readonly id: string;\n  readonly error?: boolean;\n  readonly errorMessage?: string;\n  readonly placeholder?: string;\n  readonly information?: string;\n  readonly autocomplete?: string;\n  readonly onChange?: (e: Event) => void;\n  readonly onBlur?: (e: Event) => void;\n}\n\nclass InputTextarea extends HtmlNode {\n  private readonly props: InputTextareaProps;\n  private contexts: {\n    error?: InputError;\n  } = {};\n\n  constructor(element: HTMLElement | null, props: InputTextareaProps) {\n    super(element);\n\n    this.props = props;\n    this.render();\n  }\n\n  setError(error: boolean) {\n    this.contexts.error?.setError(error);\n  }\n\n  private render() {\n    const {\n      title,\n      value,\n      name,\n      id,\n      error,\n      errorMessage,\n      placeholder,\n      information,\n      autocomplete,\n      onChange,\n      onBlur,\n    } = this.props;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-input-label\">\n        <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n      </div>\n      <textarea\n        id=\"${id}\"\n        name=\"${name}\"\n        ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n        ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n        class=\"waykeecom-textarea\"\n      >${value}</textarea>\n    `;\n\n    if (errorMessage) {\n      this.contexts.error = new InputError(this.node, {\n        error,\n        errorMessage,\n      });\n    }\n\n    if (information) {\n      new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n        information,\n      });\n    }\n\n    const input = this.node.querySelector('textarea');\n    if (input) {\n      if (onChange) {\n        input.addEventListener('input', onChange);\n      }\n      if (onBlur) {\n        input.addEventListener('blur', onBlur);\n      }\n    }\n  }\n}\n\nexport default InputTextarea;\n", "import { vehicles } from '@wayke-se/ecom';\nimport { TradeInCarData } from '../@types/TradeIn';\n\nexport const getTradeInVehicle = (data: TradeInCarData) => {\n  const request = vehicles\n    .newLookupRequest()\n    .withRegistrationNumber(data.registrationNumber)\n    .withMileage(parseInt(data.mileage, 10))\n    .withCondition(data.condition);\n\n  return vehicles.lookupVehicle(request.build());\n};\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport { TradeInCarData, TradeInCarDataPartial, VehicleCondition } from '../../../@types/TradeIn';\nimport { VehicleLookup } from '../../../@types/VehicleLookup';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport InputTextarea from '../../../Components/Input/InputTextarea';\nimport { getTradeInVehicle } from '../../../Data/getTradeInVehicle';\nimport { setTradeIn } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { translateTradeInCondition } from '../../../Utils/constants';\nimport { convertVehicleLookupResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst REGISTRATION_NUMBER_ID = 'trade-in-registrationNumber';\nconst REGISTRATION_NUMBER_NODE = `${REGISTRATION_NUMBER_ID}-node`;\n\nconst MILEAGE_ID = 'trade-in-mileage';\nconst MILEAGE_NODE = `${MILEAGE_ID}-node`;\n\nconst DESCRIPTION_ID = 'trade-in-description';\nconst DESCRIPTION_NODE = `${DESCRIPTION_ID}-node`;\n\nconst CONDITION_ID = 'trade-in-condition';\nconst CONDITION_NODE = `${CONDITION_ID}-node`;\n\nconst FETCH = 'trade-in-fetch';\nconst FETCH_NODE = `${FETCH}-node`;\n\nconst PROCEED = 'trade-in-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst TRADE_IN_NO = 'button-trade-in-no';\nconst TRADE_IN_NO_NODE = `${TRADE_IN_NO}-node`;\n\nconst CHANGE_BUTTON = 'button-trade-in-change';\nconst CHANGE_BUTTON_NODE = `${CHANGE_BUTTON}-node`;\n\nconst validation = {\n  registrationNumber: validationMethods.requiredRegistrationNumber,\n  mileage: validationMethods.requiredMileage,\n  description: validationMethods.optionalString,\n  condition: validationMethods.requiredCondition,\n};\n\nexport interface TradeInValidation {\n  registrationNumber: boolean;\n  mileage: boolean;\n  description: boolean;\n  condition: boolean;\n}\n\ninterface PartTradeInState {\n  value: TradeInCarDataPartial;\n  validation: TradeInValidation;\n  interact: TradeInValidation;\n}\n\ntype INPUT_STRING_KEYS = keyof Omit<TradeInValidation, 'condition'>;\ntype INPUT_RADIO_KEYS = keyof Omit<\n  TradeInValidation,\n  'registrationNumber' | 'mileage' | 'description'\n>;\n\n// const TRADE_IN_CACHE: { [key: string]: IVehicle | undefined } = {};\n\nconst initalState = (\n  tradeIn?: TradeInCarDataPartial,\n  marketCode?: MarketCode\n): PartTradeInState => {\n  const value = {\n    registrationNumber: marketCode === 'SE' ? tradeIn?.registrationNumber || '' : '',\n    mileage: tradeIn?.mileage || '',\n    description: tradeIn?.description || '',\n    condition: tradeIn?.condition,\n  };\n  return {\n    value,\n    validation: {\n      registrationNumber: validation.registrationNumber(value.registrationNumber, marketCode),\n      mileage: validation.mileage(value.mileage),\n      description: validation.description(value.description),\n      condition: validation.condition(value.condition),\n    },\n    interact: { registrationNumber: false, mileage: false, description: false, condition: false },\n  };\n};\n\ninterface PartTradeInProps {\n  readonly store: WaykeStore;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\n\nclass PartTradeIn extends HtmlNode {\n  private readonly props: PartTradeInProps;\n  private state: PartTradeInState;\n  private response?: VehicleLookup;\n  private contexts: {\n    registrationNumber?: InputField;\n    mileage?: InputField;\n    description?: InputTextarea;\n    buttonFetch?: ButtonArrowRight;\n  } = {};\n  private requestError = false;\n\n  constructor(element: HTMLElement, props: PartTradeInProps) {\n    super(element);\n    this.props = props;\n\n    const state = this.props.store.getState();\n    this.state = initalState(state.tradeIn, props.marketCode);\n    this.render();\n  }\n\n  private async onFetchVehicle() {\n    this.requestError = false;\n    this.render();\n\n    try {\n      ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_REQUESTED, EcomStep.TRADE_IN_DETAILS);\n\n      this.contexts.buttonFetch?.loading(true);\n      if (\n        this.state.validation.registrationNumber &&\n        this.state.validation.mileage &&\n        this.state.validation.description &&\n        this.state.validation.condition\n      ) {\n        const value = this.state.value as TradeInCarData;\n        const scandinavianMileage =\n          this.props.marketCode === 'SE' ? value.mileage : String(Number(value.mileage) / 10);\n        const _response = await getTradeInVehicle({ ...value, mileage: scandinavianMileage });\n        const response = convertVehicleLookupResponse(_response);\n        this.response = response;\n        this.render();\n        ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_SUCCEEDED, EcomStep.TRADE_IN_DETAILS);\n      }\n    } catch (_e) {\n      this.requestError = true;\n      this.render();\n      ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_FAILED, EcomStep.TRADE_IN_DETAILS);\n    } finally {\n      this.contexts.buttonFetch?.loading(false);\n    }\n  }\n\n  private onEdit() {\n    this.response = undefined;\n    this.render();\n    ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SKIPPED, EcomStep.TRADE_IN_DETAILS);\n  }\n\n  private onProceed() {\n    if (this.response) {\n      const vehicle = this.response.vehicle;\n      const value = this.state.value as TradeInCarData;\n      setTradeIn(this.props.lastStage, value, vehicle)(this.props.store.dispatch);\n      ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SET, EcomStep.TRADE_IN_DETAILS);\n    }\n  }\n\n  private onChangeRadio(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as INPUT_RADIO_KEYS;\n    const value = currentTarget.value as VehicleCondition;\n\n    this.state.value[name] = value;\n    this.state.validation[name] = validation[name](value);\n    this.updateProceedButton();\n\n    switch (value) {\n      case VehicleCondition.VeryGood:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.TRADE_IN_CONDITION_VERY_GOOD_SELECTED,\n          EcomStep.TRADE_IN_DETAILS\n        );\n        break;\n      case VehicleCondition.Good:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.TRADE_IN_CONDITION_GOOD_SELECTED,\n          EcomStep.TRADE_IN_DETAILS\n        );\n        break;\n      case VehicleCondition.Ok:\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.TRADE_IN_CONDITION_OK_SELECTED,\n          EcomStep.TRADE_IN_DETAILS\n        );\n        break;\n      default:\n        break;\n    }\n  }\n\n  private onChange(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as INPUT_STRING_KEYS;\n\n    if (name === 'registrationNumber') {\n      currentTarget.value = currentTarget.value.toUpperCase();\n    }\n\n    const value = currentTarget.value;\n\n    this.state.value[name] = value;\n    this.state.validation[name] =\n      name === 'registrationNumber'\n        ? validation[name](value, this.props.marketCode)\n        : validation[name](value);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private onBlur(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    const name = currentTarget.name as INPUT_STRING_KEYS;\n\n    this.state.interact[name] = true;\n    this.state.validation[name] =\n      name === 'registrationNumber'\n        ? validation[name](this.state.value[name], this.props.marketCode)\n        : validation[name](this.state.value[name]);\n    this.updateUiError(name);\n    this.updateProceedButton();\n  }\n\n  private updateUiError(name: INPUT_STRING_KEYS) {\n    this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n  }\n\n  private updateProceedButton() {\n    this.contexts.buttonFetch?.disabled(\n      !(\n        this.state.validation.registrationNumber &&\n        this.state.validation.mileage &&\n        this.state.validation.description &&\n        this.state.validation.condition\n      )\n    );\n  }\n\n  private onNoTradeIn() {\n    setTradeIn(this.props.lastStage)(this.props.store.dispatch);\n    ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SELECTED, EcomStep.TRADE_IN_DETAILS);\n  }\n\n  render() {\n    if (this.response) {\n      const keyValueItemsUpper: { key: string; value: string }[] = [];\n\n      const tradeInVehicle = this.response.vehicle;\n      keyValueItemsUpper.push({\n        key: i18next.t('tradeIn.mileage'),\n        value: `${this.state.value.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n      });\n      if (this.state.value.description) {\n        keyValueItemsUpper.push({\n          key: i18next.t('tradeIn.description'),\n          value: `${this.state.value.description}`,\n        });\n      }\n\n      if (this.state.value.condition) {\n        keyValueItemsUpper.push({\n          key: i18next.t('tradeIn.condition'),\n          value: translateTradeInCondition[this.state.value.condition],\n        });\n      }\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-balloon\">\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <div class=\"waykeecom-label\">${this.state.value.registrationNumber}</div>\n              </div>\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n                  tradeInVehicle.manufacturer\n                } ${tradeInVehicle.modelSeries}</span>\n                ${tradeInVehicle.modelName}, ${tradeInVehicle.modelYear}\n              </div>\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <ul class=\"waykeecom-key-value-list\">\n                ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n              </ul>\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3 waykeecom-text waykeecom-text--align-center\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <div class=\"waykeecom-text waykeecom-text--tone-alt waykeecom-text--size-small\">${i18next.t('tradeIn.estimatedValue')}</div>\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <div class=\"waykeecom-heading waykeecom-heading--2 waykeecom-no-margin\">\n                ${prettyNumber(tradeInVehicle.valuation, { postfix: 'kr' })}\n              </div>\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            ${Alert({\n              tone: 'info',\n              children: `<span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('tradeIn.infoText')}</span> ${i18next.t('tradeIn.infoDisclaimer')}`,\n            })}\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n          </div>\n      `;\n\n      new ButtonAsLink(this.node.querySelector(`#${CHANGE_BUTTON_NODE}`), {\n        id: CHANGE_BUTTON,\n        title: i18next.t('tradeIn.changeButtonTitle'),\n        onClick: () => this.onEdit(),\n      });\n\n      new ButtonArrowRight(this.node.querySelector(`#${PROCEED_NODE}`), {\n        title: i18next.t('tradeIn.proceedButton'),\n        onClick: () => this.onProceed(),\n      });\n\n      new ButtonSkip(this.node.querySelector(`#${TRADE_IN_NO_NODE}`), {\n        id: TRADE_IN_NO,\n        title: i18next.t('tradeIn.skipButton'),\n        onClick: () => this.onNoTradeIn(),\n      });\n      this.node.parentElement?.parentElement?.scrollIntoView();\n    } else {\n      this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('tradeIn.detailsHeading')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('tradeIn.detailsDescription')}</p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${REGISTRATION_NUMBER_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${MILEAGE_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DESCRIPTION_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONDITION_NODE}\"></div>\n      </div>\n      ${\n        this.requestError\n          ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n              tone: 'error',\n              children: i18next.t('tradeIn.fetchError'),\n            })}</div>`\n          : ''\n      }\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${FETCH_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n      </div>\n    `;\n\n      this.contexts.registrationNumber = new InputField(\n        this.node.querySelector(`#${REGISTRATION_NUMBER_NODE}`),\n        {\n          title: i18next.t('tradeIn.registrationNumber'),\n          value: this.state.value.registrationNumber,\n          id: REGISTRATION_NUMBER_ID,\n          error:\n            this.state.interact.registrationNumber && !this.state.validation.registrationNumber,\n          errorMessage: i18next.t('tradeIn.registrationNumberError'),\n          name: 'registrationNumber',\n          autocomplete: 'off',\n          placeholder: i18next.t('tradeIn.registrationNumberPlaceholder'),\n          unit:\n            this.props.marketCode === 'SE'\n              ? `\n                <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 34\" class=\"waykeecom-input-text__unit-regnr-icon\" aria-hidden=\"true\">\n                  <rect width=\"22\" height=\"34\" rx=\"1\" fill=\"#458BDD\"/>\n                  <circle cx=\"11\" cy=\"10\" r=\"5.5\" stroke=\"#FFF500\" stroke-linejoin=\"round\" stroke-dasharray=\"1 2\"/>\n                  <path d=\"M10.6707 21.692c1.392 0 2.04.564 2.28.996h1.644c-.264-1.08-1.248-2.364-3.924-2.364-2.028 0-3.408.912-3.408 2.436 0 1.536 1.2 2.34 2.904 2.508l1.512.156c.876.108 1.476.372 1.476 1.188 0 .684-.684 1.176-1.98 1.176-1.56 0-2.244-.72-2.472-1.26h-1.716c.336 1.224 1.404 2.628 4.188 2.628 2.412 0 3.624-1.116 3.624-2.652 0-1.8-1.308-2.448-3.012-2.616-.576-.06-.972-.108-1.5-.156-.888-.108-1.392-.444-1.392-1.02 0-.624.612-1.02 1.776-1.02Z\" fill=\"#fff\"/>\n                </svg>\n              `\n              : `\n                <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 34\" class=\"waykeecom-input-text__unit-regnr-icon\" aria-hidden=\"true\">\n                  <rect width=\"22\" height=\"34\" rx=\"1\" fill=\"#003399\"/>\n                  <rect x=\"4\" y=\"5\" width=\"14\" height=\"10\" fill=\"#ef2b2d\"/>\n                  <rect x=\"7.5\" y=\"5\" width=\"2.5\" height=\"10\" fill=\"#ffffff\"/>\n                  <rect x=\"4\" y=\"8.75\" width=\"14\" height=\"2.5\" fill=\"#ffffff\"/>\n                  <rect x=\"8.25\" y=\"5\" width=\"1\" height=\"10\" fill=\"#002868\"/>\n                  <rect x=\"4\" y=\"9.5\" width=\"14\" height=\"1\" fill=\"#002868\"/>\n                  <path d=\"M7.75 21.692v6h1.5v-4.5l3 4.5h1.5v-6h-1.5v4.5l-3-4.5h-1.5Z\" fill=\"#fff\"/>\n                </svg>`,\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      this.contexts.mileage = new InputField(this.node.querySelector(`#${MILEAGE_NODE}`), {\n        title: i18next.t('tradeIn.mileage'),\n        value: this.state.value.mileage,\n        id: MILEAGE_ID,\n        error: this.state.interact.mileage && !this.state.validation.mileage,\n        errorMessage: i18next.t('tradeIn.mileageError'),\n        name: 'mileage',\n        autocomplete: 'off',\n        placeholder: i18next.t('tradeIn.mileagePlaceholder'),\n        unit: this.props.marketCode === 'SE' ? 'mil' : 'km',\n        pattern: '[0-9]*',\n        inputmode: 'numeric',\n        onChange: (e) => this.onChange(e),\n        onBlur: (e) => this.onBlur(e),\n      });\n\n      this.contexts.description = new InputTextarea(\n        this.node.querySelector(`#${DESCRIPTION_NODE}`),\n        {\n          title: i18next.t('tradeIn.descriptionOptional'),\n          value: this.state.value.description,\n          id: DESCRIPTION_ID,\n          error: this.state.interact.description && !this.state.validation.description,\n          errorMessage: i18next.t('tradeIn.descriptionError'),\n          name: 'description',\n          autocomplete: 'off',\n          placeholder: i18next.t('tradeIn.descriptionPlaceholder'),\n          onChange: (e) => this.onChange(e),\n          onBlur: (e) => this.onBlur(e),\n        }\n      );\n\n      new InputRadioGroup(this.node.querySelector(`#${CONDITION_NODE}`), {\n        title: i18next.t('tradeIn.condition'),\n        checked: this.state.value.condition as string,\n        name: 'condition',\n        options: [\n          {\n            id: `radio-${VehicleCondition.VeryGood}`,\n            value: VehicleCondition.VeryGood,\n            title: i18next.t('tradeIn.veryGoodCondition'),\n            description: `\n            <div class=\"waykeecom-box\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <ul class=\"waykeecom-content__ul\">\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.noScratches')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.serviced')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.goodTires')}</li>\n                </ul>\n              </div>\n            </div>`,\n          },\n          {\n            id: `radio-${VehicleCondition.Good}`,\n            value: VehicleCondition.Good,\n            title: i18next.t('tradeIn.goodCondition'),\n            description: `\n            <div class=\"waykeecom-box\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <ul class=\"waykeecom-content__ul\">\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.someScratches')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.serviced')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.okTires')}</li>\n                </ul>\n              </div>\n            </div>`,\n          },\n          {\n            id: `radio-${VehicleCondition.Ok}`,\n            value: VehicleCondition.Ok,\n            title: i18next.t('tradeIn.okCondition'),\n            description: `\n            <div class=\"waykeecom-box\">\n              <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n                <ul class=\"waykeecom-content__ul\">\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.manyScratches')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.notServiced')}</li>\n                  <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.badTires')}</li>\n                </ul>\n              </div>\n            </div>`,\n          },\n        ],\n        onClick: (e) => this.onChangeRadio(e),\n      });\n\n      this.contexts.buttonFetch = new ButtonArrowRight(this.node.querySelector(`#${FETCH_NODE}`), {\n        title: i18next.t('tradeIn.fetchValue'),\n        id: FETCH,\n        disabled: !(\n          this.state.validation.registrationNumber &&\n          this.state.validation.mileage &&\n          this.state.validation.condition\n        ),\n        onClick: () => this.onFetchVehicle(),\n      });\n\n      new ButtonSkip(this.node.querySelector(`#${TRADE_IN_NO_NODE}`), {\n        id: TRADE_IN_NO,\n        title: i18next.t('tradeIn.skipButton'),\n        onClick: () => this.onNoTradeIn(),\n      });\n    }\n  }\n}\n\nexport default PartTradeIn;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { goTo, initTradeIn, setTradeIn } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ListItem from '../../../Templates/ListItem';\nimport { translateTradeInCondition } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport PartTradeIn from './PartTradeIn';\n\nconst TRADE_IN_YES = 'button-trade-in-yes';\nconst TRADE_IN_YES_NODE = `${TRADE_IN_YES}-node`;\n\nconst TRADE_IN_NO = 'button-trade-in-no';\nconst TRADE_IN_NO_NODE = `${TRADE_IN_NO}-node`;\n\nconst CHANGE_BUTTON = 'button-trade-in-change';\nconst CHANGE_BUTTON_NODE = `${CHANGE_BUTTON}-node`;\n\ninterface TradeInProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n  readonly marketCode: MarketCode;\n}\n\nclass TradeIn extends HtmlNode {\n  private readonly props: TradeInProps;\n\n  constructor(element: HTMLElement, props: TradeInProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  private onEdit() {\n    ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_EDIT, EcomStep.TRADE_IN);\n    goTo('main', this.props.index)(this.props.store.dispatch);\n  }\n\n  private onYesTradeIn() {\n    ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SELECTED, EcomStep.TRADE_IN);\n    initTradeIn(this.props.lastStage)(this.props.store.dispatch);\n  }\n\n  private onNoTradeIn() {\n    ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SKIPPED, EcomStep.TRADE_IN);\n    setTradeIn(this.props.lastStage)(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, index, lastStage } = this.props;\n    const state = this.props.store.getState();\n    if (!state.order?.allowsTradeIn) return;\n\n    const completed = state.topNavigation.stage > index;\n    const active = state.navigation.stage === index;\n    if (active) {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.TRADE_IN_ACTIVE,\n        state.navigation.subStage === 1 ? EcomStep.TRADE_IN : EcomStep.TRADE_IN_DETAILS\n      );\n    }\n    const content = ListItem(this.node, {\n      title: i18next.t('tradeIn.title'),\n      active,\n      completed,\n      id: 'trade-in',\n      index: index,\n    });\n    content.innerHTML = '';\n\n    const part = document.createElement('div');\n\n    if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n      const keyValueItemsUpper: { key: string; value: string }[] = [];\n\n      if (state.tradeIn && state.tradeInVehicle) {\n        keyValueItemsUpper.push({\n          key: i18next.t('tradeIn.mileage'),\n          value: `${state.tradeIn.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n        });\n        if (state.tradeIn.description)\n          keyValueItemsUpper.push({\n            key: i18next.t('tradeIn.description'),\n            value: `${state.tradeIn.description}`,\n          });\n        if (state.tradeIn.condition)\n          keyValueItemsUpper.push({\n            key: i18next.t('tradeIn.condition'),\n            value: translateTradeInCondition[state.tradeIn.condition],\n          });\n\n        part.innerHTML = `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-balloon\">\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <div class=\"waykeecom-label\">${state.tradeIn.registrationNumber}</div>\n              </div>\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n                  state.tradeInVehicle.manufacturer\n                } ${state.tradeInVehicle.modelSeries}</span>\n                ${state.tradeInVehicle.modelName}, ${state.tradeInVehicle.modelYear}\n              </div>\n            </div>\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\">\n              <ul class=\"waykeecom-key-value-list\">\n                ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n              </ul>\n            </div>\n            ${\n              !state.createdOrderId\n                ? `\n                  <div class=\"waykeecom-stack waykeecom-stack--1\">\n                    <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n                  </div>\n                `\n                : ''\n            }\n          </div>\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-shadow-box\">\n              <div class=\"waykeecom-stack waykeecom-stack--2\">\n                <ul class=\"waykeecom-key-value-list waykeecom-key-value-list--large-value\">\n                  ${KeyValueListItem({\n                    key: i18next.t('tradeIn.estimatedValue'),\n                    value: `~ ${prettyNumber(state.tradeInVehicle.valuation, { postfix: 'kr' })}`,\n                  })}\n                </ul>\n              </div>\n              <div class=\"waykeecom-stack waykeecom-stack--2\">\n               ${Alert({\n                 tone: 'info',\n                 children: `<span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('tradeIn.infoText')}</span> ${i18next.t('tradeIn.infoDisclaimer')}`,\n               })}\n              </div>\n            </div>\n          </div>\n        `;\n        part.querySelector(`#${CHANGE_BUTTON}`)?.addEventListener('click', () => this.onEdit());\n      } else {\n        keyValueItemsUpper.push({\n          key: i18next.t('tradeIn.title'),\n          value: i18next.t('tradeIn.no'),\n        });\n        part.innerHTML = `\n          <div class=\"waykeecom-stack waykeecom-stack--1\">\n            <ul class=\"waykeecom-key-value-list\">\n            ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n            </ul>\n          </div>\n          ${\n            !state.createdOrderId\n              ? `\n                <div class=\"waykeecom-stack waykeecom-stack--1\">\n                  <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n                </div>\n              `\n              : ''\n          }\n        `;\n      }\n      if (!state.createdOrderId) {\n        new ButtonAsLink(part.querySelector(`#${CHANGE_BUTTON_NODE}`), {\n          id: CHANGE_BUTTON,\n          title: i18next.t('tradeIn.changeButtonTitle'),\n          onClick: () => this.onEdit(),\n        });\n      }\n    } else if (state.navigation.stage === index) {\n      if (state.wantTradeIn && state.tradeIn) {\n        new PartTradeIn(part, { store, lastStage, marketCode: this.props.marketCode });\n      } else {\n        part.innerHTML = `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('tradeIn.heading')}</h4>\n            <div class=\"waykeecom-content\">\n              <p class=\"waykeecom-content__p\">${i18next.t('tradeIn.tradeInDescription')}</p>\n            </div>\n          </div>\n          \n          <div class=\"waykeecom-stack waykeecom-stack--3\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_YES_NODE}\"></div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n          </div>\n        `;\n\n        new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${TRADE_IN_YES_NODE}`), {\n          id: TRADE_IN_YES,\n          title: i18next.t('tradeIn.yesButton'),\n          onClick: () => this.onYesTradeIn(),\n        });\n\n        new ButtonSkip(part.querySelector<HTMLDivElement>(`#${TRADE_IN_NO_NODE}`), {\n          id: TRADE_IN_NO,\n          title: i18next.t('tradeIn.skipButton'),\n          onClick: () => this.onNoTradeIn(),\n        });\n      }\n    }\n\n    content.appendChild(part);\n    if (state.navigation.stage === index) {\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default TradeIn;\n", "import { StageMapper } from '../@types/Stages';\nimport Accessories from '../Views/Main/Accessories';\nimport CentralStorage from '../Views/Main/CentralStorage';\nimport Customer from '../Views/Main/Customer';\nimport Delivery from '../Views/Main/Delivery';\nimport Financial from '../Views/Main/Financial';\nimport Insurance from '../Views/Main/Insurance';\nimport TradeIn from '../Views/Main/TradeIn';\n\nexport const stageMap: StageMapper = {\n  customer: { component: Customer, name: 'customer' },\n  centralStorage: { component: CentralStorage, name: 'centralStorage' },\n  delivery: { component: Delivery, name: 'delivery' },\n  tradeIn: { component: TradeIn, name: 'tradeIn' },\n  financial: { component: Financial, name: 'financial' },\n  insurance: { component: Insurance, name: 'insurance' },\n  accessories: { component: Accessories, name: 'accessories' },\n};\n\nexport type StageMapKeys = keyof typeof stageMap;\n", "import { customers, DeliveryType, orders, PaymentType, vehicles } from '@wayke-se/ecom';\nimport { IOrderInsuranceRequest } from '@wayke-se/ecom/dist-types/orders/types';\nimport { WaykeStore } from '../Redux/store';\nimport { extractLoanIndex, extractPaymentType } from '../Views/Main/Financial/utils';\n\nexport const createOrder = (store: WaykeStore) => {\n  const state = store.getState();\n  if (!state.address) throw 'Missing address';\n  if (!state.paymentType) throw 'Missing paymentType';\n  if (!state.vehicle) throw 'Missing vehicle';\n\n  const customer = customers\n    .newCustomer()\n    .withAddress(state.address)\n    .withPersonalNumber(state.customer.socialId)\n    .withEmail(state.customer.email)\n    .withPhoneNumber(state.customer.phone)\n    .build();\n\n  const paymentType = extractPaymentType(state.paymentType)!;\n  const paymentBuilder = orders.newPayment().withType(paymentType);\n  if (paymentType === PaymentType.Loan) {\n    const index = extractLoanIndex(state.paymentType)!;\n    const loan = state.order?.paymentOptions.filter((x) => x.type === PaymentType.Loan)?.[index];\n\n    const loanDetails = state.paymentLookupResponse || loan?.loanDetails;\n\n    const duration = loanDetails?.durationSpec.current as number;\n    const downPayment = loanDetails?.downPaymentSpec.current as number;\n    const residual = loanDetails?.residualValueSpec?.current as number;\n    const externalId = state.order?.paymentOptions.find(\n      (x) => x.type === PaymentType.Loan\n    )?.externalId;\n\n    paymentBuilder\n      .withDuration(duration) // months, only applicable when payment type === PaymentType.Loan\n      .withDownPayment(Math.round(downPayment)); // only applicable when payment type === PaymentType.Loan\n    if (residual) {\n      paymentBuilder.withResidualValue(residual); // only applicable when payment type === PaymentType.Loan\n    }\n\n    if (externalId) {\n      paymentBuilder.withExternalId(externalId); // only applicable when payment type === PaymentType.Loan\n    }\n\n    if (state.creditAssessmentResponse) {\n      const scoreId = state.creditAssessmentResponse.scoringId;\n      const recommendation = state.creditAssessmentResponse.recommendation;\n      const decision = state.creditAssessmentResponse.decision;\n      const financialProductCode = loanDetails?.financialProductCode;\n      if (!scoreId || !recommendation || !decision || !financialProductCode)\n        throw 'Missing credit assessment data';\n\n      const creditAssessment = orders\n        .newCreditAssessment() // Only required for orders using credit assessment\n        .withScoreId(scoreId)\n        .withFinancialProductCode(financialProductCode)\n        .withRecommendation(recommendation)\n        .withDecision(decision)\n        .build();\n      paymentBuilder.withCreditAssessment(creditAssessment);\n    }\n  }\n  const payment = paymentBuilder.build();\n\n  const params = new URLSearchParams(window.location.search);\n  params.set('wayke-ecom-web-id', state.id);\n\n  const callbackUrl = `${window.location.origin}${window.location.pathname}?${params.toString()}${\n    window.location.hash\n  }`;\n\n  params.set('wayke-ecom-web-payment', 'true');\n  const paymentUrl = `${window.location.origin}${window.location.pathname}?${params.toString()}${\n    window.location.hash\n  }`;\n\n  const requestBuilder = orders\n    .newCreateRequest()\n    .forVehicle(state.id)\n    .withCustomer(customer)\n    .withPayment(payment)\n    .withUrls(callbackUrl, paymentUrl)\n    .withDeliveryType(state.homeDelivery ? DeliveryType.Delivery : DeliveryType.Pickup);\n\n  if (state.insurance) {\n    const insuranceBuilder = orders.newInsurance().withDrivingDistance(state.drivingDistance);\n    if (\n      state.insuranceAddOns?.addOns.length &&\n      state.insuranceAddOns.insurance === state.insurance.name\n    ) {\n      insuranceBuilder.withAddOns(state.insuranceAddOns.addOns.map((x) => x.name));\n    }\n\n    const insurance = insuranceBuilder.build();\n\n    requestBuilder.withInsurance(insurance);\n  } else if (state.freeInsurance) {\n    requestBuilder.withInsurance({} as IOrderInsuranceRequest);\n  }\n\n  if (state.accessories.length) {\n    requestBuilder.withAccessories(state.accessories);\n  }\n\n  if (state.tradeIn && state.tradeInVehicle && state.tradeIn.condition) {\n    const tradeIn = vehicles\n      .newVehicleTrade()\n      .forVehicle(state.tradeIn.registrationNumber)\n      .withMileage(parseInt(state.tradeIn.mileage, 10))\n      .withCondition(state.tradeIn.condition)\n      .withComment(state.tradeIn.description)\n      .build();\n\n    requestBuilder.withTradeIn(tradeIn);\n  }\n\n  return orders.create(requestBuilder.build());\n};\n", "import i18next from '@i18n';\nimport { title } from 'process';\nimport Button from '../../../Components/Button/Button';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../Components/Input/InputCheckbox';\nimport { createOrder } from '../../../Data/createOrder';\nimport { setCreatedOrderId } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { destroyPortal } from '../../../Utils/portal';\n\nconst ACCEPT_CONDITIONS = 'confirm-conditions';\nconst ACCEPT_CONDITIONS_NODE = `${ACCEPT_CONDITIONS}-node`;\n\nconst CONFIRM_BUTTON_NODE = `confirm-button-node`;\nconst CONFIRM_BUTTON = `confirm-button`;\n\ninterface NoVerifyProps {\n  store: WaykeStore;\n}\n\nclass NoVerify extends HtmlNode {\n  private props: NoVerifyProps;\n  private requestError = false;\n  private notAvailable = false;\n  private view: number = 1;\n  private contexts: {\n    acceptConditions?: InputCheckbox;\n    confirmButton?: Button;\n  } = {};\n  private acceptConditions: boolean = false;\n\n  constructor(element: HTMLElement | null, props: NoVerifyProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n\n    this.render();\n  }\n\n  private async onCreateOrder() {\n    const { store } = this.props;\n    this.notAvailable = false;\n    this.requestError = false;\n\n    try {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_CREATE_ORDER_REQUESTED,\n        EcomStep.CONFIRMATION\n      );\n\n      const { order } = store.getState();\n      const response = await createOrder(store);\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_CREATE_ORDER_SUCCEEDED,\n        EcomStep.CONFIRMATION\n      );\n\n      const paymentRequired = order?.isPaymentRequired;\n      if (paymentRequired) {\n        destroyPortal();\n      }\n\n      const payment = response.getPayment();\n\n      setCreatedOrderId(response.getOrderNumber(), payment)(store.dispatch);\n    } catch (ee) {\n      const e = ee as { message?: string };\n      this.view = 1;\n      ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_CREATE_ORDER_FAILED, EcomStep.CONFIRMATION);\n      if (e.message === 'The vehicle is not available for purchase') {\n        this.requestError = false;\n        this.notAvailable = true;\n      } else {\n        this.notAvailable = false;\n        this.requestError = true;\n      }\n      destroyPortal();\n\n      this.render();\n    }\n  }\n\n  private onCheckbox(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    this.acceptConditions = currentTarget.checked;\n    this.contexts.acceptConditions?.checked(this.acceptConditions);\n    this.render();\n  }\n\n  render() {\n    const { order, insurance } = this.props.store.getState();\n    const name = order?.contactInformation?.name;\n\n    this.node.innerHTML = `\n      <div class=\"confirmation\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.heading')}</h4>\n        <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description2', { name })}</p>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ACCEPT_CONDITIONS_NODE}\"></div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONFIRM_BUTTON_NODE}\"></div>\n      </div>\n    `;\n\n    const conditionsPdfUri = order?.conditionsPdfUri;\n\n    this.contexts.acceptConditions = new InputCheckbox(\n      this.node.querySelector<HTMLDivElement>(`#${ACCEPT_CONDITIONS_NODE}`),\n      {\n        checked: this.acceptConditions,\n        id: ACCEPT_CONDITIONS,\n        disabled: this.notAvailable,\n        name: 'acceptConditions',\n\n        title: `<div>${i18next.t('confirmation.confirmConditionsTitle', { conditionsPdfUri, link: `<a href=\"${conditionsPdfUri}\" title=\"${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}</a>`, interpolation: { escapeValue: false } })}${\n          insurance\n            ? ` <span class=\"waykeecom-text waykeecom-text--margin-left\">${i18next.t('confirmation.insuranceText')}</span>`\n            : ''\n        }.</div>`,\n        value: 'acceptConditions',\n        onClick: (e) => this.onCheckbox(e),\n      }\n    );\n\n    this.contexts.confirmButton = new Button(\n      this.node.querySelector<HTMLDivElement>(`#${CONFIRM_BUTTON_NODE}`),\n      {\n        title: i18next.t('confirmation.title'),\n        id: CONFIRM_BUTTON,\n        disabled: !this.acceptConditions,\n        onClick: () => this.onCreateOrder(),\n      }\n    );\n  }\n}\n\nexport default NoVerify;\n", "export const swedbankPayment = (url: string) => {\n  const script = document.createElement('script');\n  script.setAttribute('src', url);\n  script.onload = () => {\n    window.payex?.hostedView\n      .paymentMenu({\n        container: 'payment-menu',\n        culture: 'sv-SE',\n      })\n      .open();\n  };\n  const head = document.getElementsByTagName('head')[0];\n  head.appendChild(script);\n};\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport { swedbankPayment } from '../../../Utils/payment';\n\ntype SupportedPaymentTypes = 'swedbank';\n\ninterface PaymentProps {\n  store: WaykeStore;\n}\n\nclass Payment extends HtmlNode {\n  private props: PaymentProps;\n\n  constructor(element: HTMLElement | null, props: PaymentProps) {\n    super(element);\n    this.props = props;\n\n    this.render();\n    this.init();\n  }\n\n  init() {\n    const { payment: _payment } = this.props.store.getState();\n    const payment = _payment as unknown as { type: string; url: string };\n    sessionStorage.setItem('wayke-ecom-state', JSON.stringify(this.props.store.getState()));\n\n    switch (payment.type as SupportedPaymentTypes) {\n      case 'swedbank':\n        swedbankPayment(payment.url);\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  render() {\n    const { order } = this.props.store.getState();\n\n    const name = order?.contactInformation?.name;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.paymentHeading')}</h4>\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentDescription')}</p>\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentDescription2', { name })}</p>\n\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCardType')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCardTypeValue')}</span></p>\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCardNo3DSecure')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCardNo3DSecureValue')}</span></p>\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCard3DSecure')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCard3DSecureValue')}</span></p>\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentExpiry')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentExpiryValue')}</span></p>\n          <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCVC')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCVCValue')}</span></p>\n        </div>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <div id=\"payment-menu\" style=\"padding: 24px;border: 1px solid #ececeb;\"></div>\n      </div>\n    `;\n  }\n}\n\nexport default Payment;\n", "import i18next from '@i18n';\nimport { AuthMethod } from '@wayke-se/ecom';\nimport { BankIdAuthResponse } from '@wayke-se/ecom/dist-types/bankid/bankid-auth-response';\nimport { BankIdCollectResponse } from '@wayke-se/ecom/dist-types/bankid/bankid-collect-response';\nimport BankIdSign from '../../../Components/BankId/BankIdSign';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonBankId from '../../../Components/Button/ButtonBankId';\nimport Disclaimer from '../../../Components/Disclaimer/Disclaimer';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../Components/Input/InputCheckbox';\nimport { createOrder } from '../../../Data/createOrder';\nimport { creditAssessmentAccept } from '../../../Data/creditAssessmentAccept';\nimport { getBankIdAuth } from '../../../Data/getBankIdAuth';\nimport { getBankIdQrCode } from '../../../Data/getBankIdQrCode';\nimport { getBankIdStatus } from '../../../Data/getBankIdStatus';\nimport { setCreatedOrderId } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { registerInterval } from '../../../Utils/intervals';\nimport { isMobile } from '../../../Utils/isMobile';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst CONFIRM_CONDITIONS = 'confirm-conditions';\nconst CONFIRM_CONDITIONS_NODE = `${CONFIRM_CONDITIONS}-node`;\n\nconst BANKID_START_NODE = `bankid-start-node`;\nconst BANKID_START = `bankid-start`;\n\nconst DISCLAIMER_POLICY_NODE = 'address-disclaimer-policy-node';\nconst DISCLAIMER_RESERVATION_NODE = 'address-disclaimer-reservation-node';\n\ninterface VerifyByBankIdProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n}\n\nclass VerifyByBankId extends HtmlNode {\n  private readonly props: VerifyByBankIdProps;\n  private bankidStatusInterval?: NodeJS.Timer;\n  private bankidQrCodeInterval?: NodeJS.Timer;\n  private focusTimeout?: NodeJS.Timeout;\n  private view: number = 1;\n  private contexts: {\n    buttonLinkToggle?: ButtonAsLink;\n    bankId?: BankIdSign;\n    confirmConditions?: InputCheckbox;\n    startBankid?: ButtonBankId;\n  } = {};\n  private ageError = false;\n  private requestError = false;\n  private socialIdNotMatchingError = false;\n  private notAvailable = false;\n  private confirmConditions: boolean = false;\n\n  private bankidRequestRef:\n    | {\n        reference: string;\n        method: AuthMethod;\n      }\n    | undefined = undefined;\n\n  constructor(element: HTMLElement, props: VerifyByBankIdProps) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n    this.props = props;\n    this.ageError = false;\n\n    this.render();\n  }\n\n  private addWindowEvents() {\n    this.removeWindowEvents();\n    window.addEventListener('focus', () => this.onFocus());\n  }\n  private removeWindowEvents() {\n    window.removeEventListener('focus', () => this.onFocus());\n  }\n\n  private clearIntervals() {\n    clearInterval(this.bankidQrCodeInterval as NodeJS.Timeout);\n    clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n  }\n\n  private async onFocus() {\n    clearTimeout(this.focusTimeout);\n    this.focusTimeout = setTimeout(async () => {\n      if (this.bankidRequestRef?.method === AuthMethod.SameDevice) {\n        try {\n          const response = await getBankIdStatus(this.bankidRequestRef.reference);\n          this.handleBankidStatusResponse(response, this.bankidRequestRef.method);\n        } catch (_e) {\n          this.clearIntervals();\n          this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdStatusError'));\n        }\n      }\n    }, 500);\n  }\n\n  private onSameDeviceClick() {\n    this.addWindowEvents();\n  }\n\n  private setBankidRequestRef(reference: string, method: AuthMethod) {\n    this.bankidRequestRef = {\n      reference,\n      method,\n    };\n  }\n\n  private clearBankidRequestRef() {\n    this.bankidRequestRef = undefined;\n  }\n\n  private async acceptCreditAssessment() {\n    const { caseId } = this.props.store.getState();\n    if (caseId) {\n      try {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST,\n          EcomStep.CONFIRMATION\n        );\n        await creditAssessmentAccept(caseId);\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED,\n          EcomStep.CONFIRMATION\n        );\n      } catch (_e) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED,\n          EcomStep.CONFIRMATION\n        );\n      }\n    }\n  }\n\n  private async onCreateOrder() {\n    const { store } = this.props;\n    this.notAvailable = false;\n    this.requestError = false;\n    try {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_CREATE_ORDER_REQUESTED,\n        EcomStep.CONFIRMATION\n      );\n\n      const { order } = store.getState();\n      const response = await createOrder(store);\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_CREATE_ORDER_SUCCEEDED,\n        EcomStep.CONFIRMATION\n      );\n\n      const paymentRequired = order?.isPaymentRequired;\n      if (paymentRequired) {\n        destroyPortal();\n      }\n\n      const payment = response.getPayment();\n\n      setCreatedOrderId(response.getOrderNumber(), payment)(store.dispatch);\n      this.acceptCreditAssessment();\n    } catch (ee) {\n      const e = ee as { message?: string };\n      this.view = 1;\n      ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_CREATE_ORDER_FAILED, EcomStep.CONFIRMATION);\n      if (e.message === 'The vehicle is not available for purchase') {\n        this.requestError = false;\n        this.notAvailable = true;\n      } else {\n        this.notAvailable = false;\n        this.requestError = true;\n      }\n      destroyPortal();\n\n      this.render();\n    }\n  }\n\n  private async handleBankidStatusResponse(response: BankIdCollectResponse, method: AuthMethod) {\n    if (response.isCompleted()) {\n      this.removeWindowEvents();\n      this.clearBankidRequestRef();\n      this.clearIntervals();\n      const address = response.getAddress();\n      const socialId = response.getPersonalNumber();\n\n      if (address && socialId) {\n        const state = this.props.store.getState();\n        const over18 = validationMethods.requiredSsnOver18(socialId);\n        if (!over18) {\n          ecomEvent(\n            EcomView.MAIN,\n            method === AuthMethod.SameDevice\n              ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18\n              : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18,\n            EcomStep.CONFIRMATION\n          );\n          this.view = 1;\n          this.ageError = true;\n          destroyPortal();\n          this.render();\n          return;\n        }\n        if (state.customer.socialId !== socialId) {\n          ecomEvent(\n            EcomView.MAIN,\n            method === AuthMethod.SameDevice\n              ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH\n              : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH,\n            EcomStep.CONFIRMATION\n          );\n          this.view = 1;\n          this.socialIdNotMatchingError = true;\n          destroyPortal();\n          this.render();\n          return;\n        }\n        ecomEvent(\n          EcomView.MAIN,\n          method === AuthMethod.SameDevice\n            ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED\n            : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED,\n          EcomStep.CONFIRMATION\n        );\n        this.contexts.bankId?.setDescription(i18next.t('confirmation.bankIdCompletedMessage'));\n        await this.onCreateOrder();\n      }\n    }\n  }\n\n  private bankidStatus = async (reference: string) => {\n    try {\n      const response = await getBankIdStatus(reference);\n      this.handleBankidStatusResponse(response, AuthMethod.QrCode);\n    } catch (_e) {\n      this.clearIntervals();\n      this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdStatusError'));\n    }\n  };\n\n  private qrCode = async (reference: string) => {\n    try {\n      const response = await getBankIdQrCode(reference);\n      const qrCode = response.getQrCode();\n      this.contexts.bankId?.update(AuthMethod.QrCode, qrCode);\n    } catch (_e) {\n      this.clearIntervals();\n      this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdQrCodeErrorMessage'));\n    }\n  };\n\n  private async startBankidSameDevice(\n    response: BankIdAuthResponse,\n    reference: string,\n    supressTracking = false\n  ) {\n    if (!supressTracking) {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED,\n        EcomStep.CONFIRMATION\n      );\n    }\n    try {\n      this.setBankidRequestRef(reference, AuthMethod.SameDevice);\n      //this.addWindowEvents();\n      const autoLaunchUrl = response.getAutoLaunchUrl() as string;\n      this.contexts.bankId?.update(AuthMethod.SameDevice, autoLaunchUrl);\n    } catch (e) {\n      this.removeWindowEvents();\n      this.clearBankidRequestRef();\n      const _e = e as { message: string };\n      this.contexts.bankId?.setErrorMessage(`Error: ${_e.message}`);\n    }\n  }\n\n  private async startBankidWithQr(reference: string, supressTracking = false) {\n    if (!supressTracking) {\n      ecomEvent(\n        EcomView.MAIN,\n        EcomEvent.CONFIRMATION_BANKID_STATUS_QR_REQUESTED,\n        EcomStep.CONFIRMATION\n      );\n    }\n\n    this.bankidStatusInterval = setInterval(() => {\n      this.bankidStatus(reference);\n    }, 2000);\n    registerInterval('bankidStatusInterval', this.bankidStatusInterval as unknown as number);\n\n    this.qrCode(reference);\n    this.bankidQrCodeInterval = setInterval(async () => {\n      this.qrCode(reference);\n    }, 1000);\n    registerInterval('bankidQrCodeInterval', this.bankidQrCodeInterval as unknown as number);\n  }\n\n  private async onStartBankIdAuth(method: AuthMethod, supressTracking = false) {\n    this.clearIntervals();\n\n    try {\n      if (!supressTracking) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.CONFIRMATION_BANKID_INIT_REQUESTED,\n          EcomStep.CONFIRMATION\n        );\n      }\n      this.contexts.bankId?.update(method);\n      this.contexts.buttonLinkToggle?.disabled(true);\n      const response = await getBankIdAuth(method);\n      if (!supressTracking) {\n        ecomEvent(\n          EcomView.MAIN,\n          EcomEvent.CONFIRMATION_BANKID_INIT_SUCCEEDED,\n          EcomStep.CONFIRMATION\n        );\n      }\n      const reference = response.getOrderRef();\n      if (method === AuthMethod.QrCode) {\n        this.startBankidWithQr(reference, supressTracking);\n      } else {\n        this.startBankidSameDevice(response, reference, supressTracking);\n      }\n    } catch (_e) {\n      ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_BANKID_INIT_FAILED, EcomStep.CONFIRMATION);\n      this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdInitErrorMessage'));\n    } finally {\n      this.contexts.buttonLinkToggle?.disabled(false);\n    }\n  }\n\n  private onAbort() {\n    this.clearBankidRequestRef();\n    this.removeWindowEvents();\n    this.clearIntervals();\n    ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_BANKID_ABORTED, EcomStep.CONFIRMATION);\n    this.view = 1;\n\n    destroyPortal();\n    this.render();\n  }\n\n  private onCheckbox(e: Event) {\n    const currentTarget = e.currentTarget as HTMLInputElement;\n    this.confirmConditions = currentTarget.checked;\n    this.contexts.confirmConditions?.checked(this.confirmConditions);\n    this.contexts.startBankid?.disabled(!this.confirmConditions);\n  }\n\n  render() {\n    const mobile = isMobile();\n    const { navigation, order, insurance } = this.props.store.getState();\n\n    if (this.view === 2) {\n      this.contexts.bankId = new BankIdSign(createPortal(), {\n        method: mobile ? AuthMethod.SameDevice : AuthMethod.QrCode,\n        descriptionQrCode: i18next.t('confirmation.bankIdDescriptionQrCode'),\n        descriptionSameDevice: i18next.t('confirmation.bankIdDescriptionSameDevice'),\n        onAbort: () => this.onAbort(),\n        onStart: (method: AuthMethod) => this.onStartBankIdAuth(method),\n        onSameDeviceClick: () => this.onSameDeviceClick(),\n      });\n    } else {\n      const name = order?.contactInformation?.name;\n      const conditionsPdfUri = order?.conditionsPdfUri;\n      const policy = 'https://www.wayke.se/trygghet-naer-det-kommer-till-dina-personuppgifter';\n\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.heading')}</h4>\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description', { name })}</p>\n            <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description2', { name })}</p>\n          </div>\n        </div>\n        ${\n          this.ageError\n            ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n            tone: 'error',\n            children: i18next.t('confirmation.ageError'),\n          })}</div>\n        `\n            : ''\n        }\n\n        ${\n          this.requestError\n            ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n            tone: 'error',\n            children: i18next.t('confirmation.requestError'),\n          })}</div>\n        `\n            : ''\n        }\n\n        ${\n          this.notAvailable\n            ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n            tone: 'error',\n            children: i18next.t('confirmation.notAvailable'),\n          })}</div>\n        `\n            : ''\n        }\n\n        ${\n          this.socialIdNotMatchingError\n            ? `\n          <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n            tone: 'error',\n            children: i18next.t('confirmation.socialIdNotMatchingError'),\n          })}</div>\n        `\n            : ''\n        }\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONFIRM_CONDITIONS_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${BANKID_START_NODE}\"></div>\n          <div class=\"waykeecom-stack waykeecom-stack--2\">\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_POLICY_NODE}\"></div>\n            <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_RESERVATION_NODE}\"></div>\n          </div>\n        </div>\n      `;\n      this.contexts.confirmConditions = new InputCheckbox(\n        this.node.querySelector<HTMLDivElement>(`#${CONFIRM_CONDITIONS_NODE}`),\n        {\n          checked: this.confirmConditions,\n          id: CONFIRM_CONDITIONS,\n          disabled: this.notAvailable,\n          name: 'confirmConditions',\n\n          title: `<div>${i18next.t('confirmation.confirmConditionsTitle', { conditionsPdfUri, link: `<a href=\"${conditionsPdfUri}\" title=\"${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}</a>`, interpolation: { escapeValue: false } })}${\n            insurance\n              ? ` <span class=\"waykeecom-text waykeecom-text--margin-left\">${i18next.t('confirmation.insuranceText')}</span>`\n              : ''\n          }.</div>`,\n          value: 'confirmConditions',\n          onClick: (e) => this.onCheckbox(e),\n        }\n      );\n\n      this.contexts.startBankid = new ButtonBankId(\n        this.node.querySelector<HTMLDivElement>(`#${BANKID_START_NODE}`),\n        {\n          title: i18next.t('confirmation.reserveButton'),\n          id: BANKID_START,\n          disabled: !this.confirmConditions || this.notAvailable,\n          onClick: () => {\n            this.view = 2;\n            this.render();\n          },\n        }\n      );\n\n      new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_POLICY_NODE}`), {\n        text: i18next.t('confirmation.policyText', {\n          link: `<a href=\"${policy}\" title=${i18next.t('confirmation.privacyPolicy')} target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.privacyPolicy')}</a>`,\n          interpolation: { escapeValue: false },\n        }),\n      });\n\n      new Disclaimer(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_RESERVATION_NODE}`), {\n        text: i18next.t('confirmation.reservationDisclaimer'),\n      });\n\n      if (navigation.stage === this.props.index) {\n        this.node.parentElement?.scrollIntoView();\n      }\n    }\n  }\n}\n\nexport default VerifyByBankId;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentAccept = (caseId: string) => {\n  const request = creditAssessment.accept(caseId);\n  return request;\n};\n", "import { AuthMethod, bankid } from '@wayke-se/ecom';\n\nexport const getBankIdAuth = (method: AuthMethod) => {\n  const request = bankid.newAuthRequest().withMethod(method).build();\n\n  return bankid.auth(request);\n};\n", "import { bankid } from '@wayke-se/ecom';\n\nexport const getBankIdQrCode = (reference: string) => {\n  const request = bankid.newQrCodeRequest().withOrderRef(reference).build();\n\n  return bankid.qrcode(request);\n};\n", "import { bankid } from '@wayke-se/ecom';\n\nexport const getBankIdStatus = (reference: string) => {\n  const request = bankid.newCollectRequest().withOrderRef(reference).build();\n\n  return bankid.collect(request);\n};\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport NoVerify from './NoVerify';\nimport Payment from './Payment';\nimport VerifyByBankId from './VerifyByBankId';\n\ninterface ConfirmationProps {\n  readonly store: WaykeStore;\n  readonly index: number;\n  readonly lastStage: boolean;\n  readonly bypassBankId: boolean;\n}\n\nclass Confirmation extends HtmlNode {\n  private readonly props: ConfirmationProps;\n  private view = 1;\n\n  constructor(element: HTMLElement, props: ConfirmationProps) {\n    super(element);\n    this.props = props;\n\n    watch(this.props.store, 'navigation', () => {\n      this.render();\n    });\n\n    this.render();\n  }\n\n  render() {\n    const { store, index, bypassBankId } = this.props;\n    const { topNavigation, navigation, order } = store.getState();\n\n    const completed = topNavigation.stage > index;\n\n    const content = ListItem(this.node, {\n      completed,\n      title: order?.isPaymentRequired\n        ? i18next.t('confirmation.paymentTitle')\n        : i18next.t('confirmation.title'),\n      id: 'confirmation',\n      active: navigation.stage === index,\n      index: index,\n    });\n\n    if (navigation.stage === index) {\n      if (navigation.subStage === 2) {\n        new Payment(content, { store });\n      } else if (bypassBankId) {\n        new NoVerify(content, { store });\n      } else {\n        new VerifyByBankId(content, { lastStage: true, index, store: this.props.store });\n      }\n      content.parentElement?.scrollIntoView();\n    }\n  }\n}\n\nexport default Confirmation;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\nimport watch from '../../Redux/watch';\nimport ItemTileSmall from '../../Templates/ItemTileSmall';\nimport { stageMap } from '../../Utils/stage';\nimport Confirmation from './Confirmation';\n\ninterface MainProps {\n  readonly store: WaykeStore;\n  cdnMedia?: string;\n  marketCode: MarketCode;\n}\n\nclass Main extends HtmlNode {\n  private readonly props: MainProps;\n\n  constructor(element: HTMLElement, props: MainProps) {\n    super(element);\n    this.props = props;\n\n    watch<number>(this.props.store, 'navigation.view', (view) => {\n      if (view === 2) {\n        this.render();\n      }\n    });\n\n    this.render();\n    this.node.scrollTop = 0;\n  }\n\n  render() {\n    const { store, cdnMedia } = this.props;\n    const state = store.getState();\n    const { order, stages } = state;\n    if (!order) throw 'No order available';\n\n    this.node.innerHTML = ``;\n\n    // Create a node to append aside and stepper into. Required for portal to work as intended\n    const asideStepperWrapper = document.createElement('div');\n    this.node.appendChild(asideStepperWrapper);\n\n    const pageFormAside = document.createElement('aside');\n    pageFormAside.className = 'waykeecom-cart';\n    pageFormAside.setAttribute('aria-label', i18next.t('vehicleInfo'));\n    pageFormAside.innerHTML = ItemTileSmall({\n      vehicle: state.vehicle,\n      order: state.order,\n      cdnMedia,\n    });\n    asideStepperWrapper.appendChild(pageFormAside);\n\n    const stepper = document.createElement('ol');\n    stepper.className = 'waykeecom-stepper';\n    asideStepperWrapper.appendChild(stepper);\n\n    const size = stages?.length;\n    // Render stages\n    stages?.forEach(\n      (stage, index) =>\n        new stageMap[stage.name].component(stepper, {\n          store,\n          index: index + 1,\n          lastStage: false, //size === index + 1,\n          marketCode: this.props.marketCode,\n        })\n    );\n\n    new Confirmation(stepper, {\n      store,\n      index: (size || 0) + 1,\n      lastStage: true,\n      bypassBankId: this.props.marketCode === 'NO',\n    });\n  }\n}\n\nexport default Main;\n", "import i18next from '@i18n';\nimport { CallbackOrder } from '../../@types/CallbackOrder';\nimport { PaymentOrderResponse } from '../../@types/PaymentOrderResponse';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\n\n// import Loader from '../../Templates/Loader';\n// import Summary from '../Summary';\ninterface OrderCallbackProps {\n  readonly store: WaykeStore;\n  readonly callbackOrder: CallbackOrder;\n  readonly onClose: () => void;\n}\n\nclass OrderCallback extends HtmlNode {\n  private readonly props: OrderCallbackProps;\n  private order?: PaymentOrderResponse;\n  private orderFetchFailed: boolean = false;\n\n  constructor(element: HTMLElement, props: OrderCallbackProps) {\n    super(element);\n    this.props = props;\n    sessionStorage.removeItem('wayke-ecom-state');\n    this.render();\n    // this.loadOrder();\n  }\n\n  async loadOrder() {\n    this.orderFetchFailed = false;\n    this.render();\n    try {\n      const response = await fetch(this.props.callbackOrder.orderUrl);\n      this.order = (await response.json()) as PaymentOrderResponse;\n    } catch (_e) {\n      this.orderFetchFailed = true;\n    } finally {\n      this.render();\n    }\n  }\n\n  render() {\n    const { callbackOrder } = this.props;\n\n    /*\n    if (this.order) {\n      new Summary(this.node, { store: this.props.store, onClose: this.props.onClose });\n      return;\n    }\n    */\n\n    this.node.innerHTML = `\n        <div class=\"waykeecom-content\">\n          <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.thankYou')}</p>\n          <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.orderId')}: ${callbackOrder.orderUrl}</p>\n          <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.waykeId')}: ${callbackOrder.id}</p>\n        </div>\n      `;\n  }\n}\n\nexport default OrderCallback;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface CheckListProps {\n  readonly title: string;\n  readonly ariaLabel: string;\n  readonly checklistItems: string[];\n}\n\nclass CheckList extends HtmlNode {\n  private readonly props: CheckListProps;\n\n  constructor(element: HTMLElement | null, props: CheckListProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    this.node.innerHTML = `\n      <h3 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('glossary.buyOnline')}</h3>\n      <ul class=\"waykeecom-checklist\" aria-label=\"${i18next.t('glossary.ourAdvantages')}\">\n        ${this.props.checklistItems\n          .map((item) => ` <li class=\"waykeecom-checklist__item\">${item}</li>`)\n          .join('')}\n      </ul>\n    `;\n  }\n}\n\nexport default CheckList;\n", "import { IOrderVehicle } from '@wayke-se/ecom/dist-types/orders/types';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { toCdnMedia } from '../Utils/cdn';\nimport { formatShortDescription, prettyNumber } from '../Utils/format';\n\ninterface ItemTileLargeProps {\n  vehicle?: IOrderVehicle;\n  order?: OrderOptions;\n  meta?: string;\n  cdnMedia?: string;\n}\n\nconst ItemTileLarge = ({ vehicle, order, meta, cdnMedia }: ItemTileLargeProps) => {\n  const imageUrls = vehicle?.imageUrls;\n  const vehicleTitle = vehicle?.title;\n  const price = prettyNumber(vehicle?.price || NaN);\n\n  const sellerName = order?.contactInformation?.name;\n  return `\n  <div class=\"waykeecom-product-card\">\n    ${\n      imageUrls?.length\n        ? `\n          <div class=\"waykeecom-product-card__media\">\n            ${imageUrls\n              .slice(0, 3)\n              .map(\n                (imageUrl) => `\n              <div class=\"waykeecom-product-card__media-item\">\n                <img src=\"${toCdnMedia(imageUrl, cdnMedia)}?spec=800x&format=webp\" alt=\"\" class=\"waykeecom-product-card__image\" />\n              </div>\n            `\n              )\n              .join('')}\n          </div>\n        `\n        : ''\n    }\n    <dl class=\"waykeecom-product-card__body\">\n      <dt class=\"waykeecom-sr-only\">S\u00E4ljare</dt>\n      <dd class=\"waykeecom-product-card__seller\">${sellerName}</dd>\n      <dt class=\"waykeecom-sr-only\">Modell</dt>\n      <dd class=\"waykeecom-product-card__heading\">\n        <span class=\"waykeecom-product-card__title\">${vehicleTitle}</span> ${formatShortDescription(\n          vehicle\n        )}\n      </dd>\n      <dt class=\"waykeecom-sr-only\">Pris</dt>\n      <dd class=\"waykeecom-product-card__price\">${price} kr</dd>\n      ${\n        meta\n          ? `\n            <div class=\"waykeecom-product-card__meta\">\n              ${meta}\n            </div>\n          `\n          : ''\n      }\n    </dl>\n  </div>\n`;\n};\n\nexport default ItemTileLarge;\n", "import i18next from '@i18n';\nimport { IDeliveryOption, PaymentType } from '@wayke-se/ecom';\nimport { OrderOptions, PaymentOption } from '../../@types/OrderOptions';\nimport { StageTypes } from '../../@types/Stages';\nimport TimelineItem from '../../Templates/TimelineItem';\n\nconst getFinancialDescription = (options?: PaymentOption[]) => {\n  const paymentTypes = options?.map((x) => x.type) || [];\n  const hasCash = paymentTypes.find((x) => x === PaymentType.Cash);\n  const hasLease = paymentTypes.find((x) => x === PaymentType.Lease);\n  const hasLoan = paymentTypes.find((x) => x === PaymentType.Loan);\n\n  if (hasCash && hasLoan && hasLease) {\n    return i18next.t('howTo.financialDescriptionAll');\n  }\n  if (hasCash && hasLease) {\n    return i18next.t('howTo.financialDescriptionCashLease');\n  }\n  if (hasCash && hasLoan) {\n    return i18next.t('howTo.financialDescriptionCashLoan');\n  }\n  if (hasLoan && hasLease) {\n    return i18next.t('howTo.financialDescriptionLoanLease');\n  }\n  if (hasCash) {\n    return i18next.t('howTo.financialDescriptionCash');\n  }\n  if (hasLoan) {\n    return i18next.t('howTo.financialDescriptionLoan');\n  }\n  if (hasLease) {\n    return i18next.t('howTo.financialDescriptionLease');\n  }\n  return '???';\n};\n\nconst getDeliveryDescription = (options?: IDeliveryOption[]) => {\n  const hasPickup = options?.find((x) => x.type === 'Pickup');\n  const hasHomeDelivery = options?.find((x) => x.type === 'Delivery');\n  if (hasPickup && hasHomeDelivery) {\n    return i18next.t('howTo.deliveryDescriptionBoth');\n  }\n  if (hasPickup) {\n    return i18next.t('howTo.deliveryDescriptionPickup');\n  }\n  if (hasHomeDelivery) {\n    return i18next.t('howTo.deliveryDescriptionHome');\n  }\n  return '???';\n};\n\ninterface HowToProps {\n  readonly stageOrderList?: StageTypes[];\n  readonly order?: OrderOptions;\n}\n\nconst HowTo = ({ order, stageOrderList }: HowToProps) => {\n  const timelineItemByStage = {\n    customer: {\n      heading: i18next.t('howTo.customerHeading'),\n    },\n    centralStorage: {\n      heading: i18next.t('howTo.centralStorageHeading'),\n      description: i18next.t('howTo.centralStorageDescription'),\n    },\n    delivery: {\n      heading: i18next.t('howTo.deliveryHeading'),\n      description: '',\n    },\n    tradeIn: {\n      heading: i18next.t('howTo.tradeInHeading'),\n      description: i18next.t('howTo.tradeInDescription'),\n    },\n    financial: {\n      heading: i18next.t('howTo.financialHeading'),\n      description: '',\n    },\n    insurance: {\n      heading: i18next.t('howTo.insuranceHeading'),\n      description: i18next.t('howTo.insuranceDescription'),\n    },\n    accessories: {\n      heading: i18next.t('howTo.accessoriesHeading'),\n      description: i18next.t('howTo.accessoriesDescription'),\n    },\n  };\n  timelineItemByStage.financial.description = getFinancialDescription(order?.paymentOptions);\n  timelineItemByStage.delivery.description = getDeliveryDescription(order?.deliveryOptions);\n\n  return `\n  <div class=\"waykeecom-stack waykeecom-stack--3\">\n    <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('howTo.heading')}</h4>\n    <div class=\"waykeecom-content\">\n      <p class=\"waykeecom-content__p\">${i18next.t('howTo.description')}</p>\n    </div>\n  </div>\n  <div class=\"waykeecom-stack waykeecom-stack--3\">\n    <div class=\"waykeecom-p--2\">\n      <ol class=\"waykeecom-timeline\" aria-label=\"${i18next.t('howTo.timelineAriaLabel')}\">\n        ${stageOrderList?.map((stage) => TimelineItem(timelineItemByStage[stage.name])).join('')}\n        ${\n          order?.isPaymentRequired\n            ? TimelineItem({\n                heading: i18next.t('howTo.paymentHeading'),\n                description: i18next.t('howTo.paymentDescription'),\n              })\n            : ''\n        }\n        ${TimelineItem({\n          heading: i18next.t('howTo.finalHeading'),\n          final: true,\n        })}\n      </ol>\n    </div>\n  </div>\n  <div class=\"waykeecom-stack waykeecom-stack--3\">\n    <div class=\"waykeecom-content\">\n      <p class=\"waykeecom-content__p\">${i18next.t('howTo.finalDescription', {\n        contactName: order?.contactInformation?.name,\n      })}</p>\n    </div>\n  </div>\n`;\n};\n\nexport default HowTo;\n", "interface TimelineItemProps {\n  heading?: string;\n  description?: string;\n  final?: boolean;\n}\n\nconst TimelineItem = ({ heading, description, final }: TimelineItemProps) => `\n  <li class=\"waykeecom-timeline__item${final ? ' waykeecom-timeline__item--final' : ''}\">\n    <div class=\"waykeecom-timeline__stage\">\n      <div class=\"waykeecom-timeline__badge\"></div>\n    </div>\n    <div class=\"waykeecom-timeline__content\">\n      ${heading ? `<div class=\"waykeecom-timeline__heading\">${heading}</div>` : ''}\n      ${description ? `<div class=\"waykeecom-timeline__description\">${description}</div>` : ''}\n    </div>\n  </li>\n`;\n\nexport default TimelineItem;\n", "import i18next from '@i18n';\nimport { StageTypes } from '../../@types/Stages';\nimport { Vehicle } from '../../@types/Vehicle';\nimport ButtonArrowRight from '../../Components/Button/ButtonArrowRight';\nimport CheckList from '../../Components/Checklist/Checklist';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { getOrder } from '../../Data/getOrder';\nimport { goTo, setOrder, setStages } from '../../Redux/action';\nimport { WaykeStore } from '../../Redux/store';\nimport Alert from '../../Templates/Alert';\nimport ItemTileLarge from '../../Templates/ItemTileLarge';\nimport Loader from '../../Templates/Loader';\nimport { convertOrderOptionsResponse } from '../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomView } from '../../Utils/ecomEvent';\nimport { StageMapKeys, stageMap } from '../../Utils/stage';\nimport HowTo from './HowTo';\n\nconst PROCEED_BUTTON = 'preview-proceed';\nconst PROCEED_BUTTON_NODE = `${PROCEED_BUTTON}-node`;\nconst PREVIEW_CHECKLIST = 'preview-checklist';\nconst PREVIEW_CHECKLIST_NODE = `${PREVIEW_CHECKLIST}-node`;\n\ninterface PreviewProps {\n  readonly store: WaykeStore;\n  readonly stageOrderList: StageMapKeys[];\n  readonly vehicle?: Vehicle;\n  readonly cdnMedia?: string;\n}\n\nclass Preview extends HtmlNode {\n  private readonly props: PreviewProps;\n  private contexts: { buttonProceed?: ButtonArrowRight } = {};\n  private requestError = false;\n\n  constructor(element: HTMLElement, props: PreviewProps) {\n    super(element);\n    this.props = props;\n    this.init();\n    this.render();\n  }\n\n  async init() {\n    this.requestError = false;\n    this.render();\n\n    const state = this.props.store.getState();\n    try {\n      this.contexts.buttonProceed?.disabled(true);\n\n      const _order = await getOrder(state.id);\n      const order = convertOrderOptionsResponse(_order);\n      const stages: StageTypes[] = [];\n      this.props.stageOrderList.forEach((key) => {\n        if (key === 'centralStorage' && !order.requiresDealerSelection) return;\n        if (key === 'tradeIn' && !order.allowsTradeIn) return;\n        if (key === 'insurance' && !order.insuranceOption) return;\n        if (key === 'accessories' && !order.accessories.length) return;\n\n        stages.push(stageMap[key]);\n      });\n\n      setStages(stages)(this.props.store.dispatch);\n\n      setOrder(order, this.props.vehicle)(this.props.store.dispatch);\n      this.render();\n    } catch (e) {\n      this.requestError = true;\n      this.render();\n      throw e;\n    }\n  }\n\n  private onProceed() {\n    ecomEvent(EcomView.PREVIEW, EcomEvent.PREVIEW_PROCEED);\n    goTo('main')(this.props.store.dispatch);\n  }\n\n  render() {\n    const { store, cdnMedia } = this.props;\n    const state = store.getState();\n\n    if (!state.order) {\n      this.node.innerHTML = `\n        ${\n          this.requestError\n            ? Alert({\n                tone: 'error',\n                children: i18next.t('preview.error'),\n              })\n            : Loader()\n        }\n      `;\n      return;\n    }\n\n    const notOrderable = state.order.isReserved || state.order.isUnavailable;\n\n    if (notOrderable) {\n      this.node.innerHTML = `\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('preview.heading')}</h3>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          ${ItemTileLarge({\n            vehicle: state.vehicle,\n            order: state.order,\n            cdnMedia,\n          })}\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--3\">\n          ${Alert({\n            tone: 'warning',\n            children: i18next.t(\n              state.order.isReserved ? 'preview.reserved' : 'preview.unavailable'\n            ),\n          })}\n        </div>\n      `;\n      return;\n    }\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('preview.heading')}</h3>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--3\">\n        ${ItemTileLarge({\n          vehicle: state.vehicle,\n          order: state.order,\n          cdnMedia,\n        })}\n      </div>\n      ${HowTo({ order: state.order, stageOrderList: state.stages })}\n      <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_BUTTON_NODE}\"></div>\n      <footer class=\"waykeecom-footer\" id=\"${PREVIEW_CHECKLIST_NODE}\"></footer>\n    `;\n\n    this.contexts.buttonProceed = new ButtonArrowRight(\n      document.querySelector<HTMLDivElement>(`#${PROCEED_BUTTON_NODE}`),\n      {\n        id: PROCEED_BUTTON,\n        title: i18next.t('preview.proceedButton'),\n        onClick: () => this.onProceed(),\n      }\n    );\n\n    new CheckList(document.querySelector<HTMLDivElement>(`#${PREVIEW_CHECKLIST_NODE}`), {\n      title: i18next.t('preview.checklistTitle'),\n      ariaLabel: i18next.t('preview.checklistAriaLabel'),\n      checklistItems: [\n        i18next.t('preview.checklistItem1'),\n        i18next.t('preview.checklistItem2'),\n        i18next.t('preview.checklistItem3'),\n        i18next.t('preview.checklistItem4'),\n      ],\n    });\n  }\n}\n\nexport default Preview;\n", "import HtmlNode from './HtmlNode';\n\nclass StackNode extends HtmlNode {\n  constructor(element: HTMLElement) {\n    super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--4' });\n  }\n}\n\nexport default StackNode;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\n\ninterface CentralStorageProps {\n  readonly store: WaykeStore;\n  readonly createdOrderId?: string;\n}\n\nclass Delivery extends StackNode {\n  private readonly props: CentralStorageProps;\n\n  constructor(element: HTMLElement, props: CentralStorageProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store } = this.props;\n    const { dealer, order } = store.getState();\n\n    const dealerName = order?.dealerSites.find((x) => x.id === dealer)?.name;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.centralStorageTitle')}</h4>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${KeyValueListItem({\n              key: i18next.t('summary.dealerSelection'),\n              value: dealerName || '',\n            })}\n          </ul>\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default Delivery;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { maskSSn, maskText } from '../../Utils/mask';\n\ninterface CustomerProps {\n  readonly store: WaykeStore;\n  readonly marketCode: MarketCode;\n}\n\nclass Customer extends StackNode {\n  private readonly props: CustomerProps;\n  constructor(element: HTMLElement, props: CustomerProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store } = this.props;\n    const state = store.getState();\n\n    const customerName =\n      this.props.marketCode === 'SE'\n        ? `${maskText(state.address?.givenName || '')} ${maskText(state.address?.surname || '')}`\n        : `${state.address?.givenName} ${state.address?.surname || ''}`;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.customerTitle')}</h4>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${KeyValueListItem({\n              key: i18next.t('summary.customerName'),\n              value: customerName,\n            })}\n            ${\n              this.props.marketCode === 'SE'\n                ? KeyValueListItem({\n                    key: i18next.t('summary.customerSSN'),\n                    value: maskSSn(state.customer.socialId),\n                  })\n                : ''\n            }\n            ${KeyValueListItem({\n              key: i18next.t('summary.customerAddress'),\n              value: `\n                ${customerName}<br />${state.address?.street}<br />${state.address?.postalCode} ${\n                  state.address?.city\n                }\n              `,\n            })}\n            ${KeyValueListItem({\n              key: i18next.t('summary.customerEmail'),\n              value: state.customer.email,\n            })}\n            ${KeyValueListItem({\n              key: i18next.t('summary.customerPhone'),\n              value: state.customer.phone,\n            })}\n          </ul>\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default Customer;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\n\ninterface DeliveryProps {\n  readonly store: WaykeStore;\n  readonly createdOrderId?: string;\n}\n\nclass Centrallager extends StackNode {\n  private readonly props: DeliveryProps;\n\n  constructor(element: HTMLElement, props: DeliveryProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store } = this.props;\n    const state = store.getState();\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.deliveryTitle')}</h4>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <div class=\"waykeecom-stack waykeecom-stack--1\">\n          <ul class=\"waykeecom-key-value-list\">\n            ${KeyValueListItem({\n              key: i18next.t('summary.deliveryMethod'),\n              value: state.homeDelivery\n                ? i18next.t('summary.homeDelivery')\n                : i18next.t('summary.pickup'),\n            })}\n          </ul>\n        </div>\n      </div>\n    `;\n  }\n}\n\nexport default Centrallager;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\n\ninterface IntroProps {\n  readonly store: WaykeStore;\n}\n\nclass Intro extends StackNode {\n  private readonly props: IntroProps;\n\n  constructor(element: HTMLElement, props: IntroProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store } = this.props;\n    const { customer, order, createdOrderId } = store.getState();\n    const email = customer.email;\n    const contactInformation = order?.contactInformation;\n\n    if (createdOrderId) {\n      this.node.innerHTML = `\n        <h3 class=\"waykeecom-heading waykeecom-heading--3\">${i18next.t('summary.thankYou')}</h3>\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-content\">\n            <p class=\"waykeecom-content__p\">\n              <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('summary.whatHappensNext')}</span>\n            </p>\n            <ol class=\"waykeecom-content__ol\">\n              <li class=\"waykeecom-content__li\">${i18next.t('summary.orderConfirmation', { email })}</li>\n              <li class=\"waykeecom-content__li\">${i18next.t('summary.contactFromDealer', { contactName: contactInformation?.name })}</li>\n              <li class=\"waykeecom-content__li\">${i18next.t('summary.driveSafely')}</li>\n            </ol>\n          </div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-disclaimer-text\">${i18next.t('summary.orderConfirmationDisclaimer')}</div>\n        </div>\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('summary.orderNumber', { createdOrderId })}</div>\n        </div>\n      `;\n    }\n  }\n}\n\nexport default Intro;\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport ItemTileLarge from '../../Templates/ItemTileLarge';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../Utils/format';\nimport { extractPaymentType } from '../Main/Financial/utils';\n\ninterface OrderProps {\n  readonly store: WaykeStore;\n  readonly cdnMedia?: string;\n}\n\nclass Order extends StackNode {\n  private readonly props: OrderProps;\n\n  constructor(element: HTMLElement, props: OrderProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store, cdnMedia } = this.props;\n    const state = store.getState();\n\n    const paymentLoan = state.order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n    const paymentLookupResponse = state.paymentLookupResponse || paymentLoan?.loanDetails;\n    const paymentLease = state.order?.paymentOptions.find((x) => x.type === PaymentType.Lease);\n    const paymentType = extractPaymentType(state.paymentType)!;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.orderTitle')}</h4>\n      </div>\n      <div class=\"waykeecom-stack waykeecom-stack--2\">\n        ${ItemTileLarge({\n          vehicle: state.vehicle,\n          order: state.order,\n          cdnMedia,\n          meta: `\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              ${\n                paymentType === PaymentType.Loan && paymentLoan\n                  ? `\n                  <div class=\"waykeecom-stack waykeecom-stack--05\">\n                    <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n                  </div>\n                  <div class=\"waykeecom-stack waykeecom-stack--05\">\n                    <ul class=\"waykeecom-key-value-list\">\n                    ${\n                      paymentLookupResponse\n                        ? KeyValueListItem({\n                            key: paymentLoan.name || '???',\n                            value: prettyNumber(paymentLookupResponse.costs.monthlyCost, {\n                              postfix: i18next.t('summary.perMonth'),\n                            }),\n                          })\n                        : ``\n                    }\n                    </ul>\n                  </div>\n                `\n                  : paymentType === PaymentType.Cash\n                    ? `\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n                    </div>\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <ul class=\"waykeecom-key-value-list\">\n                        ${KeyValueListItem({\n                          key: i18next.t('summary.cash'),\n                          value: prettyNumber(state.vehicle?.price, { postfix: 'kr' }),\n                        })}\n                      </ul>\n                    </div>\n                  `\n                    : paymentType === PaymentType.Lease\n                      ? `\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n                    </div>\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <ul class=\"waykeecom-key-value-list\">\n                        ${KeyValueListItem({\n                          key: i18next.t('summary.lease'),\n                          value: `${i18next.t('summary.from')} ${prettyNumber(paymentLease?.price, {\n                            postfix: paymentLease?.unit,\n                          })}`,\n                        })}\n                      </ul>\n                    </div>\n                  `\n                      : ''\n              }\n            </div>\n            ${\n              !!state.accessories.length\n                ? `\n                  <div class=\"waykeecom-stack waykeecom-stack--2\">\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <div class=\"waykeecom-label\">${i18next.t('summary.accessories')}</div>\n                    </div>\n                    <div class=\"waykeecom-stack waykeecom-stack--05\">\n                      <ul class=\"waykeecom-key-value-list\">\n                        ${state.accessories\n                          .map((accessory) =>\n                            KeyValueListItem({\n                              key: accessory.name,\n                              value: prettyNumber(accessory.price, { postfix: 'kr' }),\n                            })\n                          )\n                          .join('')}\n                      </ul>\n                    </div>\n                  </div>`\n                : ''\n            }\n            ${\n              state.insurance || state.freeInsurance\n                ? `\n                <div class=\"waykeecom-stack waykeecom-stack--2\">\n                  ${\n                    state.insurance\n                      ? `\n                      <div class=\"waykeecom-stack waykeecom-stack--05\">\n                        <div class=\"waykeecom-label\">${i18next.t('summary.insurance')}</div>\n                      </div>\n                      <div class=\"waykeecom-stack waykeecom-stack--05\">\n                        <ul class=\"waykeecom-key-value-list\">\n                          ${KeyValueListItem({\n                            key: state.insurance.name,\n                            value: prettyNumber(state.insurance.price, {\n                              postfix: i18next.t('summary.perMonth'),\n                            }),\n                          })}\n                          ${\n                            state.insuranceAddOns?.addOns.length &&\n                            state.insuranceAddOns.insurance === state.insurance.name\n                              ? state.insuranceAddOns.addOns\n                                  .map((addon) =>\n                                    KeyValueListItem({\n                                      key: addon.title,\n                                      value: prettyNumber(addon.monthlyPrice, {\n                                        postfix: i18next.t('summary.perMonth'),\n                                      }),\n                                    })\n                                  )\n                                  .join('')\n                              : ''\n                          }\n                        </ul>\n                      </div>\n                    `\n                      : ''\n                  }\n                  ${\n                    state.freeInsurance\n                      ? `\n                      <div class=\"waykeecom-stack waykeecom-stack--05\">\n                        <div class=\"waykeecom-label\">${i18next.t('summary.insurance')}</div>\n                      </div>\n                      <div class=\"waykeecom-stack waykeecom-stack--05\">\n                        <ul class=\"waykeecom-key-value-list\">\n                          ${KeyValueListItem({\n                            key: state.freeInsurance.title,\n                            value: i18next.t('summary.free'),\n                          })}\n                        </ul>\n                      </div>\n                    `\n                      : ''\n                  }\n                </div>`\n                : ''\n            }\n           \n          `,\n        })}\n      </div>\n    `;\n  }\n}\n\nexport default Order;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { translateTradeInCondition } from '../../Utils/constants';\nimport { prettyNumber } from '../../Utils/format';\n\ninterface TradeInProps {\n  readonly store: WaykeStore;\n  readonly marketCode: MarketCode;\n}\n\nclass TradeIn extends StackNode {\n  private readonly props: TradeInProps;\n  constructor(element: HTMLElement, props: TradeInProps) {\n    super(element);\n    this.props = props;\n    this.render();\n  }\n\n  render() {\n    const { store } = this.props;\n    const state = store.getState();\n    const { order, tradeIn, tradeInVehicle } = state;\n    if (!order?.allowsTradeIn) return;\n\n    this.node.innerHTML = `\n      <div class=\"waykeecom-stack waykeecom-stack--4\">\n        <div class=\"waykeecom-stack waykeecom-stack--2\">\n          <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.tradeInTitle')}</h4>\n        </div>\n        \n        ${\n          tradeIn && tradeIn.condition && tradeInVehicle\n            ? `<div class=\"waykeecom-stack waykeecom-stack--2\">\n          <div class=\"waykeecom-balloon\">\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <div class=\"waykeecom-label\">${tradeIn.registrationNumber}</div>\n              </div>\n              <div class=\"waykeecom-stack waykeecom-stack--05\">\n                <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n                  tradeInVehicle.manufacturer\n                } ${tradeInVehicle.modelSeries}</span> ${tradeInVehicle.modelName} ${\n                  tradeInVehicle.modelYear\n                }\n              </div>\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <hr class=\"waykeecom-separator\" />\n            </div>\n            <div class=\"waykeecom-stack waykeecom-stack--2\">\n              <ul class=\"waykeecom-key-value-list\">\n                ${KeyValueListItem({\n                  key: i18next.t('summary.mileage'),\n                  value: `${tradeIn.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n                })}\n                ${KeyValueListItem({\n                  key: i18next.t('summary.description'),\n                  value: `${tradeIn.description}`,\n                })}\n                ${KeyValueListItem({\n                  key: i18next.t('summary.condition'),\n                  value: translateTradeInCondition[tradeIn.condition],\n                })}\n                ${KeyValueListItem({\n                  key: i18next.t('summary.estimatedValue'),\n                  value: `~ ${prettyNumber(tradeInVehicle.valuation, { postfix: 'kr' })}`,\n                })}\n              </ul>\n            </div>\n          </div>\n        </div>`\n            : `<div class=\"waykeecom-stack waykeecom-stack--2\">\n                <ul class=\"waykeecom-key-value-list\">\n                  ${KeyValueListItem({\n                    key: i18next.t('summary.tradeInTitle'),\n                    value: i18next.t('summary.no'),\n                  })}\n                </ul>\n            </div>`\n        }\n      </div>\n    `;\n  }\n}\n\nexport default TradeIn;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\nimport watch from '../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomView } from '../../Utils/ecomEvent';\nimport { scrollTop } from '../../Utils/scroll';\nimport CentralStorage from './CentralStorage';\nimport Customer from './Customer';\nimport Delivery from './Delivery';\nimport Intro from './Intro';\nimport Order from './Order';\nimport TradeIn from './TradeIn';\n\nconst SUMMARY_NODE = 'summary-node';\n\ninterface SummaryProps {\n  readonly store: WaykeStore;\n  readonly cdnMedia?: string;\n  readonly onClose: () => void;\n  readonly marketCode: MarketCode;\n}\n\nclass Summary extends HtmlNode {\n  private readonly props: SummaryProps;\n\n  constructor(element: HTMLElement, props: SummaryProps) {\n    super(element);\n    this.props = props;\n    ecomEvent(EcomView.SUMMARY, EcomEvent.SUMMARY_ACTIVE);\n\n    watch<number>(this.props.store, 'navigation.view', (view) => {\n      if (view === 3) {\n        this.render();\n        scrollTop();\n      }\n    });\n\n    watch(this.props.store, 'createdOrderId', () => {\n      this.render();\n    });\n\n    this.render();\n    scrollTop();\n  }\n\n  render() {\n    const { store, cdnMedia } = this.props;\n    const { stages } = store.getState();\n\n    this.node.innerHTML = `\n      <div id=\"${SUMMARY_NODE}\"></div>\n    `;\n\n    const content = this.node.querySelector<HTMLDivElement>(`#${SUMMARY_NODE}`);\n    if (content) {\n      new Intro(content, { store });\n      new Order(content, { store, cdnMedia });\n      if (stages?.find((x) => x.name === 'tradeIn')) {\n        new TradeIn(content, { store, marketCode: this.props.marketCode });\n      }\n\n      if (stages?.find((x) => x.name === 'centralStorage')) {\n        new CentralStorage(content, { store });\n      }\n      new Delivery(content, { store });\n      new Customer(content, { store, marketCode: this.props.marketCode });\n    }\n  }\n}\n\nexport default Summary;\n", "import WaykeEcomWeb from './App';\n\nexport { EcomEvent, EcomStep, EcomView } from './Utils/ecomEvent';\n\nexport default WaykeEcomWeb;\n"],
  "mappings": "AAAA,OAAOA,OAAc,UCArB,IAAMC,GAAO,CACX,SAAU,CACR,OAAQ,QACR,aAAc,cACd,SAAU,YACV,kBAAmB,oBACnB,cAAe,kBACf,SAAU,UACV,WAAY,eACZ,QAAS,uBACT,SAAU,qBACV,QAAS,QACT,WAAY,aACZ,IAAK,WACL,OAAQ,QACR,cAAe,kDACf,SAAU,YACV,UAAW,aACX,iBAAkB,mBAClB,UAAW,wBACb,EACA,aAAc,CACZ,QAAS,kCACT,QACE,2LACF,YAAa,0BACb,cAAe,uBACjB,EACA,kBAAmB,CACjB,WAAY,UACZ,QAAS,uBACX,EACA,YAAa,CACX,MAAO,cACP,WAAY,cACZ,kBAAmB,oBACnB,QAAS,+CACT,YAAa,kEACb,cAAe,eACf,WAAY,yBACd,EACA,eAAgB,CACd,MAAO,gBACP,QAAS,sCACT,YACE,qHACF,kBAAmB,QACnB,cAAe,eACf,aAAc,sFACd,gBAAiB,iBACjB,eAAgB,iBAClB,EACA,aAAc,CACZ,MAAO,0BACP,aAAc,WACd,QAAS,iBACT,YACE,iKACF,aACE,+HACF,SACE,2HACF,aAAc,oFACd,aAAc,qDACd,yBACE,oFACF,uBAAwB,2BACxB,cAAe,4DACf,cAAe,iBACf,WAAY,6EACZ,sBACE,4FACF,wBACE,uFACF,4BAA6B,iEAC7B,mBAAoB,6EACpB,yBAA0B,iEAC1B,uBAAwB,8EACxB,uBAAwB,4DACxB,eAAgB,wBAChB,mBACE,kJACF,oBACE,iIACF,gBAAiB,WACjB,qBAAsB,UACtB,sBAAuB,sBACvB,2BAA4B,mBAC5B,oBAAqB,qBACrB,yBAA0B,mBAC1B,cAAe,eACf,mBAAoB,QACpB,WAAY,OACZ,gBAAiB,MACjB,cAAe,mBACf,mCAAoC,+CACpC,uBAAwB,kDAC1B,EACA,SAAU,CACR,MAAO,oBACP,kBAAmB,0BACnB,MAAO,SACP,MAAO,gBACP,SAAU,eACV,KAAM,OACN,UAAW,UACX,QAAS,YACT,QAAS,UACT,OAAQ,cACR,QAAS,0BACT,kBAAmB,qBACnB,WAAY,aACZ,KAAM,WACN,iBAAkB,qBAClB,uBAAwB,4CACxB,iBAAkB,0BAClB,kBAAmB,uCACnB,iBAAkB,2BAClB,kBAAmB,2BACnB,qBAAsB,uBACtB,sBAAuB,uBACvB,mBAAoB,yBACpB,oBAAqB,yBACrB,kBAAmB,wBACnB,mBAAoB,wBACpB,mBAAoB,0BACpB,oBAAqB,0BACrB,sBAAuB,0BACvB,uBAAwB,0BACxB,gBAAiB,iBACjB,iBAAkB,iBAElB,cAAe,eACf,kBAAmB,qBACnB,wBAAyB,+DACzB,oBAAqB,4BACrB,qBAAsB,wFACtB,YAAa,oBACb,kBAAmB,+DACnB,iBAAkB,gDAClB,WAAY,6EACZ,qBAAsB,OACxB,EACA,SAAU,CACR,MAAO,WACP,eAAgB,mBAChB,aAAc,eACd,OAAQ,wBACR,qBAAsB,yBACtB,QAAS,kCACT,YACE,sFACF,KAAM,SACN,cAAe,8BACf,WAAY,4DACZ,cAAe,cACjB,EACA,iBAAkB,CAChB,gBAAiB,mBACjB,2BACE,qdACF,cAAe,cACf,WAAY,gBACZ,SAAU,OACV,OAAQ,UACR,YAAa,YACb,uBAAwB,oBACxB,YAAa,eACb,oBAAqB,yBACrB,+BACE,wEACF,gBAAiB,yBACjB,cACE,qIACF,UAAW,mFACX,YAAa,6CACb,uBAAwB,iCACxB,WACE,qMACF,eAAgB,kDAChB,UAAW,2CACX,qBACE,iMACF,WAAY,2BACZ,aAAc,oEACd,cAAe,kBACf,kBAAmB,4EACnB,kBACE,sFACF,sBAAuB,gEACvB,eAAgB,oCAChB,YAAa,2CACb,kBAAmB,4DACnB,gBAAiB,6BACjB,cAAe,mBACf,eAAgB,mBAChB,UAAW,iBACX,mBAAoB,+BACpB,oBAAqB,+BACrB,kBAAmB,8BACnB,iBAAkB,oCAClB,YAAa,cACb,iBAAkB,yCAClB,UAAW,cACX,YAAa,YACb,iBAAkB,uCAClB,WAAY,YACZ,gBAAiB,uCACjB,YAAa,mBACb,YAAa,cACb,iBAAkB,kDAClB,YAAa,kDACb,iBAAkB,0CAClB,iBAAkB,cAClB,oBAAqB,qBACrB,aAAc,iCACd,QAAS,aACT,QAAS,UACT,MAAO,QACP,QAAS,mBACT,UAAW,UACX,OAAQ,SACR,aAAc,WACd,YAAa,aACb,UAAW,YACX,cAAe,eACf,YAAa,SACb,eAAgB,yFAChB,qBAAsB,mBACtB,SAAU,sBACZ,EACA,UAAW,CACT,MAAO,yBACP,YAAa,wDACb,OAAQ,UACR,kBAAmB,oBACnB,mBAAoB,iCACpB,SAAU,WACV,oBAAqB,sBACrB,qBAAsB,gCACtB,OAAQ,YACR,kBAAmB,uBACnB,mBAAoB,iCACpB,YAAa,QACb,uBAAwB,kBACxB,wBAAyB,4BACzB,cAAe,eACf,YAAa,SACb,QAAS,eACT,aAAc,yEACd,OAAQ,gBACR,kBACE,8NACF,SAAU,aACV,oBACE,uKACF,KAAM,UACN,gBACE,uFACF,sBAAuB,qCACvB,wBAAyB,wBACzB,kBAAmB,4DACnB,aAAc,6EACd,KAAM,MACN,QAAS,eACT,eAAgB,gBAChB,0BACE,uKACF,2BAA4B,yBAC5B,sBAAuB,yBACvB,uBAAwB,sBACxB,sBAAuB,kBACvB,iBAAkB,wBAClB,kBAAmB,qBACnB,iBAAkB,iBAClB,cAAe,sBACjB,EACA,KAAM,CACJ,MAAO,YACP,YAAa,8CACb,kBACE,yKACF,YAAa,4FACb,iBAAkB,iBAClB,qBAAsB,6CACtB,2BACE,mVACF,cAAe,aACf,cAAe,YACf,cAAe,kCACf,cAAe,cACjB,EACA,YAAa,CACX,eACE,8HACF,YAAa,eACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,MACR,SAAU,QACV,kBAAmB,iBACnB,SAAU,qBACV,kBAAmB,2BACnB,gBAAiB,uBACjB,gBACE,uNACF,gBACE,kLACF,SAAU,oCACZ,EACA,oBAAqB,CACnB,YAAa,eACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,MACR,SAAU,QACV,kBAAmB,iBACnB,SAAU,qBACV,kBAAmB,2BACnB,gBAAiB,uBACjB,gBACE,uNACF,gBACE,kLACF,SAAU,oCACZ,EACA,uBAAwB,CACtB,YAAa,gCACb,SAAU,SACZ,EACA,wBAAyB,CACvB,YAAa,iBACb,WAAY,kBACZ,gBAAiB,qBACjB,OAAQ,MACR,YAAa,gCACb,eACE,8HACF,iBAAkB,8DAClB,gBAAiB,qBACjB,UAAW,eACX,KAAM,UACN,MAAO,eACT,EACA,wCAAyC,CACvC,SAAU,gEACV,oBACE,8JACF,eACE,qHACF,0BACE,oPACF,SAAU,8DACV,oBACE,+IACF,kBACE,iJACF,YAAa,sFACf,EACA,YAAa,CACX,MAAO,YACP,YAAa,8DACb,eAAgB,gEAChB,YACE,6LACF,YAAa,iBACb,WAAY,kBACZ,gBAAiB,qBACjB,YAAa,gCACb,WACE,oGACJ,EACA,QAAS,CACP,UAAW,eACX,KAAM,UACN,KAAM,YACN,QAAS,gBACT,aAAc,QACd,oBAAqB,gBACrB,gBAAiB,qBACjB,cAAe,oBACf,aAAc,oBACd,YAAa,eACb,gBAAiB,UACjB,cAAe,SACf,cAAe,gBACf,cAAe,WACf,eAAgB,mBAChB,aAAc,eACd,OAAQ,wBACR,SAAU,2BACV,gBAAiB,qBACjB,kBAAmB,4EACnB,kBACE,2FACF,YAAa,yCACb,4BACE,4GACF,YAAa,uCACb,WAAY,iBACZ,cAAe,mBACf,SAAU,SACV,MAAO,gBACP,KAAM,MACN,YAAa,cACb,UAAW,aACX,KAAM,SACN,aAAc,cACd,QAAS,iBACT,YAAa,cACb,UAAW,kBACX,eAAgB,mBAChB,GAAI,KACN,EACA,UAAW,CACT,QAAS,gDACT,YAAa,2EACb,cAAe,eACf,WAAY,UACZ,QAAS,kCACT,cACE,2UACF,eAAgB,mBAChB,QACE,iOACF,aACE,mQACF,WAAY,0BACZ,SAAU,SACV,OAAQ,UACR,SAAU,0BACV,OAAQ,WACR,OAAQ,OACR,iBAAkB,0BAClB,KAAM,QACN,WAAY,8CACZ,MAAO,gBACP,MAAO,aACP,KAAM,QACN,kBAAmB,kBACrB,EACA,QAAS,CACP,MAAO,cACP,QAAS,iBACT,YAAa,cACb,UAAW,kBACX,eAAgB,mBAChB,SAAU,qEACV,eACE,0KACF,GAAI,MACJ,kBAAmB,QACnB,QAAS,yBACT,mBACE,mIACF,UAAW,sBACX,WAAY,0BACZ,kBAAmB,qBACnB,cAAe,eACf,YAAa,mBACb,YAAa,2BACb,SAAU,wDACV,UAAW,+CACX,cAAe,oCACf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CvB,wBAAyB,uBACzB,kBAAmB,4DACnB,aAAc,sFACd,KAAM,UACN,QAAS,eACT,eAAgB,gBAChB,0BACE,6LACF,2BAA4B,yBAC5B,sBAAuB,yBACvB,uBAAwB,qBACxB,sBAAuB,iBACvB,iBAAkB,yBAClB,kBAAmB,qBACnB,iBAAkB,iBAClB,cAAe,uBACjB,EACA,KAAM,CACJ,MAAO,YACP,YAAa,+CACb,kBACE,mMACF,YACE,uGACF,iBAAkB,gBAClB,qBAAsB,mDACtB,2BACE,+VACF,cAAe,cACf,cAAe,eACf,cAAe,sCACf,cAAe,cACjB,EACA,YAAa,CACX,eACE,sIACF,YAAa,gBACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,SACR,SAAU,WACV,kBAAmB,oBACnB,SAAU,yBACV,kBAAmB,2BACnB,gBAAiB,sBACjB,gBACE,2OACF,gBACE,2OACF,SAAU,oCACZ,EACA,oBAAqB,CACnB,YAAa,gBACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,SACR,SAAU,WACV,kBAAmB,oBACnB,SAAU,yBACV,kBAAmB,2BACnB,gBAAiB,sBACjB,gBACE,2OACF,gBACE,2OACF,SAAU,oCACZ,EACA,uBAAwB,CACtB,YAAa,mCACb,SAAU,YACZ,EACA,wBAAyB,CACvB,YAAa,gBACb,WAAY,gBACZ,gBAAiB,qBACjB,OAAQ,SACR,YAAa,mCACb,eACE,sIACF,iBAAkB,6DAClB,gBAAiB,wBACjB,UAAW,eACX,KAAM,UACN,MAAO,eACT,EACA,wCAAyC,CACvC,SAAU,8DACV,oBACE,yJACF,eACE,8HACF,0BACE,iQACF,SAAU,6DACV,oBACE,+JACF,kBACE,gJACF,YAAa,oFACf,EACA,YAAa,CACX,MAAO,YACP,YAAa,6DACb,eAAgB,gEAChB,YACE,yLACF,YAAa,gBACb,WAAY,gBACZ,gBAAiB,qBACjB,YAAa,mCACb,WACE,4GACJ,EACA,QAAS,CACP,UAAW,eACX,KAAM,UACN,KAAM,YACN,QAAS,gBACT,aAAc,WACd,oBAAqB,eACrB,gBAAiB,kBACjB,cAAe,gBACf,aAAc,wBACd,YAAa,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",
  "names": ["_i18next", "nbNO", "nb_NO_default", "svSE", "sv_SE_default", "getLanguage", "marketCode", "i18next", "_i18next", "initializeI18N", "marketCode", "locale", "getLanguage", "i18next", "sv_SE_default", "nb_NO_default", "i18n_default", "config", "package_default", "trapFocus", "modalElement", "e", "focusableElements", "firstElement", "lastElement", "HtmlNode", "element", "settings", "existingElement", "attribute", "item", "HtmlNode_default", "ModalBody", "HtmlNode_default", "element", "id", "ModalBody_default", "ModalCenter", "HtmlNode_default", "element", "id", "ModalCenter_default", "ButtonClose", "HtmlNode_default", "element", "props", "title", "id", "onClick", "ButtonClose_default", "ModalClose", "HtmlNode_default", "element", "props", "event", "onClose", "ButtonClose_default", "i18n_default", "ModalClose_default", "ModalContainer", "HtmlNode_default", "element", "id", "ModalContainer_default", "ModalDialog", "HtmlNode_default", "element", "id", "ModalDialog_default", "getWordmarkLogotype", "market", "className", "getSymbolLogotype", "ModalFooter", "HtmlNode_default", "element", "props", "getSymbolLogotype", "i18n_default", "ModalFooter_default", "ModalHeader", "HtmlNode_default", "element", "props", "title", "logo", "logoX2", "onClose", "getWordmarkLogotype", "button", "ModalHeader_default", "Modal", "HtmlNode_default", "element", "props", "trapFocus", "title", "id", "onClose", "container", "ModalContainer_default", "center", "ModalCenter_default", "dialog", "ModalDialog_default", "ModalClose_default", "ModalHeader_default", "body", "ModalBody_default", "ModalFooter_default", "Modal_default", "creditAssessment", "creditAssessmentCancelSigning", "caseId", "convertPaymentLookupResponse", "plr", "convertCreditAssessmentStatusResponse", "cCAr", "convertOrderOptionsResponse", "cOOR", "option", "convertVehicleLookupResponse", "cVLR", "RESET", "reset", "id", "dispatch", "SET_ORDER", "setOrder", "order", "vehicle", "SET_ID", "setId", "SET_CONTACT_EMAIL_AND_PHONE", "setContactAndPhone", "value", "SET_SOCIAL_ID_AND_ADDRESS", "setSocialIdAndAddress", "socialId", "address", "lastStage", "SET_ADDRESS", "setAddress", "SET_HOME_DELIVERY", "setHomeDelivery", "homeDelivery", "SET_DEALER", "setDealer", "dealer", "INIT_TRADE_IN", "initTradeIn", "SET_TRADE_IN", "setTradeIn", "tradeIn", "tradeInVehicle", "SET_FINANCIAL", "setFinancial", "paymentType", "SET_PAYMENT_LOOKUP_RESPONSE", "setPaymentLookupResponse", "paymentLookupResponse", "convertPaymentLookupResponse", "RESET_PAYMENT_LOOKUP_RESPONSE", "resetPaymentLookupResponse", "SET_DRIVING_DISTANCE", "setDrivingDistance", "drivingDistance", "COMPLETE_STAGE", "completeStage", "SET_OR_REMOVE_INSURANCE", "addOrRemoveInsurance", "insurance", "SET_OR_REMOVE_INSURANCE_ADDONS", "addOrRemoveInsuranceAddon", "insuranceAddons", "SET_OR_REMOVE_FREE_INSURANCE", "addOrRemoveFreeInsurance", "freeInsurance", "SET_OR_REMOVE_ACCESSORY", "addOrRemoveAccessory", "accessory", "GO_TO", "goTo", "view", "index", "subStage", "SET_STAGES", "setStages", "stages", "SET_CREATED_ORDER_ID", "setCreatedOrderId", "payment", "SET_CREDIT_ASSESSMENT_RESPONSE", "setCreditAssessmentResponse", "caseId", "creditAssessmentResponse", "SET_STATE", "setState", "state", "createReduxStore", "DrivingDistance", "PaymentType", "isSame", "a", "b", "mock", "initNavigation", "initialState", "DrivingDistance", "getNextNavigationState", "currentStage", "lastStage", "getNextTopNavigationState", "currentTopNavigation", "nextNavigation", "next", "resolveDefaultPaymentOption", "paymentOptions", "PaymentType", "index", "reducer", "state", "action", "navigation", "topNavigation", "RESET", "SET_STAGES", "SET_ID", "SET_ORDER", "SET_CONTACT_EMAIL_AND_PHONE", "clean", "SET_SOCIAL_ID_AND_ADDRESS", "SET_ADDRESS", "SET_DEALER", "SET_HOME_DELIVERY", "INIT_TRADE_IN", "SET_TRADE_IN", "SET_FINANCIAL", "RESET_PAYMENT_LOOKUP_RESPONSE", "SET_PAYMENT_LOOKUP_RESPONSE", "SET_DRIVING_DISTANCE", "COMPLETE_STAGE", "SET_OR_REMOVE_INSURANCE_ADDONS", "SET_OR_REMOVE_INSURANCE", "isSame", "SET_OR_REMOVE_FREE_INSURANCE", "SET_OR_REMOVE_ACCESSORY", "accessory", "GO_TO", "SET_CREATED_ORDER_ID", "SET_CREDIT_ASSESSMENT_RESPONSE", "SET_STATE", "reducer_default", "createStore", "createReduxStore", "reducer_default", "getValue", "defaultCompare", "a", "b", "reduxWatch", "getState", "objectPath", "compare", "selectedCompare", "currentValue", "fn", "newValue", "oldValue", "subscriptions", "registerSubsription", "s", "unregisterAllSubscriptions", "watch", "store", "path", "callback", "doNotRegister", "w", "watch_default", "EcomEvent", "EcomStep", "EcomView", "listners", "registerEventListner", "fn", "unregisterEventListner", "index", "f", "eventHistory", "getLastHistory", "ecomEvent", "view", "currentStep", "data", "ecomEvent_default", "intervals", "registerInterval", "key", "interval", "unregisterAllIntervals", "setVw", "vw", "useVwListner", "getType", "type", "Loader", "props", "classList", "classType", "Loader_default", "Button", "HtmlNode_default", "element", "props", "disabled", "loading", "title", "id", "onClick", "Loader_default", "Button_default", "ButtonAlt", "HtmlNode_default", "element", "props", "disabled", "loading", "title", "id", "onClick", "Loader_default", "ButtonAlt_default", "CONFIRM_CLOSE_NODE", "ABORT_CLOSE_NODE", "ConfirmClose", "HtmlNode_default", "element", "props", "onConfirmClose", "onAbortClose", "i18n_default", "Button_default", "ButtonAlt_default", "ConfirmClose_default", "toCdnMedia", "url", "cdn", "asUrl", "removeSpaces", "value", "formatDecimals", "decimals", "upper", "prettyNumber", "settings", "formattedValue", "removeParts", "orginal", "remove", "orginalSplitt", "removeSplitted", "x", "formatShortDescription", "vehicle", "ItemTileSmall", "vehicle", "order", "cdnMedia", "imageUrl", "vehicleTitle", "price", "prettyNumber", "sellerName", "toCdnMedia", "formatShortDescription", "ItemTileSmall_default", "ButtonArrowRight", "HtmlNode_default", "element", "props", "disabled", "loading", "title", "id", "onClick", "Loader_default", "ButtonArrowRight_default", "ButtonSkip", "HtmlNode_default", "element", "props", "title", "id", "onClick", "ButtonSkip_default", "KeyValueListItem", "key", "value", "image", "KeyValueListItem_default", "StageCompleted", "HtmlNode_default", "element", "props", "keyValueList", "changeButtonTitle", "onEdit", "keyValue", "KeyValueListItem_default", "i18n_default", "StageCompleted_default", "ListItem", "element", "props", "title", "active", "completed", "id", "existingListItem", "item", "className", "content", "ListItem_default", "Arrow", "HtmlNode_default", "element", "props", "hide", "title", "dataIcon", "path", "i18n_default", "Arrow_default", "getRightVariables", "ref", "itemWidth", "scrollWidth", "scrollLeft", "overflowElementWidth", "overflowElementScrollWidth", "OverflowGridList", "HtmlNode_default", "element", "props", "listRef", "left", "PREV_ID", "NEXT_ID", "Arrow_default", "rightHide", "OverflowGridList_default", "ButtonAddRemove", "HtmlNode_default", "element", "props", "disabled", "loading", "id", "selected", "fullSize", "onClick", "title", "i18n_default", "buttonClassName", "selectedIcon", "Loader_default", "ButtonAddRemove_default", "ButtonAsLink", "HtmlNode_default", "element", "props", "disable", "title", "id", "disabled", "onClick", "ButtonAsLink_default", "BUTTON_ADD_REMOVE", "BUTTON_ADD_REMOVE_NODE", "READ_MORE", "READ_MORE_NODE", "GridItem", "HtmlNode_default", "element", "props", "id", "changes", "change", "title", "image", "logo", "price", "priceDetails", "description", "selected", "onClick", "onInfo", "onInfoId", "addRemoveButtonNodeId", "d", "ButtonAsLink_default", "i18n_default", "ButtonAddRemove_default", "OverflowGridItem_default", "createPortal", "destroyPortal", "el", "element", "node", "index", "ButtonAsLinkArrowLeft", "HtmlNode_default", "element", "props", "disable", "title", "id", "disabled", "onClick", "ButtonAsLinkArrowLeft_default", "ButtonClear", "HtmlNode_default", "element", "props", "title", "id", "onClick", "ButtonClear_default", "Arrow", "HtmlNode_default", "element", "props", "hide", "title", "dataIcon", "path", "i18n_default", "Arrow_default", "getRightVariables", "ref", "itemWidth", "scrollWidth", "scrollLeft", "overflowElementWidth", "overflowElementScrollWidth", "Gallery", "HtmlNode_default", "element", "props", "listRef", "left", "PREV_ID", "NEXT_ID", "m", "Arrow_default", "rightHide", "Gallery_default", "marked", "sanitizeHtml", "asHtml", "s", "scrollTop", "elementScrollDesktop", "WAYKE_ECOM_MODAL_ID", "elementScrollMobile", "BUTTON_TOP_LEFT_NODE", "BUTTON_BOTTOM_LEFT_NODE", "BUTTON_ACCESSORY_ADD_REMOVE_NODE", "ACCESSORY_GALLERY_NODE", "AccessoryItemInfo", "HtmlNode_default", "element", "props", "accessory", "ecomEvent_default", "selected", "onClick", "onClose", "name", "media", "logoUrl", "price", "shortDescription", "longDescription", "salePrice", "i18n_default", "prettyNumber", "asHtml", "Gallery_default", "m", "i", "ButtonAsLinkArrowLeft_default", "ButtonClear_default", "ButtonAddRemove_default", "scrollTop", "AccessoryItemInfo_default", "AccessoryItem", "HtmlNode_default", "element", "props", "watch_default", "newValue", "oldValue", "x", "accessory", "ecomEvent_default", "destroyPortal", "store", "selected", "_accessory", "addOrRemoveAccessory", "key", "AccessoryItemInfo_default", "createPortal", "OverflowGridItem_default", "prettyNumber", "AccessoryItem_default", "AccessoryList", "HtmlNode_default", "element", "props", "accessories", "store", "listRef", "OverflowGridList_default", "ecomEvent_default", "overflowElement", "accessory", "index", "AccessoryItem_default", "AccessoryList_default", "PROCEED", "PROCEED_NODE", "SKIP", "SKIP_NODE", "ACCESSORY_GRID_LIST_NODE", "Accessories", "HtmlNode_default", "element", "props", "watch_default", "completeStage", "ecomEvent_default", "goTo", "store", "index", "state", "completed", "active", "content", "ListItem_default", "i18n_default", "part", "StageCompleted_default", "accessory", "prettyNumber", "accessories", "AccessoryList_default", "ButtonArrowRight_default", "ButtonSkip_default", "Accessories_default", "errorInputClassName", "InputError", "HtmlNode_default", "element", "props", "error", "errorMessage", "errorNode", "errorElement", "InputError_default", "helpClassName", "foldoutClassName", "InputInformation", "HtmlNode_default", "element", "props", "information", "existHelp", "existFoldout", "label", "i18n_default", "informationElement", "InputInformation_default", "InputRadioField", "HtmlNode_default", "element", "props", "id", "title", "value", "name", "checked", "meta", "description", "disabled", "onClick", "input", "InputRadioField_default", "InputRadioGroup", "HtmlNode_default", "element", "props", "border", "error", "title", "options", "name", "checked", "errorMessage", "information", "footer", "onClick", "onClickInformation", "option", "InputError_default", "InputRadioField_default", "e", "InputInformation_default", "InputRadioGroup_default", "orders", "getOrder", "id", "dealer", "request", "Alert", "tone", "children", "polite", "Alert_default", "PROCEED", "PROCEED_NODE", "CENTRAL_STORAGE_BRANCH", "CENTRAL_STORAGE_BRANCH_NODE", "CentralStorage", "HtmlNode_default", "element", "props", "watch_default", "selectedDealer", "id", "vehicle", "order", "getOrder", "convertedOrder", "convertOrderOptionsResponse", "ecomEvent_default", "setOrder", "setDealer", "value", "goTo", "navigation", "topNavigation", "createdOrderId", "index", "dealers", "completed", "active", "content", "ListItem_default", "i18n_default", "dealer", "x", "StageCompleted_default", "Alert_default", "options", "address", "InputRadioGroup_default", "e", "ButtonArrowRight_default", "CentralStorage_default", "maskText", "text", "maskSSn", "ssn", "InputField", "HtmlNode_default", "element", "props", "border", "error", "errorMessage", "id", "title", "type", "name", "min", "value", "autocomplete", "placeholder", "unit", "information", "pattern", "inputmode", "help", "onChange", "onBlur", "onClickInformation", "InputError_default", "InputInformation_default", "input", "InputField_default", "regexEmail", "regexPhoneNumberVariant", "regexZip", "regexPersonalNumber", "regexRegistrationNumberSweden", "regexRegistrationNumberNorway", "regexNumber", "validationMethods", "s", "regexEmail", "regexPhoneNumberVariant", "regexPersonalNumber", "nonLast", "regexNumber", "asDate", "regexZip", "from", "to", "number", "f", "marketCode", "trimmed", "hasCorrectLength", "isRegexMatch", "regexRegistrationNumberSweden", "regexRegistrationNumberNorway", "_s", "EMAIL_NODE", "EMAIL_INPUT_ID", "PHONE_NODE", "PHONE_INPUT_ID", "PROCEED_NODE", "PROCEED", "validation", "validationMethods", "initalState", "customer", "value", "EmailAndPhone", "HtmlNode_default", "element", "props", "state", "currentTarget", "name", "ecomEvent_default", "setContactAndPhone", "goTo", "subStage", "keyValueItems", "i18n_default", "kv", "KeyValueListItem_default", "InputField_default", "e", "ButtonArrowRight_default", "EmailAndPhone_default", "DisclaimerPadlock", "HtmlNode_default", "element", "props", "DisclaimerPadlock_default", "customers", "getAddressBySsn", "ssn", "request", "renderConditional", "condition", "content", "SOCIAL_ID_NODE", "SOCIAL_ID_INPUT_ID", "SOCIAL_ID_INFO", "PROCEED", "PROCEED_NODE", "DISCLAIMER_NODE", "validation", "validationMethods", "initalState", "customer", "value", "FullAddressBySocialId", "HtmlNode_default", "element", "props", "state", "store", "lastStage", "ecomEvent_default", "response", "getAddressBySsn", "address", "setSocialIdAndAddress", "regexNumber", "currentTarget", "name", "policy", "i18n_default", "renderConditional", "Alert_default", "InputField_default", "e", "key", "ButtonArrowRight_default", "DisclaimerPadlock_default", "FullAddressBySocialId_default", "GIVENNAME_NODE", "GIVENNAME_INPUT_ID", "SURNAME_NODE", "SURNAME_INPUT_ID", "STREET_NODE", "STREET_INPUT_ID", "STREET2_NODE", "STREET2_INPUT_ID", "POSTALCODE_NODE", "POSTALCODE_INPUT_ID", "CITY_NODE", "CITY_INPUT_ID", "PROCEED_NODE", "PROCEED", "validation", "validationMethods", "initalState", "address", "value", "FullAddressForm", "HtmlNode_default", "element", "props", "state", "currentTarget", "name", "ecomEvent_default", "setAddress", "goTo", "subStage", "keyValueItems", "i18n_default", "kv", "KeyValueListItem_default", "InputField_default", "e", "ButtonArrowRight_default", "FullAddressForm_default", "FullAddress", "HtmlNode_default", "element", "props", "state", "store", "lastStage", "keyValueItems", "i18n_default", "kv", "KeyValueListItem_default", "FullAddressBySocialId_default", "FullAddressForm_default", "FullAddress_default", "Customer", "HtmlNode_default", "element", "props", "watch_default", "ecomEvent_default", "goTo", "store", "index", "lastStage", "state", "completed", "active", "content", "ListItem_default", "i18n_default", "part1", "part2", "keyValueList", "maskSSn", "maskText", "StageCompleted_default", "EmailAndPhone_default", "FullAddress_default", "Customer_default", "DeliveryType", "getDeliveryDistance", "distance", "deliveryOption", "getTotalDeliveryCost", "deliveryDistance", "RADIO_HOME_TRUE", "RADIO_HOME_TRUE_NODE", "RADIO_HOME_FALSE", "RADIO_HOME_FALSE_NODE", "PROCEED", "PROCEED_NODE", "Delivery", "HtmlNode_default", "element", "props", "watch_default", "state", "e", "value", "ecomEvent_default", "setHomeDelivery", "goTo", "store", "index", "contactInformation", "completed", "active", "content", "ListItem_default", "i18n_default", "StageCompleted_default", "part", "deliveryOption", "addressDistance", "totalDeliveryCost", "getTotalDeliveryCost", "DeliveryType", "InputRadioField_default", "prettyNumber", "distance", "maxDistance", "tooFarAway", "Alert_default", "ButtonArrowRight_default", "Delivery_default", "PaymentType", "DrivingDistance", "Image", "translateTradeInCondition", "translateDrivingDistance", "DrivingDistance", "AuthMethod", "Employment", "HousingType", "MaritalStatus", "PaymentType", "Accordion", "HtmlNode_default", "element", "props", "title", "description", "onClick", "content", "Accordion_default", "AuthMethod", "isMobile", "BankIdSignQrCode", "HtmlNode_default", "element", "props", "qrCode", "errorMessage", "Alert_default", "Loader_default", "BankIdSignQrCode_default", "ButtonBankId", "HtmlNode_default", "element", "props", "disabled", "loading", "title", "id", "onClick", "Loader_default", "ButtonBankId_default", "BankIdSignSameDevice", "HtmlNode_default", "element", "props", "autoLaunchUrl", "errorMessage", "Alert_default", "Image", "Loader_default", "ButtonBankId_default", "BankIdSignSameDevice_default", "BANKID_START_NODE", "BANKID_START", "ABORT", "ABORT_NODE", "AUTH_METHOD_NODE", "BankIdSign", "HtmlNode_default", "element", "props", "isMobile", "AuthMethod", "scrollTop", "method", "value", "errorMessage", "info", "title", "description", "finalizing", "qrCode", "autoLaunchUrl", "descriptionQrCode", "descriptionSameDevice", "onStart", "onAbort", "methodTitle", "methodDescription", "Loader_default", "BankIdSignSameDevice_default", "BankIdSignQrCode_default", "toggleMethodTitle", "ButtonAsLink_default", "BankIdSign_default", "Disclaimer", "HtmlNode_default", "element", "props", "Disclaimer_default", "InputSelect", "HtmlNode_default", "element", "props", "border", "error", "errorMessage", "id", "options", "value", "name", "title", "onChange", "option", "InputError_default", "e", "InputSelect_default", "creditAssessment", "creditAssessmentDecline", "caseId", "creditAssessment", "creditAssessmentGetStatus", "caseId", "creditAssessment", "creditAssessmentNewCase", "inquiry", "creditAssessment", "creditAssessmentSignCase", "creditAssessmentCase", "CreditAssessmentRecommendation", "CreditAssessmentRecommendation", "CreditAssessmentRecommendation", "PaymentType", "StageCompletedFinancialCreditAssessment", "HtmlNode_default", "element", "props", "store", "decision", "state", "order", "loan", "x", "PaymentType", "contactInformation", "CreditAssessmentRecommendation", "Alert_default", "i18n_default", "StageCompletedFinancialCreditAssessment_default", "RESULT", "RESULT_NODE", "PROCEED", "PROCEED_NODE", "ABORT", "ABORT_NODE", "CreditAssessmentApproved", "HtmlNode_default", "element", "props", "store", "onProceed", "onGoBack", "StageCompletedFinancialCreditAssessment_default", "CreditAssessmentRecommendation", "ButtonArrowRight_default", "i18n_default", "ButtonAsLink_default", "CreditAssessmentApproved_default", "CreditAssessmentRecommendation", "RESULT", "RESULT_NODE", "PROCEED", "PROCEED_NODE", "ABORT", "ABORT_NODE", "CreditAssessmentAssessManually", "HtmlNode_default", "element", "props", "store", "onProceed", "onGoBack", "StageCompletedFinancialCreditAssessment_default", "CreditAssessmentRecommendation", "ButtonArrowRight_default", "i18n_default", "ButtonClear_default", "CreditAssessmentAssessManually_default", "CreditAssessmentRecommendation", "RESULT", "RESULT_NODE", "ABORT", "ABORT_NODE", "CreditAssessmentRejected", "HtmlNode_default", "element", "props", "store", "onGoBack", "StageCompletedFinancialCreditAssessment_default", "CreditAssessmentRecommendation", "Button_default", "i18n_default", "CreditAssessmentRejected_default", "CreditAssessmentResult", "HtmlNode_default", "element", "props", "store", "creditAssessmentResponse", "onProceed", "onGoBack", "decision", "CreditAssessmentRecommendation", "CreditAssessmentApproved_default", "CreditAssessmentAssessManually_default", "CreditAssessmentRejected_default", "CreditAssessmentResult_default", "createTerm", "months", "isPositive", "factorOf12", "utils_default", "extractPaymentType", "s", "index", "extractLoanIndex", "MARITAL_STATUS", "MARITAL_STATUS_NODE", "INCOME", "INCOME_NODE", "EMPLOYMENT", "EMPLOYMENT_NODE", "HOUSEHOLD_CHILDREN", "HOUSEHOLD_CHILDREN_NODE", "HOUSING_COST", "HOUSING_COST_NODE", "DEBT_SPECIFICATION_CARD_CREDIT", "DEBT_SPECIFICATION_CARD_CREDIT_NODE", "DEBT_SPECIFICATION_CAR_LOAN", "DEBT_SPECIFICATION_CAR_LOAN_NODE", "DEBT_SPECIFICATION_COLLATERAL", "DEBT_SPECIFICATION_COLLATERAL_NODE", "DEBT_SPECIFICATION_LEASING_FEES", "DEBT_SPECIFICATION_LEASING_FEES_NODE", "DEBT_SPECIFICATION_PRIVATE_LOAN", "DEBT_SPECIFICATION_PRIVATE_LOAN_NODE", "HOUSING_TYPE", "HOUSING_TYPE_NODE", "PERFORM_APPLICATION", "PERFORM_APPLICATION_NODE", "DISCLAIMER_WRAPPER_NODE", "DISCLAIMER_NODE", "DISCLAIMER_SAFE_NODE", "WHY_DESCRIPTION", "validation", "validationMethods", "mock", "MaritalStatus", "Employment", "HousingType", "getMock", "initalState", "creditAssessmentHouseholdEconomy", "value", "CreditAssessment", "HtmlNode_default", "element", "props", "currentTarget", "name", "ecomEvent_default", "store", "caseId", "creditAssessmentCancelSigning", "creditAssessmentDecline", "setCreditAssessmentResponse", "destroyPortal", "method", "supressTracking", "AuthMethod", "loan", "x", "PaymentType", "response", "creditAssessmentGetStatus", "status", "i18n_default", "convertCreditAssessmentStatusResponse", "qrCode", "registerInterval", "creditAssessmentSignCase", "autoLaunchUrl", "currentCaseId", "initialPaymentLookupResponse", "customer", "updatePaymentLookupResponse", "paymentLookupResponse", "monthlyCost", "interest", "downPayment", "duration", "creditAmount", "price", "financialProductId", "householdEconomy", "assessmentCase", "utils_default", "creditAssessmentNewCase", "scrollIntoView", "onProceed", "mobile", "isMobile", "order", "branchName", "CreditAssessmentResult_default", "createPortal", "BankIdSign_default", "scrollTop", "prettyNumber", "Alert_default", "InputRadioGroup_default", "e", "InputField_default", "InputSelect_default", "housingCostNode", "ButtonBankId_default", "Disclaimer_default", "DisclaimerPadlock_default", "Accordion_default", "CreditAssessment_default", "ErrorAlert", "HtmlNode_default", "element", "props", "error", "Alert_default", "ErrorAlert_default", "respectStep", "value", "step", "InputRange", "HtmlNode_default", "element", "props", "min", "max", "percentage", "disabled", "foldout", "currentTarget", "inputFieldValueAsNumber", "modifiedNumberInRespectWithSteps", "elem", "inputField", "title", "name", "id", "information", "unit", "onChange", "onClickInformation", "allowSlider", "InputInformation_default", "e", "InputRange_default", "payments", "getPayment", "vehicleId", "dealerId", "downPayment", "duration", "residual", "financialOptionId", "request", "PieChart", "HtmlNode_default", "element", "props", "percentage", "Image", "PieChart_default", "LoanDetailsBasic", "HtmlNode_default", "element", "props", "downPayment", "creditAmount", "downPaymentPercentage", "creditAmountPercentage", "KeyValueListItem_default", "prettyNumber", "LoanDetailsBasic_default", "persistedShowDetails", "LoanDetailsDetailed", "HtmlNode_default", "element", "props", "value", "duration", "administrationFee", "setupFee", "totalCreditCost", "interest", "effectiveInterest", "publicUrl", "loanOrgName", "i18n_default", "KeyValueListItem_default", "prettyNumber", "e", "LoanDetailsDetailed_default", "LoanDetailsMonthlyCost", "HtmlNode_default", "element", "props", "monthlyCost", "KeyValueListItem_default", "i18n_default", "prettyNumber", "LoanDetailsMonthlyCost_default", "LOAN_DETAILS_MONTHLY_COST_NODE", "LOAN_DETAILS_PIE_CHART_NODE", "LOAN_DETAILS_BASIC_NODE", "LOAN_DETAILS_DETAILED_NODE", "LoanDetails", "HtmlNode_default", "element", "props", "loan", "paymentLookupResponse", "monthlyCost", "totalCreditCost", "interest", "effectiveInterest", "downPayment", "duration", "administrationFee", "setupFee", "creditAmount", "publicUrl", "total", "downPaymentPercentage", "creditAmountPercentage", "loanOrgName", "loanOrgLogo", "disclaimerText", "i18n_default", "prettyNumber", "LoanDetailsMonthlyCost_default", "PieChart_default", "LoanDetailsBasic_default", "LoanDetailsDetailed_default", "LoanDetails_default", "DOWNPAYMENT_RANGE_NODE", "DOWNPAYMENT_RANGE", "DURATION_RANGE_NODE", "DURATION_RANGE", "RESIDUAL_RANGE_NODE", "RESIDUAL_RANGE", "LOAN_DETAILS_id", "LOAN_DETAILS_NODE", "CREDIT_ASSESMENT_NODE", "PROCEED", "PROCEED_NODE", "ERROR_NODE", "Loan", "HtmlNode_default", "element", "props", "loanDetails", "response", "getPayment", "convertPaymentLookupResponse", "setPaymentLookupResponse", "i18n_default", "currentTarget", "name", "value", "store", "loan", "onProceed", "order", "shouldUseCreditScoring", "InputRange_default", "e", "ecomEvent_default", "ErrorAlert_default", "LoanDetails_default", "CreditAssessment_default", "ButtonArrowRight_default", "Loan_default", "PaymentType", "CREDIT_ASSESSMENT_RESULT", "CREDIT_ASSESSMENT_RESULT_NODE", "StageCompletedFinancial", "HtmlNode_default", "element", "props", "store", "paymentType", "loan", "paymentLookupResponse", "onEdit", "loanDetails", "PaymentType", "state", "currentPaymentLookupResponse", "downPayment", "creditAmount", "duration", "interest", "effectiveInterest", "monthlyCost", "keyValueList", "i18n_default", "prettyNumber", "decision", "disclaimerText", "kv", "KeyValueListItem_default", "StageCompletedFinancialCreditAssessment_default", "StageCompletedFinancial_default", "PROCEED", "PROCEED_NODE", "FINANCIAL_OPTION_ID", "FINANCIAL_OPTION_NODE", "FINANCIAL_OPTION_SECOND_ID", "FINANCIAL_OPTION_SECOND_NODE", "RADIO_FINANCIAL_CASH", "RADIO_FINANCIAL_LOAN", "RADIO_FINANCIAL_LEASE", "PAYMENT_NODE", "PAYMENT_NODE_DISCLAIMER", "DISCLAIMER_WRAPPER_NODE", "Financial", "HtmlNode_default", "element", "props", "watch_default", "state", "paymentType", "e", "resetPaymentLookupResponse", "value", "extractPaymentType", "PaymentType", "ecomEvent_default", "_paymentType", "setFinancial", "goTo", "preventScrollIntoView", "id", "order", "paymentLookupResponse", "paymentOptions", "completed", "content", "ListItem_default", "i18n_default", "part", "loan", "x", "StageCompletedFinancial_default", "vehicle", "cash", "loans", "lease", "formatShortDescription", "contactInformation", "firstGroupOptions", "prettyNumber", "index", "loanPrice", "duration", "interest", "getCreditAmount", "shouldUseCreditScoring", "Image", "InputRadioGroup_default", "secondGroupOptions", "paymentNode", "loanIndex", "extractLoanIndex", "Loan_default", "ButtonArrowRight_default", "Financial_default", "BUTTON_TOP_LEFT_NODE", "BUTTON_BOTTOM_LEFT_NODE", "BUTTON_INSURANCE_ADD_REMOVE_NODE", "InsuranceItemInfo", "HtmlNode_default", "element", "props", "freeInsurance", "selected", "onClose", "onClick", "title", "description", "logo", "longDescription", "i18n_default", "asHtml", "ButtonAsLinkArrowLeft_default", "ButtonClear_default", "ButtonAddRemove_default", "scrollTop", "InsuranceItemInfo_default", "InsuranceItem", "HtmlNode_default", "element", "props", "watch_default", "ecomEvent_default", "destroyPortal", "freeInsurance", "addOrRemoveFreeInsurance", "store", "key", "state", "logo", "selected", "InsuranceItemInfo_default", "createPortal", "OverflowGridItem_default", "InsuranceItem_default", "InsuranceList", "HtmlNode_default", "element", "props", "store", "insurances", "listRef", "OverflowGridList_default", "ecomEvent_default", "overflowElement", "freeInsurance", "index", "InsuranceItem_default", "InsuranceList_default", "INSURANCE_GRID_LIST_NODE", "PROCEED_INSURANCE", "PROCEED_INSURANCE_NODE", "SKIP_INSURANCES", "SKIP_INSURANCES_NODE", "DefaultInsurance", "HtmlNode_default", "element", "props", "freeInsurance", "completeStage", "ecomEvent_default", "store", "insurance", "i18n_default", "InsuranceList_default", "ButtonArrowRight_default", "DefaultInsurance_default", "DrivingDistance", "insurances", "getInsurances", "store", "drivingDistance", "state", "request", "ButtonSuccess", "HtmlNode_default", "element", "props", "disabled", "loading", "title", "id", "onClick", "Loader_default", "ButtonSuccess_default", "InputCheckbox", "HtmlNode_default", "element", "props", "checked", "disabled", "id", "title", "value", "name", "meta", "description", "append", "onClick", "content", "input", "InputCheckbox_default", "InsuracenAddonBox", "HtmlNode_default", "element", "InsuranceAddonBox_default", "BUTTON_TOP_LEFT_NODE", "BUTTON_BOTTOM_LEFT_NODE", "BUTTON_INSURANCE_ADD_REMOVE_NODE", "ADDONS_NODE", "ACCORDION_NODE", "slugify", "text", "InsuranceItemInfo", "_InsuranceItemInfo", "HtmlNode_default", "element", "props", "insuranceAddOns", "_initialAddons", "_addons", "initialAddons", "addons", "currentTarget", "name", "checked", "selectedAddon", "x", "key", "ecomEvent_default", "index", "a", "exclude", "containChanges", "insurance", "addOrRemoveInsuranceAddon", "selected", "onClose", "description", "legalDescription", "legalUrl", "insuranceItems", "price", "prev", "curr", "prettyNumber", "i18n_default", "ButtonAsLinkArrowLeft_default", "node", "addon", "subNode", "InsuranceAddonBox_default", "InputCheckbox_default", "e", "ii", "Accordion_default", "ButtonClear_default", "ButtonSuccess_default", "ButtonAddRemove_default", "scrollTop", "InsuranceItemInfo_default", "InsuranceItem", "HtmlNode_default", "element", "props", "watch_default", "ecomEvent_default", "destroyPortal", "insurance", "addOrRemoveInsurance", "store", "key", "state", "logo", "selectedAddons", "k", "prettyNumber", "i18n_default", "selected", "InsuranceItemInfo_default", "createPortal", "OverflowGridItem_default", "InsuranceItem_default", "InsuranceList", "HtmlNode_default", "element", "props", "store", "insurances", "listRef", "OverflowGridList_default", "ecomEvent_default", "overflowElement", "insurance", "index", "InsuranceItem_default", "InsuranceList_default", "INSURANCE_GRID_LIST_NODE", "PROCEED_INSURANCE", "PROCEED_INSURANCE_NODE", "SKIP_INSURANCES", "SKIP_INSURANCES_NODE", "EDIT_DRIVING_DISTANCE", "EDIT_DRIVING_DISTANCE_NODE", "IF_INSURANCE_CACHE", "InsuranceView", "HtmlNode_default", "element", "props", "drivingDistanceListner", "watch_default", "customerIdListner", "insuranceListner", "state", "cacheKey", "cache", "ecomEvent_default", "response", "getInsurances", "x", "completeStage", "addOrRemoveInsurance", "store", "insurance", "drivingDistance", "i18n_default", "KeyValueListItem_default", "translateDrivingDistance", "insuranceListNode", "Alert_default", "insurances", "InsuranceList_default", "Loader_default", "ButtonAsLink_default", "ButtonArrowRight_default", "ButtonSkip_default", "InsuranceView_default", "DISTANCE", "DISTANCE_NODE", "INSURANCE_INFO_NODE", "SHOW_INSURANCES", "SHOW_INSURANCES_NODE", "SHOW_INSURANCES_DISCLAIMER_NODE", "SKIP_INSURANCES", "SKIP_INSURANCES_NODE", "IfInsurance", "HtmlNode_default", "element", "props", "distance", "setDrivingDistance", "DrivingDistance", "ecomEvent_default", "store", "lastStage", "onSkip", "state", "insuranceDisclaimerTitle", "InsuranceView_default", "i18n_default", "InputSelect_default", "translateDrivingDistance", "e", "ButtonArrowRight_default", "insuranceInfoNode", "Alert_default", "Disclaimer_default", "ButtonSkip_default", "IfInsurance_default", "Insurance", "HtmlNode_default", "element", "props", "watch_default", "order", "addOrRemoveInsurance", "completeStage", "ecomEvent_default", "goTo", "store", "index", "lastStage", "state", "completed", "active", "content", "ListItem_default", "i18n_default", "keyValueOptions", "translateDrivingDistance", "prettyNumber", "addon", "StageCompleted_default", "insuranceOptions", "IfInsurance_default", "DefaultInsurance_default", "Insurance_default", "InputTextarea", "HtmlNode_default", "element", "props", "error", "title", "value", "name", "id", "errorMessage", "placeholder", "information", "autocomplete", "onChange", "onBlur", "InputError_default", "InputInformation_default", "input", "InputTextarea_default", "vehicles", "getTradeInVehicle", "data", "request", "REGISTRATION_NUMBER_ID", "REGISTRATION_NUMBER_NODE", "MILEAGE_ID", "MILEAGE_NODE", "DESCRIPTION_ID", "DESCRIPTION_NODE", "CONDITION_ID", "CONDITION_NODE", "FETCH", "FETCH_NODE", "PROCEED", "PROCEED_NODE", "TRADE_IN_NO", "TRADE_IN_NO_NODE", "CHANGE_BUTTON", "CHANGE_BUTTON_NODE", "validation", "validationMethods", "initalState", "tradeIn", "marketCode", "value", "PartTradeIn", "HtmlNode_default", "element", "props", "state", "ecomEvent_default", "scandinavianMileage", "_response", "getTradeInVehicle", "response", "convertVehicleLookupResponse", "vehicle", "setTradeIn", "currentTarget", "name", "keyValueItemsUpper", "tradeInVehicle", "i18n_default", "translateTradeInCondition", "kv", "KeyValueListItem_default", "prettyNumber", "Alert_default", "ButtonAsLink_default", "ButtonArrowRight_default", "ButtonSkip_default", "InputField_default", "InputTextarea_default", "InputRadioGroup_default", "PartTradeIn_default", "TRADE_IN_YES", "TRADE_IN_YES_NODE", "TRADE_IN_NO", "TRADE_IN_NO_NODE", "CHANGE_BUTTON", "CHANGE_BUTTON_NODE", "TradeIn", "HtmlNode_default", "element", "props", "watch_default", "ecomEvent_default", "goTo", "initTradeIn", "setTradeIn", "store", "index", "lastStage", "state", "completed", "active", "content", "ListItem_default", "i18n_default", "part", "keyValueItemsUpper", "translateTradeInCondition", "kv", "KeyValueListItem_default", "prettyNumber", "Alert_default", "ButtonAsLink_default", "PartTradeIn_default", "ButtonArrowRight_default", "ButtonSkip_default", "TradeIn_default", "stageMap", "Customer_default", "CentralStorage_default", "Delivery_default", "TradeIn_default", "Financial_default", "Insurance_default", "Accessories_default", "customers", "DeliveryType", "orders", "PaymentType", "vehicles", "createOrder", "store", "state", "customer", "customers", "paymentType", "extractPaymentType", "paymentBuilder", "orders", "PaymentType", "index", "extractLoanIndex", "loan", "x", "loanDetails", "duration", "downPayment", "residual", "externalId", "scoreId", "recommendation", "decision", "financialProductCode", "creditAssessment", "payment", "params", "callbackUrl", "paymentUrl", "requestBuilder", "DeliveryType", "insuranceBuilder", "insurance", "tradeIn", "vehicles", "ACCEPT_CONDITIONS", "ACCEPT_CONDITIONS_NODE", "CONFIRM_BUTTON_NODE", "CONFIRM_BUTTON", "NoVerify", "HtmlNode_default", "element", "props", "store", "ecomEvent_default", "order", "response", "createOrder", "destroyPortal", "payment", "setCreatedOrderId", "ee", "e", "currentTarget", "insurance", "name", "i18n_default", "conditionsPdfUri", "InputCheckbox_default", "Button_default", "NoVerify_default", "swedbankPayment", "url", "script", "Payment", "HtmlNode_default", "element", "props", "_payment", "payment", "swedbankPayment", "order", "name", "i18n_default", "Payment_default", "AuthMethod", "creditAssessment", "creditAssessmentAccept", "caseId", "bankid", "getBankIdAuth", "method", "request", "bankid", "getBankIdQrCode", "reference", "request", "bankid", "getBankIdStatus", "reference", "request", "CONFIRM_CONDITIONS", "CONFIRM_CONDITIONS_NODE", "BANKID_START_NODE", "BANKID_START", "DISCLAIMER_POLICY_NODE", "DISCLAIMER_RESERVATION_NODE", "VerifyByBankId", "HtmlNode_default", "element", "props", "reference", "response", "getBankIdStatus", "AuthMethod", "i18n_default", "qrCode", "getBankIdQrCode", "method", "caseId", "ecomEvent_default", "creditAssessmentAccept", "store", "order", "createOrder", "destroyPortal", "payment", "setCreatedOrderId", "ee", "e", "address", "socialId", "state", "validationMethods", "supressTracking", "autoLaunchUrl", "_e", "registerInterval", "getBankIdAuth", "currentTarget", "mobile", "isMobile", "navigation", "insurance", "BankIdSign_default", "createPortal", "name", "conditionsPdfUri", "policy", "Alert_default", "InputCheckbox_default", "ButtonBankId_default", "DisclaimerPadlock_default", "Disclaimer_default", "VerifyByBankId_default", "Confirmation", "HtmlNode_default", "element", "props", "watch_default", "store", "index", "bypassBankId", "topNavigation", "navigation", "order", "completed", "content", "ListItem_default", "i18n_default", "Payment_default", "NoVerify_default", "VerifyByBankId_default", "Confirmation_default", "Main", "HtmlNode_default", "element", "props", "watch_default", "view", "store", "cdnMedia", "state", "order", "stages", "asideStepperWrapper", "pageFormAside", "i18n_default", "ItemTileSmall_default", "stepper", "size", "stage", "index", "stageMap", "Confirmation_default", "Main_default", "OrderCallback", "HtmlNode_default", "element", "props", "response", "callbackOrder", "i18n_default", "OrderCallback_default", "CheckList", "HtmlNode_default", "element", "props", "i18n_default", "item", "Checklist_default", "ItemTileLarge", "vehicle", "order", "meta", "cdnMedia", "imageUrls", "vehicleTitle", "price", "prettyNumber", "sellerName", "imageUrl", "toCdnMedia", "formatShortDescription", "ItemTileLarge_default", "PaymentType", "TimelineItem", "heading", "description", "final", "TimelineItem_default", "getFinancialDescription", "options", "paymentTypes", "x", "hasCash", "PaymentType", "hasLease", "hasLoan", "i18n_default", "getDeliveryDescription", "hasPickup", "hasHomeDelivery", "HowTo", "order", "stageOrderList", "timelineItemByStage", "stage", "TimelineItem_default", "HowTo_default", "PROCEED_BUTTON", "PROCEED_BUTTON_NODE", "PREVIEW_CHECKLIST", "PREVIEW_CHECKLIST_NODE", "Preview", "HtmlNode_default", "element", "props", "state", "_order", "getOrder", "order", "convertOrderOptionsResponse", "stages", "key", "stageMap", "setStages", "setOrder", "e", "ecomEvent_default", "goTo", "store", "cdnMedia", "Alert_default", "i18n_default", "Loader_default", "ItemTileLarge_default", "HowTo_default", "ButtonArrowRight_default", "Checklist_default", "Preview_default", "StackNode", "HtmlNode_default", "element", "StackNode_default", "Delivery", "StackNode_default", "element", "props", "store", "dealer", "order", "dealerName", "x", "i18n_default", "KeyValueListItem_default", "CentralStorage_default", "Customer", "StackNode_default", "element", "props", "store", "state", "customerName", "maskText", "i18n_default", "KeyValueListItem_default", "maskSSn", "Customer_default", "Centrallager", "StackNode_default", "element", "props", "store", "state", "i18n_default", "KeyValueListItem_default", "Delivery_default", "Intro", "StackNode_default", "element", "props", "store", "customer", "order", "createdOrderId", "email", "contactInformation", "i18n_default", "Intro_default", "PaymentType", "Order", "StackNode_default", "element", "props", "store", "cdnMedia", "state", "paymentLoan", "x", "PaymentType", "paymentLookupResponse", "paymentLease", "paymentType", "extractPaymentType", "i18n_default", "ItemTileLarge_default", "KeyValueListItem_default", "prettyNumber", "accessory", "addon", "Order_default", "TradeIn", "StackNode_default", "element", "props", "store", "state", "order", "tradeIn", "tradeInVehicle", "i18n_default", "KeyValueListItem_default", "translateTradeInCondition", "prettyNumber", "TradeIn_default", "SUMMARY_NODE", "Summary", "HtmlNode_default", "element", "props", "ecomEvent_default", "watch_default", "view", "scrollTop", "store", "cdnMedia", "stages", "content", "Intro_default", "Order_default", "x", "TradeIn_default", "CentralStorage_default", "Delivery_default", "Customer_default", "Summary_default", "OrderIdQueryString", "Payment3DSecurityCallback", "OrderWaykeIdQueryString", "WAYKE_ECOM_MODAL_ID", "TEST_HOST", "PROD_HOST", "resolveCdnMedia", "url", "App", "props", "createStore", "initializeI18N", "config", "createdRoot", "rootNode", "package_default", "setId", "watch_default", "newVal", "params", "orderUrl", "payment3dSecurityCallback", "waykeId", "stateAsString", "state", "setState", "lastEvent", "getLastHistory", "ecomEvent_default", "caseId", "orderId", "orderWaykeId", "urlChanged", "unregisterAllIntervals", "unregisterAllSubscriptions", "creditAssessmentCancelSigning", "reset", "unregisterEventListner", "navigation", "createdOrderId", "firstView", "Modal_default", "i18n_default", "ConfirmClose_default", "registerEventListner", "callbackOrder", "useVwListner", "OrderCallback_default", "Preview_default", "Main_default", "Summary_default", "App_default", "index_default", "App_default"]
}
