@rtstic.dev/pulse 0.0.54 → 0.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/form/utils/initIntlTelInput.ts", "../../src/form/index.ts"],
4
- "sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\n\n// \u2500\u2500\u2500 Debug Helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst IS_STAGING = window.location.host === \"influur-staging.webflow.io\";\n\nfunction dbgWarn(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.warn(`[MSF:${tag}]`, ...args);\n}\n\nfunction dbgError(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.error(`[MSF:${tag}]`, ...args);\n}\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ntype StepEl = HTMLElement;\n\ntype ErrorCode =\n | \"required\"\n | \"email_invalid\"\n | \"email_company\"\n | \"phone_invalid\"\n | \"selection_required\"\n | \"legal_required\";\n\ntype StepStyle = {\n selector: string;\n property: string;\n value: string;\n};\n\nconst STEP_STYLES: Record<number, StepStyle[]> = {\n 1: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"none\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"50%\" },\n { selector: '[data-step-1-terms]', property: \"display\", value: \"block\" },\n ],\n 2: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"flex\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"100%\" },\n { selector: '[data-step-1-terms]', property: \"display\", value: \"none\" },\n ],\n};\n\ntype CalendarEntry = {\n type: \"company_type\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n};\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"company_type\",\n name: \"Record Label / Music Distributor\",\n \"calender-name\": \"valeria\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n required: \"This field is required\",\n email_invalid: \"Please enter a valid email address\",\n email_company: \"Please use your company email address\",\n phone_invalid: \"Please enter a valid phone number\",\n selection_required: \"Please select at least one option\",\n legal_required: \"You must accept this to continue\"\n};\n\ntype FieldState = {\n \"field-name\": string;\n value: string;\n required: boolean;\n valid: boolean;\n \"step-number\": number;\n};\n\nconst FLOW_CONDITIONS: Record<string, string[]> = {\n \"pulse-demo\": [\n \"pulse-demo-only\",\n \"common-fields\"\n ],\n \"white-glove-services\": [\n \"white-glove-only\",\n \"common-fields\"\n ]\n};\n\nconst STEP_TEXT: Record<number, { heading?: string; subheading?: string; counter?: string }> = {\n 1: {\n heading: \"Your info\",\n subheading: \"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.\",\n counter: \"Step 1/2\",\n },\n 2: {\n heading: \"Personalize\",\n subheading: \"Help us personalize your demo.\",\n counter: \"Step 2/2\",\n }\n};\n\nclass MultiStepForm {\n private form: HTMLFormElement;\n private steps: StepEl[];\n private currentStepIndex = 0;\n private itiInstances: Map<HTMLInputElement, any>;\n private stepHasBeenValidated = false;\n private originalRequired = new WeakMap<HTMLElement, boolean>();\n private fieldState = new Map<string, FieldState>();\n public isFormSubmitted = false;\n public isFormStarted = false;\n\n\n constructor(form: HTMLFormElement, itiInstances: Map<HTMLInputElement, any>) {\n this.form = form;\n this.itiInstances = itiInstances;\n\n this.steps = Array.from(\n form.querySelectorAll<HTMLElement>('[data-msf=\"step\"]')\n );\n\n if (this.steps.length === 0) {\n dbgError(\"init\", \"No steps found! Check [data-msf='step'] selectors in HTML.\");\n }\n\n this.steps.forEach((step, i) => {\n const stepNum = step.dataset.step;\n if (!stepNum) {\n dbgWarn(\"init\", `Step element at index ${i} is missing data-step attribute`);\n }\n });\n\n this.bindEvents();\n this.cacheOriginalRequiredState();\n this.initializeFieldState();\n this.showStep(0);\n this.applyFlowConditions();\n this.syncAllFieldState();\n }\n\n private bindEvents() {\n const markStarted = () => {\n if (!this.isFormStarted) {\n this.isFormStarted = true;\n this.startAbandonmentCheck();\n }\n };\n this.form.addEventListener(\"input\", markStarted);\n this.form.addEventListener(\"change\", markStarted);\n\n this.form.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const btn = target.closest<HTMLElement>(\"[data-action]\");\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === \"next\") {\n e.preventDefault();\n this.next();\n }\n\n if (action === \"back\") {\n e.preventDefault();\n this.back();\n }\n });\n\n this.form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n !(target instanceof HTMLInputElement) &&\n !(target instanceof HTMLTextAreaElement) &&\n !(target instanceof HTMLSelectElement)\n ) return;\n\n this.handleLiveValidation();\n });\n\n this.itiInstances.forEach((_iti, input) => {\n input.addEventListener(\"countrychange\", () => {\n if (!this.stepHasBeenValidated) return;\n this.handleLiveValidation();\n });\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n target instanceof HTMLInputElement &&\n target.type === \"radio\" &&\n target.name === \"flow-type\"\n ) {\n this.applyFlowConditions();\n }\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n }\n\n private handleLiveValidation() {\n if (!this.stepHasBeenValidated) return;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n this.clearErrors();\n\n if (Object.keys(errors).length > 0) {\n this.showErrors(errors);\n }\n }\n\n private showStep(index: number) {\n if (index < 0 || index >= this.steps.length) {\n dbgError(\"showStep\", `Invalid step index: ${index} (total steps: ${this.steps.length})`);\n return;\n }\n\n this.steps.forEach((step, i) => {\n step.style.display = i === index ? \"flex\" : \"none\";\n });\n\n this.currentStepIndex = index;\n\n this.stepHasBeenValidated = false;\n this.clearErrors();\n\n const stepNumber = index + 1;\n this.updateStepText(stepNumber);\n this.applyStepStyles(stepNumber);\n }\n\n private next() {\n this.stepHasBeenValidated = true;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n if (Object.keys(errors).length > 0) {\n this.clearErrors();\n this.showErrors(errors);\n this.focusFirstError(errors);\n return;\n }\n\n this.clearErrors();\n this.stepHasBeenValidated = false;\n\n const nextIndex = this.currentStepIndex + 1;\n\n if (nextIndex >= this.steps.length) {\n const currentStep = this.steps[this.currentStepIndex];\n const nextButton = currentStep.querySelector<HTMLElement>('[data-action=\"next\"]');\n\n if (nextButton) {\n const actionTextEl = nextButton.querySelector<HTMLElement>('[data-action-text]');\n if (actionTextEl) {\n actionTextEl.textContent = \"Submitting...\";\n } else {\n dbgWarn(\"next\", \"No [data-action-text] element found inside next button\");\n }\n } else {\n dbgWarn(\"next\", \"No [data-action='next'] button found in current step\");\n }\n\n this.mirrorFieldStateToDOM();\n this.loadCalendarEmbed();\n\n const webflowSubmitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n\n if (!webflowSubmitBtn) {\n dbgError(\"submit\", \"Missing #webflow-form-submit button in DOM!\");\n }\n if (!hubspotSubmitBtn) {\n dbgError(\"submit\", \"Missing #hubspot-form-submit button in DOM!\");\n }\n\n if (webflowSubmitBtn && hubspotSubmitBtn) {\n this.setSubmissionType(\"manual\");\n webflowSubmitBtn.click();\n hubspotSubmitBtn.click();\n this.isFormSubmitted = true;\n } else {\n dbgError(\"submit\", \"One or both submit buttons not found \u2014 form NOT submitted\");\n }\n\n return;\n }\n\n this.showStep(nextIndex);\n }\n\n private showErrors(errors: Record<string, ErrorCode>) {\n Object.entries(errors).forEach(([name, message]) => {\n\n const groupEl =\n this.form.querySelector<HTMLElement>(`[data-required-group=\"${name}\"]`) ||\n this.form.querySelector<HTMLElement>(`[data-required-legal=\"${name}\"]`);\n\n if (groupEl) {\n groupEl.classList.add(\"has-error\");\n\n let errorEl = groupEl.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n groupEl.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n return;\n }\n\n const field = this.form.querySelector<HTMLInputElement>(`[name=\"${name}\"]`);\n if (!field) {\n dbgWarn(\"showErrors\", `Cannot find field or group for error key: \"${name}\"`);\n return;\n }\n\n field.classList.add(\"has-error\");\n\n let errorEl = field.parentElement?.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n field.parentElement?.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n });\n }\n\n private clearErrors() {\n const errorEls = this.form.querySelectorAll(\".field-error\");\n const hasErrorEls = this.form.querySelectorAll(\".has-error\");\n\n errorEls.forEach((el) => el.remove());\n hasErrorEls.forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private back() {\n const prevIndex = this.currentStepIndex - 1;\n\n if (prevIndex < 0) {\n return;\n }\n\n this.showStep(prevIndex);\n }\n\n private getFieldsForStep(index: number): HTMLInputElement[] {\n const step = this.steps[index];\n\n if (!step) {\n dbgError(\"getFieldsForStep\", `Step at index ${index} does not exist`);\n return [];\n }\n\n const fields = Array.from(\n step.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n )\n ) as HTMLInputElement[];\n\n return fields;\n }\n\n private validateStep(index: number): Record<string, ErrorCode> {\n const errors: Record<string, ErrorCode> = {};\n\n const fields = this.getFieldsForStep(index);\n\n fields.forEach((field) => {\n const name = field.name;\n if (!name) {\n return;\n }\n\n if (field.type === \"checkbox\" || field.type === \"radio\") return;\n\n const value = field.value.trim();\n const isRequired = field.hasAttribute(\"required\");\n\n if (isRequired && !value) {\n errors[name] = \"required\";\n return;\n }\n\n if (field.type === \"email\" && value) {\n if (!this.isValidEmailFormat(value)) {\n errors[name] = \"email_invalid\";\n return;\n }\n\n if (!this.isCompanyEmail(value)) {\n errors[name] = \"email_company\";\n return;\n }\n }\n\n if (field.type === \"tel\" && value) {\n const phoneError = this.validatePhoneField(field as HTMLInputElement);\n if (phoneError) {\n errors[name] = \"phone_invalid\";\n return;\n }\n }\n });\n\n const selectionGroupErrors = this.validateRequiredSelectionGroups(index);\n const legalErrors = this.validateLegalGroups(index);\n\n const allErrors = {\n ...errors,\n ...selectionGroupErrors,\n ...legalErrors\n };\n\n return allErrors;\n }\n\n private validateRequiredSelectionGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const groups = step.querySelectorAll<HTMLElement>(\"[data-required-group]\");\n\n groups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredGroup;\n if (!groupName) return;\n\n const inputs = Array.from(\n groupEl.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"], input[type=\"radio\"]'\n )\n );\n\n const enabledInputs = inputs.filter((input) => !input.disabled);\n\n if (enabledInputs.length === 0) {\n return;\n }\n\n const isChecked = enabledInputs.some((input) => input.checked);\n\n if (!isChecked) {\n errors[groupName] = \"selection_required\";\n }\n });\n\n return errors;\n }\n\n private validateLegalGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const legalGroups = step.querySelectorAll<HTMLElement>(\"[data-required-legal]\");\n\n legalGroups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredLegal;\n if (!groupName) return;\n\n const checkbox = groupEl.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n\n if (!checkbox || checkbox.disabled) {\n return;\n }\n\n if (!checkbox.checked) {\n errors[groupName] = \"legal_required\";\n }\n });\n\n return errors;\n }\n\n private startAbandonmentCheck() {\n setTimeout(() => {\n if (this.isFormSubmitted) return;\n\n const emailField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"email\"\n );\n const firstNameField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"first_name\"\n );\n const lastNameField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"last_name\"\n );\n\n const hasValidEmail = emailField && emailField.value && this.isValidEmailFormat(emailField.value);\n const hasFirstName = firstNameField && firstNameField.value.trim().length > 0;\n const hasLastName = lastNameField && lastNameField.value.trim().length > 0;\n\n if (hasValidEmail && hasFirstName && hasLastName) {\n console.warn(\n \"[MSF] User is likely to skip the form submission \u2014 losing a lead. Email:\",\n emailField.value\n );\n\n this.mirrorFieldStateToDOM();\n\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n if (hubspotSubmitBtn) {\n this.setSubmissionType(\"automated\");\n hubspotSubmitBtn.click();\n } else {\n dbgError(\"abandonCheck\", \"Missing #hubspot-form-submit button in DOM!\");\n }\n }\n }, 30 * 60 * 1000);\n }\n\n private setSubmissionType(type: \"manual\" | \"automated\") {\n const el = document.getElementById(\"submission_type\") as HTMLInputElement | HTMLSelectElement | null;\n if (el) {\n el.value = type;\n } else {\n dbgWarn(\"setSubmissionType\", \"No element found with id 'submission_type'\");\n }\n }\n\n private isValidEmailFormat(email: string): boolean {\n const emailRegex =\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private isCompanyEmail(email: string): boolean {\n const publicDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"icloud.com\",\n \"aol.com\"\n ];\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n\n return !publicDomains.includes(domain);\n }\n\n private validatePhoneField(field: HTMLInputElement): ErrorCode | null {\n const iti = this.itiInstances.get(field);\n if (!iti) {\n dbgWarn(\"phoneValidation\", `No ITI instance found for field \"${field.name}\" \u2014 skipping phone validation`);\n return null;\n }\n\n const value = field.value.trim();\n if (!value) return null;\n\n if (!iti.isValidNumber()) {\n return \"phone_invalid\";\n }\n\n return null;\n }\n\n private focusFirstError(errors: Record<string, ErrorCode>) {\n const firstErrorName = Object.keys(errors)[0];\n if (!firstErrorName) return;\n\n const groupEl =\n this.form.querySelector<HTMLElement>(\n `[data-required-group=\"${firstErrorName}\"]`\n ) ||\n this.form.querySelector<HTMLElement>(\n `[data-required-legal=\"${firstErrorName}\"]`\n );\n\n if (groupEl) {\n const firstInput = groupEl.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (firstInput) {\n firstInput.focus();\n }\n return;\n }\n\n const field = this.form.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(`[name=\"${firstErrorName}\"]`);\n\n if (field) {\n field.focus();\n }\n }\n\n private getFlowType(): string | null {\n const flowWrapper = this.form.querySelector<HTMLElement>(\n '[data-required-group=\"flow-type\"]'\n );\n if (!flowWrapper) {\n dbgWarn(\"getFlowType\", 'No [data-required-group=\"flow-type\"] element found');\n return null;\n }\n\n const checked = flowWrapper.querySelector<HTMLInputElement>(\n 'input[type=\"radio\"]:checked'\n );\n\n const value = checked?.value ?? null;\n return value;\n }\n\n private applyFlowConditions() {\n const flowType = this.getFlowType();\n if (!flowType) {\n return;\n }\n\n const visibleKeys = FLOW_CONDITIONS[flowType] || [];\n\n if (visibleKeys.length === 0) {\n dbgWarn(\"flowConditions\", `No FLOW_CONDITIONS entry for flow type: \"${flowType}\"`);\n }\n\n const conditionalBlocks = this.form.querySelectorAll<HTMLElement>(\n \"[data-conditional]\"\n );\n\n conditionalBlocks.forEach((block) => {\n const key = block.dataset.conditional;\n if (!key) return;\n\n const shouldShow = visibleKeys.includes(key);\n\n const inputs = block.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (shouldShow) {\n block.style.display = \"\";\n\n inputs.forEach((input) => {\n input.disabled = false;\n\n const wasRequired = this.originalRequired.get(input);\n if (wasRequired) {\n input.setAttribute(\"required\", \"true\");\n }\n });\n } else {\n block.style.display = \"none\";\n\n inputs.forEach((input) => {\n input.disabled = true;\n input.removeAttribute(\"required\");\n\n if (input instanceof HTMLInputElement) {\n if (input.type === \"checkbox\" || input.type === \"radio\") {\n input.checked = false;\n } else {\n input.value = \"\";\n }\n } else if (input instanceof HTMLSelectElement) {\n input.selectedIndex = 0;\n } else if (input instanceof HTMLTextAreaElement) {\n input.value = \"\";\n }\n\n const trackable = input.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const fieldKey = trackable.dataset.fieldKey;\n if (!fieldKey) return;\n\n const state = this.fieldState.get(fieldKey);\n if (!state) return;\n\n state.required = false;\n state.valid = true;\n state.value = \"\";\n\n this.fieldState.set(fieldKey, state);\n });\n\n const wrapperKey = block.dataset.fieldKey;\n if (wrapperKey) {\n const state = this.fieldState.get(wrapperKey);\n if (state) {\n state.required = false;\n state.valid = true;\n state.value = \"\";\n this.fieldState.set(wrapperKey, state);\n }\n }\n\n this.clearErrorsInBlock(block);\n }\n });\n\n this.updateValidityForStep(this.currentStepIndex + 1);\n }\n\n private cacheOriginalRequiredState() {\n const inputs = this.form.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n inputs.forEach((input) => {\n const isReq = input.hasAttribute(\"required\");\n this.originalRequired.set(input, isReq);\n });\n }\n\n private clearErrorsInBlock(block: HTMLElement) {\n block.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n block.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private initializeFieldState() {\n const trackables = this.form.querySelectorAll<HTMLElement>(\n \"[data-field-key]\"\n );\n\n trackables.forEach((el) => {\n const key = el.dataset.fieldKey;\n if (!key) return;\n\n const stepWrapper = el.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n if (!stepWrapper) {\n dbgWarn(\"initFieldState\", `Field \"${key}\" is not inside a [data-msf=\"step\"] element \u2014 defaulting to step ${stepNumber}`);\n }\n\n this.fieldState.set(key, {\n \"field-name\": key,\n value: \"\",\n required: false,\n valid: true,\n \"step-number\": stepNumber\n });\n });\n }\n\n private updateFieldState(key: string) {\n const element = this.form.querySelector<HTMLElement>(\n `[data-field-key=\"${key}\"]`\n );\n if (!element) {\n dbgWarn(\"updateFieldState\", `No element found for field key: \"${key}\"`);\n return;\n }\n\n let value = \"\";\n let required = false;\n\n if (element.hasAttribute(\"data-group\")) {\n const inputs = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n \"input[type='radio'], input[type='checkbox']\"\n )\n ).filter((i) => !i.disabled);\n\n required = element.hasAttribute(\"data-required-group\");\n\n if (inputs.some((i) => i.type === \"radio\")) {\n const checked = inputs.find((i) => i.checked);\n\n if (checked) {\n const span = checked.closest(\"label\")?.querySelector(\"span\");\n value = span?.textContent?.trim() ?? checked.value ?? \"\";\n } else {\n value = \"\";\n }\n } else {\n const checkedValues = inputs\n .filter((i) => i.checked)\n .map((i) => {\n const span = i.closest(\"label\")?.querySelector(\"span\");\n return span?.textContent?.trim() ?? i.value ?? \"\";\n });\n\n value = checkedValues.join(\",\");\n }\n }\n else if (element.hasAttribute(\"data-required-legal\")) {\n const checkbox = element.querySelector<HTMLInputElement>(\n \"input[type='checkbox']\"\n );\n\n if (checkbox && !checkbox.disabled) {\n required = true;\n value = checkbox.checked ? \"true\" : \"false\";\n }\n }\n else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n required = element.hasAttribute(\"required\") && !element.disabled;\n\n if (element instanceof HTMLInputElement && element.type === \"checkbox\") {\n value = element.checked ? \"true\" : \"false\";\n } else {\n value = (element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value.trim();\n }\n }\n\n const stepWrapper = element.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n const state = this.fieldState.get(key);\n if (!state) {\n dbgWarn(\"updateFieldState\", `No state entry for key \"${key}\" \u2014 was it initialized?`);\n return;\n }\n\n state.value = value;\n state.required = required;\n state[\"step-number\"] = stepNumber;\n\n this.fieldState.set(key, state);\n\n this.updateValidityForStep(stepNumber);\n }\n\n private updateValidityForStep(stepNumber: number) {\n const stepIndex = this.steps.findIndex(\n (step) => Number(step.dataset.step) === stepNumber\n );\n\n if (stepIndex === -1) {\n dbgWarn(\"updateValidity\", `No step element found with data-step=\"${stepNumber}\"`);\n return;\n }\n\n const errors = this.validateStep(stepIndex);\n\n const keysInStep = Array.from(this.fieldState.values()).filter(\n (f) => f[\"step-number\"] === stepNumber\n );\n\n keysInStep.forEach((field) => {\n field.valid = !errors[field[\"field-name\"]];\n });\n }\n\n public getFormStateJSON(): FieldState[] {\n return Array.from(this.fieldState.values());\n }\n\n private updateStepText(stepNumber: number) {\n const config = STEP_TEXT[stepNumber];\n if (!config) {\n dbgWarn(\"updateStepText\", `No STEP_TEXT config for step ${stepNumber}`);\n return;\n }\n\n if (config.heading) {\n const headingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"heading\"]'\n );\n if (headingEl) {\n headingEl.textContent = config.heading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"heading\"] element');\n }\n }\n\n if (config.subheading) {\n const subheadingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"subheading\"]'\n );\n if (subheadingEl) {\n subheadingEl.textContent = config.subheading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"subheading\"] element');\n }\n }\n\n if (config.counter) {\n const counterEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"counter\"]'\n );\n if (counterEl) {\n counterEl.textContent = config.counter;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"counter\"] element');\n }\n }\n }\n\n private syncAllFieldState() {\n this.fieldState.forEach((_state, key) => {\n this.updateFieldState(key);\n });\n }\n\n private mirrorFieldStateToDOM() {\n const allFields = this.getFormStateJSON();\n const hubspotForm = document.getElementById(\"form-hubspot-book-a-demo\");\n\n if (!hubspotForm) {\n dbgError(\"mirror\", \"HubSpot form #form-hubspot-book-a-demo NOT FOUND in DOM!\");\n return;\n }\n\n allFields.forEach((field) => {\n const mirrorEl = hubspotForm?.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(`[data-mirror=\"${field[\"field-name\"]}\"]`);\n\n if (!mirrorEl) {\n dbgWarn(\"mirror\", `No mirror element for data-mirror=\"${field[\"field-name\"]}\"`);\n return;\n }\n\n if (\n mirrorEl instanceof HTMLInputElement &&\n mirrorEl.disabled\n ) {\n return;\n }\n\n if (mirrorEl instanceof HTMLInputElement) {\n if (mirrorEl.type === \"checkbox\") {\n mirrorEl.checked = field.value === \"true\";\n } else if (mirrorEl.type === \"radio\") {\n mirrorEl.checked = mirrorEl.value === field.value;\n } else {\n mirrorEl.value = field.value;\n }\n } else {\n mirrorEl.value = field.value;\n }\n });\n }\n\n private resolveCalendarEntry(): CalendarEntry | null {\n const companyType = this.fieldState.get(\"company_type\")?.value ?? \"\";\n const industry = this.fieldState.get(\"industry\")?.value ?? \"\";\n\n switch (true) {\n case !!companyType:\n return CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"company_type\" && entry.name === companyType\n ) ?? null;\n\n case !!industry:\n return CALENDAR_ENTRIES.find(\n (entry) => entry.type === \"industry\" && entry.name === industry\n ) ?? null;\n\n default:\n return null;\n }\n }\n\n private loadCalendarEmbed() {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n dbgError(\"calendar\", \"No [hs-calender-block] element found in DOM!\");\n return;\n }\n\n const entry = this.resolveCalendarEntry();\n\n if (!entry) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n\n const tyEls = document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\");\n tyEls.forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"true\"));\n\n return;\n }\n\n container.setAttribute(\"hs-calender-block-active\", \"true\");\n container.innerHTML = \"\";\n\n const tyEls = document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\");\n tyEls.forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"false\"));\n\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", entry[\"embed-url\"]);\n container.appendChild(meetingsDiv);\n\n const scriptSrc =\n \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n `script[src=\"${scriptSrc}\"]`\n );\n if (existingScript) {\n existingScript.remove();\n }\n\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = scriptSrc;\n\n script.addEventListener(\"error\", (err) => {\n dbgError(\"calendar\", \"HubSpot meetings script FAILED to load:\", err);\n });\n\n container.appendChild(script);\n }\n\n private applyStepStyles(stepNumber: number) {\n const styles = STEP_STYLES[stepNumber];\n if (!styles) {\n dbgWarn(\"applyStepStyles\", `No STEP_STYLES config for step ${stepNumber}`);\n return;\n }\n\n styles.forEach(({ selector, property, value }) => {\n const els = document.querySelectorAll<HTMLElement>(selector);\n if (els.length === 0) {\n dbgWarn(\"applyStepStyles\", `Selector \"${selector}\" matched 0 elements`);\n }\n els.forEach((el) => {\n el.style.setProperty(property, value);\n });\n });\n }\n\n}\n\n// Boot\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const form = document.querySelector<HTMLFormElement>('[data-msf=\"form\"]');\n\n if (!form) {\n dbgError(\"boot\", 'No form element found with [data-msf=\"form\"] \u2014 MultiStepForm NOT initialized');\n return;\n }\n\n let itiInstances: Map<HTMLInputElement, any>;\n\n try {\n itiInstances = initIntlTelInput({ root: form });\n } catch (err) {\n dbgError(\"boot\", \"intl-tel-input initialization FAILED:\", err);\n itiInstances = new Map();\n }\n\n try {\n const msf = new MultiStepForm(form, itiInstances);\n (window as any).msf = msf;\n } catch (err) {\n dbgError(\"boot\", \"MultiStepForm constructor THREW:\", err);\n }\n});"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\n\n// \u2500\u2500\u2500 Debug Helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst IS_STAGING = window.location.host === \"influur-staging.webflow.io\";\n\nfunction dbgWarn(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.warn(`[MSF:${tag}]`, ...args);\n}\n\nfunction dbgError(tag: string, ...args: any[]) {\n if (!IS_STAGING) return;\n console.error(`[MSF:${tag}]`, ...args);\n}\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ntype StepEl = HTMLElement;\n\ntype ErrorCode =\n | \"required\"\n | \"email_invalid\"\n | \"email_company\"\n | \"phone_invalid\"\n | \"selection_required\"\n | \"legal_required\";\n\ntype StepStyle = {\n selector: string;\n property: string;\n value: string;\n};\n\nconst STEP_STYLES: Record<number, StepStyle[]> = {\n 1: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"none\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"50%\" },\n { selector: '[data-step-1-terms]', property: \"display\", value: \"block\" },\n ],\n 2: [\n { selector: '[data-action=\"back\"]', property: \"display\", value: \"flex\" },\n { selector: '[pricing-form-element=\"progress-fill\"]', property: \"width\", value: \"100%\" },\n { selector: '[data-step-1-terms]', property: \"display\", value: \"none\" },\n ],\n};\n\ntype CalendarEntry = {\n type: \"company_type\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n};\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"company_type\",\n name: \"Record Label / Music Distributor\",\n \"calender-name\": \"valeria\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n required: \"This field is required\",\n email_invalid: \"Please enter a valid email address\",\n email_company: \"Please use your company email address\",\n phone_invalid: \"Please enter a valid phone number\",\n selection_required: \"Please select at least one option\",\n legal_required: \"You must accept this to continue\"\n};\n\ntype FieldState = {\n \"field-name\": string;\n value: string;\n required: boolean;\n valid: boolean;\n \"step-number\": number;\n};\n\nconst FLOW_CONDITIONS: Record<string, string[]> = {\n \"pulse-demo\": [\n \"pulse-demo-only\",\n \"common-fields\"\n ],\n \"white-glove-services\": [\n \"white-glove-only\",\n \"common-fields\"\n ]\n};\n\nconst STEP_TEXT: Record<number, { heading?: string; subheading?: string; counter?: string }> = {\n 1: {\n heading: \"Your info\",\n subheading: \"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.\",\n counter: \"Step 1/2\",\n },\n 2: {\n heading: \"Personalize\",\n subheading: \"Help us personalize your demo.\",\n counter: \"Step 2/2\",\n }\n};\n\nclass MultiStepForm {\n private form: HTMLFormElement;\n private steps: StepEl[];\n private currentStepIndex = 0;\n private itiInstances: Map<HTMLInputElement, any>;\n private stepHasBeenValidated = false;\n private originalRequired = new WeakMap<HTMLElement, boolean>();\n private fieldState = new Map<string, FieldState>();\n public isFormSubmitted = false;\n public isFormStarted = false;\n\n\n constructor(form: HTMLFormElement, itiInstances: Map<HTMLInputElement, any>) {\n this.form = form;\n this.itiInstances = itiInstances;\n\n this.steps = Array.from(\n form.querySelectorAll<HTMLElement>('[data-msf=\"step\"]')\n );\n\n if (this.steps.length === 0) {\n dbgError(\"init\", \"No steps found! Check [data-msf='step'] selectors in HTML.\");\n }\n\n this.steps.forEach((step, i) => {\n const stepNum = step.dataset.step;\n if (!stepNum) {\n dbgWarn(\"init\", `Step element at index ${i} is missing data-step attribute`);\n }\n });\n\n this.bindEvents();\n this.cacheOriginalRequiredState();\n this.initializeFieldState();\n this.showStep(0);\n this.applyFlowConditions();\n this.syncAllFieldState();\n }\n\n private bindEvents() {\n const markStarted = () => {\n if (!this.isFormStarted) {\n this.isFormStarted = true;\n this.startAbandonmentCheck();\n (window as any).posthog?.capture(\"form_started\", {\n fields: this.getFormStateJSON(),\n });\n }\n\n\n };\n this.form.addEventListener(\"input\", markStarted);\n this.form.addEventListener(\"change\", markStarted);\n\n this.form.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const btn = target.closest<HTMLElement>(\"[data-action]\");\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === \"next\") {\n e.preventDefault();\n this.next();\n }\n\n if (action === \"back\") {\n e.preventDefault();\n this.back();\n }\n });\n\n this.form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n !(target instanceof HTMLInputElement) &&\n !(target instanceof HTMLTextAreaElement) &&\n !(target instanceof HTMLSelectElement)\n ) return;\n\n this.handleLiveValidation();\n });\n\n this.itiInstances.forEach((_iti, input) => {\n input.addEventListener(\"countrychange\", () => {\n if (!this.stepHasBeenValidated) return;\n this.handleLiveValidation();\n });\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n target instanceof HTMLInputElement &&\n target.type === \"radio\" &&\n target.name === \"flow-type\"\n ) {\n this.applyFlowConditions();\n }\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n }\n\n private handleLiveValidation() {\n if (!this.stepHasBeenValidated) return;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n this.clearErrors();\n\n if (Object.keys(errors).length > 0) {\n this.showErrors(errors);\n }\n }\n\n private showStep(index: number) {\n if (index < 0 || index >= this.steps.length) {\n dbgError(\"showStep\", `Invalid step index: ${index} (total steps: ${this.steps.length})`);\n return;\n }\n\n this.steps.forEach((step, i) => {\n step.style.display = i === index ? \"flex\" : \"none\";\n });\n\n this.currentStepIndex = index;\n\n this.stepHasBeenValidated = false;\n this.clearErrors();\n\n const stepNumber = index + 1;\n this.updateStepText(stepNumber);\n this.applyStepStyles(stepNumber);\n }\n\n private next() {\n this.stepHasBeenValidated = true;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n if (Object.keys(errors).length > 0) {\n this.clearErrors();\n this.showErrors(errors);\n this.focusFirstError(errors);\n return;\n }\n\n this.clearErrors();\n this.stepHasBeenValidated = false;\n\n const nextIndex = this.currentStepIndex + 1;\n\n if (nextIndex >= this.steps.length) {\n const currentStep = this.steps[this.currentStepIndex];\n const nextButton = currentStep.querySelector<HTMLElement>('[data-action=\"next\"]');\n\n if (nextButton) {\n const actionTextEl = nextButton.querySelector<HTMLElement>('[data-action-text]');\n if (actionTextEl) {\n actionTextEl.textContent = \"Submitting...\";\n } else {\n dbgWarn(\"next\", \"No [data-action-text] element found inside next button\");\n }\n } else {\n dbgWarn(\"next\", \"No [data-action='next'] button found in current step\");\n }\n\n this.mirrorFieldStateToDOM();\n this.setQualificationStatus();\n this.loadCalendarEmbed();\n\n const webflowSubmitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n\n if (!webflowSubmitBtn) {\n dbgError(\"submit\", \"Missing #webflow-form-submit button in DOM!\");\n }\n if (!hubspotSubmitBtn) {\n dbgError(\"submit\", \"Missing #hubspot-form-submit button in DOM!\");\n }\n\n if (webflowSubmitBtn && hubspotSubmitBtn) {\n this.setSubmissionType(\"manual\");\n webflowSubmitBtn.click();\n hubspotSubmitBtn.click();\n this.isFormSubmitted = true;\n\n (window as any).posthog?.capture(\"form_submitted\", {\n fields: this.getFormStateJSON(),\n });\n\n } else {\n dbgError(\"submit\", \"One or both submit buttons not found \u2014 form NOT submitted\");\n }\n\n return;\n }\n\n this.showStep(nextIndex);\n }\n\n private showErrors(errors: Record<string, ErrorCode>) {\n Object.entries(errors).forEach(([name, message]) => {\n\n const groupEl =\n this.form.querySelector<HTMLElement>(`[data-required-group=\"${name}\"]`) ||\n this.form.querySelector<HTMLElement>(`[data-required-legal=\"${name}\"]`);\n\n if (groupEl) {\n groupEl.classList.add(\"has-error\");\n\n let errorEl = groupEl.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n groupEl.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n return;\n }\n\n const field = this.form.querySelector<HTMLInputElement>(`[name=\"${name}\"]`);\n if (!field) {\n dbgWarn(\"showErrors\", `Cannot find field or group for error key: \"${name}\"`);\n return;\n }\n\n field.classList.add(\"has-error\");\n\n let errorEl = field.parentElement?.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n field.parentElement?.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n });\n }\n\n private clearErrors() {\n const errorEls = this.form.querySelectorAll(\".field-error\");\n const hasErrorEls = this.form.querySelectorAll(\".has-error\");\n\n errorEls.forEach((el) => el.remove());\n hasErrorEls.forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private back() {\n const prevIndex = this.currentStepIndex - 1;\n\n if (prevIndex < 0) {\n return;\n }\n\n this.showStep(prevIndex);\n }\n\n private getFieldsForStep(index: number): HTMLInputElement[] {\n const step = this.steps[index];\n\n if (!step) {\n dbgError(\"getFieldsForStep\", `Step at index ${index} does not exist`);\n return [];\n }\n\n const fields = Array.from(\n step.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n )\n ) as HTMLInputElement[];\n\n return fields;\n }\n\n private validateStep(index: number): Record<string, ErrorCode> {\n const errors: Record<string, ErrorCode> = {};\n\n const fields = this.getFieldsForStep(index);\n\n fields.forEach((field) => {\n const name = field.name;\n if (!name) {\n return;\n }\n\n if (field.type === \"checkbox\" || field.type === \"radio\") return;\n\n const value = field.value.trim();\n const isRequired = field.hasAttribute(\"required\");\n\n if (isRequired && !value) {\n errors[name] = \"required\";\n return;\n }\n\n if (field.type === \"email\" && value) {\n if (!this.isValidEmailFormat(value)) {\n errors[name] = \"email_invalid\";\n return;\n }\n\n if (!this.isCompanyEmail(value)) {\n errors[name] = \"email_company\";\n return;\n }\n }\n\n if (field.type === \"tel\" && value) {\n const phoneError = this.validatePhoneField(field as HTMLInputElement);\n if (phoneError) {\n errors[name] = \"phone_invalid\";\n return;\n }\n }\n });\n\n const selectionGroupErrors = this.validateRequiredSelectionGroups(index);\n const legalErrors = this.validateLegalGroups(index);\n\n const allErrors = {\n ...errors,\n ...selectionGroupErrors,\n ...legalErrors\n };\n\n return allErrors;\n }\n\n private validateRequiredSelectionGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const groups = step.querySelectorAll<HTMLElement>(\"[data-required-group]\");\n\n groups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredGroup;\n if (!groupName) return;\n\n const inputs = Array.from(\n groupEl.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"], input[type=\"radio\"]'\n )\n );\n\n const enabledInputs = inputs.filter((input) => !input.disabled);\n\n if (enabledInputs.length === 0) {\n return;\n }\n\n const isChecked = enabledInputs.some((input) => input.checked);\n\n if (!isChecked) {\n errors[groupName] = \"selection_required\";\n }\n });\n\n return errors;\n }\n\n private validateLegalGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const legalGroups = step.querySelectorAll<HTMLElement>(\"[data-required-legal]\");\n\n legalGroups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredLegal;\n if (!groupName) return;\n\n const checkbox = groupEl.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n\n if (!checkbox || checkbox.disabled) {\n return;\n }\n\n if (!checkbox.checked) {\n errors[groupName] = \"legal_required\";\n }\n });\n\n return errors;\n }\n\n private startAbandonmentCheck() {\n setTimeout(() => {\n if (this.isFormSubmitted) return;\n\n const emailField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"email\"\n );\n const firstNameField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"first_name\"\n );\n const lastNameField = this.getFormStateJSON().find(\n (f) => f[\"field-name\"] === \"last_name\"\n );\n\n const hasValidEmail = emailField && emailField.value && this.isValidEmailFormat(emailField.value);\n const hasFirstName = firstNameField && firstNameField.value.trim().length > 0;\n const hasLastName = lastNameField && lastNameField.value.trim().length > 0;\n\n if (hasValidEmail && hasFirstName && hasLastName) {\n console.warn(\n \"[MSF] User is likely to skip the form submission \u2014 losing a lead. Email:\",\n emailField.value\n );\n\n this.mirrorFieldStateToDOM();\n\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n if (hubspotSubmitBtn) {\n this.setSubmissionType(\"automated\");\n (window as any).posthog?.capture(\"form_abandoned\", {\n fields: this.getFormStateJSON(),\n });\n hubspotSubmitBtn.click();\n } else {\n dbgError(\"abandonCheck\", \"Missing #hubspot-form-submit button in DOM!\");\n }\n }\n }, 30 * 60 * 1000);\n }\n\n private setSubmissionType(type: \"manual\" | \"automated\") {\n const el = document.getElementById(\"submission_type\") as HTMLInputElement | HTMLSelectElement | null;\n if (el) {\n el.value = type;\n } else {\n dbgWarn(\"setSubmissionType\", \"No element found with id 'submission_type'\");\n }\n }\n\n private isValidEmailFormat(email: string): boolean {\n const emailRegex =\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private isCompanyEmail(email: string): boolean {\n const publicDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"icloud.com\",\n \"aol.com\"\n ];\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n\n return !publicDomains.includes(domain);\n }\n\n private validatePhoneField(field: HTMLInputElement): ErrorCode | null {\n const iti = this.itiInstances.get(field);\n if (!iti) {\n dbgWarn(\"phoneValidation\", `No ITI instance found for field \"${field.name}\" \u2014 skipping phone validation`);\n return null;\n }\n\n const value = field.value.trim();\n if (!value) return null;\n\n if (!iti.isValidNumber()) {\n return \"phone_invalid\";\n }\n\n return null;\n }\n\n private focusFirstError(errors: Record<string, ErrorCode>) {\n const firstErrorName = Object.keys(errors)[0];\n if (!firstErrorName) return;\n\n const groupEl =\n this.form.querySelector<HTMLElement>(\n `[data-required-group=\"${firstErrorName}\"]`\n ) ||\n this.form.querySelector<HTMLElement>(\n `[data-required-legal=\"${firstErrorName}\"]`\n );\n\n if (groupEl) {\n const firstInput = groupEl.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (firstInput) {\n firstInput.focus();\n }\n return;\n }\n\n const field = this.form.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(`[name=\"${firstErrorName}\"]`);\n\n if (field) {\n field.focus();\n }\n }\n\n private getFlowType(): string | null {\n const flowWrapper = this.form.querySelector<HTMLElement>(\n '[data-required-group=\"flow-type\"]'\n );\n if (!flowWrapper) {\n dbgWarn(\"getFlowType\", 'No [data-required-group=\"flow-type\"] element found');\n return null;\n }\n\n const checked = flowWrapper.querySelector<HTMLInputElement>(\n 'input[type=\"radio\"]:checked'\n );\n\n const value = checked?.value ?? null;\n return value;\n }\n\n private applyFlowConditions() {\n const flowType = this.getFlowType();\n if (!flowType) {\n return;\n }\n\n const visibleKeys = FLOW_CONDITIONS[flowType] || [];\n\n if (visibleKeys.length === 0) {\n dbgWarn(\"flowConditions\", `No FLOW_CONDITIONS entry for flow type: \"${flowType}\"`);\n }\n\n const conditionalBlocks = this.form.querySelectorAll<HTMLElement>(\n \"[data-conditional]\"\n );\n\n conditionalBlocks.forEach((block) => {\n const key = block.dataset.conditional;\n if (!key) return;\n\n const shouldShow = visibleKeys.includes(key);\n\n const inputs = block.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (shouldShow) {\n block.style.display = \"\";\n\n inputs.forEach((input) => {\n input.disabled = false;\n\n const wasRequired = this.originalRequired.get(input);\n if (wasRequired) {\n input.setAttribute(\"required\", \"true\");\n }\n });\n } else {\n block.style.display = \"none\";\n\n inputs.forEach((input) => {\n input.disabled = true;\n input.removeAttribute(\"required\");\n\n if (input instanceof HTMLInputElement) {\n if (input.type === \"checkbox\" || input.type === \"radio\") {\n input.checked = false;\n } else {\n input.value = \"\";\n }\n } else if (input instanceof HTMLSelectElement) {\n input.selectedIndex = 0;\n } else if (input instanceof HTMLTextAreaElement) {\n input.value = \"\";\n }\n\n const trackable = input.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const fieldKey = trackable.dataset.fieldKey;\n if (!fieldKey) return;\n\n const state = this.fieldState.get(fieldKey);\n if (!state) return;\n\n state.required = false;\n state.valid = true;\n state.value = \"\";\n\n this.fieldState.set(fieldKey, state);\n });\n\n const wrapperKey = block.dataset.fieldKey;\n if (wrapperKey) {\n const state = this.fieldState.get(wrapperKey);\n if (state) {\n state.required = false;\n state.valid = true;\n state.value = \"\";\n this.fieldState.set(wrapperKey, state);\n }\n }\n\n this.clearErrorsInBlock(block);\n }\n });\n\n this.updateValidityForStep(this.currentStepIndex + 1);\n }\n\n private cacheOriginalRequiredState() {\n const inputs = this.form.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n inputs.forEach((input) => {\n const isReq = input.hasAttribute(\"required\");\n this.originalRequired.set(input, isReq);\n });\n }\n\n private clearErrorsInBlock(block: HTMLElement) {\n block.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n block.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private initializeFieldState() {\n const trackables = this.form.querySelectorAll<HTMLElement>(\n \"[data-field-key]\"\n );\n\n trackables.forEach((el) => {\n const key = el.dataset.fieldKey;\n if (!key) return;\n\n const stepWrapper = el.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n if (!stepWrapper) {\n dbgWarn(\"initFieldState\", `Field \"${key}\" is not inside a [data-msf=\"step\"] element \u2014 defaulting to step ${stepNumber}`);\n }\n\n this.fieldState.set(key, {\n \"field-name\": key,\n value: \"\",\n required: false,\n valid: true,\n \"step-number\": stepNumber\n });\n });\n }\n\n private updateFieldState(key: string) {\n const element = this.form.querySelector<HTMLElement>(\n `[data-field-key=\"${key}\"]`\n );\n if (!element) {\n dbgWarn(\"updateFieldState\", `No element found for field key: \"${key}\"`);\n return;\n }\n\n let value = \"\";\n let required = false;\n\n if (element.hasAttribute(\"data-group\")) {\n const inputs = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n \"input[type='radio'], input[type='checkbox']\"\n )\n ).filter((i) => !i.disabled);\n\n required = element.hasAttribute(\"data-required-group\");\n\n if (inputs.some((i) => i.type === \"radio\")) {\n const checked = inputs.find((i) => i.checked);\n\n if (checked) {\n const span = checked.closest(\"label\")?.querySelector(\"span\");\n value = span?.textContent?.trim() ?? checked.value ?? \"\";\n } else {\n value = \"\";\n }\n } else {\n const checkedValues = inputs\n .filter((i) => i.checked)\n .map((i) => {\n const span = i.closest(\"label\")?.querySelector(\"span\");\n return span?.textContent?.trim() ?? i.value ?? \"\";\n });\n\n value = checkedValues.join(\",\");\n }\n }\n else if (element.hasAttribute(\"data-required-legal\")) {\n const checkbox = element.querySelector<HTMLInputElement>(\n \"input[type='checkbox']\"\n );\n\n if (checkbox && !checkbox.disabled) {\n required = true;\n value = checkbox.checked ? \"true\" : \"false\";\n }\n }\n else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n required = element.hasAttribute(\"required\") && !element.disabled;\n\n if (element instanceof HTMLInputElement && element.type === \"checkbox\") {\n value = element.checked ? \"true\" : \"false\";\n } else {\n value = (element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value.trim();\n }\n }\n\n const stepWrapper = element.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n const state = this.fieldState.get(key);\n if (!state) {\n dbgWarn(\"updateFieldState\", `No state entry for key \"${key}\" \u2014 was it initialized?`);\n return;\n }\n\n state.value = value;\n state.required = required;\n state[\"step-number\"] = stepNumber;\n\n this.fieldState.set(key, state);\n\n this.updateValidityForStep(stepNumber);\n }\n\n private updateValidityForStep(stepNumber: number) {\n const stepIndex = this.steps.findIndex(\n (step) => Number(step.dataset.step) === stepNumber\n );\n\n if (stepIndex === -1) {\n dbgWarn(\"updateValidity\", `No step element found with data-step=\"${stepNumber}\"`);\n return;\n }\n\n const errors = this.validateStep(stepIndex);\n\n const keysInStep = Array.from(this.fieldState.values()).filter(\n (f) => f[\"step-number\"] === stepNumber\n );\n\n keysInStep.forEach((field) => {\n field.valid = !errors[field[\"field-name\"]];\n });\n }\n\n public getFormStateJSON(): FieldState[] {\n return Array.from(this.fieldState.values());\n }\n\n private updateStepText(stepNumber: number) {\n const config = STEP_TEXT[stepNumber];\n if (!config) {\n dbgWarn(\"updateStepText\", `No STEP_TEXT config for step ${stepNumber}`);\n return;\n }\n\n if (config.heading) {\n const headingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"heading\"]'\n );\n if (headingEl) {\n headingEl.textContent = config.heading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"heading\"] element');\n }\n }\n\n if (config.subheading) {\n const subheadingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"subheading\"]'\n );\n if (subheadingEl) {\n subheadingEl.textContent = config.subheading;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"subheading\"] element');\n }\n }\n\n if (config.counter) {\n const counterEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"counter\"]'\n );\n if (counterEl) {\n counterEl.textContent = config.counter;\n } else {\n dbgWarn(\"updateStepText\", 'Missing [data-dynamic-text=\"counter\"] element');\n }\n }\n }\n\n private syncAllFieldState() {\n this.fieldState.forEach((_state, key) => {\n this.updateFieldState(key);\n });\n }\n\n private mirrorFieldStateToDOM() {\n const allFields = this.getFormStateJSON();\n const hubspotForm = document.getElementById(\"form-hubspot-book-a-demo\");\n\n if (!hubspotForm) {\n dbgError(\"mirror\", \"HubSpot form #form-hubspot-book-a-demo NOT FOUND in DOM!\");\n return;\n }\n\n allFields.forEach((field) => {\n const mirrorEl = hubspotForm?.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(`[data-mirror=\"${field[\"field-name\"]}\"]`);\n\n if (!mirrorEl) {\n dbgWarn(\"mirror\", `No mirror element for data-mirror=\"${field[\"field-name\"]}\"`);\n return;\n }\n\n if (\n mirrorEl instanceof HTMLInputElement &&\n mirrorEl.disabled\n ) {\n return;\n }\n\n if (mirrorEl instanceof HTMLInputElement) {\n if (mirrorEl.type === \"checkbox\") {\n mirrorEl.checked = field.value === \"true\";\n } else if (mirrorEl.type === \"radio\") {\n mirrorEl.checked = mirrorEl.value === field.value;\n } else {\n mirrorEl.value = field.value;\n }\n } else {\n mirrorEl.value = field.value;\n }\n });\n }\n\n private resolveCalendarEntry(): CalendarEntry | null {\n\n const companyType = this.fieldState.get(\"company_type\")?.value ?? \"\";\n\n const industry = this.fieldState.get(\"industry\")?.value ?? \"\";\n\n return CALENDAR_ENTRIES.find(\n\n (entry) => entry.type === \"company_type\" && entry.name === companyType\n\n ) ?? CALENDAR_ENTRIES.find(\n\n (entry) => entry.type === \"industry\" && entry.name === industry\n\n ) ?? null;\n\n }\n\n private loadCalendarEmbed() {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n dbgError(\"calendar\", \"No [hs-calender-block] element found in DOM!\");\n return;\n }\n\n const entry = this.resolveCalendarEntry();\n\n if (!entry) {\n container.setAttribute(\"hs-calender-block-active\", \"false\");\n container.innerHTML = \"\";\n\n const tyEls = document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\");\n tyEls.forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"true\"));\n\n return;\n }\n\n container.setAttribute(\"hs-calender-block-active\", \"true\");\n container.innerHTML = \"\";\n\n const tyEls = document.querySelectorAll<HTMLElement>(\"[hs-thankyou-block-active]\");\n tyEls.forEach((el) => el.setAttribute(\"hs-thankyou-block-active\", \"false\"));\n\n // \u2500\u2500\u2500 Prefill params \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const firstName = this.fieldState.get(\"first_name\")?.value ?? \"\";\n const lastName = this.fieldState.get(\"last_name\")?.value ?? \"\";\n const email = this.fieldState.get(\"email\")?.value ?? \"\";\n\n const prefillParams = new URLSearchParams();\n if (firstName) prefillParams.set(\"firstName\", firstName);\n if (lastName) prefillParams.set(\"lastName\", lastName);\n if (email) prefillParams.set(\"email\", email);\n\n const separator = entry[\"embed-url\"].includes(\"?\") ? \"&\" : \"?\";\n const embedUrl = prefillParams.toString()\n ? `${entry[\"embed-url\"]}${separator}${prefillParams.toString()}`\n : entry[\"embed-url\"];\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", embedUrl);\n container.appendChild(meetingsDiv);\n\n const scriptSrc =\n \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n `script[src=\"${scriptSrc}\"]`\n );\n if (existingScript) {\n existingScript.remove();\n }\n\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = scriptSrc;\n\n script.addEventListener(\"error\", (err) => {\n dbgError(\"calendar\", \"HubSpot meetings script FAILED to load:\", err);\n });\n\n container.appendChild(script);\n }\n\n private applyStepStyles(stepNumber: number) {\n const styles = STEP_STYLES[stepNumber];\n if (!styles) {\n dbgWarn(\"applyStepStyles\", `No STEP_STYLES config for step ${stepNumber}`);\n return;\n }\n\n styles.forEach(({ selector, property, value }) => {\n const els = document.querySelectorAll<HTMLElement>(selector);\n if (els.length === 0) {\n dbgWarn(\"applyStepStyles\", `Selector \"${selector}\" matched 0 elements`);\n }\n els.forEach((el) => {\n el.style.setProperty(property, value);\n });\n });\n }\n\n private setQualificationStatus() {\n const companyType = this.fieldState.get(\"company_type\")?.value ?? \"\";\n const el = document.getElementById(\"qualified_unqualified\") as HTMLInputElement | null;\n\n if (!el) {\n dbgWarn(\"qualification\", \"No element found with id 'qualified_unqualified'\");\n return;\n }\n\n el.value = companyType === \"Record Label / Music Distributor\" ? \"qualified\" : \"unqualified\";\n }\n\n}\n\n// Boot\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const form = document.querySelector<HTMLFormElement>('[data-msf=\"form\"]');\n\n if (!form) {\n dbgError(\"boot\", 'No form element found with [data-msf=\"form\"] \u2014 MultiStepForm NOT initialized');\n return;\n }\n\n let itiInstances: Map<HTMLInputElement, any>;\n\n try {\n itiInstances = initIntlTelInput({ root: form });\n } catch (err) {\n dbgError(\"boot\", \"intl-tel-input initialization FAILED:\", err);\n itiInstances = new Map();\n }\n\n try {\n const msf = new MultiStepForm(form, itiInstances);\n (window as any).msf = msf;\n } catch (err) {\n dbgError(\"boot\", \"MultiStepForm constructor THREW:\", err);\n }\n});"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,WAAS,iBACZ,UAA+B,CAAC,GACN;AAC1B,UAAM;AAAA,MACF,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,sBAAsB;AAAA,MACtB;AAAA,MACA,UAAU,CAAC,QAAQ,QAAQ,KAAK,sBAAsB,GAAG,EAAE;AAAA,IAC/D,IAAI;AAEJ,UAAM,YAAY,oBAAI,IAA2B;AAGjD,UAAM,eAAgB,OAAe;AACrC,QAAI,CAAC,cAAc;AACf;AAAA,QACI;AAAA,MAGJ;AACA,aAAO;AAAA,IACX;AAGA,UAAM,cAAc,KAAK;AAAA,MACrB;AAAA,IACJ;AAEA,gBAAY,QAAQ,CAAC,UAAU;AAC3B,UAAI;AACA,cAAM,MAAM,aAAa,OAAO;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,YAAY;AAAA;AAAA,UAEZ,WAAW,MACP;AAAA;AAAA,YAEI;AAAA,UACJ;AAAA,QACR,CAAC;AAED,kBAAU,IAAI,OAAO,GAAG;AAGxB,wBAAgB,KAAK,mBAAmB;AACxC,cAAM,iBAAiB,iBAAiB,MAAM;AAC1C,0BAAgB,KAAK,mBAAmB;AAAA,QAC5C,CAAC;AAED,iBAAS,OAAO,GAAG;AAAA,MACvB,SAAS,KAAK;AACV,gBAAQ,mCAAmC,YAAY,KAAK,CAAC,KAAK,GAAG;AAAA,MACzE;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAIA,WAAS,gBAAgB,KAAU,UAAwB;AACvD,QAAI;AACA,YAAM,cAAc,IAAI,yBAAyB;AACjD,UAAI,CAAC,aAAa,SAAU;AAE5B,eAAS,iBAAmC,QAAQ,EAAE,QAAQ,CAAC,UAAU;AACrE,cAAM,QAAQ,IAAI,YAAY,QAAQ;AAAA,MAC1C,CAAC;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACJ;AAEA,WAAS,YAAY,OAAiC;AAClD,WACI,MAAM,QAAQ,oBAAoB,GAAG,aAAa,kBAAkB,KACpE;AAAA,EAER;;;AC7GA,MAAM,aAAa,OAAO,SAAS,SAAS;AAE5C,WAAS,QAAQ,QAAgB,MAAa;AAC1C,QAAI,CAAC,WAAY;AACjB,YAAQ,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AAAA,EACxC;AAEA,WAAS,SAAS,QAAgB,MAAa;AAC3C,QAAI,CAAC,WAAY;AACjB,YAAQ,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI;AAAA,EACzC;AAmBA,MAAM,cAA2C;AAAA,IAC7C,GAAG;AAAA,MACC,EAAE,UAAU,wBAAwB,UAAU,WAAW,OAAO,OAAO;AAAA,MACvE,EAAE,UAAU,0CAA0C,UAAU,SAAS,OAAO,MAAM;AAAA,MACtF,EAAE,UAAU,uBAAuB,UAAU,WAAW,OAAO,QAAQ;AAAA,IAC3E;AAAA,IACA,GAAG;AAAA,MACC,EAAE,UAAU,wBAAwB,UAAU,WAAW,OAAO,OAAO;AAAA,MACvE,EAAE,UAAU,0CAA0C,UAAU,SAAS,OAAO,OAAO;AAAA,MACvF,EAAE,UAAU,uBAAuB,UAAU,WAAW,OAAO,OAAO;AAAA,IAC1E;AAAA,EACJ;AASA,MAAM,mBAAoC;AAAA,IACtC;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACjB;AAAA,EACJ;AAEA,MAAM,iBAA4C;AAAA,IAC9C,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EACpB;AAUA,MAAM,kBAA4C;AAAA,IAC9C,cAAc;AAAA,MACV;AAAA,MACA;AAAA,IACJ;AAAA,IACA,wBAAwB;AAAA,MACpB;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,MAAM,YAAyF;AAAA,IAC3F,GAAG;AAAA,MACC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,IACb;AAAA,IACA,GAAG;AAAA,MACC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,IACb;AAAA,EACJ;AAEA,MAAM,gBAAN,MAAoB;AAAA,IAYhB,YAAY,MAAuB,cAA0C;AAT7E,WAAQ,mBAAmB;AAE3B,WAAQ,uBAAuB;AAC/B,WAAQ,mBAAmB,oBAAI,QAA8B;AAC7D,WAAQ,aAAa,oBAAI,IAAwB;AACjD,WAAO,kBAAkB;AACzB,WAAO,gBAAgB;AAInB,WAAK,OAAO;AACZ,WAAK,eAAe;AAEpB,WAAK,QAAQ,MAAM;AAAA,QACf,KAAK,iBAA8B,mBAAmB;AAAA,MAC1D;AAEA,UAAI,KAAK,MAAM,WAAW,GAAG;AACzB,iBAAS,QAAQ,4DAA4D;AAAA,MACjF;AAEA,WAAK,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC5B,cAAM,UAAU,KAAK,QAAQ;AAC7B,YAAI,CAAC,SAAS;AACV,kBAAQ,QAAQ,yBAAyB,CAAC,iCAAiC;AAAA,QAC/E;AAAA,MACJ,CAAC;AAED,WAAK,WAAW;AAChB,WAAK,2BAA2B;AAChC,WAAK,qBAAqB;AAC1B,WAAK,SAAS,CAAC;AACf,WAAK,oBAAoB;AACzB,WAAK,kBAAkB;AAAA,IAC3B;AAAA,IAEQ,aAAa;AACjB,YAAM,cAAc,MAAM;AACtB,YAAI,CAAC,KAAK,eAAe;AACrB,eAAK,gBAAgB;AACrB,eAAK,sBAAsB;AAC3B,UAAC,OAAe,SAAS,QAAQ,gBAAgB;AAAA,YAC7C,QAAQ,KAAK,iBAAiB;AAAA,UAClC,CAAC;AAAA,QACL;AAAA,MAGJ;AACA,WAAK,KAAK,iBAAiB,SAAS,WAAW;AAC/C,WAAK,KAAK,iBAAiB,UAAU,WAAW;AAEhD,WAAK,KAAK,iBAAiB,SAAS,CAAC,MAAM;AACvC,cAAM,SAAS,EAAE;AACjB,YAAI,CAAC,OAAQ;AAEb,cAAM,MAAM,OAAO,QAAqB,eAAe;AACvD,YAAI,CAAC,IAAK;AAEV,cAAM,SAAS,IAAI,QAAQ;AAE3B,YAAI,WAAW,QAAQ;AACnB,YAAE,eAAe;AACjB,eAAK,KAAK;AAAA,QACd;AAEA,YAAI,WAAW,QAAQ;AACnB,YAAE,eAAe;AACjB,eAAK,KAAK;AAAA,QACd;AAAA,MACJ,CAAC;AAED,WAAK,KAAK,iBAAiB,UAAU,CAAC,MAAM;AACxC,UAAE,eAAe;AAAA,MACrB,CAAC;AAED,WAAK,KAAK,iBAAiB,SAAS,CAAC,MAAM;AACvC,cAAM,SAAS,EAAE;AACjB,YAAI,CAAC,OAAQ;AAEb,YACI,EAAE,kBAAkB,qBACpB,EAAE,kBAAkB,wBACpB,EAAE,kBAAkB,mBACtB;AAEF,aAAK,qBAAqB;AAAA,MAC9B,CAAC;AAED,WAAK,aAAa,QAAQ,CAAC,MAAM,UAAU;AACvC,cAAM,iBAAiB,iBAAiB,MAAM;AAC1C,cAAI,CAAC,KAAK,qBAAsB;AAChC,eAAK,qBAAqB;AAAA,QAC9B,CAAC;AAAA,MACL,CAAC;AAED,WAAK,KAAK,iBAAiB,UAAU,CAAC,MAAM;AACxC,cAAM,SAAS,EAAE;AACjB,YAAI,CAAC,OAAQ;AAEb,YACI,kBAAkB,oBAClB,OAAO,SAAS,WAChB,OAAO,SAAS,aAClB;AACE,eAAK,oBAAoB;AAAA,QAC7B;AAAA,MACJ,CAAC;AAED,WAAK,KAAK,iBAAiB,SAAS,CAAC,MAAM;AACvC,cAAM,SAAS,EAAE;AACjB,YAAI,CAAC,OAAQ;AAEb,cAAM,YAAY,OAAO,QAAqB,kBAAkB;AAChE,YAAI,CAAC,UAAW;AAEhB,cAAM,MAAM,UAAU,QAAQ;AAC9B,YAAI,CAAC,IAAK;AAEV,aAAK,iBAAiB,GAAG;AAAA,MAC7B,CAAC;AAED,WAAK,KAAK,iBAAiB,UAAU,CAAC,MAAM;AACxC,cAAM,SAAS,EAAE;AACjB,YAAI,CAAC,OAAQ;AAEb,cAAM,YAAY,OAAO,QAAqB,kBAAkB;AAChE,YAAI,CAAC,UAAW;AAEhB,cAAM,MAAM,UAAU,QAAQ;AAC9B,YAAI,CAAC,IAAK;AAEV,aAAK,iBAAiB,GAAG;AAAA,MAC7B,CAAC;AAAA,IACL;AAAA,IAEQ,uBAAuB;AAC3B,UAAI,CAAC,KAAK,qBAAsB;AAEhC,YAAM,SAAS,KAAK,aAAa,KAAK,gBAAgB;AAEtD,WAAK,YAAY;AAEjB,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAChC,aAAK,WAAW,MAAM;AAAA,MAC1B;AAAA,IACJ;AAAA,IAEQ,SAAS,OAAe;AAC5B,UAAI,QAAQ,KAAK,SAAS,KAAK,MAAM,QAAQ;AACzC,iBAAS,YAAY,uBAAuB,KAAK,kBAAkB,KAAK,MAAM,MAAM,GAAG;AACvF;AAAA,MACJ;AAEA,WAAK,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC5B,aAAK,MAAM,UAAU,MAAM,QAAQ,SAAS;AAAA,MAChD,CAAC;AAED,WAAK,mBAAmB;AAExB,WAAK,uBAAuB;AAC5B,WAAK,YAAY;AAEjB,YAAM,aAAa,QAAQ;AAC3B,WAAK,eAAe,UAAU;AAC9B,WAAK,gBAAgB,UAAU;AAAA,IACnC;AAAA,IAEQ,OAAO;AACX,WAAK,uBAAuB;AAE5B,YAAM,SAAS,KAAK,aAAa,KAAK,gBAAgB;AAEtD,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAChC,aAAK,YAAY;AACjB,aAAK,WAAW,MAAM;AACtB,aAAK,gBAAgB,MAAM;AAC3B;AAAA,MACJ;AAEA,WAAK,YAAY;AACjB,WAAK,uBAAuB;AAE5B,YAAM,YAAY,KAAK,mBAAmB;AAE1C,UAAI,aAAa,KAAK,MAAM,QAAQ;AAChC,cAAM,cAAc,KAAK,MAAM,KAAK,gBAAgB;AACpD,cAAM,aAAa,YAAY,cAA2B,sBAAsB;AAEhF,YAAI,YAAY;AACZ,gBAAM,eAAe,WAAW,cAA2B,oBAAoB;AAC/E,cAAI,cAAc;AACd,yBAAa,cAAc;AAAA,UAC/B,OAAO;AACH,oBAAQ,QAAQ,wDAAwD;AAAA,UAC5E;AAAA,QACJ,OAAO;AACH,kBAAQ,QAAQ,sDAAsD;AAAA,QAC1E;AAEA,aAAK,sBAAsB;AAC3B,aAAK,uBAAuB;AAC5B,aAAK,kBAAkB;AAEvB,cAAM,mBAAmB,SAAS,eAAe,qBAAqB;AACtE,cAAM,mBAAmB,SAAS,eAAe,qBAAqB;AAEtE,YAAI,CAAC,kBAAkB;AACnB,mBAAS,UAAU,6CAA6C;AAAA,QACpE;AACA,YAAI,CAAC,kBAAkB;AACnB,mBAAS,UAAU,6CAA6C;AAAA,QACpE;AAEA,YAAI,oBAAoB,kBAAkB;AACtC,eAAK,kBAAkB,QAAQ;AAC/B,2BAAiB,MAAM;AACvB,2BAAiB,MAAM;AACvB,eAAK,kBAAkB;AAEvB,UAAC,OAAe,SAAS,QAAQ,kBAAkB;AAAA,YAC/C,QAAQ,KAAK,iBAAiB;AAAA,UAClC,CAAC;AAAA,QAEL,OAAO;AACH,mBAAS,UAAU,gEAA2D;AAAA,QAClF;AAEA;AAAA,MACJ;AAEA,WAAK,SAAS,SAAS;AAAA,IAC3B;AAAA,IAEQ,WAAW,QAAmC;AAClD,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM;AAEhD,cAAM,UACF,KAAK,KAAK,cAA2B,yBAAyB,IAAI,IAAI,KACtE,KAAK,KAAK,cAA2B,yBAAyB,IAAI,IAAI;AAE1E,YAAI,SAAS;AACT,kBAAQ,UAAU,IAAI,WAAW;AAEjC,cAAIA,WAAU,QAAQ,cAA2B,cAAc;AAC/D,cAAI,CAACA,UAAS;AACV,YAAAA,WAAU,SAAS,cAAc,KAAK;AACtC,YAAAA,SAAQ,YAAY;AACpB,oBAAQ,YAAYA,QAAO;AAAA,UAC/B;AAEA,UAAAA,SAAQ,cAAc,eAAe,OAAO;AAC5C,UAAAA,SAAQ,aAAa,mBAAmB,OAAO;AAC/C;AAAA,QACJ;AAEA,cAAM,QAAQ,KAAK,KAAK,cAAgC,UAAU,IAAI,IAAI;AAC1E,YAAI,CAAC,OAAO;AACR,kBAAQ,cAAc,8CAA8C,IAAI,GAAG;AAC3E;AAAA,QACJ;AAEA,cAAM,UAAU,IAAI,WAAW;AAE/B,YAAI,UAAU,MAAM,eAAe,cAA2B,cAAc;AAC5E,YAAI,CAAC,SAAS;AACV,oBAAU,SAAS,cAAc,KAAK;AACtC,kBAAQ,YAAY;AACpB,gBAAM,eAAe,YAAY,OAAO;AAAA,QAC5C;AAEA,gBAAQ,cAAc,eAAe,OAAO;AAC5C,gBAAQ,aAAa,mBAAmB,OAAO;AAAA,MACnD,CAAC;AAAA,IACL;AAAA,IAEQ,cAAc;AAClB,YAAM,WAAW,KAAK,KAAK,iBAAiB,cAAc;AAC1D,YAAM,cAAc,KAAK,KAAK,iBAAiB,YAAY;AAE3D,eAAS,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AACpC,kBAAY;AAAA,QAAQ,CAAC,OACjB,GAAG,UAAU,OAAO,WAAW;AAAA,MACnC;AAAA,IACJ;AAAA,IAEQ,OAAO;AACX,YAAM,YAAY,KAAK,mBAAmB;AAE1C,UAAI,YAAY,GAAG;AACf;AAAA,MACJ;AAEA,WAAK,SAAS,SAAS;AAAA,IAC3B;AAAA,IAEQ,iBAAiB,OAAmC;AACxD,YAAM,OAAO,KAAK,MAAM,KAAK;AAE7B,UAAI,CAAC,MAAM;AACP,iBAAS,oBAAoB,iBAAiB,KAAK,iBAAiB;AACpE,eAAO,CAAC;AAAA,MACZ;AAEA,YAAM,SAAS,MAAM;AAAA,QACjB,KAAK;AAAA,UACD;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEQ,aAAa,OAA0C;AAC3D,YAAM,SAAoC,CAAC;AAE3C,YAAM,SAAS,KAAK,iBAAiB,KAAK;AAE1C,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,OAAO,MAAM;AACnB,YAAI,CAAC,MAAM;AACP;AAAA,QACJ;AAEA,YAAI,MAAM,SAAS,cAAc,MAAM,SAAS,QAAS;AAEzD,cAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,cAAM,aAAa,MAAM,aAAa,UAAU;AAEhD,YAAI,cAAc,CAAC,OAAO;AACtB,iBAAO,IAAI,IAAI;AACf;AAAA,QACJ;AAEA,YAAI,MAAM,SAAS,WAAW,OAAO;AACjC,cAAI,CAAC,KAAK,mBAAmB,KAAK,GAAG;AACjC,mBAAO,IAAI,IAAI;AACf;AAAA,UACJ;AAEA,cAAI,CAAC,KAAK,eAAe,KAAK,GAAG;AAC7B,mBAAO,IAAI,IAAI;AACf;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,MAAM,SAAS,SAAS,OAAO;AAC/B,gBAAM,aAAa,KAAK,mBAAmB,KAAyB;AACpE,cAAI,YAAY;AACZ,mBAAO,IAAI,IAAI;AACf;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AAED,YAAM,uBAAuB,KAAK,gCAAgC,KAAK;AACvE,YAAM,cAAc,KAAK,oBAAoB,KAAK;AAElD,YAAM,YAAY;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACP;AAEA,aAAO;AAAA,IACX;AAAA,IAEQ,gCAAgC,OAA0C;AAC9E,YAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,YAAM,SAAoC,CAAC;AAE3C,YAAM,SAAS,KAAK,iBAA8B,uBAAuB;AAEzE,aAAO,QAAQ,CAAC,YAAY;AACxB,cAAM,YAAY,QAAQ,QAAQ;AAClC,YAAI,CAAC,UAAW;AAEhB,cAAM,SAAS,MAAM;AAAA,UACjB,QAAQ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ;AAE9D,YAAI,cAAc,WAAW,GAAG;AAC5B;AAAA,QACJ;AAEA,cAAM,YAAY,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO;AAE7D,YAAI,CAAC,WAAW;AACZ,iBAAO,SAAS,IAAI;AAAA,QACxB;AAAA,MACJ,CAAC;AAED,aAAO;AAAA,IACX;AAAA,IAEQ,oBAAoB,OAA0C;AAClE,YAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,YAAM,SAAoC,CAAC;AAE3C,YAAM,cAAc,KAAK,iBAA8B,uBAAuB;AAE9E,kBAAY,QAAQ,CAAC,YAAY;AAC7B,cAAM,YAAY,QAAQ,QAAQ;AAClC,YAAI,CAAC,UAAW;AAEhB,cAAM,WAAW,QAAQ;AAAA,UACrB;AAAA,QACJ;AAEA,YAAI,CAAC,YAAY,SAAS,UAAU;AAChC;AAAA,QACJ;AAEA,YAAI,CAAC,SAAS,SAAS;AACnB,iBAAO,SAAS,IAAI;AAAA,QACxB;AAAA,MACJ,CAAC;AAED,aAAO;AAAA,IACX;AAAA,IAEQ,wBAAwB;AAC5B,iBAAW,MAAM;AACb,YAAI,KAAK,gBAAiB;AAE1B,cAAM,aAAa,KAAK,iBAAiB,EAAE;AAAA,UACvC,CAAC,MAAM,EAAE,YAAY,MAAM;AAAA,QAC/B;AACA,cAAM,iBAAiB,KAAK,iBAAiB,EAAE;AAAA,UAC3C,CAAC,MAAM,EAAE,YAAY,MAAM;AAAA,QAC/B;AACA,cAAM,gBAAgB,KAAK,iBAAiB,EAAE;AAAA,UAC1C,CAAC,MAAM,EAAE,YAAY,MAAM;AAAA,QAC/B;AAEA,cAAM,gBAAgB,cAAc,WAAW,SAAS,KAAK,mBAAmB,WAAW,KAAK;AAChG,cAAM,eAAe,kBAAkB,eAAe,MAAM,KAAK,EAAE,SAAS;AAC5E,cAAM,cAAc,iBAAiB,cAAc,MAAM,KAAK,EAAE,SAAS;AAEzE,YAAI,iBAAiB,gBAAgB,aAAa;AAC9C,kBAAQ;AAAA,YACJ;AAAA,YACA,WAAW;AAAA,UACf;AAEA,eAAK,sBAAsB;AAE3B,gBAAM,mBAAmB,SAAS,eAAe,qBAAqB;AACtE,cAAI,kBAAkB;AAClB,iBAAK,kBAAkB,WAAW;AAClC,YAAC,OAAe,SAAS,QAAQ,kBAAkB;AAAA,cAC/C,QAAQ,KAAK,iBAAiB;AAAA,YAClC,CAAC;AACD,6BAAiB,MAAM;AAAA,UAC3B,OAAO;AACH,qBAAS,gBAAgB,6CAA6C;AAAA,UAC1E;AAAA,QACJ;AAAA,MACJ,GAAG,KAAK,KAAK,GAAI;AAAA,IACrB;AAAA,IAEQ,kBAAkB,MAA8B;AACpD,YAAM,KAAK,SAAS,eAAe,iBAAiB;AACpD,UAAI,IAAI;AACJ,WAAG,QAAQ;AAAA,MACf,OAAO;AACH,gBAAQ,qBAAqB,4CAA4C;AAAA,MAC7E;AAAA,IACJ;AAAA,IAEQ,mBAAmB,OAAwB;AAC/C,YAAM,aACF;AACJ,aAAO,WAAW,KAAK,KAAK;AAAA,IAChC;AAAA,IAEQ,eAAe,OAAwB;AAC3C,YAAM,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,YAAM,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY;AAChD,UAAI,CAAC,OAAQ,QAAO;AAEpB,aAAO,CAAC,cAAc,SAAS,MAAM;AAAA,IACzC;AAAA,IAEQ,mBAAmB,OAA2C;AAClE,YAAM,MAAM,KAAK,aAAa,IAAI,KAAK;AACvC,UAAI,CAAC,KAAK;AACN,gBAAQ,mBAAmB,oCAAoC,MAAM,IAAI,oCAA+B;AACxG,eAAO;AAAA,MACX;AAEA,YAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,UAAI,CAAC,MAAO,QAAO;AAEnB,UAAI,CAAC,IAAI,cAAc,GAAG;AACtB,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,IACX;AAAA,IAEQ,gBAAgB,QAAmC;AACvD,YAAM,iBAAiB,OAAO,KAAK,MAAM,EAAE,CAAC;AAC5C,UAAI,CAAC,eAAgB;AAErB,YAAM,UACF,KAAK,KAAK;AAAA,QACN,yBAAyB,cAAc;AAAA,MAC3C,KACA,KAAK,KAAK;AAAA,QACN,yBAAyB,cAAc;AAAA,MAC3C;AAEJ,UAAI,SAAS;AACT,cAAM,aAAa,QAAQ,cAEzB,yBAAyB;AAE3B,YAAI,YAAY;AACZ,qBAAW,MAAM;AAAA,QACrB;AACA;AAAA,MACJ;AAEA,YAAM,QAAQ,KAAK,KAAK,cAEtB,UAAU,cAAc,IAAI;AAE9B,UAAI,OAAO;AACP,cAAM,MAAM;AAAA,MAChB;AAAA,IACJ;AAAA,IAEQ,cAA6B;AACjC,YAAM,cAAc,KAAK,KAAK;AAAA,QAC1B;AAAA,MACJ;AACA,UAAI,CAAC,aAAa;AACd,gBAAQ,eAAe,oDAAoD;AAC3E,eAAO;AAAA,MACX;AAEA,YAAM,UAAU,YAAY;AAAA,QACxB;AAAA,MACJ;AAEA,YAAM,QAAQ,SAAS,SAAS;AAChC,aAAO;AAAA,IACX;AAAA,IAEQ,sBAAsB;AAC1B,YAAM,WAAW,KAAK,YAAY;AAClC,UAAI,CAAC,UAAU;AACX;AAAA,MACJ;AAEA,YAAM,cAAc,gBAAgB,QAAQ,KAAK,CAAC;AAElD,UAAI,YAAY,WAAW,GAAG;AAC1B,gBAAQ,kBAAkB,4CAA4C,QAAQ,GAAG;AAAA,MACrF;AAEA,YAAM,oBAAoB,KAAK,KAAK;AAAA,QAChC;AAAA,MACJ;AAEA,wBAAkB,QAAQ,CAAC,UAAU;AACjC,cAAM,MAAM,MAAM,QAAQ;AAC1B,YAAI,CAAC,IAAK;AAEV,cAAM,aAAa,YAAY,SAAS,GAAG;AAE3C,cAAM,SAAS,MAAM,iBAEnB,yBAAyB;AAE3B,YAAI,YAAY;AACZ,gBAAM,MAAM,UAAU;AAEtB,iBAAO,QAAQ,CAAC,UAAU;AACtB,kBAAM,WAAW;AAEjB,kBAAM,cAAc,KAAK,iBAAiB,IAAI,KAAK;AACnD,gBAAI,aAAa;AACb,oBAAM,aAAa,YAAY,MAAM;AAAA,YACzC;AAAA,UACJ,CAAC;AAAA,QACL,OAAO;AACH,gBAAM,MAAM,UAAU;AAEtB,iBAAO,QAAQ,CAAC,UAAU;AACtB,kBAAM,WAAW;AACjB,kBAAM,gBAAgB,UAAU;AAEhC,gBAAI,iBAAiB,kBAAkB;AACnC,kBAAI,MAAM,SAAS,cAAc,MAAM,SAAS,SAAS;AACrD,sBAAM,UAAU;AAAA,cACpB,OAAO;AACH,sBAAM,QAAQ;AAAA,cAClB;AAAA,YACJ,WAAW,iBAAiB,mBAAmB;AAC3C,oBAAM,gBAAgB;AAAA,YAC1B,WAAW,iBAAiB,qBAAqB;AAC7C,oBAAM,QAAQ;AAAA,YAClB;AAEA,kBAAM,YAAY,MAAM,QAAqB,kBAAkB;AAC/D,gBAAI,CAAC,UAAW;AAEhB,kBAAM,WAAW,UAAU,QAAQ;AACnC,gBAAI,CAAC,SAAU;AAEf,kBAAM,QAAQ,KAAK,WAAW,IAAI,QAAQ;AAC1C,gBAAI,CAAC,MAAO;AAEZ,kBAAM,WAAW;AACjB,kBAAM,QAAQ;AACd,kBAAM,QAAQ;AAEd,iBAAK,WAAW,IAAI,UAAU,KAAK;AAAA,UACvC,CAAC;AAED,gBAAM,aAAa,MAAM,QAAQ;AACjC,cAAI,YAAY;AACZ,kBAAM,QAAQ,KAAK,WAAW,IAAI,UAAU;AAC5C,gBAAI,OAAO;AACP,oBAAM,WAAW;AACjB,oBAAM,QAAQ;AACd,oBAAM,QAAQ;AACd,mBAAK,WAAW,IAAI,YAAY,KAAK;AAAA,YACzC;AAAA,UACJ;AAEA,eAAK,mBAAmB,KAAK;AAAA,QACjC;AAAA,MACJ,CAAC;AAED,WAAK,sBAAsB,KAAK,mBAAmB,CAAC;AAAA,IACxD;AAAA,IAEQ,6BAA6B;AACjC,YAAM,SAAS,KAAK,KAAK,iBAEvB,yBAAyB;AAE3B,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,QAAQ,MAAM,aAAa,UAAU;AAC3C,aAAK,iBAAiB,IAAI,OAAO,KAAK;AAAA,MAC1C,CAAC;AAAA,IACL;AAAA,IAEQ,mBAAmB,OAAoB;AAC3C,YAAM,iBAAiB,cAAc,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AAClE,YAAM,iBAAiB,YAAY,EAAE;AAAA,QAAQ,CAAC,OAC1C,GAAG,UAAU,OAAO,WAAW;AAAA,MACnC;AAAA,IACJ;AAAA,IAEQ,uBAAuB;AAC3B,YAAM,aAAa,KAAK,KAAK;AAAA,QACzB;AAAA,MACJ;AAEA,iBAAW,QAAQ,CAAC,OAAO;AACvB,cAAM,MAAM,GAAG,QAAQ;AACvB,YAAI,CAAC,IAAK;AAEV,cAAM,cAAc,GAAG,QAAqB,mBAAmB;AAC/D,cAAM,aAAa,cACb,OAAO,YAAY,QAAQ,IAAI,IAC/B,KAAK,mBAAmB;AAE9B,YAAI,CAAC,aAAa;AACd,kBAAQ,kBAAkB,UAAU,GAAG,yEAAoE,UAAU,EAAE;AAAA,QAC3H;AAEA,aAAK,WAAW,IAAI,KAAK;AAAA,UACrB,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,UACP,eAAe;AAAA,QACnB,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,IAEQ,iBAAiB,KAAa;AAClC,YAAM,UAAU,KAAK,KAAK;AAAA,QACtB,oBAAoB,GAAG;AAAA,MAC3B;AACA,UAAI,CAAC,SAAS;AACV,gBAAQ,oBAAoB,oCAAoC,GAAG,GAAG;AACtE;AAAA,MACJ;AAEA,UAAI,QAAQ;AACZ,UAAI,WAAW;AAEf,UAAI,QAAQ,aAAa,YAAY,GAAG;AACpC,cAAM,SAAS,MAAM;AAAA,UACjB,QAAQ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAE3B,mBAAW,QAAQ,aAAa,qBAAqB;AAErD,YAAI,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG;AACxC,gBAAM,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO;AAE5C,cAAI,SAAS;AACT,kBAAM,OAAO,QAAQ,QAAQ,OAAO,GAAG,cAAc,MAAM;AAC3D,oBAAQ,MAAM,aAAa,KAAK,KAAK,QAAQ,SAAS;AAAA,UAC1D,OAAO;AACH,oBAAQ;AAAA,UACZ;AAAA,QACJ,OAAO;AACH,gBAAM,gBAAgB,OACjB,OAAO,CAAC,MAAM,EAAE,OAAO,EACvB,IAAI,CAAC,MAAM;AACR,kBAAM,OAAO,EAAE,QAAQ,OAAO,GAAG,cAAc,MAAM;AACrD,mBAAO,MAAM,aAAa,KAAK,KAAK,EAAE,SAAS;AAAA,UACnD,CAAC;AAEL,kBAAQ,cAAc,KAAK,GAAG;AAAA,QAClC;AAAA,MACJ,WACS,QAAQ,aAAa,qBAAqB,GAAG;AAClD,cAAM,WAAW,QAAQ;AAAA,UACrB;AAAA,QACJ;AAEA,YAAI,YAAY,CAAC,SAAS,UAAU;AAChC,qBAAW;AACX,kBAAQ,SAAS,UAAU,SAAS;AAAA,QACxC;AAAA,MACJ,WAEI,mBAAmB,oBACnB,mBAAmB,qBACnB,mBAAmB,qBACrB;AACE,mBAAW,QAAQ,aAAa,UAAU,KAAK,CAAC,QAAQ;AAExD,YAAI,mBAAmB,oBAAoB,QAAQ,SAAS,YAAY;AACpE,kBAAQ,QAAQ,UAAU,SAAS;AAAA,QACvC,OAAO;AACH,kBAAS,QAAuE,MAAM,KAAK;AAAA,QAC/F;AAAA,MACJ;AAEA,YAAM,cAAc,QAAQ,QAAqB,mBAAmB;AACpE,YAAM,aAAa,cACb,OAAO,YAAY,QAAQ,IAAI,IAC/B,KAAK,mBAAmB;AAE9B,YAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AACrC,UAAI,CAAC,OAAO;AACR,gBAAQ,oBAAoB,2BAA2B,GAAG,8BAAyB;AACnF;AAAA,MACJ;AAEA,YAAM,QAAQ;AACd,YAAM,WAAW;AACjB,YAAM,aAAa,IAAI;AAEvB,WAAK,WAAW,IAAI,KAAK,KAAK;AAE9B,WAAK,sBAAsB,UAAU;AAAA,IACzC;AAAA,IAEQ,sBAAsB,YAAoB;AAC9C,YAAM,YAAY,KAAK,MAAM;AAAA,QACzB,CAAC,SAAS,OAAO,KAAK,QAAQ,IAAI,MAAM;AAAA,MAC5C;AAEA,UAAI,cAAc,IAAI;AAClB,gBAAQ,kBAAkB,yCAAyC,UAAU,GAAG;AAChF;AAAA,MACJ;AAEA,YAAM,SAAS,KAAK,aAAa,SAAS;AAE1C,YAAM,aAAa,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAAE;AAAA,QACpD,CAAC,MAAM,EAAE,aAAa,MAAM;AAAA,MAChC;AAEA,iBAAW,QAAQ,CAAC,UAAU;AAC1B,cAAM,QAAQ,CAAC,OAAO,MAAM,YAAY,CAAC;AAAA,MAC7C,CAAC;AAAA,IACL;AAAA,IAEO,mBAAiC;AACpC,aAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,IAC9C;AAAA,IAEQ,eAAe,YAAoB;AACvC,YAAM,SAAS,UAAU,UAAU;AACnC,UAAI,CAAC,QAAQ;AACT,gBAAQ,kBAAkB,gCAAgC,UAAU,EAAE;AACtE;AAAA,MACJ;AAEA,UAAI,OAAO,SAAS;AAChB,cAAM,YAAY,KAAK,KAAK;AAAA,UACxB;AAAA,QACJ;AACA,YAAI,WAAW;AACX,oBAAU,cAAc,OAAO;AAAA,QACnC,OAAO;AACH,kBAAQ,kBAAkB,+CAA+C;AAAA,QAC7E;AAAA,MACJ;AAEA,UAAI,OAAO,YAAY;AACnB,cAAM,eAAe,KAAK,KAAK;AAAA,UAC3B;AAAA,QACJ;AACA,YAAI,cAAc;AACd,uBAAa,cAAc,OAAO;AAAA,QACtC,OAAO;AACH,kBAAQ,kBAAkB,kDAAkD;AAAA,QAChF;AAAA,MACJ;AAEA,UAAI,OAAO,SAAS;AAChB,cAAM,YAAY,KAAK,KAAK;AAAA,UACxB;AAAA,QACJ;AACA,YAAI,WAAW;AACX,oBAAU,cAAc,OAAO;AAAA,QACnC,OAAO;AACH,kBAAQ,kBAAkB,+CAA+C;AAAA,QAC7E;AAAA,MACJ;AAAA,IACJ;AAAA,IAEQ,oBAAoB;AACxB,WAAK,WAAW,QAAQ,CAAC,QAAQ,QAAQ;AACrC,aAAK,iBAAiB,GAAG;AAAA,MAC7B,CAAC;AAAA,IACL;AAAA,IAEQ,wBAAwB;AAC5B,YAAM,YAAY,KAAK,iBAAiB;AACxC,YAAM,cAAc,SAAS,eAAe,0BAA0B;AAEtE,UAAI,CAAC,aAAa;AACd,iBAAS,UAAU,0DAA0D;AAC7E;AAAA,MACJ;AAEA,gBAAU,QAAQ,CAAC,UAAU;AACzB,cAAM,WAAW,aAAa,cAE5B,iBAAiB,MAAM,YAAY,CAAC,IAAI;AAE1C,YAAI,CAAC,UAAU;AACX,kBAAQ,UAAU,sCAAsC,MAAM,YAAY,CAAC,GAAG;AAC9E;AAAA,QACJ;AAEA,YACI,oBAAoB,oBACpB,SAAS,UACX;AACE;AAAA,QACJ;AAEA,YAAI,oBAAoB,kBAAkB;AACtC,cAAI,SAAS,SAAS,YAAY;AAC9B,qBAAS,UAAU,MAAM,UAAU;AAAA,UACvC,WAAW,SAAS,SAAS,SAAS;AAClC,qBAAS,UAAU,SAAS,UAAU,MAAM;AAAA,UAChD,OAAO;AACH,qBAAS,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACJ,OAAO;AACH,mBAAS,QAAQ,MAAM;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IAEQ,uBAA6C;AAEjD,YAAM,cAAc,KAAK,WAAW,IAAI,cAAc,GAAG,SAAS;AAElE,YAAM,WAAW,KAAK,WAAW,IAAI,UAAU,GAAG,SAAS;AAE3D,aAAO,iBAAiB;AAAA,QAEpB,CAAC,UAAU,MAAM,SAAS,kBAAkB,MAAM,SAAS;AAAA,MAE/D,KAAK,iBAAiB;AAAA,QAElB,CAAC,UAAU,MAAM,SAAS,cAAc,MAAM,SAAS;AAAA,MAE3D,KAAK;AAAA,IAET;AAAA,IAEQ,oBAAoB;AACxB,YAAM,YAAY,SAAS,cAA2B,qBAAqB;AAC3E,UAAI,CAAC,WAAW;AACZ,iBAAS,YAAY,8CAA8C;AACnE;AAAA,MACJ;AAEA,YAAM,QAAQ,KAAK,qBAAqB;AAExC,UAAI,CAAC,OAAO;AACR,kBAAU,aAAa,4BAA4B,OAAO;AAC1D,kBAAU,YAAY;AAEtB,cAAMC,SAAQ,SAAS,iBAA8B,4BAA4B;AACjF,QAAAA,OAAM,QAAQ,CAAC,OAAO,GAAG,aAAa,4BAA4B,MAAM,CAAC;AAEzE;AAAA,MACJ;AAEA,gBAAU,aAAa,4BAA4B,MAAM;AACzD,gBAAU,YAAY;AAEtB,YAAM,QAAQ,SAAS,iBAA8B,4BAA4B;AACjF,YAAM,QAAQ,CAAC,OAAO,GAAG,aAAa,4BAA4B,OAAO,CAAC;AAG1E,YAAM,YAAY,KAAK,WAAW,IAAI,YAAY,GAAG,SAAS;AAC9D,YAAM,WAAW,KAAK,WAAW,IAAI,WAAW,GAAG,SAAS;AAC5D,YAAM,QAAQ,KAAK,WAAW,IAAI,OAAO,GAAG,SAAS;AAErD,YAAM,gBAAgB,IAAI,gBAAgB;AAC1C,UAAI,UAAW,eAAc,IAAI,aAAa,SAAS;AACvD,UAAI,SAAU,eAAc,IAAI,YAAY,QAAQ;AACpD,UAAI,MAAO,eAAc,IAAI,SAAS,KAAK;AAE3C,YAAM,YAAY,MAAM,WAAW,EAAE,SAAS,GAAG,IAAI,MAAM;AAC3D,YAAM,WAAW,cAAc,SAAS,IAClC,GAAG,MAAM,WAAW,CAAC,GAAG,SAAS,GAAG,cAAc,SAAS,CAAC,KAC5D,MAAM,WAAW;AAGvB,YAAM,cAAc,SAAS,cAAc,KAAK;AAChD,kBAAY,YAAY;AACxB,kBAAY,aAAa,YAAY,QAAQ;AAC7C,gBAAU,YAAY,WAAW;AAEjC,YAAM,YACF;AAEJ,YAAM,iBAAiB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC5B;AACA,UAAI,gBAAgB;AAChB,uBAAe,OAAO;AAAA,MAC1B;AAEA,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,MAAM;AAEb,aAAO,iBAAiB,SAAS,CAAC,QAAQ;AACtC,iBAAS,YAAY,2CAA2C,GAAG;AAAA,MACvE,CAAC;AAED,gBAAU,YAAY,MAAM;AAAA,IAChC;AAAA,IAEQ,gBAAgB,YAAoB;AACxC,YAAM,SAAS,YAAY,UAAU;AACrC,UAAI,CAAC,QAAQ;AACT,gBAAQ,mBAAmB,kCAAkC,UAAU,EAAE;AACzE;AAAA,MACJ;AAEA,aAAO,QAAQ,CAAC,EAAE,UAAU,UAAU,MAAM,MAAM;AAC9C,cAAM,MAAM,SAAS,iBAA8B,QAAQ;AAC3D,YAAI,IAAI,WAAW,GAAG;AAClB,kBAAQ,mBAAmB,aAAa,QAAQ,sBAAsB;AAAA,QAC1E;AACA,YAAI,QAAQ,CAAC,OAAO;AAChB,aAAG,MAAM,YAAY,UAAU,KAAK;AAAA,QACxC,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,IAEQ,yBAAyB;AAC7B,YAAM,cAAc,KAAK,WAAW,IAAI,cAAc,GAAG,SAAS;AAClE,YAAM,KAAK,SAAS,eAAe,uBAAuB;AAE1D,UAAI,CAAC,IAAI;AACL,gBAAQ,iBAAiB,kDAAkD;AAC3E;AAAA,MACJ;AAEA,SAAG,QAAQ,gBAAgB,qCAAqC,cAAc;AAAA,IAClF;AAAA,EAEJ;AAGA,WAAS,iBAAiB,oBAAoB,MAAM;AAChD,UAAM,OAAO,SAAS,cAA+B,mBAAmB;AAExE,QAAI,CAAC,MAAM;AACP,eAAS,QAAQ,mFAA8E;AAC/F;AAAA,IACJ;AAEA,QAAI;AAEJ,QAAI;AACA,qBAAe,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAAA,IAClD,SAAS,KAAK;AACV,eAAS,QAAQ,yCAAyC,GAAG;AAC7D,qBAAe,oBAAI,IAAI;AAAA,IAC3B;AAEA,QAAI;AACA,YAAM,MAAM,IAAI,cAAc,MAAM,YAAY;AAChD,MAAC,OAAe,MAAM;AAAA,IAC1B,SAAS,KAAK;AACV,eAAS,QAAQ,oCAAoC,GAAG;AAAA,IAC5D;AAAA,EACJ,CAAC;",
6
6
  "names": ["errorEl", "tyEls"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ /* src/form/pricing.css */
2
+ /*# sourceMappingURL=pricing.css.map */