aw-wizard-forms 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"wizard-form.min.js","sources":["../src/adapters/hubspot.ts","../src/adapters/webhook.ts","../src/adapters/revenuehero.ts","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/controllers/FormStateController.ts","../src/controllers/KeyboardController.ts","../src/components/wf-badge.ts","../src/components/wizard-form.ts","../src/components/wf-step.ts","../src/components/wf-options.ts","../src/components/wf-option.ts","../src/controllers/ValidationController.ts","../src/components/wf-field.ts","../src/components/wf-email.ts","../src/components/wf-input.ts","../src/components/wf-number.ts","../src/init.ts","../src/components/wf-textarea.ts","../src/components/wf-layout.ts","../src/components/wf-progress.ts","../src/components/wf-thank-you.ts"],"sourcesContent":["/**\n * HubSpot Adapter - Submit form data to HubSpot Forms API\n *\n * This adapter formats the payload for HubSpot's Forms API v3.\n * The consumer website loads the HubSpot tracking script separately.\n *\n * @example\n * const adapter = createHubSpotAdapter({\n * portalId: '12345678',\n * formId: 'abc-123-def',\n * fieldMapping: { fullName: 'firstname' }\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n HubSpotConfig,\n HubSpotSubmissionPayload,\n HubSpotField,\n} from './types.js';\n\n/**\n * Get HubSpot tracking cookie (hutk)\n */\nexport function getHubSpotCookie(): string | undefined {\n if (typeof document === 'undefined') {return undefined;}\n\n const match = document.cookie.match(/hubspotutk=([^;]+)/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Create a HubSpot submission adapter\n */\nexport function createHubSpotAdapter(config: HubSpotConfig): SubmissionAdapter {\n const { portalId, formId, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'hubspot',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, formData: data } };\n }\n\n const endpoint = `https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`;\n\n // Map fields to HubSpot format\n const mappedData = this.mapFields(data);\n const fields: HubSpotField[] = Object.entries(mappedData).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(';') : String(value ?? ''),\n }));\n\n const payload: HubSpotSubmissionPayload = {\n fields,\n context: {\n pageUri: context.pageUrl,\n pageName: context.pageTitle,\n hutk: getHubSpotCookie(),\n },\n };\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage =\n errorData.message || `HubSpot submission failed: ${response.status}`;\n return { success: false, error: errorMessage };\n }\n\n const responseData = await response.json();\n return { success: true, data: responseData };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Network error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { HubSpotConfig };\n","/**\n * Webhook Adapter - Submit form data to any webhook endpoint\n *\n * A generic adapter for sending form data to any HTTP endpoint.\n *\n * @example\n * const adapter = createWebhookAdapter({\n * url: 'https://api.example.com/forms',\n * headers: { 'Authorization': 'Bearer token' }\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n WebhookConfig,\n} from './types.js';\n\n/**\n * Create a webhook submission adapter\n */\nexport function createWebhookAdapter(config: WebhookConfig): SubmissionAdapter {\n const { url, method = 'POST', headers = {}, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'webhook',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, formData: data } };\n }\n\n if (!url) {\n return { success: false, error: 'Webhook URL is required' };\n }\n\n const mappedData = this.mapFields(data);\n\n const payload = {\n formData: mappedData,\n context: {\n pageUrl: context.pageUrl,\n pageTitle: context.pageTitle,\n referrer: context.referrer,\n submittedAt: context.timestamp,\n },\n };\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n return {\n success: false,\n error: `Webhook failed: ${response.status} ${errorText}`.trim(),\n };\n }\n\n // Try to parse JSON response, fall back to success with no data\n let responseData: unknown;\n try {\n responseData = await response.json();\n } catch {\n responseData = { status: response.status };\n }\n\n return { success: true, data: responseData };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Network error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { WebhookConfig };\n","/**\n * RevenueHero Adapter - Trigger RevenueHero calendar scheduling\n *\n * This adapter triggers the RevenueHero scheduler after form submission.\n * The consumer website loads the RevenueHero SDK separately.\n *\n * @example\n * const adapter = createRevenueHeroAdapter({\n * routerId: 'your-router-id'\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n RevenueHeroConfig,\n} from './types.js';\n\n/**\n * Check if RevenueHero SDK is loaded\n */\nexport function isRevenueHeroLoaded(): boolean {\n return typeof window !== 'undefined' && typeof window.RevenueHero !== 'undefined';\n}\n\n/**\n * Create a RevenueHero submission adapter\n *\n * Note: This adapter triggers the RevenueHero scheduler but doesn't\n * submit data to a backend. Use it in combination with another adapter\n * (like HubSpot or webhook) for data persistence.\n */\nexport function createRevenueHeroAdapter(config: RevenueHeroConfig): SubmissionAdapter {\n const { routerId, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'revenuehero',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, _context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, scheduled: true } };\n }\n\n if (!routerId) {\n return { success: false, error: 'RevenueHero router ID is required' };\n }\n\n // Check if SDK is loaded\n if (!isRevenueHeroLoaded()) {\n console.warn(\n '[RevenueHeroAdapter] RevenueHero SDK not loaded. ' +\n 'Load the SDK in your page: <script src=\"https://app.revenuehero.io/js/widget.js\"></script>'\n );\n return {\n success: false,\n error: 'RevenueHero SDK not loaded. Please load the SDK in your page.',\n };\n }\n\n const mappedData = this.mapFields(data);\n\n // Extract email (required for RevenueHero)\n const email = String(mappedData.email || mappedData.workEmail || '');\n if (!email) {\n return { success: false, error: 'Email is required for RevenueHero scheduling' };\n }\n\n try {\n // Trigger RevenueHero scheduler\n window.RevenueHero!.schedule({\n routerId,\n email,\n ...mappedData,\n });\n\n return {\n success: true,\n data: { scheduled: true, email },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'RevenueHero error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { RevenueHeroConfig };\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * FormStateController - Centralized state management for wizard forms\n *\n * Uses Lit's ReactiveController pattern for automatic re-rendering\n * when state changes.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport type { FormState, FieldValidation, ValidationResult, StepConfig } from '../types.js';\n\ntype StateSubscriber = (state: FormState) => void;\n\nexport class FormStateController implements ReactiveController {\n host: ReactiveControllerHost;\n\n // Internal state\n private _formData: Record<string, unknown> = {};\n private _validation: Record<string, FieldValidation> = {};\n private _currentStep = 1;\n private _totalSteps = 0;\n private _submitting = false;\n private _submitted = false;\n private _error?: string;\n private _stepConfigs: Map<number, StepConfig> = new Map();\n private _subscribers: Set<StateSubscriber> = new Set();\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n hostConnected(): void {\n // Controller connected to host\n }\n\n hostDisconnected(): void {\n // Clean up subscriptions\n this._subscribers.clear();\n }\n\n // ============================================\n // State Getters\n // ============================================\n\n get formData(): Record<string, unknown> {\n return { ...this._formData };\n }\n\n get validation(): Record<string, FieldValidation> {\n return { ...this._validation };\n }\n\n get currentStep(): number {\n return this._currentStep;\n }\n\n get totalSteps(): number {\n return this._totalSteps;\n }\n\n get submitting(): boolean {\n return this._submitting;\n }\n\n get submitted(): boolean {\n return this._submitted;\n }\n\n get error(): string | undefined {\n return this._error;\n }\n\n get state(): FormState {\n return {\n formData: this.formData,\n validation: this.validation,\n currentStep: this._currentStep,\n totalSteps: this._totalSteps,\n submitting: this._submitting,\n submitted: this._submitted,\n error: this._error,\n };\n }\n\n // ============================================\n // State Mutations\n // ============================================\n\n setValue(name: string, value: unknown): void {\n this._formData[name] = value;\n\n // Mark field as dirty\n if (this._validation[name]) {\n this._validation[name] = {\n ...this._validation[name],\n value,\n dirty: true,\n };\n } else {\n this._validation[name] = {\n name,\n value,\n result: { valid: true },\n touched: false,\n dirty: true,\n };\n }\n\n this._notifyChange();\n }\n\n getValue(name: string): unknown {\n return this._formData[name];\n }\n\n setValidation(name: string, result: ValidationResult): void {\n const existing = this._validation[name];\n this._validation[name] = {\n name,\n value: existing?.value ?? this._formData[name],\n result,\n touched: existing?.touched ?? false,\n dirty: existing?.dirty ?? false,\n };\n this._notifyChange();\n }\n\n markTouched(name: string): void {\n if (this._validation[name]) {\n this._validation[name] = {\n ...this._validation[name],\n touched: true,\n };\n } else {\n this._validation[name] = {\n name,\n value: this._formData[name],\n result: { valid: true },\n touched: true,\n dirty: false,\n };\n }\n this._notifyChange();\n }\n\n // ============================================\n // Step Management\n // ============================================\n\n setTotalSteps(total: number): void {\n this._totalSteps = total;\n this._notifyChange();\n }\n\n setStepConfig(step: number, config: StepConfig): void {\n this._stepConfigs.set(step, config);\n }\n\n getStepConfig(step: number): StepConfig | undefined {\n return this._stepConfigs.get(step);\n }\n\n getStepFields(step: number): string[] {\n return this._stepConfigs.get(step)?.fields ?? [];\n }\n\n goToStep(step: number): boolean {\n if (step < 1 || step > this._totalSteps) {\n return false;\n }\n\n // Check for skip conditions\n const config = this._stepConfigs.get(step);\n if (config?.skipIf?.(this._formData)) {\n // Skip this step, try next/previous\n if (step > this._currentStep) {\n return this.goToStep(step + 1);\n } else {\n return this.goToStep(step - 1);\n }\n }\n\n this._currentStep = step;\n this._notifyChange();\n return true;\n }\n\n nextStep(): boolean {\n return this.goToStep(this._currentStep + 1);\n }\n\n previousStep(): boolean {\n return this.goToStep(this._currentStep - 1);\n }\n\n isFirstStep(): boolean {\n return this._currentStep === 1;\n }\n\n isLastStep(): boolean {\n return this._currentStep === this._totalSteps;\n }\n\n // ============================================\n // Validation Helpers\n // ============================================\n\n isStepValid(step: number): boolean {\n const fields = this.getStepFields(step);\n return fields.every((name) => {\n const validation = this._validation[name];\n return !validation || validation.result.valid;\n });\n }\n\n isCurrentStepValid(): boolean {\n return this.isStepValid(this._currentStep);\n }\n\n getFieldError(name: string): string | undefined {\n const validation = this._validation[name];\n if (validation?.touched && !validation.result.valid) {\n return validation.result.error;\n }\n return undefined;\n }\n\n hasFieldError(name: string): boolean {\n return this.getFieldError(name) !== undefined;\n }\n\n // ============================================\n // Submission State\n // ============================================\n\n setSubmitting(submitting: boolean): void {\n this._submitting = submitting;\n this._notifyChange();\n }\n\n setSubmitted(submitted: boolean): void {\n this._submitted = submitted;\n this._notifyChange();\n }\n\n setError(error: string | undefined): void {\n this._error = error;\n this._notifyChange();\n }\n\n // ============================================\n // Reset\n // ============================================\n\n reset(): void {\n this._formData = {};\n this._validation = {};\n this._currentStep = 1;\n this._submitting = false;\n this._submitted = false;\n this._error = undefined;\n this._notifyChange();\n }\n\n // ============================================\n // Subscriptions\n // ============================================\n\n subscribe(callback: StateSubscriber): () => void {\n this._subscribers.add(callback);\n return () => {\n this._subscribers.delete(callback);\n };\n }\n\n private _notifyChange(): void {\n // Request host update\n this.host.requestUpdate();\n\n // Notify subscribers\n const state = this.state;\n this._subscribers.forEach((callback) => {\n try {\n callback(state);\n } catch (error) {\n console.error('[FormStateController] Subscriber error:', error);\n }\n });\n }\n}\n","/**\n * KeyboardController - Global keyboard shortcut management\n *\n * Handles Enter, Escape, and other keyboard navigation for wizard forms.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nexport interface KeyboardConfig {\n onEnter?: () => void;\n onEscape?: () => void;\n onArrowUp?: () => void;\n onArrowDown?: () => void;\n onArrowLeft?: () => void;\n onArrowRight?: () => void;\n /** Whether to prevent Enter on textareas (default: true) */\n blockEnterOnTextarea?: boolean;\n}\n\nexport class KeyboardController implements ReactiveController {\n host: ReactiveControllerHost & HTMLElement;\n private _config: KeyboardConfig;\n private _enabled = true;\n private _boundHandler: (e: KeyboardEvent) => void;\n\n constructor(host: ReactiveControllerHost & HTMLElement, config: KeyboardConfig = {}) {\n this.host = host;\n this._config = {\n blockEnterOnTextarea: true,\n ...config,\n };\n this._boundHandler = this._handleKeydown.bind(this);\n host.addController(this);\n }\n\n hostConnected(): void {\n // Listen on the host element\n this.host.addEventListener('keydown', this._boundHandler);\n // Also listen on document for global shortcuts\n document.addEventListener('keydown', this._boundHandler);\n }\n\n hostDisconnected(): void {\n this.host.removeEventListener('keydown', this._boundHandler);\n document.removeEventListener('keydown', this._boundHandler);\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n if (!this._enabled) {return;}\n\n // Get active element, accounting for shadow DOM\n const activeElement = this._getActiveElement();\n const isTextarea = activeElement?.tagName === 'TEXTAREA';\n const isInput = activeElement?.tagName === 'INPUT';\n const isContentEditable = activeElement?.getAttribute('contenteditable') === 'true';\n const isTextInput = isTextarea || isInput || isContentEditable;\n\n switch (e.key) {\n case 'Enter':\n // Block Enter on textareas if configured\n if (isTextarea && this._config.blockEnterOnTextarea) {\n return;\n }\n // Allow Enter on inputs and other elements\n if (this._config.onEnter) {\n e.preventDefault();\n this._config.onEnter();\n }\n break;\n\n case 'Escape':\n if (this._config.onEscape) {\n e.preventDefault();\n this._config.onEscape();\n }\n break;\n\n case 'ArrowUp':\n if (!isTextInput && this._config.onArrowUp) {\n e.preventDefault();\n this._config.onArrowUp();\n }\n break;\n\n case 'ArrowDown':\n if (!isTextInput && this._config.onArrowDown) {\n e.preventDefault();\n this._config.onArrowDown();\n }\n break;\n\n case 'ArrowLeft':\n if (!isTextInput && this._config.onArrowLeft) {\n e.preventDefault();\n this._config.onArrowLeft();\n }\n break;\n\n case 'ArrowRight':\n if (!isTextInput && this._config.onArrowRight) {\n e.preventDefault();\n this._config.onArrowRight();\n }\n break;\n }\n }\n\n /**\n * Get the actual active element, traversing shadow DOMs\n */\n private _getActiveElement(): Element | null {\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n return active;\n }\n\n /**\n * Update keyboard config\n */\n updateConfig(config: Partial<KeyboardConfig>): void {\n this._config = { ...this._config, ...config };\n }\n\n /**\n * Enable keyboard shortcuts\n */\n enable(): void {\n this._enabled = true;\n }\n\n /**\n * Disable keyboard shortcuts\n */\n disable(): void {\n this._enabled = false;\n }\n\n /**\n * Check if keyboard shortcuts are enabled\n */\n get enabled(): boolean {\n return this._enabled;\n }\n}\n","/**\n * WF-Badge - Keyboard shortcut badge component for wizard forms\n *\n * A reusable badge component with multiple variants for displaying keyboard shortcuts.\n *\n * @example\n * <wf-badge shortcut=\"A\"></wf-badge>\n * <wf-badge shortcut=\"Enter\" variant=\"selected\"></wf-badge>\n * <wf-badge shortcut=\"↵\" variant=\"button\"></wf-badge>\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nexport type BadgeVariant = 'default' | 'selected' | 'button' | 'button-secondary';\n\n@customElement('wf-badge')\nexport class WfBadge extends LitElement {\n static styles = css`\n :host {\n display: inline-flex;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 24px;\n height: 24px;\n padding: var(--wf-spacing-1, 4px) var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-xs, 0.75rem);\n font-weight: 500;\n font-family: inherit;\n text-transform: uppercase;\n flex-shrink: 0;\n line-height: 1;\n }\n\n /* Default variant - unselected options */\n .wf-badge--default {\n background-color: var(--wf-color-badge-bg, #fcfcfc);\n border: 1px solid var(--wf-color-badge-border, #d4d4d4);\n border-radius: var(--wf-radius-sm, 4px);\n color: var(--wf-color-badge-text, #5f5f5f);\n }\n\n /* Selected variant - selected options */\n .wf-badge--selected {\n background-color: var(--wf-color-primary, #8040f0);\n border: 1px solid var(--wf-color-primary, #8040f0);\n border-radius: var(--wf-radius-sm, 4px);\n color: white;\n }\n\n /* Button variant - primary buttons (transparent) */\n .wf-badge--button {\n background-color: transparent;\n border: none;\n border-radius: var(--wf-radius-sm, 4px);\n color: rgba(255, 255, 255, 0.65);\n }\n\n /* Button-secondary variant - back button (transparent like primary) */\n .wf-badge--button-secondary {\n background-color: transparent;\n border: none;\n border-radius: var(--wf-radius-sm, 4px);\n color: var(--wf-color-text-muted, #5f5f5f);\n }\n `;\n\n /**\n * The text to display in the badge (e.g., 'A', 'Enter', '↵')\n */\n @property({ type: String })\n shortcut = '';\n\n /**\n * Visual variant of the badge\n */\n @property({ type: String })\n variant: BadgeVariant = 'default';\n\n render() {\n return html`\n <span\n class=\"wf-badge wf-badge--${this.variant}\"\n aria-hidden=\"true\"\n >\n ${this.shortcut}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-badge': WfBadge;\n }\n}\n","/**\n * Wizard-Form - Main orchestrator component\n *\n * Manages multi-step form flow, validation, and submission.\n *\n * @example\n * <wizard-form hubspot-portal=\"12345\" hubspot-form=\"abc-123\">\n * <wf-step data-step=\"1\">...</wf-step>\n * <wf-step data-step=\"2\">...</wf-step>\n * <wf-success>Thank you!</wf-success>\n * </wizard-form>\n */\n\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { FormStateController } from '../controllers/FormStateController.js';\nimport { KeyboardController } from '../controllers/KeyboardController.js';\nimport type { WfStep } from './wf-step.js';\nimport type { Theme, HubSpotSubmissionData } from '../types.js';\n// Import wf-badge for button shortcuts\nimport './wf-badge.js';\n\n// Event detail types\nexport interface StepChangeDetail {\n from: number;\n to: number;\n direction: 'forward' | 'backward';\n}\n\nexport interface FieldChangeDetail {\n name: string;\n value: unknown;\n formData: Record<string, unknown>;\n}\n\nexport interface SubmitDetail {\n formData: Record<string, unknown>;\n}\n\nexport interface SuccessDetail {\n formData: Record<string, unknown>;\n response?: unknown;\n}\n\nexport interface ErrorDetail {\n error: string;\n formData?: Record<string, unknown>;\n}\n\n@customElement('wizard-form')\nexport class WizardForm extends LitElement {\n static styles = css`\n :host {\n display: block;\n --wf-color-primary: #8040f0;\n --wf-color-primary-border: #602cbb;\n --wf-color-primary-light: rgba(128, 64, 240, 0.08);\n --wf-color-surface: #f3f3f5;\n --wf-color-surface-hover: #e9e9eb;\n --wf-color-border: #d4d4d4;\n --wf-color-text: #0a0a0a;\n --wf-color-text-secondary: #404040;\n --wf-color-text-muted: #646464;\n --wf-color-error: #dc3545;\n --wf-color-badge-bg: #fcfcfc;\n --wf-color-badge-border: #d4d4d4;\n --wf-color-badge-text: #5f5f5f;\n --wf-color-progress-active: rgba(139, 139, 139, 0.6);\n --wf-color-progress-inactive: rgba(217, 217, 217, 0.6);\n --wf-spacing-1: 4px;\n --wf-spacing-2: 8px;\n --wf-spacing-3: 12px;\n --wf-spacing-4: 16px;\n --wf-spacing-5: 20px;\n --wf-spacing-6: 24px;\n --wf-spacing-8: 32px;\n --wf-radius-sm: 4px;\n --wf-radius-md: 8px;\n --wf-radius-lg: 8px;\n --wf-radius-full: 99px;\n /* Typography Scale (Major Third based, 16px = 1rem) */\n --wf-font-size-xs: 0.75rem; /* 12px - badges, captions */\n --wf-font-size-sm: 0.875rem; /* 14px - labels, hints */\n --wf-font-size-base: 1rem; /* 16px - body, inputs */\n --wf-font-size-lg: 1.25rem; /* 20px - buttons */\n --wf-font-size-xl: 1.5rem; /* 24px - subtitles */\n --wf-font-size-2xl: 2rem; /* 32px - small headings */\n --wf-font-size-3xl: 2.5rem; /* 40px - main headings */\n --wf-input-min-height: 56px;\n }\n\n /* Dark theme */\n :host([theme='dark']) {\n --wf-color-surface: #2d2d2d;\n --wf-color-surface-hover: #3d3d3d;\n --wf-color-border: #4d4d4d;\n --wf-color-text: #f8f9fa;\n --wf-color-text-secondary: #d0d0d0;\n --wf-color-text-muted: #adb5bd;\n --wf-color-badge-bg: #3d3d3d;\n --wf-color-badge-border: #4d4d4d;\n --wf-color-badge-text: #adb5bd;\n --wf-color-progress-active: rgba(200, 200, 200, 0.6);\n --wf-color-progress-inactive: rgba(100, 100, 100, 0.6);\n }\n\n /* Auto theme (respects system preference) */\n @media (prefers-color-scheme: dark) {\n :host([theme='auto']) {\n --wf-color-surface: #2d2d2d;\n --wf-color-surface-hover: #3d3d3d;\n --wf-color-border: #4d4d4d;\n --wf-color-text: #f8f9fa;\n --wf-color-text-secondary: #d0d0d0;\n --wf-color-text-muted: #adb5bd;\n --wf-color-badge-bg: #3d3d3d;\n --wf-color-badge-border: #4d4d4d;\n --wf-color-badge-text: #adb5bd;\n --wf-color-progress-active: rgba(200, 200, 200, 0.6);\n --wf-color-progress-inactive: rgba(100, 100, 100, 0.6);\n }\n }\n\n .wf-container {\n margin: 0 auto;\n }\n\n .wf-progress {\n display: flex;\n gap: var(--wf-spacing-4, 16px);\n margin-top: var(--wf-spacing-6, 24px);\n }\n\n .wf-progress-segment {\n width: 32px;\n height: 8px;\n background-color: var(--wf-color-progress-inactive, rgba(217, 217, 217, 0.6));\n border-radius: var(--wf-radius-full, 99px);\n transition: background-color 300ms ease;\n }\n\n .wf-progress-segment.completed {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n }\n\n .wf-progress-segment.active {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n }\n\n .wf-steps-container {\n min-height: 200px;\n }\n\n .wf-navigation {\n display: flex;\n justify-content: space-between;\n gap: var(--wf-spacing-4, 16px);\n margin-top: var(--wf-spacing-6, 24px);\n }\n\n .wf-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wf-spacing-2, 8px);\n padding: var(--wf-spacing-3, 12px) var(--wf-spacing-4, 16px);\n min-height: 48px;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 600;\n font-family: inherit;\n border-radius: var(--wf-radius-md, 8px);\n cursor: pointer;\n transition: all 150ms ease;\n border: 1px solid transparent;\n outline: none;\n }\n\n .wf-btn:focus-visible {\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.3);\n }\n\n .wf-btn-back {\n background-color: var(--wf-color-surface, #f3f3f5);\n border: 1px solid var(--wf-color-border, #d4d4d4);\n color: var(--wf-color-text, #0a0a0a);\n }\n\n .wf-btn-back:hover:not(:disabled) {\n background-color: var(--wf-color-surface-hover, #e9e9eb);\n }\n\n .wf-btn-next {\n flex: 1;\n background-color: var(--wf-color-primary, #8040f0);\n border: 1px solid var(--wf-color-primary-border, #602cbb);\n color: white;\n margin-left: auto;\n position: relative;\n }\n\n .wf-btn-next:hover:not(:disabled) {\n filter: brightness(1.1);\n }\n\n .wf-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-btn-shortcut {\n position: absolute;\n right: var(--wf-spacing-4, 16px);\n display: inline-flex;\n align-items: center;\n gap: 2px;\n }\n\n .wf-btn-back .wf-btn-shortcut {\n position: static;\n }\n\n /* Success screen styles */\n .wf-success-screen {\n text-align: center;\n padding: var(--wf-spacing-6, 24px);\n }\n\n /* Loading spinner */\n .wf-loading {\n display: inline-block;\n width: 20px;\n height: 20px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n border-top-color: white;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n /* Error message */\n .wf-form-error {\n padding: var(--wf-spacing-4, 16px);\n margin-bottom: var(--wf-spacing-4, 16px);\n background-color: rgba(220, 53, 69, 0.1);\n border: 1px solid var(--wf-color-error, #dc3545);\n border-radius: var(--wf-radius-md, 8px);\n color: var(--wf-color-error, #dc3545);\n font-size: var(--wf-font-size-base, 1rem);\n }\n `;\n\n // ============================================\n // Properties\n // ============================================\n\n /**\n * HubSpot portal ID\n */\n @property({ type: String, attribute: 'hubspot-portal' })\n hubspotPortal = '';\n\n /**\n * HubSpot form ID\n */\n @property({ type: String, attribute: 'hubspot-form' })\n hubspotForm = '';\n\n /**\n * Color theme\n */\n @property({ type: String, reflect: true })\n theme: Theme = 'light';\n\n /**\n * Mock submission mode (for testing)\n */\n @property({ type: Boolean })\n mock = false;\n\n /**\n * Show progress bar\n */\n @property({ type: Boolean, attribute: 'show-progress' })\n showProgress = false;\n\n /**\n * Auto-advance after single-select option\n */\n @property({ type: Boolean, attribute: 'auto-advance' })\n autoAdvance = true;\n\n /**\n * Hide the back button in navigation\n */\n @property({ type: Boolean, attribute: 'hide-back' })\n hideBack = true;\n\n // ============================================\n // State\n // ============================================\n\n @state()\n private _steps: WfStep[] = [];\n\n @state()\n private _currentStep = 1;\n\n @state()\n private _totalSteps = 0;\n\n @state()\n private _formData: Record<string, unknown> = {};\n\n @state()\n private _submitting = false;\n\n @state()\n private _submitted = false;\n\n @state()\n private _error = '';\n\n // ============================================\n // Controllers\n // ============================================\n\n private _stateController = new FormStateController(this);\n\n constructor() {\n super();\n\n // Initialize keyboard controller (attaches to host automatically)\n new KeyboardController(this, {\n onEnter: () => this._handleEnter(),\n onEscape: () => this._handleEscape(),\n });\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('wf-change', this._handleFieldChange as EventListener);\n this.addEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('wf-change', this._handleFieldChange as EventListener);\n this.removeEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n }\n\n firstUpdated(): void {\n this._discoverSteps();\n this._showCurrentStep();\n }\n\n // ============================================\n // Rendering\n // ============================================\n\n render() {\n if (this._submitted) {\n return html`\n <div class=\"wf-container\">\n <div class=\"wf-success-screen\">\n <slot name=\"success\">\n <h2>Thank you!</h2>\n <p>Your submission has been received.</p>\n </slot>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"wf-container\">\n ${this._error\n ? html`<div class=\"wf-form-error\" role=\"alert\">${this._error}</div>`\n : nothing}\n\n <div class=\"wf-steps-container\">\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n\n ${this._renderNavigation()}\n </div>\n `;\n }\n\n private _renderProgress() {\n const segments = [];\n for (let i = 1; i <= this._totalSteps; i++) {\n const completed = i < this._currentStep;\n const active = i === this._currentStep;\n segments.push(html`\n <div\n class=\"wf-progress-segment ${completed ? 'completed' : ''} ${active ? 'active' : ''}\"\n ></div>\n `);\n }\n return html`<div class=\"wf-progress\">${segments}</div>`;\n }\n\n private _renderNavigation() {\n const isFirst = this._currentStep === 1;\n const isLast = this._currentStep === this._totalSteps;\n const showBack = !this.hideBack && !isFirst;\n\n return html`\n <div class=\"wf-navigation\">\n ${showBack\n ? html`\n <button\n class=\"wf-btn wf-btn-back\"\n @click=\"${this._goBack}\"\n ?disabled=\"${this._submitting}\"\n data-testid=\"wf-back-btn\"\n >\n <span class=\"wf-btn-shortcut\"><wf-badge shortcut=\"Esc\" variant=\"button-secondary\"></wf-badge></span>\n Back\n </button>\n `\n : nothing}\n\n <button\n class=\"wf-btn wf-btn-next\"\n @click=\"${this._goNext}\"\n ?disabled=\"${this._submitting}\"\n data-testid=\"wf-next-btn\"\n >\n ${this._submitting\n ? html`<span class=\"wf-loading\"></span>`\n : isLast\n ? 'Submit'\n : 'Continue'}\n <span class=\"wf-btn-shortcut\"><wf-badge shortcut=\"Enter ↵\" variant=\"button\"></wf-badge></span>\n </button>\n </div>\n `;\n }\n\n // ============================================\n // Step Discovery\n // ============================================\n\n private _handleSlotChange(): void {\n this._discoverSteps();\n this._showCurrentStep();\n }\n\n private _discoverSteps(): void {\n const slot = this.shadowRoot?.querySelector('slot:not([name])');\n if (!slot) {return;}\n\n const elements = (slot as HTMLSlotElement).assignedElements({ flatten: true });\n this._steps = elements.filter(\n (el): el is WfStep => el.tagName.toLowerCase() === 'wf-step'\n );\n\n // Auto-assign step numbers based on DOM order (1-indexed)\n // This makes data-step attribute optional\n this._steps.forEach((step, index) => {\n step.step = index + 1;\n });\n\n this._totalSteps = this._steps.length;\n this._stateController.setTotalSteps(this._totalSteps);\n\n // Emit event for external progress components\n this.dispatchEvent(\n new CustomEvent('wf:steps-discovered', {\n detail: {\n totalSteps: this._totalSteps,\n currentStep: this._currentStep,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _showCurrentStep(): void {\n this._steps.forEach((step, index) => {\n const stepNumber = index + 1;\n if (stepNumber === this._currentStep) {\n step.show('forward');\n } else {\n step.active = false;\n }\n });\n }\n\n /**\n * Get step element by step number (1-indexed)\n */\n private _getStepByNumber(stepNumber: number): WfStep | undefined {\n const index = stepNumber - 1;\n return this._steps[index];\n }\n\n // ============================================\n // Navigation\n // ============================================\n\n private async _goNext(): Promise<void> {\n if (this._submitting) {return;}\n\n // Validate current step\n const currentStep = this._getStepByNumber(this._currentStep);\n if (currentStep) {\n const isValid = await currentStep.validate();\n if (!isValid) {\n return;\n }\n }\n\n if (this._currentStep >= this._totalSteps) {\n // Submit form\n await this._submit();\n } else {\n // Go to next step\n this._navigateToStep(this._currentStep + 1, 'forward');\n }\n }\n\n private _goBack(): void {\n if (this._submitting) {return;}\n if (this._currentStep <= 1) {return;}\n\n this._navigateToStep(this._currentStep - 1, 'backward');\n }\n\n private async _navigateToStep(\n targetStep: number,\n direction: 'forward' | 'backward'\n ): Promise<void> {\n if (targetStep < 1 || targetStep > this._totalSteps) {return;}\n\n const targetStepEl = this._getStepByNumber(targetStep);\n if (!targetStepEl) {return;}\n\n // Check skip condition\n if (targetStepEl.shouldSkip(this._formData)) {\n const nextTarget = direction === 'forward' ? targetStep + 1 : targetStep - 1;\n if (nextTarget >= 1 && nextTarget <= this._totalSteps) {\n return this._navigateToStep(nextTarget, direction);\n }\n return;\n }\n\n const previousStep = this._currentStep;\n\n // Hide current step\n const currentStepEl = this._getStepByNumber(this._currentStep);\n if (currentStepEl) {\n await currentStepEl.hide();\n }\n\n // Update current step\n this._currentStep = targetStep;\n this._stateController.goToStep(targetStep);\n\n // Show new step\n targetStepEl.show(direction);\n\n // Dispatch step change event\n this.dispatchEvent(\n new CustomEvent<StepChangeDetail>('wf:step-change', {\n detail: {\n from: previousStep,\n to: targetStep,\n direction,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n // ============================================\n // Event Handlers\n // ============================================\n\n private _handleFieldChange = (e: CustomEvent): void => {\n const { name, value, extraFields } = e.detail;\n this._formData[name] = value;\n this._stateController.setValue(name, value);\n\n // Handle dual-field submission (e.g., \"Others\" with custom text from wf-options)\n if (extraFields) {\n Object.entries(extraFields).forEach(([fieldName, fieldValue]) => {\n this._formData[fieldName] = fieldValue;\n this._stateController.setValue(fieldName, fieldValue as string);\n });\n }\n\n // Clear form error on field change\n this._error = '';\n\n this.dispatchEvent(\n new CustomEvent<FieldChangeDetail>('wf:field-change', {\n detail: {\n name,\n value,\n formData: { ...this._formData },\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleOptionSelect = (e: CustomEvent): void => {\n // Check if this is a single-select option and auto-advance is enabled\n if (this.autoAdvance) {\n const target = e.target as Element;\n const optionsParent = target.closest('wf-options');\n if (optionsParent && !optionsParent.hasAttribute('multi')) {\n // Delay to show selection animation\n setTimeout(() => {\n this._goNext();\n }, 300);\n }\n }\n };\n\n private async _handleEnter(): Promise<void> {\n await this._goNext();\n }\n\n private _handleEscape(): void {\n this._goBack();\n }\n\n // ============================================\n // Submission\n // ============================================\n\n private async _submit(): Promise<void> {\n if (this._submitting) {return;}\n\n // Dispatch submit event (cancelable)\n const submitEvent = new CustomEvent<SubmitDetail>('wf:submit', {\n detail: { formData: { ...this._formData } },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(submitEvent);\n\n if (submitEvent.defaultPrevented) {\n return;\n }\n\n this._submitting = true;\n this._error = '';\n\n try {\n let response: unknown;\n\n if (this.mock) {\n // Mock submission for testing\n await new Promise((resolve) => setTimeout(resolve, 1000));\n response = { success: true };\n } else if (this.hubspotPortal && this.hubspotForm) {\n // Submit to HubSpot\n response = await this._submitToHubSpot();\n } else {\n // No submission target configured\n console.warn('[WizardForm] No submission target configured. Use hubspot-portal/hubspot-form or mock.');\n response = { success: true };\n }\n\n this._submitted = true;\n\n this.dispatchEvent(\n new CustomEvent<SuccessDetail>('wf:success', {\n detail: {\n formData: { ...this._formData },\n response,\n },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed';\n this._error = errorMessage;\n\n this.dispatchEvent(\n new CustomEvent<ErrorDetail>('wf:error', {\n detail: {\n error: errorMessage,\n formData: { ...this._formData },\n },\n bubbles: true,\n composed: true,\n })\n );\n } finally {\n this._submitting = false;\n }\n }\n\n private async _submitToHubSpot(): Promise<unknown> {\n const endpoint = `https://api.hsforms.com/submissions/v3/integration/submit/${this.hubspotPortal}/${this.hubspotForm}`;\n\n // Convert form data to HubSpot format\n const fields = Object.entries(this._formData).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(';') : String(value ?? ''),\n }));\n\n const data: HubSpotSubmissionData = {\n fields,\n context: {\n pageUri: window.location.href,\n pageName: document.title,\n },\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `HubSpot submission failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current form data\n */\n get formData(): Record<string, unknown> {\n return { ...this._formData };\n }\n\n /**\n * Get current step number\n */\n get currentStep(): number {\n return this._currentStep;\n }\n\n /**\n * Get total number of steps\n */\n get totalSteps(): number {\n return this._totalSteps;\n }\n\n /**\n * Check if form is submitting\n */\n get isSubmitting(): boolean {\n return this._submitting;\n }\n\n /**\n * Check if form was submitted\n */\n get isSubmitted(): boolean {\n return this._submitted;\n }\n\n /**\n * Go to a specific step\n */\n goToStep(step: number): void {\n const direction = step > this._currentStep ? 'forward' : 'backward';\n this._navigateToStep(step, direction);\n }\n\n /**\n * Go to next step\n */\n next(): Promise<void> {\n return this._goNext();\n }\n\n /**\n * Go to previous step\n */\n back(): void {\n this._goBack();\n }\n\n /**\n * Submit the form\n */\n submit(): Promise<void> {\n return this._submit();\n }\n\n /**\n * Reset the form\n */\n reset(): void {\n this._formData = {};\n this._currentStep = 1;\n this._submitting = false;\n this._submitted = false;\n this._error = '';\n this._stateController.reset();\n this._showCurrentStep();\n\n // Reset all field components\n this._steps.forEach((step) => {\n const fields = step.querySelectorAll('wf-options, wf-field, wf-email');\n fields.forEach((field) => {\n if ('reset' in field && typeof (field as { reset: () => void }).reset === 'function') {\n (field as { reset: () => void }).reset();\n }\n });\n });\n }\n\n /**\n * Set form data\n */\n setFormData(data: Record<string, unknown>): void {\n this._formData = { ...this._formData, ...data };\n Object.entries(data).forEach(([name, value]) => {\n this._stateController.setValue(name, value);\n });\n }\n}\n\n// Success screen component\n@customElement('wf-success')\nexport class WfSuccess extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n ::slotted(h1),\n ::slotted(h2),\n ::slotted(h3) {\n margin: 0 0 var(--wf-spacing-4, 16px) 0;\n font-weight: 600;\n color: var(--wf-color-text, #212529);\n }\n\n ::slotted(p) {\n margin: 0;\n color: var(--wf-color-text-muted, #6c757d);\n }\n `;\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wizard-form': WizardForm;\n 'wf-success': WfSuccess;\n }\n}\n","/**\n * WF-Step - Step container component for wizard forms\n *\n * Wraps step content and handles visibility/transitions.\n *\n * @example\n * <wf-step data-step=\"1\">\n * <h2>What's your role?</h2>\n * <wf-options name=\"role\" required>\n * <wf-option value=\"developer\">Developer</wf-option>\n * </wf-options>\n * </wf-step>\n */\n\nimport { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('wf-step')\nexport class WfStep extends LitElement {\n static styles = css`\n :host {\n display: none;\n width: 100%;\n }\n\n :host([active]) {\n display: block;\n animation: stepFadeIn 0.3s ease forwards;\n }\n\n :host([direction='forward'][active]) {\n animation: stepSlideInRight 0.3s ease forwards;\n }\n\n :host([direction='backward'][active]) {\n animation: stepSlideInLeft 0.3s ease forwards;\n }\n\n :host([leaving]) {\n display: block;\n animation: stepFadeOut 0.2s ease forwards;\n }\n\n @keyframes stepFadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes stepFadeOut {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(-10px);\n }\n }\n\n @keyframes stepSlideInRight {\n from {\n opacity: 0;\n transform: translateX(30px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n @keyframes stepSlideInLeft {\n from {\n opacity: 0;\n transform: translateX(-30px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n .wf-step-content {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-4, 16px);\n }\n\n /* Slotted heading styles */\n ::slotted(h1),\n ::slotted(h2),\n ::slotted(h3) {\n margin: 0;\n font-weight: 600;\n color: var(--wf-color-text, #212529);\n }\n\n ::slotted(h2) {\n font-size: var(--wf-font-size-3xl, 2rem);\n }\n\n ::slotted(p) {\n margin: 0;\n color: var(--wf-color-text-muted, #6c757d);\n font-size: var(--wf-font-size-xl, 1.375rem);\n }\n `;\n\n /**\n * Step number (1-indexed)\n */\n @property({ type: Number, attribute: 'data-step' })\n step = 0;\n\n /**\n * Whether this step is currently active\n */\n @property({ type: Boolean, reflect: true })\n active = false;\n\n /**\n * Animation direction (forward/backward)\n */\n @property({ type: String, reflect: true })\n direction: 'forward' | 'backward' = 'forward';\n\n /**\n * Whether this step is leaving (for exit animation)\n */\n @property({ type: Boolean, reflect: true })\n leaving = false;\n\n /**\n * Skip condition expression (evaluated against form data)\n */\n @property({ type: String, attribute: 'data-skip-if' })\n skipIf = '';\n\n /**\n * List of field names in this step (auto-discovered)\n */\n @state()\n private _fields: string[] = [];\n\n render() {\n return html`\n <div class=\"wf-step-content\">\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n `;\n }\n\n private _handleSlotChange(): void {\n this._discoverFields();\n }\n\n firstUpdated(): void {\n this._discoverFields();\n }\n\n protected updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('active')) {\n if (this.active) {\n this.leaving = false;\n this._focusFirstField();\n }\n }\n }\n\n /**\n * Discover field elements within this step\n */\n private _discoverFields(): void {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return;}\n\n const elements = slot.assignedElements({ flatten: true });\n const fields: string[] = [];\n\n const findFields = (el: Element): void => {\n // Check for name attribute on known field elements\n const fieldElements = ['wf-options', 'wf-field', 'wf-email', 'wf-input', 'wf-textarea'];\n if (fieldElements.includes(el.tagName.toLowerCase())) {\n const name = el.getAttribute('name');\n if (name) {\n fields.push(name);\n }\n }\n\n // Recurse into children\n Array.from(el.children).forEach(findFields);\n };\n\n elements.forEach(findFields);\n this._fields = fields;\n }\n\n /**\n * Focus the first focusable field in this step\n */\n private _focusFirstField(): void {\n // Delay to allow DOM updates\n requestAnimationFrame(() => {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return;}\n\n const elements = slot.assignedElements({ flatten: true });\n\n // Find first focusable element\n for (const el of elements) {\n const focusable = this._findFocusable(el);\n if (focusable) {\n focusable.focus();\n return;\n }\n }\n });\n }\n\n private _findFocusable(el: Element): HTMLElement | null {\n // Check if element itself is focusable\n if (el instanceof HTMLElement && typeof el.focus === 'function') {\n // Skip wf-options - don't auto-focus as the focus style looks like selection\n const fieldElements = ['wf-field', 'wf-email', 'wf-input', 'wf-textarea'];\n if (fieldElements.includes(el.tagName.toLowerCase())) {\n return el;\n }\n }\n\n // Recurse into children\n for (const child of el.children) {\n const found = this._findFocusable(child);\n if (found) {return found;}\n }\n\n return null;\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get field names in this step\n */\n get fields(): string[] {\n return [...this._fields];\n }\n\n /**\n * Check if step should be skipped based on form data\n */\n shouldSkip(formData: Record<string, unknown>): boolean {\n if (!this.skipIf) {return false;}\n\n try {\n // Simple expression evaluation\n // Supports: \"fieldName === 'value'\" or \"!fieldName\"\n const expression = this.skipIf.trim();\n\n // Handle negation\n if (expression.startsWith('!')) {\n const fieldName = expression.slice(1);\n return !formData[fieldName];\n }\n\n // Handle equality check\n if (expression.includes('===')) {\n const [left, right] = expression.split('===').map((s) => s.trim());\n const fieldValue = formData[left];\n const compareValue = right.replace(/['\"]/g, ''); // Remove quotes\n return fieldValue === compareValue;\n }\n\n // Handle inequality check\n if (expression.includes('!==')) {\n const [left, right] = expression.split('!==').map((s) => s.trim());\n const fieldValue = formData[left];\n const compareValue = right.replace(/['\"]/g, '');\n return fieldValue !== compareValue;\n }\n\n // Simple truthy check\n return Boolean(formData[expression]);\n } catch (error) {\n console.error('[WfStep] Error evaluating skip condition:', error);\n return false;\n }\n }\n\n /**\n * Show this step with animation\n */\n show(direction: 'forward' | 'backward' = 'forward'): void {\n this.direction = direction;\n this.leaving = false;\n this.active = true;\n }\n\n /**\n * Hide this step with animation\n */\n hide(): Promise<void> {\n return new Promise((resolve) => {\n this.leaving = true;\n\n const handleAnimationEnd = (): void => {\n this.active = false;\n this.leaving = false;\n this.removeEventListener('animationend', handleAnimationEnd);\n resolve();\n };\n\n this.addEventListener('animationend', handleAnimationEnd);\n\n // Fallback timeout\n setTimeout(() => {\n this.active = false;\n this.leaving = false;\n this.removeEventListener('animationend', handleAnimationEnd);\n resolve();\n }, 300);\n });\n }\n\n /**\n * Validate all fields in this step\n * Returns true if all fields are valid\n * Scrolls to and focuses the first invalid field if validation fails\n */\n async validate(): Promise<boolean> {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return true;}\n\n const elements = slot.assignedElements({ flatten: true });\n const invalidElements: Element[] = [];\n let allValid = true;\n\n const validateElement = async (el: Element): Promise<void> => {\n // Check for validate method on field elements\n if ('validate' in el && typeof (el as { validate: () => boolean | Promise<boolean> }).validate === 'function') {\n const isValid = await (el as { validate: () => boolean | Promise<boolean> }).validate();\n if (!isValid) {\n // Track invalid elements\n invalidElements.push(el);\n allValid = false;\n }\n }\n\n // Recurse into children\n for (const child of el.children) {\n await validateElement(child);\n }\n };\n\n for (const el of elements) {\n await validateElement(el);\n }\n\n // Scroll to and focus first invalid field\n if (invalidElements.length > 0) {\n const firstInvalid = invalidElements[0];\n\n // Smooth scroll to the element\n firstInvalid.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n\n // Focus the element after a brief delay for scroll to complete\n setTimeout(() => {\n if ('focus' in firstInvalid && typeof (firstInvalid as HTMLElement).focus === 'function') {\n (firstInvalid as HTMLElement).focus();\n }\n }, 100);\n }\n\n return allValid;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-step': WfStep;\n }\n}\n","/**\n * WF-Options - Option group component for wizard forms\n *\n * Manages a group of wf-option elements with single/multi-select support.\n * Auto-assigns keyboard shortcuts to child options.\n *\n * @example\n * <!-- Single select (default) -->\n * <wf-options name=\"role\" required>\n * <wf-option value=\"developer\">Developer</wf-option>\n * <wf-option value=\"designer\">Designer</wf-option>\n * </wf-options>\n *\n * <!-- Multi-select with constraints -->\n * <wf-options name=\"interests\" multi required min=\"1\" max=\"3\">\n * <wf-option value=\"ai\">AI</wf-option>\n * <wf-option value=\"web\">Web</wf-option>\n * <wf-option value=\"mobile\">Mobile</wf-option>\n * </wf-options>\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { WfOption, OptionSelectDetail } from './wf-option.js';\n\n// Import wf-badge for shortcut display\nimport './wf-badge.js';\n\n// Event detail types\nexport interface OptionsChangeDetail {\n name: string;\n value: string | string[];\n selected: string[];\n /** Extra fields for dual-field submission (e.g., \"Other\" with custom text) */\n extraFields?: Record<string, unknown>;\n}\n\n@customElement('wf-options')\nexport class WfOptions extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n /* Two columns (default) */\n .wf-options-container {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: var(--wf-spacing-4, 16px);\n }\n\n /* Single column via attribute */\n :host([columns='1']) .wf-options-container {\n grid-template-columns: 1fr;\n }\n\n /* Single column on mobile */\n @media (max-width: 600px) {\n .wf-options-container {\n grid-template-columns: 1fr;\n }\n }\n\n .wf-error-message {\n display: block;\n margin-top: var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n min-height: 20px;\n }\n\n /* Other input styles */\n .wf-other-container {\n margin-top: var(--wf-spacing-4, 16px);\n }\n\n .wf-other-label {\n display: block;\n margin-bottom: var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n }\n\n .wf-other-label span {\n font-weight: 400;\n color: var(--wf-color-text-muted, #646464);\n }\n\n /* Wrapper puts badge inside the input */\n .wf-other-input-wrapper {\n display: flex;\n align-items: center;\n gap: var(--wf-spacing-3, 12px);\n min-height: var(--wf-input-min-height, 56px);\n background: var(--wf-color-surface, #f3f3f5);\n border: 1px solid var(--wf-color-border, #d4d4d4);\n border-radius: var(--wf-radius-md, 8px);\n padding-left: var(--wf-spacing-4, 16px);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n }\n\n .wf-other-input-wrapper:focus-within {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.1);\n }\n\n .wf-other-input {\n flex: 1;\n min-height: calc(var(--wf-input-min-height, 56px) - 2px);\n padding: var(--wf-spacing-4, 16px);\n padding-left: 0;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n background: transparent;\n border: none;\n outline: none;\n box-sizing: border-box;\n }\n\n .wf-other-input::placeholder {\n color: var(--wf-color-text-muted, #646464);\n font-weight: 500;\n }\n `;\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Enable multi-select mode\n */\n @property({ type: Boolean })\n multi = false;\n\n /**\n * Whether selection is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Minimum selections required (multi-select only)\n */\n @property({ type: Number })\n min = 0;\n\n /**\n * Maximum selections allowed (multi-select only, 0 = unlimited)\n */\n @property({ type: Number })\n max = 0;\n\n /**\n * Number of grid columns (2 by default)\n */\n @property({ type: Number, reflect: true })\n columns = 2;\n\n /**\n * Enable \"Other\" text input when option with value=\"other\" is selected\n */\n @property({ type: Boolean, attribute: 'allow-other' })\n allowOther = false;\n\n /**\n * Label for the \"Other\" text input\n */\n @property({ type: String, attribute: 'other-label' })\n otherLabel = 'Other, please specify:';\n\n /**\n * Placeholder for the \"Other\" text input\n */\n @property({ type: String, attribute: 'other-placeholder' })\n otherPlaceholder = 'Enter your answer';\n\n /**\n * Make \"Other\" text input required when visible\n */\n @property({ type: Boolean, attribute: 'other-required' })\n otherRequired = false;\n\n /**\n * Name of secondary field for \"Other\" custom text.\n * When set and \"Other\" text is entered, form will have:\n * - {name}: otherValue (defaults to \"Others\")\n * - {otherName}: the custom text entered\n * If not set, existing behavior is preserved (custom text → name field)\n */\n @property({ type: String, attribute: 'other-name' })\n otherName = '';\n\n /**\n * Value to use for primary field when \"Other\" is selected.\n * Only used when other-name is set. Defaults to \"Others\"\n */\n @property({ type: String, attribute: 'other-value' })\n otherFieldValue = 'Others';\n\n /**\n * Currently selected values\n */\n @state()\n private _selected: Set<string> = new Set();\n\n /**\n * Value of the \"Other\" text input\n */\n @state()\n private _otherValue = '';\n\n /**\n * Validation error message\n */\n @state()\n private _errorMessage = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n private _validationActivated = false;\n\n /**\n * Child option elements\n */\n private _options: WfOption[] = [];\n\n /**\n * Keyboard shortcut map (key -> option)\n */\n private _shortcutMap: Map<string, WfOption> = new Map();\n\n /**\n * Keyboard shortcut for the \"Others\" input (next letter after options)\n */\n @state()\n private _otherShortcut = '';\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure clean state on mount\n this._errorMessage = '';\n this._validationActivated = false;\n // Listen for option selection events\n this.addEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n // Listen for keyboard events at document level so shortcuts work globally\n document.addEventListener('keydown', this._handleKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n document.removeEventListener('keydown', this._handleKeydown);\n }\n\n firstUpdated(): void {\n this._discoverOptions();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has('multi') || changedProperties.has('max')) {\n // Just update option states, don't validate (lazy validation)\n this._updateOptionStates();\n }\n }\n\n render() {\n return html`\n <div\n class=\"wf-options-container\"\n role=\"listbox\"\n aria-multiselectable=\"${this.multi}\"\n aria-required=\"${this.required}\"\n >\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n ${this.allowOther\n ? html`\n <div class=\"wf-other-container\">\n <label class=\"wf-other-label\">${this.otherLabel}</label>\n <div class=\"wf-other-input-wrapper\">\n ${this._otherShortcut\n ? html`<wf-badge shortcut=\"${this._otherShortcut}\"></wf-badge>`\n : ''}\n <input\n type=\"text\"\n id=\"wf-other-input\"\n class=\"wf-other-input\"\n .value=\"${this._otherValue}\"\n placeholder=\"${this.otherPlaceholder}\"\n data-testid=\"wf-other-input\"\n @input=\"${this._handleOtherInput}\"\n @keydown=\"${this._handleOtherKeydown}\"\n @focus=\"${this._handleOtherFocus}\"\n />\n </div>\n </div>\n `\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n `;\n }\n\n private _handleOtherInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this._otherValue = input.value;\n\n // When typing in \"Others\", deselect any selected options (mutually exclusive)\n if (this._otherValue.trim() && this._selected.size > 0) {\n this._selected.clear();\n this._updateOptionStates();\n }\n\n this._dispatchChange();\n }\n\n private _handleOtherFocus(): void {\n // When focusing the \"Others\" input, deselect options if text exists\n // This provides visual feedback that they're entering a custom value\n }\n\n private _handleOtherKeydown(e: KeyboardEvent): void {\n // Escape blurs the input (stop propagation to prevent navigation)\n if (e.key === 'Escape') {\n e.stopPropagation();\n const input = e.target as HTMLInputElement;\n input.blur();\n }\n // Enter is allowed to bubble up to advance the form\n }\n\n private _handleSlotChange(): void {\n this._discoverOptions();\n }\n\n private _discoverOptions(): void {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return;}\n\n const elements = slot.assignedElements({ flatten: true });\n this._options = elements.filter(\n (el): el is WfOption => el.tagName.toLowerCase() === 'wf-option'\n );\n\n // Assign keyboard shortcuts (A, B, C, etc.)\n this._shortcutMap.clear();\n this._options.forEach((option, index) => {\n if (index < 26) {\n const shortcut = String.fromCharCode(65 + index); // A, B, C...\n option.shortcut = shortcut;\n this._shortcutMap.set(shortcut, option);\n }\n\n // Restore selected state if value is in _selected\n option.setSelected(this._selected.has(option.value));\n });\n\n // Assign shortcut for \"Others\" input (next letter after options)\n if (this.allowOther && this._options.length < 26) {\n this._otherShortcut = String.fromCharCode(65 + this._options.length);\n }\n }\n\n private _handleOptionSelect = (e: CustomEvent<OptionSelectDetail>): void => {\n e.stopPropagation();\n const { value } = e.detail;\n this._selectValue(value);\n };\n\n private _selectValue(value: string): void {\n if (this.multi) {\n this._handleMultiSelect(value);\n } else {\n this._handleSingleSelect(value);\n }\n\n // When selecting an option, clear the \"Others\" text (mutually exclusive)\n if (this.allowOther && this._otherValue) {\n this._otherValue = '';\n }\n\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n\n private _handleSingleSelect(value: string): void {\n // Clear previous selection and select new\n this._selected.clear();\n this._selected.add(value);\n }\n\n private _handleMultiSelect(value: string): void {\n if (this._selected.has(value)) {\n // Deselect\n this._selected.delete(value);\n } else {\n // Check max constraint\n if (this.max > 0 && this._selected.size >= this.max) {\n // At max capacity, don't add more\n return;\n }\n this._selected.add(value);\n }\n }\n\n private _updateOptionStates(): void {\n this._options.forEach((option) => {\n option.setSelected(this._selected.has(option.value));\n });\n }\n\n /**\n * Silent validation check (no side effects)\n */\n private _checkValidation(): boolean {\n // If allowOther is enabled, \"Others\" text counts as a valid selection\n const hasOtherValue = this.allowOther && this._otherValue.trim();\n const hasSelection = this._selected.size > 0 || hasOtherValue;\n\n if (this.required && !hasSelection) {\n return false;\n }\n\n if (this.multi) {\n if (this.min > 0 && this._selected.size < this.min && !hasOtherValue) {\n return false;\n }\n\n if (this.max > 0 && this._selected.size > this.max) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Validate and show error messages (only when activated)\n */\n private _validateSelection(): boolean {\n // Only show error messages if validation has been activated\n if (!this._validationActivated) {\n // Clear any stale error message\n this._errorMessage = '';\n return this._checkValidation();\n }\n\n this._errorMessage = '';\n\n // If allowOther is enabled, \"Others\" text counts as a valid selection\n const hasOtherValue = this.allowOther && this._otherValue.trim();\n const hasSelection = this._selected.size > 0 || hasOtherValue;\n\n if (this.required && !hasSelection) {\n this._errorMessage = this.allowOther\n ? 'Please select an option or specify in the text field'\n : 'Please select an option';\n return false;\n }\n\n if (this.multi) {\n if (this.min > 0 && this._selected.size < this.min && !hasOtherValue) {\n this._errorMessage = `Please select at least ${this.min} option${this.min > 1 ? 's' : ''}`;\n return false;\n }\n\n if (this.max > 0 && this._selected.size > this.max) {\n this._errorMessage = `Please select at most ${this.max} option${this.max > 1 ? 's' : ''}`;\n return false;\n }\n }\n\n return true;\n }\n\n private _dispatchChange(): void {\n const selectedArray = Array.from(this._selected);\n const hasOtherText = this.allowOther && this._otherValue.trim() && this._selected.size === 0;\n\n // Determine the value to dispatch\n let currentValue: string | string[];\n\n // If other-name is configured AND \"Other\" text is entered, use dual-field mode\n if (this.otherName && hasOtherText) {\n // Primary field gets the configured \"Others\" value (or default)\n currentValue = this.multi ? [this.otherFieldValue] : this.otherFieldValue;\n } else {\n // Use the value getter which handles existing behavior\n currentValue = this.value;\n }\n\n const detail: OptionsChangeDetail = {\n name: this.name,\n value: currentValue,\n selected: selectedArray,\n };\n\n // Add extraFields for dual-field submission when other-name is configured\n // Always include the field (with value or empty) to clear stale data when switching options\n if (this.otherName) {\n detail.extraFields = {\n [this.otherName]: hasOtherText ? this._otherValue.trim() : '',\n };\n }\n\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n // Only handle shortcuts if this component is in the active step\n const parentStep = this.closest('wf-step');\n if (!parentStep || !parentStep.hasAttribute('active')) {\n return;\n }\n\n // Don't handle A-Z shortcuts if user is typing in an input field\n // Use composedPath to get actual target (works with Shadow DOM)\n const path = e.composedPath();\n const actualTarget = path[0] as HTMLElement;\n if (actualTarget?.tagName === 'INPUT' || actualTarget?.tagName === 'TEXTAREA') {\n return;\n }\n\n // Also check the \"Others\" input inside our own shadow DOM\n const otherInput = this.shadowRoot?.querySelector('#wf-other-input');\n if (otherInput && otherInput === this.shadowRoot?.activeElement) {\n return;\n }\n\n // Handle A-Z keys for shortcuts\n const key = e.key.toUpperCase();\n if (key.length === 1 && key >= 'A' && key <= 'Z') {\n // Check if this is the \"Others\" shortcut\n if (this.allowOther && key === this._otherShortcut) {\n e.preventDefault();\n const otherInput = this.shadowRoot?.querySelector('#wf-other-input') as HTMLInputElement;\n if (otherInput) {\n otherInput.focus();\n }\n return;\n }\n\n const option = this._shortcutMap.get(key);\n if (option && !option.disabled) {\n e.preventDefault();\n option.triggerSelect();\n }\n }\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value (string for single, array for multi)\n * If allowOther is enabled and \"Others\" text is filled, returns the custom text\n */\n get value(): string | string[] {\n // If \"Others\" text has value and no options selected, return the custom text\n if (this.allowOther && this._otherValue.trim() && this._selected.size === 0) {\n return this.multi ? [this._otherValue] : this._otherValue;\n }\n\n const selectedArray = Array.from(this._selected);\n\n if (this.multi) {\n return selectedArray;\n }\n\n // For single-select\n return selectedArray[0] ?? '';\n }\n\n /**\n * Set value programmatically\n */\n set value(val: string | string[]) {\n this._selected.clear();\n\n if (Array.isArray(val)) {\n val.forEach((v) => this._selected.add(v));\n } else if (val) {\n this._selected.add(val);\n }\n\n this._updateOptionStates();\n this._validateSelection();\n }\n\n /**\n * Get selected values as array\n */\n getSelected(): string[] {\n return Array.from(this._selected);\n }\n\n /**\n * Check if option is selected\n */\n isSelected(value: string): boolean {\n return this._selected.has(value);\n }\n\n /**\n * Select an option by value\n */\n select(value: string): void {\n this._selectValue(value);\n }\n\n /**\n * Deselect an option by value\n */\n deselect(value: string): void {\n if (this._selected.has(value)) {\n this._selected.delete(value);\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n }\n\n /**\n * Clear all selections\n */\n clear(): void {\n this._selected.clear();\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n\n /**\n * Validate current selection\n */\n validate(): boolean {\n // Activate validation mode (enables showing error messages)\n this._validationActivated = true;\n return this._validateSelection();\n }\n\n /**\n * Check if selection is valid (no side effects)\n */\n get isValid(): boolean {\n return this._checkValidation();\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus first option\n */\n focus(): void {\n this._options[0]?.focus();\n }\n\n /**\n * Reset to initial state\n */\n reset(): void {\n this._selected.clear();\n this._otherValue = '';\n this._errorMessage = '';\n this._validationActivated = false;\n\n // Restore any pre-selected options from attributes\n this._options.forEach((option) => {\n if (option.hasAttribute('selected')) {\n this._selected.add(option.value);\n }\n option.setSelected(this._selected.has(option.value));\n });\n\n this._dispatchChange();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-options': WfOptions;\n }\n}\n","/**\n * WF-Option - Individual option component for wizard forms\n *\n * A selectable option card with slot content and auto-injected shortcut badge.\n *\n * @example\n * <wf-option value=\"developer\">\n * <strong>Developer</strong>\n * <span>I write code</span>\n * </wf-option>\n */\n\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n// Import wf-badge for shortcut display\nimport './wf-badge.js';\n\n// Event detail types\nexport interface OptionSelectDetail {\n value: string;\n selected: boolean;\n}\n\n@customElement('wf-option')\nexport class WfOption extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-option-card {\n display: flex;\n align-items: center;\n gap: var(--wf-spacing-3, 12px);\n width: 100%;\n min-height: var(--wf-input-min-height, 56px);\n padding: var(--wf-spacing-3, 12px);\n background-color: var(--wf-color-surface, #f3f3f5);\n border: 1px solid var(--wf-color-border, #d4d4d4);\n border-radius: var(--wf-radius-md, 8px);\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n transition: border-color 150ms ease, background-color 150ms ease,\n transform 100ms ease;\n outline: none;\n box-sizing: border-box;\n }\n\n .wf-option-card:hover:not(:disabled) {\n border-color: var(--wf-color-primary, #8040f0);\n background-color: var(--wf-color-primary-light, rgba(128, 64, 240, 0.08));\n }\n\n .wf-option-card:focus-visible {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.2);\n }\n\n .wf-option-card[aria-selected='true'] {\n border-color: var(--wf-color-primary, #8040f0);\n background-color: var(--wf-color-primary-light, rgba(128, 64, 240, 0.1));\n }\n\n .wf-option-card:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-option-card:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n /* Blink animation on selection */\n .wf-option-card.selecting {\n animation: blink 0.3s ease;\n }\n\n @keyframes blink {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n .wf-option-content {\n flex: 1;\n min-width: 0;\n }\n\n /* Slotted content styling */\n ::slotted(strong),\n ::slotted(h3),\n ::slotted(h4) {\n display: block;\n font-weight: 600;\n margin: 0;\n }\n\n ::slotted(span),\n ::slotted(p) {\n display: block;\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #646464);\n margin: 4px 0 0 0;\n }\n `;\n\n /**\n * The value associated with this option (required)\n */\n @property({ type: String })\n value = '';\n\n /**\n * Whether this option is selected\n */\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n /**\n * Whether this option is disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * The keyboard shortcut key for this option (auto-assigned by parent)\n */\n @property({ type: String })\n shortcut = '';\n\n /**\n * Internal state for selection animation\n */\n @state()\n private _selecting = false;\n\n render() {\n return html`\n <button\n class=\"wf-option-card ${this._selecting ? 'selecting' : ''}\"\n role=\"option\"\n aria-selected=\"${this.selected}\"\n ?disabled=\"${this.disabled}\"\n data-testid=\"wf-option-btn\"\n @click=\"${this._handleClick}\"\n >\n ${this.shortcut\n ? html`<wf-badge\n shortcut=\"${this.shortcut}\"\n variant=\"${this.selected ? 'selected' : 'default'}\"\n ></wf-badge>`\n : nothing}\n <div class=\"wf-option-content\">\n <slot></slot>\n </div>\n </button>\n `;\n }\n\n private _handleClick(e: Event): void {\n if (this.disabled) {\n e.preventDefault();\n return;\n }\n\n this._triggerSelect();\n }\n\n /**\n * Programmatically trigger selection (used by keyboard shortcuts)\n */\n triggerSelect(): void {\n if (!this.disabled) {\n this._triggerSelect();\n }\n }\n\n private _triggerSelect(): void {\n // Start selection animation\n this._selecting = true;\n\n // Dispatch selection event\n const detail: OptionSelectDetail = {\n value: this.value,\n selected: !this.selected, // Toggle for multi-select, parent handles logic\n };\n\n this.dispatchEvent(\n new CustomEvent('wf-option-select', {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n\n // Clear animation after it completes\n setTimeout(() => {\n this._selecting = false;\n }, 300);\n }\n\n /**\n * Focus the option button\n */\n focus(): void {\n const button = this.shadowRoot?.querySelector('button');\n button?.focus();\n }\n\n /**\n * Set selected state programmatically\n */\n setSelected(selected: boolean): void {\n this.selected = selected;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-option': WfOption;\n }\n}\n","/**\n * ValidationController - Validation management for wizard forms\n *\n * Provides built-in validators and custom validator support.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport type { Validator, ValidatorFn, ValidationResult } from '../types.js';\n\n// Default blocked email domains for work email validation\nconst DEFAULT_BLOCKED_DOMAINS = [\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'aol.com',\n 'icloud.com',\n 'mail.com',\n 'protonmail.com',\n 'zoho.com',\n 'yandex.com',\n 'live.com',\n 'msn.com',\n 'me.com',\n 'inbox.com',\n 'gmx.com',\n];\n\nexport class ValidationController implements ReactiveController {\n host: ReactiveControllerHost;\n\n private _validators: Map<string, Validator[]> = new Map();\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n hostConnected(): void {\n // Controller connected\n }\n\n hostDisconnected(): void {\n // Clean up\n this._validators.clear();\n }\n\n // ============================================\n // Validator Management\n // ============================================\n\n addValidator(name: string, validator: Validator): void {\n const existing = this._validators.get(name) ?? [];\n this._validators.set(name, [...existing, validator]);\n }\n\n addValidators(name: string, validators: Validator[]): void {\n validators.forEach((v) => this.addValidator(name, v));\n }\n\n removeValidator(name: string, validatorName: string): void {\n const existing = this._validators.get(name) ?? [];\n this._validators.set(\n name,\n existing.filter((v) => v.name !== validatorName)\n );\n }\n\n clearValidators(name: string): void {\n this._validators.delete(name);\n }\n\n getValidators(name: string): Validator[] {\n return this._validators.get(name) ?? [];\n }\n\n // ============================================\n // Validation Execution\n // ============================================\n\n async validate(name: string, value: unknown): Promise<ValidationResult> {\n const validators = this.getValidators(name);\n\n for (const validator of validators) {\n try {\n const result = await validator.validate(value);\n if (!result.valid) {\n return {\n valid: false,\n error: result.error ?? validator.message ?? 'Validation failed',\n };\n }\n } catch (error) {\n console.error(`[ValidationController] Validator \"${validator.name}\" threw:`, error);\n return {\n valid: false,\n error: 'Validation error occurred',\n };\n }\n }\n\n return { valid: true };\n }\n\n validateSync(name: string, value: unknown): ValidationResult {\n const validators = this.getValidators(name);\n\n for (const validator of validators) {\n const result = validator.validate(value);\n\n // If it's a promise, we can't handle it synchronously\n if (result instanceof Promise) {\n console.warn(`[ValidationController] Async validator \"${validator.name}\" called synchronously`);\n continue;\n }\n\n if (!result.valid) {\n return {\n valid: false,\n error: result.error ?? validator.message ?? 'Validation failed',\n };\n }\n }\n\n return { valid: true };\n }\n\n // ============================================\n // Built-in Validators (Static Factory Methods)\n // ============================================\n\n static required(message = 'This field is required'): Validator {\n return {\n name: 'required',\n message,\n validate: (value: unknown): ValidationResult => {\n if (value === null || value === undefined) {\n return { valid: false, error: message };\n }\n if (typeof value === 'string' && value.trim() === '') {\n return { valid: false, error: message };\n }\n if (Array.isArray(value) && value.length === 0) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static email(message = 'Please enter a valid email address'): Validator {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n return {\n name: 'email',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n if (!emailRegex.test(value)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static workEmail(\n blockedDomains: string[] = DEFAULT_BLOCKED_DOMAINS,\n message = 'Please use your work email address'\n ): Validator {\n return {\n name: 'workEmail',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n\n const domain = value.split('@')[1]?.toLowerCase();\n if (domain && blockedDomains.includes(domain)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static pattern(regex: RegExp, message = 'Invalid format'): Validator {\n return {\n name: 'pattern',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n if (!regex.test(value)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static minLength(min: number, message?: string): Validator {\n const errorMessage = message ?? `Minimum ${min} characters required`;\n\n return {\n name: 'minLength',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string') {\n return { valid: true };\n }\n if (value.length < min) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static maxLength(max: number, message?: string): Validator {\n const errorMessage = message ?? `Maximum ${max} characters allowed`;\n\n return {\n name: 'maxLength',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string') {\n return { valid: true };\n }\n if (value.length > max) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static minSelections(min: number, message?: string): Validator {\n const errorMessage = message ?? `Select at least ${min} option${min > 1 ? 's' : ''}`;\n\n return {\n name: 'minSelections',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (!Array.isArray(value)) {\n return { valid: true };\n }\n if (value.length < min) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static maxSelections(max: number, message?: string): Validator {\n const errorMessage = message ?? `Select at most ${max} option${max > 1 ? 's' : ''}`;\n\n return {\n name: 'maxSelections',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (!Array.isArray(value)) {\n return { valid: true };\n }\n if (value.length > max) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static custom(name: string, validateFn: ValidatorFn, message?: string): Validator {\n return {\n name,\n message,\n validate: validateFn,\n };\n }\n}\n\n// Export default blocked domains for external use\nexport { DEFAULT_BLOCKED_DOMAINS };\n","/**\n * WF-Field - Generic field wrapper for wizard forms\n *\n * Wraps native form elements and provides validation, styling, and integration.\n *\n * @example\n * <wf-field name=\"company\" label=\"Company Name\" required>\n * <input type=\"text\" placeholder=\"Acme Inc.\" />\n * </wf-field>\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { ValidationController } from '../controllers/ValidationController.js';\nimport type { Validator } from '../types.js';\n\n@customElement('wf-field')\nexport class WfField extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-field-container {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-2, 8px);\n }\n\n .wf-label {\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #212529);\n }\n\n .wf-label-required::after {\n content: ' *';\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-input-wrapper {\n position: relative;\n }\n\n /* Style slotted inputs */\n ::slotted(input),\n ::slotted(textarea),\n ::slotted(select) {\n width: 100%;\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-family: inherit;\n background-color: var(--wf-color-surface, #f8f9fa);\n border: 2px solid var(--wf-color-border, #dee2e6);\n border-radius: var(--wf-radius-lg, 12px);\n color: var(--wf-color-text, #212529);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n outline: none;\n box-sizing: border-box;\n }\n\n ::slotted(input::placeholder),\n ::slotted(textarea::placeholder) {\n color: var(--wf-color-text-muted, #6c757d);\n }\n\n ::slotted(input:focus),\n ::slotted(textarea:focus),\n ::slotted(select:focus) {\n border-color: var(--wf-color-primary, #8b5cf6);\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2);\n }\n\n ::slotted(input:disabled),\n ::slotted(textarea:disabled),\n ::slotted(select:disabled) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-error-message {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n min-height: 20px;\n }\n\n .wf-hint {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #6c757d);\n }\n `;\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Optional label text\n */\n @property({ type: String })\n label = '';\n\n /**\n * Whether field is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Optional hint text\n */\n @property({ type: String })\n hint = '';\n\n /**\n * Validation error message\n */\n @state()\n private _errorMessage = '';\n\n /**\n * Current field value\n */\n @state()\n private _value: unknown = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n private _validationActivated = false;\n\n /**\n * Debounce timer for input validation\n */\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Internal validators\n */\n private _validators: Validator[] = [];\n\n /**\n * Reference to slotted input element\n */\n private _inputElement: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('input', this._handleInput);\n this.addEventListener('blur', this._handleBlur, true);\n this.addEventListener('focus', this._handleFocus, true);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('input', this._handleInput);\n this.removeEventListener('blur', this._handleBlur, true);\n this.removeEventListener('focus', this._handleFocus, true);\n }\n\n firstUpdated(): void {\n this._discoverInput();\n this._setupValidatorsFromAttributes();\n }\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n >\n ${this.label}\n </label>`\n : ''}\n <div class=\"wf-input-wrapper\">\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n private _handleSlotChange(): void {\n this._discoverInput();\n this._setupValidatorsFromAttributes();\n }\n\n private _discoverInput(): void {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return;}\n\n const elements = slot.assignedElements({ flatten: true });\n for (const el of elements) {\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n ) {\n this._inputElement = el;\n\n // Set id and name if not present\n if (!el.id) {el.id = this.name;}\n if (!el.name) {el.name = this.name;}\n\n // Sync initial value\n this._value = el.value;\n break;\n }\n }\n }\n\n private _setupValidatorsFromAttributes(): void {\n if (!this._inputElement) {return;}\n\n this._validators = [];\n\n // Required validator\n if (this.required || this._inputElement.hasAttribute('required')) {\n this._validators.push(ValidationController.required());\n }\n\n // Email validator\n if (this._inputElement.getAttribute('type') === 'email') {\n this._validators.push(ValidationController.email());\n }\n\n // Work email validator\n if (this._inputElement.hasAttribute('data-work-email')) {\n const blockedDomainsAttr = this._inputElement.getAttribute('data-blocked-domains');\n const blockedDomains = blockedDomainsAttr\n ? blockedDomainsAttr.split(',').map((d) => d.trim())\n : undefined;\n this._validators.push(ValidationController.workEmail(blockedDomains));\n }\n\n // Pattern validator\n const pattern = this._inputElement.getAttribute('pattern');\n if (pattern) {\n const message =\n this._inputElement.getAttribute('data-pattern-message') || 'Invalid format';\n this._validators.push(ValidationController.pattern(new RegExp(pattern), message));\n }\n\n // Min length validator\n const minLength = this._inputElement.getAttribute('minlength');\n if (minLength) {\n this._validators.push(ValidationController.minLength(parseInt(minLength, 10)));\n }\n\n // Max length validator\n const maxLength = this._inputElement.getAttribute('maxlength');\n if (maxLength) {\n this._validators.push(ValidationController.maxLength(parseInt(maxLength, 10)));\n }\n }\n\n private _handleInput = (e: Event): void => {\n const target = e.target as HTMLInputElement;\n this._value = target.value;\n\n // Debounced validation after activation (300ms)\n if (this._validationActivated) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n this.validate();\n }, 300);\n }\n\n // Dispatch change event\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail: {\n name: this.name,\n value: this._value,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleBlur = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-blur', {\n detail: { name: this.name, value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleFocus = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-focus', {\n detail: { name: this.name },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value\n */\n get value(): unknown {\n return this._inputElement?.value ?? this._value;\n }\n\n /**\n * Set value\n */\n set value(val: unknown) {\n this._value = val;\n if (this._inputElement) {\n this._inputElement.value = String(val ?? '');\n }\n }\n\n /**\n * Add a custom validator\n */\n addValidator(validator: Validator): void {\n this._validators.push(validator);\n }\n\n /**\n * Validate the field\n */\n async validate(): Promise<boolean> {\n // Activate validation mode (enables debounced input validation)\n this._validationActivated = true;\n\n const value = this.value;\n\n for (const validator of this._validators) {\n try {\n const result = await validator.validate(value);\n if (!result.valid) {\n this._errorMessage = result.error ?? validator.message ?? 'Validation failed';\n return false;\n }\n } catch (error) {\n console.error('[WfField] Validator error:', error);\n this._errorMessage = 'Validation error occurred';\n return false;\n }\n }\n\n this._errorMessage = '';\n return true;\n }\n\n /**\n * Check if field is valid (sync check, doesn't update UI)\n */\n get isValid(): boolean {\n const value = this.value;\n\n for (const validator of this._validators) {\n const result = validator.validate(value);\n if (result instanceof Promise) {\n console.warn('[WfField] Async validator called synchronously');\n continue;\n }\n if (!result.valid) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus the input element\n */\n focus(): void {\n this._inputElement?.focus();\n }\n\n /**\n * Reset field to initial state\n */\n reset(): void {\n this._value = '';\n this._errorMessage = '';\n this._validationActivated = false;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._inputElement) {\n this._inputElement.value = '';\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-field': WfField;\n }\n}\n","/**\n * WF-Email - Email input component for wizard forms\n *\n * A convenience component for email inputs with optional work email validation.\n *\n * @example\n * <wf-email name=\"email\" label=\"Email Address\" work-email required />\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { ValidationController, DEFAULT_BLOCKED_DOMAINS } from '../controllers/ValidationController.js';\nimport type { Validator } from '../types.js';\n\n@customElement('wf-email')\nexport class WfEmail extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-field-container {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-2, 8px);\n }\n\n .wf-label {\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n }\n\n .wf-label-required::after {\n content: ' *';\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-input {\n width: 100%;\n min-height: var(--wf-input-min-height, 56px);\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 500;\n font-family: inherit;\n background-color: var(--wf-color-surface, #f3f3f5);\n border: 1px solid var(--wf-color-border, #d4d4d4);\n border-radius: var(--wf-radius-md, 8px);\n color: var(--wf-color-text, #0a0a0a);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n outline: none;\n box-sizing: border-box;\n }\n\n .wf-input::placeholder {\n color: var(--wf-color-text-muted, #646464);\n font-weight: 500;\n }\n\n .wf-input:focus {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.2);\n }\n\n .wf-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-input.wf-input-error {\n border-color: var(--wf-color-error, #dc3545);\n }\n\n .wf-input.wf-input-error:focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.2);\n }\n\n .wf-error-message {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-hint {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #646464);\n }\n `;\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Label text\n */\n @property({ type: String })\n label = '';\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = 'you@company.com';\n\n /**\n * Whether field is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Whether to validate as work email (block personal domains)\n */\n @property({ type: Boolean, attribute: 'work-email' })\n workEmail = false;\n\n /**\n * Custom blocked domains (comma-separated or array)\n */\n @property({ type: String, attribute: 'blocked-domains' })\n blockedDomains = '';\n\n /**\n * Work email validation message\n */\n @property({ type: String, attribute: 'work-email-message' })\n workEmailMessage = 'Please use your work email address';\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n /**\n * Hint text\n */\n @property({ type: String })\n hint = '';\n\n /**\n * Validation error message\n */\n @state()\n private _errorMessage = '';\n\n /**\n * Current value\n */\n @state()\n private _value = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n private _validationActivated = false;\n\n /**\n * Debounce timer for input validation\n */\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Validators\n */\n private _validators: Validator[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n this._setupValidators();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (\n changedProperties.has('required') ||\n changedProperties.has('workEmail') ||\n changedProperties.has('blockedDomains')\n ) {\n this._setupValidators();\n }\n }\n\n private _setupValidators(): void {\n this._validators = [];\n\n // Required validator\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n // Email format validator\n this._validators.push(ValidationController.email());\n\n // Work email validator\n if (this.workEmail) {\n let domains = DEFAULT_BLOCKED_DOMAINS;\n\n if (this.blockedDomains) {\n domains = this.blockedDomains.split(',').map((d) => d.trim().toLowerCase());\n }\n\n this._validators.push(\n ValidationController.workEmail(domains, this.workEmailMessage)\n );\n }\n }\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"email\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n private _handleInput = (e: Event): void => {\n const target = e.target as HTMLInputElement;\n this._value = target.value;\n\n // Debounced validation after activation (300ms)\n if (this._validationActivated) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n this.validate();\n }, 300);\n }\n\n // Dispatch change event\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail: {\n name: this.name,\n value: this._value,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleBlur = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-blur', {\n detail: { name: this.name, value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleFocus = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-focus', {\n detail: { name: this.name },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value\n */\n get value(): string {\n return this._value;\n }\n\n /**\n * Set value\n */\n set value(val: string) {\n this._value = val;\n }\n\n /**\n * Validate the field\n */\n async validate(): Promise<boolean> {\n // Activate validation mode (enables debounced input validation)\n this._validationActivated = true;\n\n for (const validator of this._validators) {\n try {\n const result = await validator.validate(this._value);\n if (!result.valid) {\n this._errorMessage = result.error ?? validator.message ?? 'Validation failed';\n return false;\n }\n } catch (error) {\n console.error('[WfEmail] Validator error:', error);\n this._errorMessage = 'Validation error occurred';\n return false;\n }\n }\n\n this._errorMessage = '';\n return true;\n }\n\n /**\n * Check if field is valid (sync check)\n */\n get isValid(): boolean {\n for (const validator of this._validators) {\n const result = validator.validate(this._value);\n if (result instanceof Promise) {\n console.warn('[WfEmail] Async validator called synchronously');\n continue;\n }\n if (!result.valid) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus the input\n */\n focus(): void {\n const input = this.shadowRoot?.querySelector('input');\n input?.focus();\n }\n\n /**\n * Reset field to initial state\n */\n reset(): void {\n this._value = '';\n this._errorMessage = '';\n this._validationActivated = false;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-email': WfEmail;\n }\n}\n","/**\n * WF-Input - Base text input component for wizard forms\n *\n * A standalone text input with validation, styling, and form integration.\n *\n * @example\n * <wf-input name=\"fullName\" label=\"Full Name\" required placeholder=\"John Doe\" />\n */\n\nimport { LitElement, html, css, CSSResultGroup } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { ValidationController } from '../controllers/ValidationController.js';\nimport type { Validator } from '../types.js';\n\n@customElement('wf-input')\nexport class WfInput extends LitElement {\n static styles: CSSResultGroup = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-field-container {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-2, 8px);\n }\n\n .wf-label {\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n }\n\n .wf-label-required::after {\n content: ' *';\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-input {\n width: 100%;\n min-height: var(--wf-input-min-height, 56px);\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 400;\n font-family: inherit;\n background-color: var(--wf-color-surface, #f3f3f5);\n border: 1px solid var(--wf-color-border, #d4d4d4);\n border-radius: var(--wf-radius-md, 8px);\n color: var(--wf-color-text, #0a0a0a);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n outline: none;\n box-sizing: border-box;\n }\n\n .wf-input::placeholder {\n color: var(--wf-color-text-muted, #646464);\n font-weight: 500;\n }\n\n .wf-input:focus {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.2);\n }\n\n .wf-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-input.wf-input-error {\n border-color: var(--wf-color-error, #dc3545);\n }\n\n .wf-input.wf-input-error:focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.2);\n }\n\n .wf-error-message {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-hint {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #646464);\n }\n `;\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Label text\n */\n @property({ type: String })\n label = '';\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = '';\n\n /**\n * Input type (text, tel, url, etc.)\n */\n @property({ type: String })\n type: 'text' | 'tel' | 'url' | 'search' = 'text';\n\n /**\n * Whether field is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Minimum length\n */\n @property({ type: Number })\n minlength?: number;\n\n /**\n * Maximum length\n */\n @property({ type: Number })\n maxlength?: number;\n\n /**\n * Pattern regex string\n */\n @property({ type: String })\n pattern?: string;\n\n /**\n * Pattern validation message\n */\n @property({ type: String, attribute: 'pattern-message' })\n patternMessage = 'Invalid format';\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n /**\n * Autocomplete attribute\n */\n @property({ type: String })\n autocomplete = '';\n\n /**\n * Hint text\n */\n @property({ type: String })\n hint = '';\n\n /**\n * Validation error message\n */\n @state()\n protected _errorMessage = '';\n\n /**\n * Current value\n */\n @state()\n protected _value = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n protected _validationActivated = false;\n\n /**\n * Debounce timer for input validation\n */\n protected _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Validators\n */\n protected _validators: Validator[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n this._setupValidators();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (\n changedProperties.has('required') ||\n changedProperties.has('minlength') ||\n changedProperties.has('maxlength') ||\n changedProperties.has('pattern')\n ) {\n this._setupValidators();\n }\n }\n\n protected _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n if (this.minlength !== undefined) {\n this._validators.push(ValidationController.minLength(this.minlength));\n }\n\n if (this.maxlength !== undefined) {\n this._validators.push(ValidationController.maxLength(this.maxlength));\n }\n\n if (this.pattern) {\n this._validators.push(\n ValidationController.pattern(new RegExp(this.pattern), this.patternMessage)\n );\n }\n }\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"${this.type}\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n autocomplete=\"${this.autocomplete || 'off'}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n protected _handleInput = (e: Event): void => {\n const target = e.target as HTMLInputElement;\n this._value = target.value;\n\n // Debounced validation after activation (600ms)\n if (this._validationActivated) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n this.validate();\n }, 600);\n }\n\n // Dispatch change event\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail: {\n name: this.name,\n value: this._value,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n protected _handleBlur = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-blur', {\n detail: { name: this.name, value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n protected _handleFocus = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-focus', {\n detail: { name: this.name },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value\n */\n get value(): string {\n return this._value;\n }\n\n /**\n * Set value\n */\n set value(val: string) {\n this._value = val;\n }\n\n /**\n * Add a custom validator\n */\n addValidator(validator: Validator): void {\n this._validators.push(validator);\n }\n\n /**\n * Validate the field\n */\n async validate(): Promise<boolean> {\n // Activate validation mode (enables debounced input validation)\n this._validationActivated = true;\n\n for (const validator of this._validators) {\n try {\n const result = await validator.validate(this._value);\n if (!result.valid) {\n this._errorMessage = result.error ?? validator.message ?? 'Validation failed';\n return false;\n }\n } catch (error) {\n console.error('[WfInput] Validator error:', error);\n this._errorMessage = 'Validation error occurred';\n return false;\n }\n }\n\n this._errorMessage = '';\n return true;\n }\n\n /**\n * Check if field is valid (sync check)\n */\n get isValid(): boolean {\n for (const validator of this._validators) {\n const result = validator.validate(this._value);\n if (result instanceof Promise) {\n console.warn('[WfInput] Async validator called synchronously');\n continue;\n }\n if (!result.valid) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus the input\n */\n focus(): void {\n const input = this.shadowRoot?.querySelector('input');\n input?.focus();\n }\n\n /**\n * Reset field to initial state\n */\n reset(): void {\n this._value = '';\n this._errorMessage = '';\n this._validationActivated = false;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-input': WfInput;\n }\n}\n","/**\n * WF-Number - Number input component for wizard forms\n *\n * A specialized input for numeric values with min/max/step support.\n *\n * @example\n * <wf-number name=\"employees\" label=\"Number of Employees\" min=\"1\" max=\"10000\" />\n */\n\nimport { html, css, CSSResultGroup } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { WfInput } from './wf-input.js';\nimport { ValidationController } from '../controllers/ValidationController.js';\n\n@customElement('wf-number')\nexport class WfNumber extends WfInput {\n static override styles: CSSResultGroup = [\n WfInput.styles as CSSResultGroup,\n css`\n /* Hide number input spinners */\n .wf-input::-webkit-outer-spin-button,\n .wf-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .wf-input[type='number'] {\n -moz-appearance: textfield;\n }\n `,\n ];\n\n /**\n * Minimum value\n */\n @property({ type: Number })\n min?: number;\n\n /**\n * Maximum value\n */\n @property({ type: Number })\n max?: number;\n\n /**\n * Step increment\n */\n @property({ type: Number })\n step = 1;\n\n protected _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n // Number range validator\n if (this.min !== undefined || this.max !== undefined) {\n this._validators.push(\n ValidationController.custom(\n 'range',\n (value: unknown) => {\n if (value === '' || value === null || value === undefined) {\n return { valid: true }; // Let required handle empty\n }\n\n const num = Number(value);\n if (isNaN(num)) {\n return { valid: false, error: 'Please enter a valid number' };\n }\n\n if (this.min !== undefined && num < this.min) {\n return { valid: false, error: `Value must be at least ${this.min}` };\n }\n\n if (this.max !== undefined && num > this.max) {\n return { valid: false, error: `Value must be at most ${this.max}` };\n }\n\n return { valid: true };\n },\n 'Value out of range'\n )\n );\n }\n }\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"number\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n min=\"${this.min ?? ''}\"\n max=\"${this.max ?? ''}\"\n step=\"${this.step}\"\n autocomplete=\"${this.autocomplete || 'off'}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n /**\n * Get current value as number\n */\n get valueAsNumber(): number {\n return Number(this._value) || 0;\n }\n\n /**\n * Set value as number\n */\n set valueAsNumber(val: number) {\n this._value = String(val);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-number': WfNumber;\n }\n}\n","/**\n * WizardForm.init() - Imperative API for wizard forms\n *\n * Provides a simple way to initialize wizard forms from a script tag.\n *\n * @example\n * <script src=\"wizard-form.min.js\"></script>\n * <script>\n * WizardForm.init({\n * container: '#signup-form',\n * adapter: 'hubspot',\n * hubspot: { portalId: '123', formId: 'abc' },\n * onSubmit: (data) => console.log(data),\n * onSuccess: () => console.log('Success!'),\n * onError: (err) => console.error(err)\n * });\n * </script>\n */\n\nimport type { WizardForm } from './components/wizard-form.js';\nimport type { SubmissionAdapter, SubmissionContext } from './adapters/types.js';\nimport { createHubSpotAdapter } from './adapters/hubspot.js';\nimport { createWebhookAdapter } from './adapters/webhook.js';\nimport { createRevenueHeroAdapter } from './adapters/revenuehero.js';\n\n// Ensure components are registered\nimport './components/wizard-form.js';\nimport './components/wf-step.js';\nimport './components/wf-options.js';\nimport './components/wf-option.js';\nimport './components/wf-field.js';\nimport './components/wf-email.js';\nimport './components/wf-input.js';\nimport './components/wf-number.js';\nimport './components/wf-textarea.js';\n\nexport type FormData = Record<string, unknown>;\n\nexport interface WizardFormConfig {\n /**\n * Container element or selector\n */\n container: string | HTMLElement;\n\n /**\n * Adapter type or custom adapter\n */\n adapter?: 'hubspot' | 'webhook' | 'revenuehero' | 'json' | SubmissionAdapter;\n\n /**\n * HubSpot configuration\n */\n hubspot?: {\n portalId: string;\n formId: string;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * Webhook configuration\n */\n webhook?: {\n url: string;\n method?: 'POST' | 'PUT';\n headers?: Record<string, string>;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * RevenueHero configuration\n */\n revenuehero?: {\n routerId: string;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * Color theme\n */\n theme?: 'light' | 'dark' | 'auto';\n\n /**\n * Show progress bar\n */\n showProgress?: boolean;\n\n /**\n * Auto-advance after single-select option\n */\n autoAdvance?: boolean;\n\n /**\n * Mock mode (for testing)\n */\n mock?: boolean;\n\n /**\n * Callback before submission (can cancel)\n */\n onSubmit?: (data: FormData) => boolean | void;\n\n /**\n * Callback on successful submission\n */\n onSuccess?: (data: FormData, response?: unknown) => void;\n\n /**\n * Callback on submission error\n */\n onError?: (error: string, data?: FormData) => void;\n\n /**\n * Callback on step change\n */\n onStepChange?: (from: number, to: number, direction: 'forward' | 'backward') => void;\n\n /**\n * Callback on field value change\n */\n onFieldChange?: (name: string, value: unknown, formData: FormData) => void;\n\n /**\n * Transform form data before submission to adapter.\n * Called after validation, before adapter.submit().\n */\n serialize?: (data: FormData) => FormData;\n}\n\nexport interface WizardFormInstance {\n /**\n * The wizard-form element\n */\n element: WizardForm;\n\n /**\n * Current form data\n */\n readonly formData: FormData;\n\n /**\n * Current step number\n */\n readonly currentStep: number;\n\n /**\n * Total number of steps\n */\n readonly totalSteps: number;\n\n /**\n * Go to next step\n */\n next(): Promise<void>;\n\n /**\n * Go to previous step\n */\n back(): void;\n\n /**\n * Go to a specific step\n */\n goToStep(step: number): void;\n\n /**\n * Submit the form\n */\n submit(): Promise<void>;\n\n /**\n * Reset the form\n */\n reset(): void;\n\n /**\n * Set form data\n */\n setFormData(data: FormData): void;\n\n /**\n * Destroy the instance (remove event listeners)\n */\n destroy(): void;\n\n /**\n * Serialize function (if configured)\n */\n serialize?: (data: FormData) => FormData;\n}\n\n/**\n * Initialize a wizard form with the given configuration\n */\nexport function init(config: WizardFormConfig): WizardFormInstance {\n // Get container element\n const container =\n typeof config.container === 'string'\n ? document.querySelector<HTMLElement>(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(`[WizardForm] Container not found: ${config.container}`);\n }\n\n // Find or create wizard-form element\n let wizardForm = container.querySelector<WizardForm>('wizard-form');\n if (!wizardForm) {\n wizardForm = container as unknown as WizardForm;\n if (wizardForm.tagName.toLowerCase() !== 'wizard-form') {\n throw new Error(\n '[WizardForm] Container must be a <wizard-form> element or contain one'\n );\n }\n }\n\n // Apply configuration attributes\n if (config.theme) {\n wizardForm.setAttribute('theme', config.theme);\n }\n if (config.showProgress !== undefined) {\n wizardForm.showProgress = config.showProgress;\n }\n if (config.autoAdvance !== undefined) {\n wizardForm.autoAdvance = config.autoAdvance;\n }\n if (config.mock) {\n wizardForm.mock = config.mock;\n }\n\n // Create adapter\n let adapter: SubmissionAdapter | null = null;\n\n if (typeof config.adapter === 'object') {\n // Custom adapter\n adapter = config.adapter;\n } else {\n const adapterType = config.adapter || 'json';\n\n switch (adapterType) {\n case 'hubspot':\n if (!config.hubspot?.portalId || !config.hubspot?.formId) {\n throw new Error('[WizardForm] HubSpot config requires portalId and formId');\n }\n adapter = createHubSpotAdapter({\n portalId: config.hubspot.portalId,\n formId: config.hubspot.formId,\n fieldMapping: config.hubspot.fieldMapping,\n mock: config.mock,\n });\n // Also set attributes for built-in HubSpot support\n wizardForm.setAttribute('hubspot-portal', config.hubspot.portalId);\n wizardForm.setAttribute('hubspot-form', config.hubspot.formId);\n break;\n\n case 'webhook':\n if (!config.webhook?.url) {\n throw new Error('[WizardForm] Webhook config requires url');\n }\n adapter = createWebhookAdapter({\n url: config.webhook.url,\n method: config.webhook.method,\n headers: config.webhook.headers,\n fieldMapping: config.webhook.fieldMapping,\n mock: config.mock,\n });\n break;\n\n case 'revenuehero':\n if (!config.revenuehero?.routerId) {\n throw new Error('[WizardForm] RevenueHero config requires routerId');\n }\n adapter = createRevenueHeroAdapter({\n routerId: config.revenuehero.routerId,\n fieldMapping: config.revenuehero.fieldMapping,\n mock: config.mock,\n });\n break;\n\n case 'json':\n // No adapter - just emit events\n adapter = null;\n break;\n }\n }\n\n // Event handlers\n const handleSubmit = (e: CustomEvent) => {\n const rawFormData = e.detail.formData;\n\n // Apply serialize transform if provided\n let submitData = { ...rawFormData };\n if (config.serialize) {\n submitData = config.serialize(submitData);\n }\n\n // Auto-expose test refs when mock mode is enabled\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormData = submitData;\n (window as unknown as Record<string, unknown>).__wizardFormRawData = rawFormData;\n (window as unknown as Record<string, unknown>).__wizardFormInstance = instance;\n }\n\n // Call user's onSubmit callback\n if (config.onSubmit) {\n const result = config.onSubmit(submitData);\n if (result === false) {\n e.preventDefault();\n return;\n }\n }\n\n // Submit via adapter if configured\n if (adapter) {\n e.preventDefault();\n\n const context: SubmissionContext = {\n pageUrl: window.location.href,\n pageTitle: document.title,\n referrer: document.referrer,\n timestamp: new Date().toISOString(),\n };\n\n adapter.submit(submitData, context).then((result) => {\n // Auto-expose response in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormResponse = result;\n }\n\n if (result.success) {\n // Manually show success screen\n (wizardForm as unknown as { _submitted: boolean })._submitted = true;\n wizardForm!.requestUpdate();\n\n // Dispatch wf:success event (triggers handleSuccess listener + progress bar hide)\n wizardForm!.dispatchEvent(\n new CustomEvent('wf:success', {\n detail: { formData: rawFormData, response: result.data },\n bubbles: true,\n composed: true,\n })\n );\n // Note: onSuccess callback is triggered by handleSuccess listener\n } else {\n // Auto-expose error in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormError = result.error;\n }\n\n if (config.onError) {\n // Pass raw form data (not serialized) for user callbacks\n config.onError(result.error || 'Submission failed', rawFormData);\n }\n }\n });\n }\n };\n\n const handleSuccess = (e: CustomEvent) => {\n // Auto-expose response in mock mode (for built-in HubSpot handler)\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormResponse = {\n success: true,\n data: e.detail.response,\n };\n }\n\n if (config.onSuccess) {\n config.onSuccess(e.detail.formData, e.detail.response);\n }\n };\n\n const handleError = (e: CustomEvent) => {\n // Auto-expose error in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormError = e.detail.error;\n }\n\n if (config.onError) {\n config.onError(e.detail.error, e.detail.formData);\n }\n };\n\n const handleStepChange = (e: CustomEvent) => {\n if (config.onStepChange) {\n config.onStepChange(e.detail.from, e.detail.to, e.detail.direction);\n }\n };\n\n const handleFieldChange = (e: CustomEvent) => {\n if (config.onFieldChange) {\n config.onFieldChange(e.detail.name, e.detail.value, e.detail.formData);\n }\n };\n\n // Attach event listeners\n wizardForm.addEventListener('wf:submit', handleSubmit as EventListener);\n wizardForm.addEventListener('wf:success', handleSuccess as EventListener);\n wizardForm.addEventListener('wf:error', handleError as EventListener);\n wizardForm.addEventListener('wf:step-change', handleStepChange as EventListener);\n wizardForm.addEventListener('wf:field-change', handleFieldChange as EventListener);\n\n // Create instance\n const instance: WizardFormInstance = {\n element: wizardForm,\n\n get formData() {\n return wizardForm!.formData;\n },\n\n get currentStep() {\n return wizardForm!.currentStep;\n },\n\n get totalSteps() {\n return wizardForm!.totalSteps;\n },\n\n next() {\n return wizardForm!.next();\n },\n\n back() {\n wizardForm!.back();\n },\n\n goToStep(step: number) {\n wizardForm!.goToStep(step);\n },\n\n submit() {\n return wizardForm!.submit();\n },\n\n reset() {\n wizardForm!.reset();\n },\n\n setFormData(data: FormData) {\n wizardForm!.setFormData(data);\n },\n\n destroy() {\n wizardForm!.removeEventListener('wf:submit', handleSubmit as EventListener);\n wizardForm!.removeEventListener('wf:success', handleSuccess as EventListener);\n wizardForm!.removeEventListener('wf:error', handleError as EventListener);\n wizardForm!.removeEventListener('wf:step-change', handleStepChange as EventListener);\n wizardForm!.removeEventListener('wf:field-change', handleFieldChange as EventListener);\n },\n\n // Expose serialize function if configured\n serialize: config.serialize,\n };\n\n return instance;\n}\n\nexport default { init };\n","/**\n * WF-Textarea - Multiline text input component for wizard forms\n *\n * A textarea with validation, styling, and form integration.\n * Enter key inserts newline (does NOT submit the form).\n *\n * @example\n * <wf-textarea name=\"message\" label=\"Message\" rows=\"4\" required />\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { ValidationController } from '../controllers/ValidationController.js';\nimport type { Validator } from '../types.js';\n\n@customElement('wf-textarea')\nexport class WfTextarea extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-field-container {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-2, 8px);\n }\n\n .wf-label {\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #212529);\n }\n\n .wf-label-required::after {\n content: ' *';\n color: var(--wf-color-error, #dc3545);\n }\n\n .wf-textarea {\n width: 100%;\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-family: inherit;\n background-color: var(--wf-color-surface, #f8f9fa);\n border: 1.5px solid var(--wf-color-border, #e5e7eb);\n border-radius: var(--wf-radius-lg, 12px);\n color: var(--wf-color-text, #212529);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n outline: none;\n box-sizing: border-box;\n resize: vertical;\n min-height: 100px;\n }\n\n .wf-textarea::placeholder {\n color: var(--wf-color-text-muted, #6c757d);\n }\n\n .wf-textarea:focus {\n border-color: var(--wf-color-primary, #8b5cf6);\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2);\n }\n\n .wf-textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .wf-textarea.wf-textarea-error {\n border-color: var(--wf-color-error, #dc3545);\n }\n\n .wf-textarea.wf-textarea-error:focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.2);\n }\n\n .wf-error-message {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n min-height: 20px;\n }\n\n .wf-hint {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #6c757d);\n }\n\n .wf-char-count {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #6c757d);\n text-align: right;\n }\n\n .wf-char-count.wf-char-limit {\n color: var(--wf-color-error, #dc3545);\n }\n `;\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Label text\n */\n @property({ type: String })\n label = '';\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = '';\n\n /**\n * Number of visible rows\n */\n @property({ type: Number })\n rows = 4;\n\n /**\n * Whether field is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Minimum length\n */\n @property({ type: Number })\n minlength?: number;\n\n /**\n * Maximum length\n */\n @property({ type: Number })\n maxlength?: number;\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n /**\n * Show character count\n */\n @property({ type: Boolean, attribute: 'show-count' })\n showCount = false;\n\n /**\n * Hint text\n */\n @property({ type: String })\n hint = '';\n\n /**\n * Validation error message\n */\n @state()\n private _errorMessage = '';\n\n /**\n * Current value\n */\n @state()\n private _value = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n private _validationActivated = false;\n\n /**\n * Debounce timer for input validation\n */\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Validators\n */\n private _validators: Validator[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n this._setupValidators();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (\n changedProperties.has('required') ||\n changedProperties.has('minlength') ||\n changedProperties.has('maxlength')\n ) {\n this._setupValidators();\n }\n }\n\n private _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n if (this.minlength !== undefined) {\n this._validators.push(ValidationController.minLength(this.minlength));\n }\n\n if (this.maxlength !== undefined) {\n this._validators.push(ValidationController.maxLength(this.maxlength));\n }\n }\n\n render() {\n const charCount = this._value.length;\n const isAtLimit = this.maxlength !== undefined && charCount >= this.maxlength;\n\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <textarea\n class=\"wf-textarea ${this._errorMessage ? 'wf-textarea-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n rows=\"${this.rows}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n maxlength=\"${this.maxlength ?? ''}\"\n data-testid=\"wf-textarea\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n @keydown=\"${this._handleKeydown}\"\n ></textarea>\n ${this.showCount && this.maxlength\n ? html`<span class=\"wf-char-count ${isAtLimit ? 'wf-char-limit' : ''}\" data-testid=\"wf-counter\">\n ${charCount}/${this.maxlength}\n </span>`\n : ''}\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n private _handleInput = (e: Event): void => {\n const target = e.target as HTMLTextAreaElement;\n this._value = target.value;\n\n // Debounced validation after activation (600ms)\n if (this._validationActivated) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n this.validate();\n }, 600);\n }\n\n // Dispatch change event\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail: {\n name: this.name,\n value: this._value,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleBlur = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-blur', {\n detail: { name: this.name, value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleFocus = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-focus', {\n detail: { name: this.name },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n // Allow Enter to insert newline (don't trigger form navigation)\n if (e.key === 'Enter') {\n e.stopPropagation();\n }\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value\n */\n get value(): string {\n return this._value;\n }\n\n /**\n * Set value\n */\n set value(val: string) {\n this._value = val;\n }\n\n /**\n * Add a custom validator\n */\n addValidator(validator: Validator): void {\n this._validators.push(validator);\n }\n\n /**\n * Validate the field\n */\n async validate(): Promise<boolean> {\n // Activate validation mode (enables debounced input validation)\n this._validationActivated = true;\n\n for (const validator of this._validators) {\n try {\n const result = await validator.validate(this._value);\n if (!result.valid) {\n this._errorMessage = result.error ?? validator.message ?? 'Validation failed';\n return false;\n }\n } catch (error) {\n console.error('[WfTextarea] Validator error:', error);\n this._errorMessage = 'Validation error occurred';\n return false;\n }\n }\n\n this._errorMessage = '';\n return true;\n }\n\n /**\n * Check if field is valid (sync check)\n */\n get isValid(): boolean {\n for (const validator of this._validators) {\n const result = validator.validate(this._value);\n if (result instanceof Promise) {\n console.warn('[WfTextarea] Async validator called synchronously');\n continue;\n }\n if (!result.valid) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus the textarea\n */\n focus(): void {\n const textarea = this.shadowRoot?.querySelector('textarea');\n textarea?.focus();\n }\n\n /**\n * Reset field to initial state\n */\n reset(): void {\n this._value = '';\n this._errorMessage = '';\n this._validationActivated = false;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-textarea': WfTextarea;\n }\n}\n","/**\n * WF-Layout - Figma-style auto-layout container for wizard forms\n *\n * A flexible layout component supporting both flexbox and CSS grid modes\n * with independent horizontal/vertical gutters and padding.\n *\n * @example\n * <!-- Flex mode (default) -->\n * <wf-layout direction=\"column\" gap=\"md\">\n * <wf-input name=\"name\" label=\"Name\"></wf-input>\n * <wf-email name=\"email\" label=\"Email\"></wf-email>\n * </wf-layout>\n *\n * <!-- Grid mode with responsive columns -->\n * <wf-layout mode=\"grid\" columns=\"2\" gap-x=\"lg\" gap-y=\"md\">\n * <wf-option value=\"a\">A</wf-option>\n * <wf-option value=\"b\">B</wf-option>\n * </wf-layout>\n */\n\nimport { LitElement, html, css, CSSResultGroup } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nexport type LayoutMode = 'flex' | 'grid';\nexport type FlexDirection = 'row' | 'column';\nexport type AlignItems = 'start' | 'center' | 'end' | 'stretch';\nexport type JustifyContent = 'start' | 'center' | 'end' | 'space-between' | 'space-around';\nexport type WidthBehavior = 'full' | 'auto' | 'fit';\nexport type SpacingPreset = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n// Spacing scale in pixels\nconst SPACING_SCALE: Record<SpacingPreset, number> = {\n none: 0,\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n};\n\n@customElement('wf-layout')\nexport class WfLayout extends LitElement {\n static styles: CSSResultGroup = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-layout {\n box-sizing: border-box;\n }\n\n /* Width behaviors */\n .wf-layout--width-full {\n width: 100%;\n }\n\n .wf-layout--width-auto {\n width: auto;\n }\n\n .wf-layout--width-fit {\n width: fit-content;\n }\n `;\n\n /**\n * Layout mode: 'flex' for flexbox, 'grid' for CSS grid\n */\n @property({ type: String })\n mode: LayoutMode = 'flex';\n\n /**\n * Flex direction (flex mode only)\n */\n @property({ type: String })\n direction: FlexDirection = 'column';\n\n /**\n * Uniform gap (sets both gap-x and gap-y)\n */\n @property({ type: String })\n gap: SpacingPreset | string = 'none';\n\n /**\n * Horizontal gutter (column-gap)\n */\n @property({ type: String, attribute: 'gap-x' })\n gapX: SpacingPreset | string = '';\n\n /**\n * Vertical gutter (row-gap)\n */\n @property({ type: String, attribute: 'gap-y' })\n gapY: SpacingPreset | string = '';\n\n /**\n * Cross-axis alignment\n */\n @property({ type: String })\n align: AlignItems = 'stretch';\n\n /**\n * Main-axis justification\n */\n @property({ type: String })\n justify: JustifyContent = 'start';\n\n /**\n * Uniform padding (all sides)\n */\n @property({ type: String })\n padding: SpacingPreset | string = 'none';\n\n /**\n * Horizontal padding (left/right)\n */\n @property({ type: String, attribute: 'padding-x' })\n paddingX: SpacingPreset | string = '';\n\n /**\n * Vertical padding (top/bottom)\n */\n @property({ type: String, attribute: 'padding-y' })\n paddingY: SpacingPreset | string = '';\n\n /**\n * Enable flex-wrap (flex mode only)\n */\n @property({ type: Boolean })\n wrap = false;\n\n /**\n * Width behavior\n */\n @property({ type: String })\n width: WidthBehavior = 'full';\n\n /**\n * Number of columns or 'auto' for responsive (grid mode only)\n */\n @property({ type: String })\n columns: string = 'auto';\n\n /**\n * Minimum item width for auto-fit grid\n */\n @property({ type: String, attribute: 'min-item-width' })\n minItemWidth = '200px';\n\n /**\n * Convert spacing value to pixels\n */\n private _resolveSpacing(value: SpacingPreset | string): string {\n if (!value || value === 'none') {\n return '0';\n }\n\n // Check if it's a preset\n if (value in SPACING_SCALE) {\n return `${SPACING_SCALE[value as SpacingPreset]}px`;\n }\n\n // Check if it's a number (treat as pixels)\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return `${num}px`;\n }\n\n // Return as-is (could be a CSS value like '1rem')\n return value;\n }\n\n /**\n * Get computed gap-x value\n */\n private _getGapX(): string {\n return this._resolveSpacing(this.gapX || this.gap);\n }\n\n /**\n * Get computed gap-y value\n */\n private _getGapY(): string {\n return this._resolveSpacing(this.gapY || this.gap);\n }\n\n /**\n * Get computed padding values\n */\n private _getPadding(): string {\n const uniformPadding = this._resolveSpacing(this.padding);\n const px = this.paddingX ? this._resolveSpacing(this.paddingX) : uniformPadding;\n const py = this.paddingY ? this._resolveSpacing(this.paddingY) : uniformPadding;\n return `${py} ${px}`;\n }\n\n /**\n * Build inline styles based on properties\n */\n private _buildStyles(): string {\n const styles: string[] = [];\n\n if (this.mode === 'grid') {\n styles.push('display: grid');\n\n // Grid columns\n const cols = parseInt(this.columns, 10);\n if (!isNaN(cols) && cols > 0) {\n styles.push(`grid-template-columns: repeat(${cols}, 1fr)`);\n } else {\n // Auto-fit responsive grid\n styles.push(\n `grid-template-columns: repeat(auto-fit, minmax(${this.minItemWidth}, 1fr))`\n );\n }\n\n // Grid alignment\n if (this.align !== 'stretch') {\n styles.push(`align-items: ${this.align}`);\n }\n if (this.justify !== 'start') {\n styles.push(`justify-content: ${this.justify}`);\n }\n } else {\n // Flex mode\n styles.push('display: flex');\n styles.push(`flex-direction: ${this.direction}`);\n\n if (this.wrap) {\n styles.push('flex-wrap: wrap');\n }\n\n // Flex alignment\n if (this.align !== 'stretch') {\n styles.push(`align-items: ${this.align}`);\n }\n if (this.justify !== 'start') {\n styles.push(`justify-content: ${this.justify}`);\n }\n }\n\n // Gap (works for both flex and grid)\n const gapX = this._getGapX();\n const gapY = this._getGapY();\n if (gapX !== '0' || gapY !== '0') {\n styles.push(`column-gap: ${gapX}`);\n styles.push(`row-gap: ${gapY}`);\n }\n\n // Padding\n const padding = this._getPadding();\n if (padding !== '0 0') {\n styles.push(`padding: ${padding}`);\n }\n\n return styles.join('; ');\n }\n\n render() {\n return html`\n <div\n class=\"wf-layout wf-layout--width-${this.width}\"\n style=\"${this._buildStyles()}\"\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-layout': WfLayout;\n }\n}\n","/**\n * WF-Progress - Composable progress bar component for wizard forms\n *\n * A standalone progress indicator that can be placed inside or outside the wizard.\n * Connects to wizard-form via `for` attribute or auto-discovers parent wizard.\n *\n * @example\n * <!-- Inside wizard (auto-connects) -->\n * <wizard-form id=\"my-form\">\n * <wf-progress></wf-progress>\n * <wf-step>...</wf-step>\n * </wizard-form>\n *\n * @example\n * <!-- Outside wizard (uses for attribute) -->\n * <wf-progress for=\"my-form\"></wf-progress>\n * <wizard-form id=\"my-form\">...</wizard-form>\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { WizardForm, StepChangeDetail } from './wizard-form.js';\n\n@customElement('wf-progress')\nexport class WfProgress extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-progress {\n display: flex;\n gap: var(--wf-spacing-4, 16px);\n }\n\n .wf-progress-segment {\n width: 32px;\n height: 8px;\n background-color: var(--wf-color-progress-inactive, rgba(217, 217, 217, 0.6));\n border-radius: var(--wf-radius-full, 99px);\n transition: background-color 300ms ease;\n }\n\n .wf-progress-segment.completed {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n }\n\n .wf-progress-segment.active {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n }\n `;\n\n /**\n * ID of the wizard-form to connect to.\n * If not specified, auto-connects to parent wizard-form.\n */\n @property({ type: String })\n for = '';\n\n @state()\n private _currentStep = 1;\n\n @state()\n private _totalSteps = 1;\n\n @state()\n private _isComplete = false;\n\n private _wizard: WizardForm | null = null;\n private _boundHandleStepChange = this._handleStepChange.bind(this);\n private _boundHandleSuccess = this._handleSuccess.bind(this);\n\n connectedCallback(): void {\n super.connectedCallback();\n // Defer connection to allow DOM to settle\n requestAnimationFrame(() => {\n this._connectToWizard();\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._disconnectFromWizard();\n }\n\n private _connectToWizard(): void {\n // Find wizard by ID or by closest parent\n if (this.for) {\n this._wizard = document.getElementById(this.for) as WizardForm | null;\n } else {\n this._wizard = this.closest('wizard-form') as WizardForm | null;\n }\n\n if (this._wizard) {\n // Get initial state\n this._currentStep = this._wizard.currentStep || 1;\n this._totalSteps = this._wizard.totalSteps || 1;\n this._isComplete = this._wizard.isSubmitted || false;\n\n // Listen for step changes\n this._wizard.addEventListener('wf:step-change', this._boundHandleStepChange as EventListener);\n\n // Listen for success (form complete)\n this._wizard.addEventListener('wf:success', this._boundHandleSuccess as EventListener);\n\n // Also watch for slot changes (steps being added/removed)\n this._wizard.addEventListener('wf:steps-discovered', this._handleStepsDiscovered.bind(this) as EventListener);\n }\n }\n\n private _disconnectFromWizard(): void {\n if (this._wizard) {\n this._wizard.removeEventListener('wf:step-change', this._boundHandleStepChange as EventListener);\n this._wizard.removeEventListener('wf:success', this._boundHandleSuccess as EventListener);\n this._wizard = null;\n }\n }\n\n private _handleStepChange(e: CustomEvent<StepChangeDetail>): void {\n this._currentStep = e.detail.to;\n // Re-read total steps in case it changed\n if (this._wizard) {\n this._totalSteps = this._wizard.totalSteps;\n }\n }\n\n private _handleStepsDiscovered(): void {\n if (this._wizard) {\n this._totalSteps = this._wizard.totalSteps;\n this._currentStep = this._wizard.currentStep;\n }\n }\n\n private _handleSuccess(): void {\n this._isComplete = true;\n }\n\n render() {\n // Hide progress when form is complete\n if (this._isComplete) {\n return null;\n }\n\n const segments = [];\n for (let i = 1; i <= this._totalSteps; i++) {\n const completed = i < this._currentStep;\n const active = i === this._currentStep;\n segments.push(html`\n <div\n class=\"wf-progress-segment ${completed ? 'completed' : ''} ${active ? 'active' : ''}\"\n role=\"progressbar\"\n aria-valuenow=\"${this._currentStep}\"\n aria-valuemin=\"1\"\n aria-valuemax=\"${this._totalSteps}\"\n ></div>\n `);\n }\n return html`<div class=\"wf-progress\" role=\"group\" aria-label=\"Form progress\">${segments}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-progress': WfProgress;\n }\n}\n","/**\n * WF-Thank-You - Composable success screen component for wizard forms\n *\n * A reusable thank-you/success component with customizable title, subtitle, and slots.\n *\n * @example\n * <!-- Minimal usage -->\n * <wf-thank-you></wf-thank-you>\n *\n * @example\n * <!-- With props -->\n * <wf-thank-you\n * title=\"Thanks for your interest!\"\n * subtitle=\"We'll be in touch within 24 hours.\"\n * ></wf-thank-you>\n *\n * @example\n * <!-- With slots for full customization -->\n * <wf-thank-you>\n * <span slot=\"icon\">🎉</span>\n * <p>Custom message here</p>\n * <div slot=\"footer\">\n * <div id=\"revenuehero-container\"></div>\n * </div>\n * </wf-thank-you>\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('wf-thank-you')\nexport class WfThankYou extends LitElement {\n static styles = css`\n :host {\n display: block;\n text-align: center;\n padding: var(--wf-spacing-8, 48px) var(--wf-spacing-4, 24px);\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .wf-thank-you-icon {\n width: 72px;\n height: 72px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto var(--wf-spacing-4, 24px);\n box-shadow: 0 10px 25px -5px rgba(16, 185, 129, 0.4);\n }\n\n .wf-thank-you-icon svg {\n width: 36px;\n height: 36px;\n color: white;\n }\n\n .wf-thank-you-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--wf-color-text, #1e293b);\n margin: 0 0 12px 0;\n }\n\n .wf-thank-you-subtitle {\n font-size: 16px;\n color: var(--wf-color-text-muted, #64748b);\n margin: 0 0 24px 0;\n line-height: 1.6;\n }\n\n ::slotted([slot=\"footer\"]) {\n margin-top: var(--wf-spacing-4, 24px);\n }\n `;\n\n /**\n * Main heading text\n */\n @property({ type: String })\n title = 'Thank you!';\n\n /**\n * Sub-message text\n */\n @property({ type: String })\n subtitle = \"We've received your request.\";\n\n /**\n * Hide the success icon\n */\n @property({ type: Boolean, attribute: 'hide-icon' })\n hideIcon = false;\n\n render() {\n return html`\n ${!this.hideIcon\n ? html`\n <div class=\"wf-thank-you-icon\">\n <slot name=\"icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </slot>\n </div>\n `\n : ''}\n <h2 class=\"wf-thank-you-title\">${this.title}</h2>\n <p class=\"wf-thank-you-subtitle\">${this.subtitle}</p>\n <slot></slot>\n <slot name=\"footer\"></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-thank-you': WfThankYou;\n }\n}\n"],"names":["getHubSpotCookie","document","match","cookie","createHubSpotAdapter","config","portalId","formId","fieldMapping","mock","name","mapFields","data","mapped","key","value","Object","entries","submit","context","Promise","resolve","setTimeout","success","formData","endpoint","mappedData","this","payload","fields","map","Array","isArray","join","String","pageUri","pageUrl","pageName","pageTitle","hutk","response","fetch","method","headers","body","JSON","stringify","ok","json","error","catch","message","status","Error","createWebhookAdapter","url","referrer","submittedAt","timestamp","errorText","text","trim","responseData","isRevenueHeroLoaded","window","RevenueHero","createRevenueHeroAdapter","routerId","_context","scheduled","email","workEmail","schedule","t","globalThis","e","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","o","WeakMap","n$3","constructor","_$cssResult$","cssText","styleSheet","length","get","replaceSync","set","toString","i","reduce","n","c","cssRules","r","is","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","fromAttribute","Number","parse","f","b","attribute","type","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y$1","HTMLElement","addInitializer","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","enableUpdating","_$AL","_$E_","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","y","mode","ReactiveElement","reactiveElementVersions","createPolicy","createHTML","Math","random","toFixed","slice","createComment","v","_","m","RegExp","g","$","_$litType$","strings","values","E","for","A","P","createTreeWalker","V","S","parts","lastIndex","exec","test","x","startsWith","N","el","currentNode","content","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","index","ctor","I","L","z","H","tagName","append","indexOf","innerHTML","M","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","k","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","options","startNode","endNode","_$AR","T","iterator","O","insertBefore","createTextNode","_$AC","_$AP","remove","setConnected","element","fill","j","arguments","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","B","litHtmlPolyfillSupport","litHtmlVersions","renderOptions","_$Do","_a","renderBefore","render","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPolyfillSupport","litElementVersions","customElements","define","kind","init","FormStateController","_formData","_validation","_currentStep","_totalSteps","_submitting","_submitted","_stepConfigs","_subscribers","clear","validation","currentStep","totalSteps","submitting","submitted","_error","setValue","dirty","result","valid","touched","_notifyChange","getValue","setValidation","existing","markTouched","setTotalSteps","total","setStepConfig","step","getStepConfig","getStepFields","goToStep","skipIf","nextStep","previousStep","isFirstStep","isLastStep","isStepValid","every","isCurrentStepValid","getFieldError","hasFieldError","setSubmitting","setSubmitted","setError","reset","subscribe","callback","KeyboardController","_enabled","_config","blockEnterOnTextarea","_boundHandler","_handleKeydown","bind","activeElement","_getActiveElement","isTextarea","isInput","isContentEditable","isTextInput","onEnter","preventDefault","onEscape","onArrowUp","onArrowDown","onArrowLeft","onArrowRight","active","updateConfig","enable","disable","enabled","WfBadge","shortcut","variant","html","css","__decorateClass","property","customElement","WizardForm","hubspotPortal","hubspotForm","theme","showProgress","autoAdvance","hideBack","_steps","_stateController","_handleFieldChange","extraFields","detail","fieldName","fieldValue","dispatchEvent","CustomEvent","bubbles","composed","_handleOptionSelect","optionsParent","target","closest","_goNext","_handleEnter","_handleEscape","_discoverSteps","_showCurrentStep","nothing","_handleSlotChange","_renderNavigation","_renderProgress","segments","completed","isFirst","isLast","showBack","_goBack","slot","querySelector","elements","assignedElements","flatten","filter","show","_getStepByNumber","stepNumber","validate","_submit","_navigateToStep","targetStep","direction","targetStepEl","shouldSkip","nextTarget","currentStepEl","hide","from","to","submitEvent","cancelable","defaultPrevented","_submitToHubSpot","errorMessage","location","href","title","errorData","isSubmitting","isSubmitted","next","back","querySelectorAll","field","setFormData","WfSuccess","WfStep","leaving","_fields","_discoverFields","changedProperties","_focusFirstField","findFields","includes","children","requestAnimationFrame","focusable","_findFocusable","focus","child","found","expression","left","right","replace","handleAnimationEnd","invalidElements","allValid","validateElement","async","firstInvalid","scrollIntoView","behavior","block","WfOptions","multi","required","min","max","columns","allowOther","otherLabel","otherPlaceholder","otherRequired","otherName","otherFieldValue","_selected","_otherValue","_errorMessage","_validationActivated","_options","_shortcutMap","_otherShortcut","stopPropagation","_selectValue","parentStep","actualTarget","composedPath","otherInput","toUpperCase","option","disabled","triggerSelect","_discoverOptions","_updateOptionStates","_handleOtherInput","_handleOtherKeydown","_handleOtherFocus","input","_dispatchChange","blur","fromCharCode","setSelected","_handleMultiSelect","_handleSingleSelect","_validateSelection","_checkValidation","hasOtherValue","hasSelection","selectedArray","hasOtherText","currentValue","selected","val","getSelected","isSelected","select","deselect","isValid","showError","clearError","WfOption","_selecting","_handleClick","_triggerSelect","button","DEFAULT_BLOCKED_DOMAINS","ValidationController","_validators","addValidator","validator","addValidators","validators","removeValidator","validatorName","clearValidators","getValidators","validateSync","emailRegex","blockedDomains","domain","pattern","regex","minLength","maxLength","minSelections","maxSelections","custom","validateFn","WfField","label","hint","_value","_debounceTimer","_inputElement","_handleInput","clearTimeout","_handleBlur","_handleFocus","_discoverInput","_setupValidatorsFromAttributes","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","id","blockedDomainsAttr","parseInt","WfEmail","placeholder","workEmailMessage","_setupValidators","domains","WfInput","patternMessage","autocomplete","minlength","maxlength","WfNumber","num","isNaN","valueAsNumber","container","wizardForm","adapter","hubspot","webhook","revenuehero","handleSubmit","rawFormData","submitData","serialize","__wizardFormData","__wizardFormRawData","__wizardFormInstance","instance","onSubmit","Date","toISOString","then","__wizardFormResponse","__wizardFormError","onError","handleSuccess","onSuccess","handleError","handleStepChange","onStepChange","handleFieldChange","onFieldChange","destroy","WfTextarea","rows","showCount","charCount","isAtLimit","textarea","init_default","SPACING_SCALE","none","xs","sm","md","lg","xl","WfLayout","gap","gapX","gapY","align","justify","padding","paddingX","paddingY","wrap","width","minItemWidth","_resolveSpacing","parseFloat","_getGapX","_getGapY","_getPadding","uniformPadding","px","_buildStyles","cols","WfProgress","_isComplete","_wizard","_boundHandleStepChange","_handleStepChange","_boundHandleSuccess","_handleSuccess","_connectToWizard","_disconnectFromWizard","getElementById","_handleStepsDiscovered","WfThankYou","subtitle","hideIcon"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9]}
1
+ {"version":3,"file":"wizard-form.min.js","sources":["../src/adapters/hubspot.ts","../src/adapters/webhook.ts","../src/adapters/revenuehero.ts","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/controllers/FormStateController.ts","../src/controllers/KeyboardController.ts","../src/components/wf-badge.ts","../src/components/wizard-form.ts","../src/components/wf-step.ts","../src/components/wf-layout.ts","../src/components/wf-options.ts","../src/components/wf-option.ts","../src/components/base/form-input-base.ts","../src/controllers/ValidationController.ts","../src/components/wf-field.ts","../src/components/wf-email.ts","../src/components/wf-input.ts","../src/components/wf-number.ts","../src/init.ts","../src/components/wf-textarea.ts","../src/components/wf-progress.ts","../src/components/wf-thank-you.ts","../src/styles/global.styles.ts","../src/index.ts"],"sourcesContent":["/**\n * HubSpot Adapter - Submit form data to HubSpot Forms API\n *\n * This adapter formats the payload for HubSpot's Forms API v3.\n * The consumer website loads the HubSpot tracking script separately.\n *\n * @example\n * const adapter = createHubSpotAdapter({\n * portalId: '12345678',\n * formId: 'abc-123-def',\n * fieldMapping: { fullName: 'firstname' }\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n HubSpotConfig,\n HubSpotSubmissionPayload,\n HubSpotField,\n} from './types.js';\n\n/**\n * Get HubSpot tracking cookie (hutk)\n */\nexport function getHubSpotCookie(): string | undefined {\n if (typeof document === 'undefined') {return undefined;}\n\n const match = document.cookie.match(/hubspotutk=([^;]+)/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Create a HubSpot submission adapter\n */\nexport function createHubSpotAdapter(config: HubSpotConfig): SubmissionAdapter {\n const { portalId, formId, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'hubspot',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, formData: data } };\n }\n\n const endpoint = `https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`;\n\n // Map fields to HubSpot format\n const mappedData = this.mapFields(data);\n const fields: HubSpotField[] = Object.entries(mappedData).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(';') : String(value ?? ''),\n }));\n\n const payload: HubSpotSubmissionPayload = {\n fields,\n context: {\n pageUri: context.pageUrl,\n pageName: context.pageTitle,\n hutk: getHubSpotCookie(),\n },\n };\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage =\n errorData.message || `HubSpot submission failed: ${response.status}`;\n return { success: false, error: errorMessage };\n }\n\n const responseData = await response.json();\n return { success: true, data: responseData };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Network error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { HubSpotConfig };\n","/**\n * Webhook Adapter - Submit form data to any webhook endpoint\n *\n * A generic adapter for sending form data to any HTTP endpoint.\n *\n * @example\n * const adapter = createWebhookAdapter({\n * url: 'https://api.example.com/forms',\n * headers: { 'Authorization': 'Bearer token' }\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n WebhookConfig,\n} from './types.js';\n\n/**\n * Create a webhook submission adapter\n */\nexport function createWebhookAdapter(config: WebhookConfig): SubmissionAdapter {\n const { url, method = 'POST', headers = {}, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'webhook',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, formData: data } };\n }\n\n if (!url) {\n return { success: false, error: 'Webhook URL is required' };\n }\n\n const mappedData = this.mapFields(data);\n\n const payload = {\n formData: mappedData,\n context: {\n pageUrl: context.pageUrl,\n pageTitle: context.pageTitle,\n referrer: context.referrer,\n submittedAt: context.timestamp,\n },\n };\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n return {\n success: false,\n error: `Webhook failed: ${response.status} ${errorText}`.trim(),\n };\n }\n\n // Try to parse JSON response, fall back to success with no data\n let responseData: unknown;\n try {\n responseData = await response.json();\n } catch {\n responseData = { status: response.status };\n }\n\n return { success: true, data: responseData };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Network error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { WebhookConfig };\n","/**\n * RevenueHero Adapter - Trigger RevenueHero calendar scheduling\n *\n * This adapter triggers the RevenueHero scheduler after form submission.\n * The consumer website loads the RevenueHero SDK separately.\n *\n * @example\n * const adapter = createRevenueHeroAdapter({\n * routerId: 'your-router-id'\n * });\n * await adapter.submit(formData, context);\n */\n\nimport type {\n FormData,\n SubmissionContext,\n SubmissionResult,\n SubmissionAdapter,\n RevenueHeroConfig,\n} from './types.js';\n\n/**\n * Check if RevenueHero SDK is loaded\n */\nexport function isRevenueHeroLoaded(): boolean {\n return typeof window !== 'undefined' && typeof window.RevenueHero !== 'undefined';\n}\n\n/**\n * Create a RevenueHero submission adapter\n *\n * Note: This adapter triggers the RevenueHero scheduler but doesn't\n * submit data to a backend. Use it in combination with another adapter\n * (like HubSpot or webhook) for data persistence.\n */\nexport function createRevenueHeroAdapter(config: RevenueHeroConfig): SubmissionAdapter {\n const { routerId, fieldMapping = {}, mock = false } = config;\n\n return {\n name: 'revenuehero',\n\n mapFields(data: FormData): FormData {\n const mapped: FormData = {};\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = fieldMapping[key] || key;\n mapped[mappedKey] = value;\n }\n return mapped;\n },\n\n async submit(data: FormData, _context: SubmissionContext): Promise<SubmissionResult> {\n // Mock mode for testing\n if (mock) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: true, data: { mock: true, scheduled: true } };\n }\n\n if (!routerId) {\n return { success: false, error: 'RevenueHero router ID is required' };\n }\n\n // Check if SDK is loaded\n if (!isRevenueHeroLoaded()) {\n console.warn(\n '[RevenueHeroAdapter] RevenueHero SDK not loaded. ' +\n 'Load the SDK in your page: <script src=\"https://app.revenuehero.io/js/widget.js\"></script>'\n );\n return {\n success: false,\n error: 'RevenueHero SDK not loaded. Please load the SDK in your page.',\n };\n }\n\n const mappedData = this.mapFields(data);\n\n // Extract email (required for RevenueHero)\n const email = String(mappedData.email || mappedData.workEmail || '');\n if (!email) {\n return { success: false, error: 'Email is required for RevenueHero scheduling' };\n }\n\n try {\n // Trigger RevenueHero scheduler\n window.RevenueHero!.schedule({\n routerId,\n email,\n ...mappedData,\n });\n\n return {\n success: true,\n data: { scheduled: true, email },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'RevenueHero error';\n return { success: false, error: errorMessage };\n }\n },\n };\n}\n\nexport type { RevenueHeroConfig };\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * FormStateController - Centralized state management for wizard forms\n *\n * Uses Lit's ReactiveController pattern for automatic re-rendering\n * when state changes.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport type { FormState, FieldValidation, ValidationResult, StepConfig } from '../types.js';\n\ntype StateSubscriber = (state: FormState) => void;\n\nexport class FormStateController implements ReactiveController {\n host: ReactiveControllerHost;\n\n // Internal state\n private _formData: Record<string, unknown> = {};\n private _validation: Record<string, FieldValidation> = {};\n private _currentStep = 1;\n private _totalSteps = 0;\n private _submitting = false;\n private _submitted = false;\n private _error?: string;\n private _stepConfigs: Map<number, StepConfig> = new Map();\n private _subscribers: Set<StateSubscriber> = new Set();\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n hostConnected(): void {\n // Controller connected to host\n }\n\n hostDisconnected(): void {\n // Clean up subscriptions\n this._subscribers.clear();\n }\n\n // ============================================\n // State Getters\n // ============================================\n\n get formData(): Record<string, unknown> {\n return { ...this._formData };\n }\n\n get validation(): Record<string, FieldValidation> {\n return { ...this._validation };\n }\n\n get currentStep(): number {\n return this._currentStep;\n }\n\n get totalSteps(): number {\n return this._totalSteps;\n }\n\n get submitting(): boolean {\n return this._submitting;\n }\n\n get submitted(): boolean {\n return this._submitted;\n }\n\n get error(): string | undefined {\n return this._error;\n }\n\n get state(): FormState {\n return {\n formData: this.formData,\n validation: this.validation,\n currentStep: this._currentStep,\n totalSteps: this._totalSteps,\n submitting: this._submitting,\n submitted: this._submitted,\n error: this._error,\n };\n }\n\n // ============================================\n // State Mutations\n // ============================================\n\n setValue(name: string, value: unknown): void {\n this._formData[name] = value;\n\n // Mark field as dirty\n if (this._validation[name]) {\n this._validation[name] = {\n ...this._validation[name],\n value,\n dirty: true,\n };\n } else {\n this._validation[name] = {\n name,\n value,\n result: { valid: true },\n touched: false,\n dirty: true,\n };\n }\n\n this._notifyChange();\n }\n\n getValue(name: string): unknown {\n return this._formData[name];\n }\n\n setValidation(name: string, result: ValidationResult): void {\n const existing = this._validation[name];\n this._validation[name] = {\n name,\n value: existing?.value ?? this._formData[name],\n result,\n touched: existing?.touched ?? false,\n dirty: existing?.dirty ?? false,\n };\n this._notifyChange();\n }\n\n markTouched(name: string): void {\n if (this._validation[name]) {\n this._validation[name] = {\n ...this._validation[name],\n touched: true,\n };\n } else {\n this._validation[name] = {\n name,\n value: this._formData[name],\n result: { valid: true },\n touched: true,\n dirty: false,\n };\n }\n this._notifyChange();\n }\n\n // ============================================\n // Step Management\n // ============================================\n\n setTotalSteps(total: number): void {\n this._totalSteps = total;\n this._notifyChange();\n }\n\n setStepConfig(step: number, config: StepConfig): void {\n this._stepConfigs.set(step, config);\n }\n\n getStepConfig(step: number): StepConfig | undefined {\n return this._stepConfigs.get(step);\n }\n\n getStepFields(step: number): string[] {\n return this._stepConfigs.get(step)?.fields ?? [];\n }\n\n goToStep(step: number): boolean {\n if (step < 1 || step > this._totalSteps) {\n return false;\n }\n\n // Check for skip conditions\n const config = this._stepConfigs.get(step);\n if (config?.skipIf?.(this._formData)) {\n // Skip this step, try next/previous\n if (step > this._currentStep) {\n return this.goToStep(step + 1);\n } else {\n return this.goToStep(step - 1);\n }\n }\n\n this._currentStep = step;\n this._notifyChange();\n return true;\n }\n\n nextStep(): boolean {\n return this.goToStep(this._currentStep + 1);\n }\n\n previousStep(): boolean {\n return this.goToStep(this._currentStep - 1);\n }\n\n isFirstStep(): boolean {\n return this._currentStep === 1;\n }\n\n isLastStep(): boolean {\n return this._currentStep === this._totalSteps;\n }\n\n // ============================================\n // Validation Helpers\n // ============================================\n\n isStepValid(step: number): boolean {\n const fields = this.getStepFields(step);\n return fields.every((name) => {\n const validation = this._validation[name];\n return !validation || validation.result.valid;\n });\n }\n\n isCurrentStepValid(): boolean {\n return this.isStepValid(this._currentStep);\n }\n\n getFieldError(name: string): string | undefined {\n const validation = this._validation[name];\n if (validation?.touched && !validation.result.valid) {\n return validation.result.error;\n }\n return undefined;\n }\n\n hasFieldError(name: string): boolean {\n return this.getFieldError(name) !== undefined;\n }\n\n // ============================================\n // Submission State\n // ============================================\n\n setSubmitting(submitting: boolean): void {\n this._submitting = submitting;\n this._notifyChange();\n }\n\n setSubmitted(submitted: boolean): void {\n this._submitted = submitted;\n this._notifyChange();\n }\n\n setError(error: string | undefined): void {\n this._error = error;\n this._notifyChange();\n }\n\n // ============================================\n // Reset\n // ============================================\n\n reset(): void {\n this._formData = {};\n this._validation = {};\n this._currentStep = 1;\n this._submitting = false;\n this._submitted = false;\n this._error = undefined;\n this._notifyChange();\n }\n\n // ============================================\n // Subscriptions\n // ============================================\n\n subscribe(callback: StateSubscriber): () => void {\n this._subscribers.add(callback);\n return () => {\n this._subscribers.delete(callback);\n };\n }\n\n private _notifyChange(): void {\n // Request host update\n this.host.requestUpdate();\n\n // Notify subscribers\n const state = this.state;\n this._subscribers.forEach((callback) => {\n try {\n callback(state);\n } catch (error) {\n console.error('[FormStateController] Subscriber error:', error);\n }\n });\n }\n}\n","/**\n * KeyboardController - Global keyboard shortcut management\n *\n * Handles Enter, Escape, and other keyboard navigation for wizard forms.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nexport interface KeyboardConfig {\n onEnter?: () => void;\n onEscape?: () => void;\n onArrowUp?: () => void;\n onArrowDown?: () => void;\n onArrowLeft?: () => void;\n onArrowRight?: () => void;\n /** Whether to prevent Enter on textareas (default: true) */\n blockEnterOnTextarea?: boolean;\n}\n\nexport class KeyboardController implements ReactiveController {\n host: ReactiveControllerHost & HTMLElement;\n private _config: KeyboardConfig;\n private _enabled = true;\n private _boundHandler: (e: KeyboardEvent) => void;\n\n constructor(host: ReactiveControllerHost & HTMLElement, config: KeyboardConfig = {}) {\n this.host = host;\n this._config = {\n blockEnterOnTextarea: true,\n ...config,\n };\n this._boundHandler = this._handleKeydown.bind(this);\n host.addController(this);\n }\n\n hostConnected(): void {\n // Listen on the host element\n this.host.addEventListener('keydown', this._boundHandler);\n // Also listen on document for global shortcuts\n document.addEventListener('keydown', this._boundHandler);\n }\n\n hostDisconnected(): void {\n this.host.removeEventListener('keydown', this._boundHandler);\n document.removeEventListener('keydown', this._boundHandler);\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n if (!this._enabled) {return;}\n\n // Get active element, accounting for shadow DOM\n const activeElement = this._getActiveElement();\n const isTextarea = activeElement?.tagName === 'TEXTAREA';\n const isInput = activeElement?.tagName === 'INPUT';\n const isContentEditable = activeElement?.getAttribute('contenteditable') === 'true';\n const isTextInput = isTextarea || isInput || isContentEditable;\n\n switch (e.key) {\n case 'Enter':\n // Block Enter on textareas if configured\n if (isTextarea && this._config.blockEnterOnTextarea) {\n return;\n }\n // Allow Enter on inputs and other elements\n if (this._config.onEnter) {\n e.preventDefault();\n this._config.onEnter();\n }\n break;\n\n case 'Escape':\n if (this._config.onEscape) {\n e.preventDefault();\n this._config.onEscape();\n }\n break;\n\n case 'ArrowUp':\n if (!isTextInput && this._config.onArrowUp) {\n e.preventDefault();\n this._config.onArrowUp();\n }\n break;\n\n case 'ArrowDown':\n if (!isTextInput && this._config.onArrowDown) {\n e.preventDefault();\n this._config.onArrowDown();\n }\n break;\n\n case 'ArrowLeft':\n if (!isTextInput && this._config.onArrowLeft) {\n e.preventDefault();\n this._config.onArrowLeft();\n }\n break;\n\n case 'ArrowRight':\n if (!isTextInput && this._config.onArrowRight) {\n e.preventDefault();\n this._config.onArrowRight();\n }\n break;\n }\n }\n\n /**\n * Get the actual active element, traversing shadow DOMs\n */\n private _getActiveElement(): Element | null {\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n return active;\n }\n\n /**\n * Update keyboard config\n */\n updateConfig(config: Partial<KeyboardConfig>): void {\n this._config = { ...this._config, ...config };\n }\n\n /**\n * Enable keyboard shortcuts\n */\n enable(): void {\n this._enabled = true;\n }\n\n /**\n * Disable keyboard shortcuts\n */\n disable(): void {\n this._enabled = false;\n }\n\n /**\n * Check if keyboard shortcuts are enabled\n */\n get enabled(): boolean {\n return this._enabled;\n }\n}\n","/**\n * WF-Badge - Keyboard shortcut badge component for wizard forms\n *\n * A reusable badge component with multiple variants for displaying keyboard shortcuts.\n *\n * @example\n * <wf-badge shortcut=\"A\"></wf-badge>\n * <wf-badge shortcut=\"Enter\" variant=\"selected\"></wf-badge>\n * <wf-badge shortcut=\"↵\" variant=\"button\"></wf-badge>\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nexport type BadgeVariant = 'default' | 'selected' | 'button' | 'button-secondary';\n\n@customElement('wf-badge')\nexport class WfBadge extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * The text to display in the badge (e.g., 'A', 'Enter', '↵')\n */\n @property({ type: String })\n shortcut = '';\n\n /**\n * Visual variant of the badge\n */\n @property({ type: String })\n variant: BadgeVariant = 'default';\n\n render() {\n return html`\n <span\n class=\"wf-badge wf-badge--${this.variant}\"\n aria-hidden=\"true\"\n >\n ${this.shortcut}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-badge': WfBadge;\n }\n}\n","/**\n * Wizard-Form - Main orchestrator component\n *\n * Manages multi-step form flow, validation, and submission.\n *\n * @example\n * <wizard-form hubspot-portal=\"12345\" hubspot-form=\"abc-123\">\n * <wf-step data-step=\"1\">...</wf-step>\n * <wf-step data-step=\"2\">...</wf-step>\n * <wf-success>Thank you!</wf-success>\n * </wizard-form>\n */\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { FormStateController } from '../controllers/FormStateController.js';\nimport { KeyboardController } from '../controllers/KeyboardController.js';\nimport type { WfStep } from './wf-step.js';\nimport type { Theme, HubSpotSubmissionData } from '../types.js';\n// Import wf-badge for button shortcuts\nimport './wf-badge.js';\n\n// Event detail types\nexport interface StepChangeDetail {\n from: number;\n to: number;\n direction: 'forward' | 'backward';\n submitted?: boolean;\n adapter?: 'hubspot';\n}\n\nexport interface FieldChangeDetail {\n name: string;\n value: unknown;\n formData: Record<string, unknown>;\n}\n\nexport interface SubmitDetail {\n formData: Record<string, unknown>;\n}\n\nexport interface SuccessDetail {\n formData: Record<string, unknown>;\n response?: unknown;\n}\n\nexport interface ErrorDetail {\n error: string;\n formData?: Record<string, unknown>;\n}\n\n@customElement('wizard-form')\nexport class WizardForm extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n // ============================================\n // Properties\n // ============================================\n\n /**\n * HubSpot portal ID\n */\n @property({ type: String, attribute: 'hubspot-portal' })\n hubspotPortal = '';\n\n /**\n * HubSpot form ID\n */\n @property({ type: String, attribute: 'hubspot-form' })\n hubspotForm = '';\n\n /**\n * Color theme\n */\n @property({ type: String, reflect: true })\n theme: Theme = 'light';\n\n /**\n * Mock submission mode (for testing)\n */\n @property({ type: Boolean })\n mock = false;\n\n /**\n * Show progress bar\n */\n @property({ type: Boolean, attribute: 'show-progress' })\n showProgress = false;\n\n /**\n * Auto-advance after single-select option\n */\n @property({ type: Boolean, attribute: 'auto-advance' })\n autoAdvance = true;\n\n /**\n * Hide the back button in navigation\n */\n @property({ type: Boolean, attribute: 'hide-back' })\n hideBack = true;\n\n /**\n * Transform form data before submission.\n * Applied before HubSpot submission and passed to wf:success event.\n */\n @property({ attribute: false })\n serialize?: (data: Record<string, unknown>) => Record<string, unknown>;\n\n /**\n * Submit partial form data to HubSpot after each step change.\n * When enabled, form data is submitted after each step navigation (blocking).\n * Only fields from completed steps are included in partial submissions.\n */\n @property({ type: Boolean, attribute: 'submit-on-step' })\n submitOnStep = false;\n\n // ============================================\n // State\n // ============================================\n\n @state()\n private _steps: WfStep[] = [];\n\n @state()\n private _currentStep = 1;\n\n @state()\n private _totalSteps = 0;\n\n @state()\n private _formData: Record<string, unknown> = {};\n\n @state()\n private _submitting = false;\n\n @state()\n private _submitted = false;\n\n @state()\n private _error = '';\n\n /**\n * Cached success content (stored in firstUpdated before render can remove it)\n */\n private _cachedSuccessContent: Element | null = null;\n\n // ============================================\n // Controllers\n // ============================================\n\n private _stateController = new FormStateController(this);\n\n constructor() {\n super();\n\n // Initialize keyboard controller (attaches to host automatically)\n new KeyboardController(this, {\n onEnter: () => this._handleEnter(),\n onEscape: () => this._handleEscape(),\n });\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('wf-change', this._handleFieldChange as EventListener);\n this.addEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('wf-change', this._handleFieldChange as EventListener);\n this.removeEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n }\n\n firstUpdated(): void {\n // Cache success content before any re-renders could lose it (Light DOM issue)\n this._cachedSuccessContent = this.querySelector('[slot=\"success\"]');\n\n this._discoverSteps();\n this._showCurrentStep();\n }\n\n // ============================================\n // Rendering\n // ============================================\n\n render() {\n if (this._submitted) {\n // Hide all steps (they exist outside Lit's render in Light DOM)\n this._steps.forEach(step => {\n step.active = false;\n step.style.display = 'none';\n });\n\n // Use cached success content (stored in firstUpdated)\n if (this._cachedSuccessContent) {\n // Ensure success content is visible\n (this._cachedSuccessContent as HTMLElement).style.display = '';\n return html`\n <div class=\"wf-container wf-submitted\">\n <div class=\"wf-success-screen\">\n ${this._cachedSuccessContent}\n </div>\n </div>\n `;\n }\n\n // Default success screen if no slot=\"success\" provided\n return html`\n <div class=\"wf-container wf-submitted\">\n <div class=\"wf-success-screen\">\n <h2>Thank you!</h2>\n <p>Your submission has been received.</p>\n </div>\n </div>\n `;\n }\n\n // Ensure success content is hidden during form flow\n if (this._cachedSuccessContent) {\n (this._cachedSuccessContent as HTMLElement).style.display = 'none';\n }\n\n return html`\n <div class=\"wf-container\">\n ${this._error\n ? html`<div class=\"wf-form-error\" role=\"alert\">${this._error}</div>`\n : nothing}\n\n ${this._renderNavigation()}\n </div>\n `;\n }\n\n private _renderProgress() {\n const segments = [];\n for (let i = 1; i <= this._totalSteps; i++) {\n const completed = i < this._currentStep;\n const active = i === this._currentStep;\n segments.push(html`\n <div\n class=\"wf-progress-segment ${completed ? 'completed' : ''} ${active ? 'active' : ''}\"\n ></div>\n `);\n }\n return html`<div class=\"wf-progress\">${segments}</div>`;\n }\n\n private _renderNavigation() {\n const isFirst = this._currentStep === 1;\n const isLast = this._currentStep === this._totalSteps;\n const showBack = !this.hideBack && !isFirst;\n\n return html`\n <div class=\"wf-navigation\">\n ${showBack\n ? html`\n <button\n class=\"wf-btn wf-btn-back\"\n @click=\"${this._goBack}\"\n ?disabled=\"${this._submitting}\"\n data-testid=\"wf-back-btn\"\n >\n <span class=\"wf-btn-shortcut\"><wf-badge shortcut=\"Esc\" variant=\"button-secondary\"></wf-badge></span>\n Back\n </button>\n `\n : nothing}\n\n <button\n class=\"wf-btn wf-btn-next\"\n @click=\"${this._goNext}\"\n ?disabled=\"${this._submitting}\"\n data-testid=\"wf-next-btn\"\n >\n ${this._submitting\n ? html`<span class=\"wf-loading\"></span>`\n : isLast\n ? 'Submit'\n : 'Continue'}\n <span class=\"wf-btn-shortcut\"><wf-badge shortcut=\"Enter ↵\" variant=\"button\"></wf-badge></span>\n </button>\n </div>\n `;\n }\n\n // ============================================\n // Step Discovery\n // ============================================\n\n private _discoverSteps(): void {\n // Light DOM: Query direct wf-step children\n this._steps = Array.from(this.querySelectorAll(':scope > wf-step')) as WfStep[];\n\n // Auto-assign step numbers based on DOM order (1-indexed)\n // This makes data-step attribute optional\n this._steps.forEach((step, index) => {\n step.step = index + 1;\n });\n\n this._totalSteps = this._steps.length;\n this._stateController.setTotalSteps(this._totalSteps);\n\n // Emit event for external progress components\n this.dispatchEvent(\n new CustomEvent('wf:steps-discovered', {\n detail: {\n totalSteps: this._totalSteps,\n currentStep: this._currentStep,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _showCurrentStep(): void {\n this._steps.forEach((step, index) => {\n const stepNumber = index + 1;\n if (stepNumber === this._currentStep) {\n step.show('forward');\n } else {\n step.active = false;\n }\n });\n }\n\n /**\n * Get step element by step number (1-indexed)\n */\n private _getStepByNumber(stepNumber: number): WfStep | undefined {\n const index = stepNumber - 1;\n return this._steps[index];\n }\n\n // ============================================\n // Navigation\n // ============================================\n\n private async _goNext(): Promise<void> {\n if (this._submitting) {return;}\n\n // Validate current step\n const currentStep = this._getStepByNumber(this._currentStep);\n if (currentStep) {\n const isValid = await currentStep.validate();\n if (!isValid) {\n return;\n }\n }\n\n if (this._currentStep >= this._totalSteps) {\n // Submit form\n await this._submit();\n } else {\n // Go to next step\n this._navigateToStep(this._currentStep + 1, 'forward');\n }\n }\n\n private _goBack(): void {\n if (this._submitting) {return;}\n if (this._currentStep <= 1) {return;}\n\n this._navigateToStep(this._currentStep - 1, 'backward');\n }\n\n private async _navigateToStep(\n targetStep: number,\n direction: 'forward' | 'backward'\n ): Promise<void> {\n if (targetStep < 1 || targetStep > this._totalSteps) {return;}\n\n const targetStepEl = this._getStepByNumber(targetStep);\n if (!targetStepEl) {return;}\n\n // Check skip condition\n if (targetStepEl.shouldSkip(this._formData)) {\n const nextTarget = direction === 'forward' ? targetStep + 1 : targetStep - 1;\n if (nextTarget >= 1 && nextTarget <= this._totalSteps) {\n return this._navigateToStep(nextTarget, direction);\n }\n return;\n }\n\n const previousStep = this._currentStep;\n\n // Partial submission (blocking) - submit before navigation\n let submitted = false;\n let adapter: 'hubspot' | undefined;\n\n if (this.submitOnStep && this.hubspotPortal && this.hubspotForm) {\n try {\n await this._submitPartialToHubSpot();\n submitted = true;\n adapter = 'hubspot';\n } catch (error) {\n // Block navigation on failure\n console.error('[wizard-form] Partial submission failed:', error);\n this.dispatchEvent(\n new CustomEvent<ErrorDetail>('wf:error', {\n detail: {\n error: error instanceof Error ? error.message : 'Partial submission failed',\n formData: this._getFieldsUpToStep(this._currentStep),\n },\n bubbles: true,\n composed: true,\n })\n );\n return; // Don't proceed to next step\n }\n }\n\n // Hide current step\n const currentStepEl = this._getStepByNumber(this._currentStep);\n if (currentStepEl) {\n await currentStepEl.hide();\n }\n\n // Update current step\n this._currentStep = targetStep;\n this._stateController.goToStep(targetStep);\n\n // Show new step\n targetStepEl.show(direction);\n\n // Dispatch step change event with submission metadata\n this.dispatchEvent(\n new CustomEvent<StepChangeDetail>('wf:step-change', {\n detail: {\n from: previousStep,\n to: targetStep,\n direction,\n submitted,\n adapter,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n // ============================================\n // Event Handlers\n // ============================================\n\n private _handleFieldChange = (e: CustomEvent): void => {\n const { name, value, extraFields } = e.detail;\n this._formData[name] = value;\n this._stateController.setValue(name, value);\n\n // Handle dual-field submission (e.g., \"Others\" with custom text from wf-options)\n if (extraFields) {\n Object.entries(extraFields).forEach(([fieldName, fieldValue]) => {\n this._formData[fieldName] = fieldValue;\n this._stateController.setValue(fieldName, fieldValue as string);\n });\n }\n\n // Clear form error on field change\n this._error = '';\n\n this.dispatchEvent(\n new CustomEvent<FieldChangeDetail>('wf:field-change', {\n detail: {\n name,\n value,\n formData: { ...this._formData },\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleOptionSelect = (e: CustomEvent): void => {\n // Check if this is a single-select option and auto-advance is enabled\n if (this.autoAdvance) {\n const target = e.target as Element;\n const optionsParent = target.closest('wf-options');\n if (optionsParent && !optionsParent.hasAttribute('multi')) {\n // Delay to show selection animation\n setTimeout(() => {\n this._goNext();\n }, 300);\n }\n }\n };\n\n private async _handleEnter(): Promise<void> {\n await this._goNext();\n }\n\n private _handleEscape(): void {\n this._goBack();\n }\n\n // ============================================\n // Submission\n // ============================================\n\n private async _submit(): Promise<void> {\n if (this._submitting) {return;}\n\n const rawData: Record<string, unknown> = { ...this._formData };\n\n // Dispatch submit event with RAW data (cancelable)\n // This allows init() or user code to apply their own transformations\n const submitEvent = new CustomEvent<SubmitDetail>('wf:submit', {\n detail: { formData: rawData },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(submitEvent);\n\n if (submitEvent.defaultPrevented) {\n return;\n }\n\n this._submitting = true;\n this._error = '';\n\n // Apply serialize transform if provided (for built-in HubSpot submission)\n let submitData = rawData;\n if (this.serialize) {\n submitData = this.serialize(rawData);\n }\n\n try {\n let response: unknown;\n\n if (this.mock) {\n // Mock submission for testing\n await new Promise((resolve) => setTimeout(resolve, 1000));\n response = { success: true };\n } else if (this.hubspotPortal && this.hubspotForm) {\n // Submit to HubSpot with serialized data\n response = await this._submitToHubSpot(submitData);\n } else {\n // No submission target configured\n console.warn('[WizardForm] No submission target configured. Use hubspot-portal/hubspot-form or mock.');\n response = { success: true };\n }\n\n this._submitted = true;\n\n // wf:success receives serialized data (same as what went to HubSpot)\n this.dispatchEvent(\n new CustomEvent<SuccessDetail>('wf:success', {\n detail: {\n formData: submitData,\n response,\n },\n bubbles: true,\n composed: true,\n })\n );\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed';\n this._error = errorMessage;\n\n this.dispatchEvent(\n new CustomEvent<ErrorDetail>('wf:error', {\n detail: {\n error: errorMessage,\n formData: submitData,\n },\n bubbles: true,\n composed: true,\n })\n );\n } finally {\n this._submitting = false;\n }\n }\n\n private async _submitToHubSpot(formData: Record<string, unknown>): Promise<unknown> {\n const endpoint = `https://api.hsforms.com/submissions/v3/integration/submit/${this.hubspotPortal}/${this.hubspotForm}`;\n\n // Convert form data to HubSpot format\n const fields = Object.entries(formData).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(';') : String(value ?? ''),\n }));\n\n const data: HubSpotSubmissionData = {\n fields,\n context: {\n pageUri: window.location.href,\n pageName: document.title,\n },\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `HubSpot submission failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ============================================\n // Partial Submission\n // ============================================\n\n /**\n * Get form fields from steps up to and including the specified step number.\n * Used for partial submission to only include completed step data.\n */\n private _getFieldsUpToStep(stepNumber: number): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Get all steps up to and including the specified step\n for (let i = 0; i < stepNumber && i < this._steps.length; i++) {\n const step = this._steps[i];\n // Find all field components in this step\n const fields = step.querySelectorAll('[name]') as NodeListOf<HTMLElement & { name: string }>;\n fields.forEach((field) => {\n if (field.name && this._formData[field.name] !== undefined) {\n result[field.name] = this._formData[field.name];\n }\n });\n }\n\n return result;\n }\n\n /**\n * Submit partial form data to HubSpot.\n * Only includes fields from steps up to and including the current step.\n */\n private async _submitPartialToHubSpot(): Promise<void> {\n // Only include fields from steps up to and including the current step\n const partialData = this._getFieldsUpToStep(this._currentStep);\n\n // Apply serialize transform if provided\n let submitData = { ...partialData };\n if (this.serialize) {\n submitData = this.serialize(submitData);\n }\n\n await this._submitToHubSpot(submitData);\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current form data\n */\n get formData(): Record<string, unknown> {\n return { ...this._formData };\n }\n\n /**\n * Get current step number\n */\n get currentStep(): number {\n return this._currentStep;\n }\n\n /**\n * Get total number of steps\n */\n get totalSteps(): number {\n return this._totalSteps;\n }\n\n /**\n * Check if form is submitting\n */\n get isSubmitting(): boolean {\n return this._submitting;\n }\n\n /**\n * Check if form was submitted\n */\n get isSubmitted(): boolean {\n return this._submitted;\n }\n\n /**\n * Go to a specific step\n */\n goToStep(step: number): void {\n const direction = step > this._currentStep ? 'forward' : 'backward';\n this._navigateToStep(step, direction);\n }\n\n /**\n * Go to next step\n */\n next(): Promise<void> {\n return this._goNext();\n }\n\n /**\n * Go to previous step\n */\n back(): void {\n this._goBack();\n }\n\n /**\n * Submit the form\n */\n submit(): Promise<void> {\n return this._submit();\n }\n\n /**\n * Reset the form\n */\n reset(): void {\n this._formData = {};\n this._currentStep = 1;\n this._submitting = false;\n this._submitted = false;\n this._error = '';\n this._stateController.reset();\n this._showCurrentStep();\n\n // Reset all field components\n this._steps.forEach((step) => {\n const fields = step.querySelectorAll('wf-options, wf-field, wf-email');\n fields.forEach((field) => {\n if ('reset' in field && typeof (field as { reset: () => void }).reset === 'function') {\n (field as { reset: () => void }).reset();\n }\n });\n });\n }\n\n /**\n * Set form data\n */\n setFormData(data: Record<string, unknown>): void {\n this._formData = { ...this._formData, ...data };\n Object.entries(data).forEach(([name, value]) => {\n this._stateController.setValue(name, value);\n });\n }\n}\n\n// Success screen component\n@customElement('wf-success')\nexport class WfSuccess extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wizard-form': WizardForm;\n 'wf-success': WfSuccess;\n }\n}\n","/**\n * WF-Step - Step container component for wizard forms\n *\n * Wraps step content and handles visibility/transitions.\n *\n * @example\n * <wf-step data-step=\"1\">\n * <h2>What's your role?</h2>\n * <wf-options name=\"role\" required>\n * <wf-option value=\"developer\">Developer</wf-option>\n * </wf-options>\n * </wf-step>\n */\n\nimport { LitElement, html, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('wf-step')\nexport class WfStep extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * Step number (1-indexed)\n */\n @property({ type: Number, attribute: 'data-step' })\n step = 0;\n\n /**\n * Whether this step is currently active\n */\n @property({ type: Boolean, reflect: true })\n active = false;\n\n /**\n * Animation direction (forward/backward)\n */\n @property({ type: String, reflect: true })\n direction: 'forward' | 'backward' = 'forward';\n\n /**\n * Whether this step is leaving (for exit animation)\n */\n @property({ type: Boolean, reflect: true })\n leaving = false;\n\n /**\n * Skip condition expression (evaluated against form data)\n */\n @property({ type: String, attribute: 'data-skip-if' })\n skipIf = '';\n\n /**\n * List of field names in this step (auto-discovered)\n */\n @state()\n private _fields: string[] = [];\n\n render() {\n return html`\n <div class=\"wf-step-content\"></div>\n `;\n }\n\n firstUpdated(): void {\n this._discoverFields();\n }\n\n protected updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('active')) {\n if (this.active) {\n this.leaving = false;\n this._focusFirstField();\n }\n }\n }\n\n /**\n * Discover field elements within this step\n */\n private _discoverFields(): void {\n // Light DOM: Query all field elements within this step\n const fieldElements = ['wf-options', 'wf-field', 'wf-email', 'wf-input', 'wf-textarea', 'wf-number'];\n const fields: string[] = [];\n\n const findFields = (el: Element): void => {\n if (fieldElements.includes(el.tagName.toLowerCase())) {\n const name = el.getAttribute('name');\n if (name) {\n fields.push(name);\n }\n }\n // Recurse into children\n Array.from(el.children).forEach(findFields);\n };\n\n Array.from(this.children).forEach(findFields);\n this._fields = fields;\n }\n\n /**\n * Focus the first focusable field in this step\n */\n private _focusFirstField(): void {\n // Delay to allow DOM updates\n requestAnimationFrame(() => {\n // Light DOM: Find first focusable element among children\n for (const el of this.children) {\n const focusable = this._findFocusable(el);\n if (focusable) {\n focusable.focus();\n return;\n }\n }\n });\n }\n\n private _findFocusable(el: Element): HTMLElement | null {\n // Check if element itself is focusable\n if (el instanceof HTMLElement && typeof el.focus === 'function') {\n // Skip wf-options - don't auto-focus as the focus style looks like selection\n const fieldElements = ['wf-field', 'wf-email', 'wf-input', 'wf-textarea'];\n if (fieldElements.includes(el.tagName.toLowerCase())) {\n return el;\n }\n }\n\n // Recurse into children\n for (const child of el.children) {\n const found = this._findFocusable(child);\n if (found) {return found;}\n }\n\n return null;\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get field names in this step\n */\n get fields(): string[] {\n return [...this._fields];\n }\n\n /**\n * Check if step should be skipped based on form data\n */\n shouldSkip(formData: Record<string, unknown>): boolean {\n if (!this.skipIf) {return false;}\n\n try {\n // Simple expression evaluation\n // Supports: \"fieldName === 'value'\" or \"!fieldName\"\n const expression = this.skipIf.trim();\n\n // Handle negation\n if (expression.startsWith('!')) {\n const fieldName = expression.slice(1);\n return !formData[fieldName];\n }\n\n // Handle equality check\n if (expression.includes('===')) {\n const [left, right] = expression.split('===').map((s) => s.trim());\n const fieldValue = formData[left];\n const compareValue = right.replace(/['\"]/g, ''); // Remove quotes\n return fieldValue === compareValue;\n }\n\n // Handle inequality check\n if (expression.includes('!==')) {\n const [left, right] = expression.split('!==').map((s) => s.trim());\n const fieldValue = formData[left];\n const compareValue = right.replace(/['\"]/g, '');\n return fieldValue !== compareValue;\n }\n\n // Simple truthy check\n return Boolean(formData[expression]);\n } catch (error) {\n console.error('[WfStep] Error evaluating skip condition:', error);\n return false;\n }\n }\n\n /**\n * Show this step with animation\n */\n show(direction: 'forward' | 'backward' = 'forward'): void {\n this.direction = direction;\n this.leaving = false;\n this.active = true;\n }\n\n /**\n * Hide this step with animation\n */\n hide(): Promise<void> {\n return new Promise((resolve) => {\n this.leaving = true;\n\n const handleAnimationEnd = (): void => {\n this.active = false;\n this.leaving = false;\n this.removeEventListener('animationend', handleAnimationEnd);\n resolve();\n };\n\n this.addEventListener('animationend', handleAnimationEnd);\n\n // Fallback timeout\n setTimeout(() => {\n this.active = false;\n this.leaving = false;\n this.removeEventListener('animationend', handleAnimationEnd);\n resolve();\n }, 300);\n });\n }\n\n /**\n * Validate all fields in this step\n * Returns true if all fields are valid\n * Scrolls to and focuses the first invalid field if validation fails\n */\n async validate(): Promise<boolean> {\n // Light DOM: Validate all child elements\n const invalidElements: Element[] = [];\n let allValid = true;\n\n const validateElement = async (el: Element): Promise<void> => {\n // Check for validate method on field elements\n if ('validate' in el && typeof (el as { validate: () => boolean | Promise<boolean> }).validate === 'function') {\n const isValid = await (el as { validate: () => boolean | Promise<boolean> }).validate();\n if (!isValid) {\n // Track invalid elements\n invalidElements.push(el);\n allValid = false;\n }\n }\n\n // Recurse into children\n for (const child of el.children) {\n await validateElement(child);\n }\n };\n\n for (const el of this.children) {\n await validateElement(el);\n }\n\n // Scroll to and focus first invalid field\n if (invalidElements.length > 0) {\n const firstInvalid = invalidElements[0];\n\n // Smooth scroll to the element\n firstInvalid.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n\n // Focus the element after a brief delay for scroll to complete\n setTimeout(() => {\n if ('focus' in firstInvalid && typeof (firstInvalid as HTMLElement).focus === 'function') {\n (firstInvalid as HTMLElement).focus();\n }\n }, 100);\n }\n\n return allValid;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-step': WfStep;\n }\n}\n","/**\n * WF-Layout - Figma-style auto-layout container for wizard forms\n *\n * A flexible layout component supporting both flexbox and CSS grid modes\n * with independent horizontal/vertical gutters and padding.\n *\n * @example\n * <!-- Flex mode (default) -->\n * <wf-layout direction=\"column\" gap=\"md\">\n * <wf-input name=\"name\" label=\"Name\"></wf-input>\n * <wf-email name=\"email\" label=\"Email\"></wf-email>\n * </wf-layout>\n *\n * <!-- Grid mode with responsive columns -->\n * <wf-layout mode=\"grid\" columns=\"2\" gap-x=\"lg\" gap-y=\"md\">\n * <wf-option value=\"a\">A</wf-option>\n * <wf-option value=\"b\">B</wf-option>\n * </wf-layout>\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nexport type LayoutMode = 'flex' | 'grid';\nexport type FlexDirection = 'row' | 'column';\nexport type AlignItems = 'start' | 'center' | 'end' | 'stretch';\nexport type JustifyContent = 'start' | 'center' | 'end' | 'space-between' | 'space-around';\nexport type WidthBehavior = 'full' | 'auto' | 'fit';\nexport type SpacingPreset = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n// Spacing scale in pixels\nconst SPACING_SCALE: Record<SpacingPreset, number> = {\n none: 0,\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n};\n\n@customElement('wf-layout')\nexport class WfLayout extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * Layout mode: 'flex' for flexbox, 'grid' for CSS grid\n */\n @property({ type: String })\n mode: LayoutMode = 'flex';\n\n /**\n * Flex direction (flex mode only)\n */\n @property({ type: String })\n direction: FlexDirection = 'column';\n\n /**\n * Uniform gap (sets both gap-x and gap-y)\n */\n @property({ type: String })\n gap: SpacingPreset | string = 'none';\n\n /**\n * Horizontal gutter (column-gap)\n */\n @property({ type: String, attribute: 'gap-x' })\n gapX: SpacingPreset | string = '';\n\n /**\n * Vertical gutter (row-gap)\n */\n @property({ type: String, attribute: 'gap-y' })\n gapY: SpacingPreset | string = '';\n\n /**\n * Cross-axis alignment\n */\n @property({ type: String })\n align: AlignItems = 'stretch';\n\n /**\n * Main-axis justification\n */\n @property({ type: String })\n justify: JustifyContent = 'start';\n\n /**\n * Uniform padding (all sides)\n */\n @property({ type: String })\n padding: SpacingPreset | string = 'none';\n\n /**\n * Horizontal padding (left/right)\n */\n @property({ type: String, attribute: 'padding-x' })\n paddingX: SpacingPreset | string = '';\n\n /**\n * Vertical padding (top/bottom)\n */\n @property({ type: String, attribute: 'padding-y' })\n paddingY: SpacingPreset | string = '';\n\n /**\n * Enable flex-wrap (flex mode only)\n */\n @property({ type: Boolean })\n wrap = false;\n\n /**\n * Width behavior\n */\n @property({ type: String })\n width: WidthBehavior = 'full';\n\n /**\n * Number of columns or 'auto' for responsive (grid mode only)\n */\n @property({ type: String })\n columns: string = 'auto';\n\n /**\n * Minimum item width for auto-fit grid\n */\n @property({ type: String, attribute: 'min-item-width' })\n minItemWidth = '200px';\n\n /**\n * Convert spacing value to pixels\n */\n private _resolveSpacing(value: SpacingPreset | string): string {\n if (!value || value === 'none') {\n return '0';\n }\n\n // Check if it's a preset\n if (value in SPACING_SCALE) {\n return `${SPACING_SCALE[value as SpacingPreset]}px`;\n }\n\n // Check if it's a number (treat as pixels)\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return `${num}px`;\n }\n\n // Return as-is (could be a CSS value like '1rem')\n return value;\n }\n\n /**\n * Get computed gap-x value\n */\n private _getGapX(): string {\n return this._resolveSpacing(this.gapX || this.gap);\n }\n\n /**\n * Get computed gap-y value\n */\n private _getGapY(): string {\n return this._resolveSpacing(this.gapY || this.gap);\n }\n\n /**\n * Get computed padding values\n */\n private _getPadding(): string {\n const uniformPadding = this._resolveSpacing(this.padding);\n const px = this.paddingX ? this._resolveSpacing(this.paddingX) : uniformPadding;\n const py = this.paddingY ? this._resolveSpacing(this.paddingY) : uniformPadding;\n return `${py} ${px}`;\n }\n\n /**\n * Build inline styles based on properties\n */\n private _buildStyles(): string {\n const styles: string[] = [];\n\n if (this.mode === 'grid') {\n styles.push('display: grid');\n\n // Grid columns\n const cols = parseInt(this.columns, 10);\n if (!isNaN(cols) && cols > 0) {\n styles.push(`grid-template-columns: repeat(${cols}, 1fr)`);\n } else {\n // Auto-fit responsive grid\n styles.push(\n `grid-template-columns: repeat(auto-fit, minmax(${this.minItemWidth}, 1fr))`\n );\n }\n\n // Grid alignment\n if (this.align !== 'stretch') {\n styles.push(`align-items: ${this.align}`);\n }\n if (this.justify !== 'start') {\n styles.push(`justify-content: ${this.justify}`);\n }\n } else {\n // Flex mode\n styles.push('display: flex');\n styles.push(`flex-direction: ${this.direction}`);\n\n if (this.wrap) {\n styles.push('flex-wrap: wrap');\n }\n\n // Flex alignment\n if (this.align !== 'stretch') {\n styles.push(`align-items: ${this.align}`);\n }\n if (this.justify !== 'start') {\n styles.push(`justify-content: ${this.justify}`);\n }\n }\n\n // Gap (works for both flex and grid)\n const gapX = this._getGapX();\n const gapY = this._getGapY();\n if (gapX !== '0' || gapY !== '0') {\n styles.push(`column-gap: ${gapX}`);\n styles.push(`row-gap: ${gapY}`);\n }\n\n // Padding\n const padding = this._getPadding();\n if (padding !== '0 0') {\n styles.push(`padding: ${padding}`);\n }\n\n return styles.join('; ');\n }\n\n /**\n * Apply styles to host element when properties change\n */\n updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n\n // Apply layout styles to host element\n this.style.cssText = this._buildStyles();\n\n // Update width class on host\n this.classList.remove('wf-layout--width-full', 'wf-layout--width-auto', 'wf-layout--width-fit');\n this.classList.add(`wf-layout--width-${this.width}`);\n }\n\n render() {\n // No inner div needed - children are direct Light DOM children of host\n // Styles are applied to host in updated()\n return html``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-layout': WfLayout;\n }\n}\n","/**\n * WF-Options - Option group component for wizard forms\n *\n * Manages a group of wf-option elements with single/multi-select support.\n * Auto-assigns keyboard shortcuts to child options.\n *\n * @example\n * <!-- Single select (default) -->\n * <wf-options name=\"role\" required>\n * <wf-option value=\"developer\">Developer</wf-option>\n * <wf-option value=\"designer\">Designer</wf-option>\n * </wf-options>\n *\n * <!-- Multi-select with constraints -->\n * <wf-options name=\"interests\" multi required min=\"1\" max=\"3\">\n * <wf-option value=\"ai\">AI</wf-option>\n * <wf-option value=\"web\">Web</wf-option>\n * <wf-option value=\"mobile\">Mobile</wf-option>\n * </wf-options>\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { WfOption, OptionSelectDetail } from './wf-option.js';\n\n// Import wf-badge for shortcut display\nimport './wf-badge.js';\n// Import wf-layout for grid layout\nimport './wf-layout.js';\n\n// Event detail types\nexport interface OptionsChangeDetail {\n name: string;\n value: string | string[];\n selected: string[];\n /** Extra fields for dual-field submission (e.g., \"Other\" with custom text) */\n extraFields?: Record<string, unknown>;\n}\n\n@customElement('wf-options')\nexport class WfOptions extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Enable multi-select mode\n */\n @property({ type: Boolean })\n multi = false;\n\n /**\n * Whether selection is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Minimum selections required (multi-select only)\n */\n @property({ type: Number })\n min = 0;\n\n /**\n * Maximum selections allowed (multi-select only, 0 = unlimited)\n */\n @property({ type: Number })\n max = 0;\n\n /**\n * Number of grid columns (2 by default)\n */\n @property({ type: Number, reflect: true })\n columns = 2;\n\n /**\n * Enable \"Other\" text input when option with value=\"other\" is selected\n */\n @property({ type: Boolean, attribute: 'allow-other' })\n allowOther = false;\n\n /**\n * Label for the \"Other\" text input\n */\n @property({ type: String, attribute: 'other-label' })\n otherLabel = 'Other, please specify:';\n\n /**\n * Placeholder for the \"Other\" text input\n */\n @property({ type: String, attribute: 'other-placeholder' })\n otherPlaceholder = 'Enter your answer';\n\n /**\n * Make \"Other\" text input required when visible\n */\n @property({ type: Boolean, attribute: 'other-required' })\n otherRequired = false;\n\n /**\n * Name of secondary field for \"Other\" custom text.\n * When set and \"Other\" text is entered, form will have:\n * - {name}: otherValue (defaults to \"Others\")\n * - {otherName}: the custom text entered\n * If not set, existing behavior is preserved (custom text → name field)\n */\n @property({ type: String, attribute: 'other-name' })\n otherName = '';\n\n /**\n * Value to use for primary field when \"Other\" is selected.\n * Only used when other-name is set. Defaults to \"Others\"\n */\n @property({ type: String, attribute: 'other-value' })\n otherFieldValue = 'Others';\n\n /**\n * Currently selected values\n */\n @state()\n private _selected: Set<string> = new Set();\n\n /**\n * Value of the \"Other\" text input\n */\n @state()\n private _otherValue = '';\n\n /**\n * Validation error message\n */\n @state()\n private _errorMessage = '';\n\n /**\n * Whether validation has been activated (after first Next press)\n */\n private _validationActivated = false;\n\n /**\n * Child option elements\n */\n private _options: WfOption[] = [];\n\n /**\n * Keyboard shortcut map (key -> option)\n */\n private _shortcutMap: Map<string, WfOption> = new Map();\n\n /**\n * Keyboard shortcut for the \"Others\" input (next letter after options)\n */\n @state()\n private _otherShortcut = '';\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure clean state on mount\n this._errorMessage = '';\n this._validationActivated = false;\n // Listen for option selection events\n this.addEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n // Listen for keyboard events at document level so shortcuts work globally\n document.addEventListener('keydown', this._handleKeydown);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('wf-option-select', this._handleOptionSelect as EventListener);\n document.removeEventListener('keydown', this._handleKeydown);\n }\n\n firstUpdated(): void {\n // Move wf-option children into the wf-layout container\n const layout = this.querySelector('wf-layout');\n const options = Array.from(this.querySelectorAll(':scope > wf-option'));\n options.forEach(option => layout?.appendChild(option));\n\n this._discoverOptions();\n\n // Force re-render in Light DOM mode to ensure _otherShortcut badge appears\n this.requestUpdate();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has('multi') || changedProperties.has('max')) {\n // Just update option states, don't validate (lazy validation)\n this._updateOptionStates();\n }\n }\n\n render() {\n // Set ARIA attributes on host\n this.setAttribute('role', 'listbox');\n this.setAttribute('aria-multiselectable', String(this.multi));\n this.setAttribute('aria-required', String(this.required));\n\n return html`\n <wf-layout mode=\"grid\" columns=\"${this.columns}\" gap=\"md\">\n <!-- wf-option children will be moved here in firstUpdated -->\n </wf-layout>\n ${this.allowOther\n ? html`\n <div class=\"wf-other-container\">\n <label class=\"wf-other-label\">${this.otherLabel}</label>\n <div class=\"wf-other-input-wrapper\">\n ${this._otherShortcut\n ? html`<wf-badge shortcut=\"${this._otherShortcut}\"></wf-badge>`\n : ''}\n <input\n type=\"text\"\n class=\"wf-other-input\"\n .value=\"${this._otherValue}\"\n placeholder=\"${this.otherPlaceholder}\"\n data-testid=\"wf-other-input\"\n @input=\"${this._handleOtherInput}\"\n @keydown=\"${this._handleOtherKeydown}\"\n @focus=\"${this._handleOtherFocus}\"\n />\n </div>\n </div>\n `\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n `;\n }\n\n private _handleOtherInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this._otherValue = input.value;\n\n // When typing in \"Others\", deselect any selected options (mutually exclusive)\n if (this._otherValue.trim() && this._selected.size > 0) {\n this._selected.clear();\n this._updateOptionStates();\n }\n\n this._dispatchChange();\n }\n\n private _handleOtherFocus(): void {\n // When focusing the \"Others\" input, deselect options if text exists\n // This provides visual feedback that they're entering a custom value\n }\n\n private _handleOtherKeydown(e: KeyboardEvent): void {\n // Escape blurs the input (stop propagation to prevent navigation)\n if (e.key === 'Escape') {\n e.stopPropagation();\n const input = e.target as HTMLInputElement;\n input.blur();\n }\n // Enter is allowed to bubble up to advance the form\n }\n\n private _discoverOptions(): void {\n // Light DOM: Query wf-option children inside wf-layout\n const layout = this.querySelector('wf-layout');\n this._options = layout\n ? (Array.from(layout.querySelectorAll(':scope > wf-option')) as WfOption[])\n : [];\n\n // Assign keyboard shortcuts (A, B, C, etc.)\n this._shortcutMap.clear();\n this._options.forEach((option, index) => {\n if (index < 26) {\n const shortcut = String.fromCharCode(65 + index); // A, B, C...\n option.shortcut = shortcut;\n this._shortcutMap.set(shortcut, option);\n }\n\n // Restore selected state if value is in _selected\n option.setSelected(this._selected.has(option.value));\n });\n\n // Assign shortcut for \"Others\" input (next letter after options)\n if (this.allowOther && this._options.length < 26) {\n this._otherShortcut = String.fromCharCode(65 + this._options.length);\n }\n }\n\n private _handleOptionSelect = (e: CustomEvent<OptionSelectDetail>): void => {\n e.stopPropagation();\n const { value } = e.detail;\n this._selectValue(value);\n };\n\n private _selectValue(value: string): void {\n if (this.multi) {\n this._handleMultiSelect(value);\n } else {\n this._handleSingleSelect(value);\n }\n\n // When selecting an option, clear the \"Others\" text (mutually exclusive)\n if (this.allowOther && this._otherValue) {\n this._otherValue = '';\n }\n\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n\n private _handleSingleSelect(value: string): void {\n // Clear previous selection and select new\n this._selected.clear();\n this._selected.add(value);\n }\n\n private _handleMultiSelect(value: string): void {\n if (this._selected.has(value)) {\n // Deselect\n this._selected.delete(value);\n } else {\n // Check max constraint\n if (this.max > 0 && this._selected.size >= this.max) {\n // At max capacity, don't add more\n return;\n }\n this._selected.add(value);\n }\n }\n\n private _updateOptionStates(): void {\n this._options.forEach((option) => {\n option.setSelected(this._selected.has(option.value));\n });\n }\n\n /**\n * Silent validation check (no side effects)\n */\n private _checkValidation(): boolean {\n // If allowOther is enabled, \"Others\" text counts as a valid selection\n const hasOtherValue = this.allowOther && this._otherValue.trim();\n const hasSelection = this._selected.size > 0 || hasOtherValue;\n\n if (this.required && !hasSelection) {\n return false;\n }\n\n if (this.multi) {\n if (this.min > 0 && this._selected.size < this.min && !hasOtherValue) {\n return false;\n }\n\n if (this.max > 0 && this._selected.size > this.max) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Validate and show error messages (only when activated)\n */\n private _validateSelection(): boolean {\n // Only show error messages if validation has been activated\n if (!this._validationActivated) {\n // Clear any stale error message\n this._errorMessage = '';\n return this._checkValidation();\n }\n\n this._errorMessage = '';\n\n // If allowOther is enabled, \"Others\" text counts as a valid selection\n const hasOtherValue = this.allowOther && this._otherValue.trim();\n const hasSelection = this._selected.size > 0 || hasOtherValue;\n\n if (this.required && !hasSelection) {\n this._errorMessage = this.allowOther\n ? 'Please select an option or specify in the text field'\n : 'Please select an option';\n return false;\n }\n\n if (this.multi) {\n if (this.min > 0 && this._selected.size < this.min && !hasOtherValue) {\n this._errorMessage = `Please select at least ${this.min} option${this.min > 1 ? 's' : ''}`;\n return false;\n }\n\n if (this.max > 0 && this._selected.size > this.max) {\n this._errorMessage = `Please select at most ${this.max} option${this.max > 1 ? 's' : ''}`;\n return false;\n }\n }\n\n return true;\n }\n\n private _dispatchChange(): void {\n const selectedArray = Array.from(this._selected);\n const hasOtherText = this.allowOther && this._otherValue.trim() && this._selected.size === 0;\n\n // Determine the value to dispatch\n let currentValue: string | string[];\n\n // If other-name is configured AND \"Other\" text is entered, use dual-field mode\n if (this.otherName && hasOtherText) {\n // Primary field gets the configured \"Others\" value (or default)\n currentValue = this.multi ? [this.otherFieldValue] : this.otherFieldValue;\n } else {\n // Use the value getter which handles existing behavior\n currentValue = this.value;\n }\n\n const detail: OptionsChangeDetail = {\n name: this.name,\n value: currentValue,\n selected: selectedArray,\n };\n\n // Add extraFields for dual-field submission when other-name is configured\n // Always include the field (with value or empty) to clear stale data when switching options\n if (this.otherName) {\n detail.extraFields = {\n [this.otherName]: hasOtherText ? this._otherValue.trim() : '',\n };\n }\n\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n // Only handle shortcuts if this component is in the active step\n const parentStep = this.closest('wf-step');\n if (!parentStep || !parentStep.hasAttribute('active')) {\n return;\n }\n\n // Don't handle A-Z shortcuts if user is typing in an input field\n // Use composedPath to get actual target (works with Shadow DOM)\n const path = e.composedPath();\n const actualTarget = path[0] as HTMLElement;\n if (actualTarget?.tagName === 'INPUT' || actualTarget?.tagName === 'TEXTAREA') {\n return;\n }\n\n // Also check the \"Others\" input inside our component\n const otherInput = this.querySelector('.wf-other-input');\n if (otherInput && document.activeElement === otherInput) {\n return;\n }\n\n // Handle A-Z keys for shortcuts\n const key = e.key.toUpperCase();\n if (key.length === 1 && key >= 'A' && key <= 'Z') {\n // Check if this is the \"Others\" shortcut\n if (this.allowOther && key === this._otherShortcut) {\n e.preventDefault();\n const otherInput = this.querySelector('.wf-other-input') as HTMLInputElement;\n if (otherInput) {\n otherInput.focus();\n }\n return;\n }\n\n const option = this._shortcutMap.get(key);\n if (option && !option.disabled) {\n e.preventDefault();\n option.triggerSelect();\n }\n }\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value (string for single, array for multi)\n * If allowOther is enabled and \"Others\" text is filled, returns the custom text\n */\n get value(): string | string[] {\n // If \"Others\" text has value and no options selected, return the custom text\n if (this.allowOther && this._otherValue.trim() && this._selected.size === 0) {\n return this.multi ? [this._otherValue] : this._otherValue;\n }\n\n const selectedArray = Array.from(this._selected);\n\n if (this.multi) {\n return selectedArray;\n }\n\n // For single-select\n return selectedArray[0] ?? '';\n }\n\n /**\n * Set value programmatically\n */\n set value(val: string | string[]) {\n this._selected.clear();\n\n if (Array.isArray(val)) {\n val.forEach((v) => this._selected.add(v));\n } else if (val) {\n this._selected.add(val);\n }\n\n this._updateOptionStates();\n this._validateSelection();\n }\n\n /**\n * Get selected values as array\n */\n getSelected(): string[] {\n return Array.from(this._selected);\n }\n\n /**\n * Check if option is selected\n */\n isSelected(value: string): boolean {\n return this._selected.has(value);\n }\n\n /**\n * Select an option by value\n */\n select(value: string): void {\n this._selectValue(value);\n }\n\n /**\n * Deselect an option by value\n */\n deselect(value: string): void {\n if (this._selected.has(value)) {\n this._selected.delete(value);\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n }\n\n /**\n * Clear all selections\n */\n clear(): void {\n this._selected.clear();\n this._updateOptionStates();\n this._validateSelection();\n this._dispatchChange();\n }\n\n /**\n * Validate current selection\n */\n validate(): boolean {\n // Activate validation mode (enables showing error messages)\n this._validationActivated = true;\n return this._validateSelection();\n }\n\n /**\n * Check if selection is valid (no side effects)\n */\n get isValid(): boolean {\n return this._checkValidation();\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus first option\n */\n focus(): void {\n this._options[0]?.focus();\n }\n\n /**\n * Reset to initial state\n */\n reset(): void {\n this._selected.clear();\n this._otherValue = '';\n this._errorMessage = '';\n this._validationActivated = false;\n\n // Restore any pre-selected options from attributes\n this._options.forEach((option) => {\n if (option.hasAttribute('selected')) {\n this._selected.add(option.value);\n }\n option.setSelected(this._selected.has(option.value));\n });\n\n this._dispatchChange();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-options': WfOptions;\n }\n}\n","/**\n * WF-Option - Individual option component for wizard forms\n *\n * A selectable option card with slot content and auto-injected shortcut badge.\n *\n * @example\n * <wf-option value=\"developer\">\n * <strong>Developer</strong>\n * <span>I write code</span>\n * </wf-option>\n */\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n// Import wf-badge for shortcut display\nimport './wf-badge.js';\n\n// Event detail types\nexport interface OptionSelectDetail {\n value: string;\n selected: boolean;\n}\n\n@customElement('wf-option')\nexport class WfOption extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * The value associated with this option (required)\n */\n @property({ type: String })\n value = '';\n\n /**\n * Whether this option is selected\n */\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n /**\n * Whether this option is disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * The keyboard shortcut key for this option (auto-assigned by parent)\n */\n @property({ type: String })\n shortcut = '';\n\n /**\n * Internal state for selection animation\n */\n @state()\n private _selecting = false;\n\n /**\n * Cached content from children (for Light DOM)\n */\n private _cachedContent: Node[] = [];\n\n connectedCallback(): void {\n // Cache and clear children BEFORE Lit renders (only on first connection)\n // This prevents Lit's ChildPart marker nodes from being destroyed\n if (this._cachedContent.length === 0) {\n this._cachedContent = Array.from(this.childNodes).map(node => node.cloneNode(true));\n // Clear original children BEFORE Lit creates its marker nodes\n this.textContent = '';\n }\n super.connectedCallback();\n }\n\n render() {\n return html`\n <button\n class=\"wf-option-card ${this._selecting ? 'selecting' : ''}\"\n role=\"option\"\n aria-selected=\"${this.selected}\"\n ?disabled=\"${this.disabled}\"\n data-testid=\"wf-option-btn\"\n @click=\"${this._handleClick}\"\n >\n ${this.shortcut\n ? html`<wf-badge\n shortcut=\"${this.shortcut}\"\n variant=\"${this.selected ? 'selected' : 'default'}\"\n ></wf-badge>`\n : nothing}\n <div class=\"wf-option-content\">\n ${this._cachedContent}\n </div>\n </button>\n `;\n }\n\n private _handleClick(e: Event): void {\n if (this.disabled) {\n e.preventDefault();\n return;\n }\n\n this._triggerSelect();\n }\n\n /**\n * Programmatically trigger selection (used by keyboard shortcuts)\n */\n triggerSelect(): void {\n if (!this.disabled) {\n this._triggerSelect();\n }\n }\n\n private _triggerSelect(): void {\n // Start selection animation\n this._selecting = true;\n\n // Dispatch selection event\n const detail: OptionSelectDetail = {\n value: this.value,\n selected: !this.selected, // Toggle for multi-select, parent handles logic\n };\n\n this.dispatchEvent(\n new CustomEvent('wf-option-select', {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n\n // Clear animation after it completes\n setTimeout(() => {\n this._selecting = false;\n }, 300);\n }\n\n /**\n * Focus the option button\n */\n focus(): void {\n const button = this.querySelector('button');\n button?.focus();\n }\n\n /**\n * Set selected state programmatically\n */\n setSelected(selected: boolean): void {\n this.selected = selected;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-option': WfOption;\n }\n}\n","/**\n * FormInputBase - Abstract base class for form input components\n *\n * Provides shared validation, event handling, and state management for:\n * - wf-input\n * - wf-email\n * - wf-textarea\n * - wf-field\n *\n * Subclasses must implement:\n * - _setupValidators(): Configure validators based on component properties\n * - _getValidationTriggerProperties(): Return property names that trigger validator rebuild\n * - render(): Render the component-specific template\n *\n * Subclasses may override:\n * - _getDebounceMs(): Return debounce delay for input validation (default: 600ms)\n * - _getFocusableElement(): Return the focusable element (default: 'input')\n */\n\nimport { LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport type { Validator } from '../../types.js';\n\n/**\n * Default debounce delay for input validation (in milliseconds)\n */\nconst DEFAULT_DEBOUNCE_MS = 600;\n\n/**\n * Abstract base class for form input components\n */\nexport abstract class FormInputBase extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n // ============================================\n // Common Properties\n // ============================================\n\n /**\n * Field name for form data\n */\n @property({ type: String })\n name = '';\n\n /**\n * Label text\n */\n @property({ type: String })\n label = '';\n\n /**\n * Whether field is required\n */\n @property({ type: Boolean })\n required = false;\n\n /**\n * Hint text displayed below the input\n */\n @property({ type: String })\n hint = '';\n\n // ============================================\n // Internal State\n // ============================================\n\n /**\n * Validation error message (displayed to user)\n */\n @state()\n protected _errorMessage = '';\n\n /**\n * Current field value\n */\n @state()\n protected _value = '';\n\n /**\n * Whether validation has been activated (after first validation attempt)\n * When true, input changes trigger debounced validation\n */\n protected _validationActivated = false;\n\n /**\n * Debounce timer for input validation\n */\n protected _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Array of validators for this field\n */\n protected _validators: Validator[] = [];\n\n // ============================================\n // Lifecycle Methods\n // ============================================\n\n connectedCallback(): void {\n super.connectedCallback();\n this._setupValidators();\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n const triggerProps = this._getValidationTriggerProperties();\n const shouldRebuild = triggerProps.some((prop) => changedProperties.has(prop));\n if (shouldRebuild) {\n this._setupValidators();\n }\n }\n\n // ============================================\n // Abstract Methods (must be implemented by subclasses)\n // ============================================\n\n /**\n * Setup validators based on component properties.\n * Called on connectedCallback and when validation-triggering properties change.\n */\n protected abstract _setupValidators(): void;\n\n /**\n * Return property names that should trigger validator rebuild when changed.\n * At minimum, should include 'required'.\n */\n protected abstract _getValidationTriggerProperties(): string[];\n\n // ============================================\n // Overridable Methods\n // ============================================\n\n /**\n * Return the debounce delay for input validation (in milliseconds).\n * Override in subclasses that need different debounce timing.\n */\n protected _getDebounceMs(): number {\n return DEFAULT_DEBOUNCE_MS;\n }\n\n /**\n * Return the CSS selector for the focusable element.\n * Override in subclasses with different focusable elements (e.g., 'textarea').\n */\n protected _getFocusableSelector(): string {\n return 'input';\n }\n\n // ============================================\n // Event Handlers\n // ============================================\n\n /**\n * Handle input events with debounced validation\n */\n protected _handleInput = (e: Event): void => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n this._value = target.value;\n\n // Debounced validation after activation\n if (this._validationActivated) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n this.validate();\n }, this._getDebounceMs());\n }\n\n // Dispatch change event\n this.dispatchEvent(\n new CustomEvent('wf-change', {\n detail: {\n name: this.name,\n value: this._value,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n /**\n * Handle blur events\n */\n protected _handleBlur = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-blur', {\n detail: { name: this.name, value: this._value },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n /**\n * Handle focus events\n */\n protected _handleFocus = (): void => {\n this.dispatchEvent(\n new CustomEvent('wf-focus', {\n detail: { name: this.name },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Get current value\n */\n get value(): string {\n return this._value;\n }\n\n /**\n * Set value programmatically\n */\n set value(val: string) {\n this._value = val;\n }\n\n /**\n * Add a custom validator\n */\n addValidator(validator: Validator): void {\n this._validators.push(validator);\n }\n\n /**\n * Validate the field asynchronously\n * @returns Promise resolving to true if valid, false otherwise\n */\n async validate(): Promise<boolean> {\n // Activate validation mode (enables debounced input validation)\n this._validationActivated = true;\n\n // Use getter to allow subclasses to customize value retrieval\n const currentValue = this.value;\n\n for (const validator of this._validators) {\n try {\n const result = await validator.validate(currentValue);\n if (!result.valid) {\n this._errorMessage = result.error ?? validator.message ?? 'Validation failed';\n return false;\n }\n } catch (error) {\n console.error(`[${this.tagName}] Validator error:`, error);\n this._errorMessage = 'Validation error occurred';\n return false;\n }\n }\n\n this._errorMessage = '';\n return true;\n }\n\n /**\n * Check if field is valid synchronously (doesn't update UI)\n */\n get isValid(): boolean {\n // Use getter to allow subclasses to customize value retrieval\n const currentValue = this.value;\n\n for (const validator of this._validators) {\n const result = validator.validate(currentValue);\n if (result instanceof Promise) {\n console.warn(`[${this.tagName}] Async validator called synchronously`);\n continue;\n }\n if (!result.valid) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Show an error message manually\n */\n showError(message: string): void {\n this._errorMessage = message;\n }\n\n /**\n * Clear the error message\n */\n clearError(): void {\n this._errorMessage = '';\n }\n\n /**\n * Focus the input element\n */\n focus(): void {\n const element = this.querySelector(this._getFocusableSelector());\n (element as HTMLElement | null)?.focus();\n }\n\n /**\n * Reset field to initial state\n */\n reset(): void {\n this._value = '';\n this._errorMessage = '';\n this._validationActivated = false;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n}\n","/**\n * ValidationController - Validation management for wizard forms\n *\n * Provides built-in validators and custom validator support.\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport type { Validator, ValidatorFn, ValidationResult } from '../types.js';\n\n// Default blocked email domains for work email validation\nconst DEFAULT_BLOCKED_DOMAINS = [\n 'gmail.com',\n 'yahoo.com',\n 'hotmail.com',\n 'outlook.com',\n 'aol.com',\n 'icloud.com',\n 'mail.com',\n 'protonmail.com',\n 'zoho.com',\n 'yandex.com',\n 'live.com',\n 'msn.com',\n 'me.com',\n 'inbox.com',\n 'gmx.com',\n];\n\nexport class ValidationController implements ReactiveController {\n host: ReactiveControllerHost;\n\n private _validators: Map<string, Validator[]> = new Map();\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n hostConnected(): void {\n // Controller connected\n }\n\n hostDisconnected(): void {\n // Clean up\n this._validators.clear();\n }\n\n // ============================================\n // Validator Management\n // ============================================\n\n addValidator(name: string, validator: Validator): void {\n const existing = this._validators.get(name) ?? [];\n this._validators.set(name, [...existing, validator]);\n }\n\n addValidators(name: string, validators: Validator[]): void {\n validators.forEach((v) => this.addValidator(name, v));\n }\n\n removeValidator(name: string, validatorName: string): void {\n const existing = this._validators.get(name) ?? [];\n this._validators.set(\n name,\n existing.filter((v) => v.name !== validatorName)\n );\n }\n\n clearValidators(name: string): void {\n this._validators.delete(name);\n }\n\n getValidators(name: string): Validator[] {\n return this._validators.get(name) ?? [];\n }\n\n // ============================================\n // Validation Execution\n // ============================================\n\n async validate(name: string, value: unknown): Promise<ValidationResult> {\n const validators = this.getValidators(name);\n\n for (const validator of validators) {\n try {\n const result = await validator.validate(value);\n if (!result.valid) {\n return {\n valid: false,\n error: result.error ?? validator.message ?? 'Validation failed',\n };\n }\n } catch (error) {\n console.error(`[ValidationController] Validator \"${validator.name}\" threw:`, error);\n return {\n valid: false,\n error: 'Validation error occurred',\n };\n }\n }\n\n return { valid: true };\n }\n\n validateSync(name: string, value: unknown): ValidationResult {\n const validators = this.getValidators(name);\n\n for (const validator of validators) {\n const result = validator.validate(value);\n\n // If it's a promise, we can't handle it synchronously\n if (result instanceof Promise) {\n console.warn(`[ValidationController] Async validator \"${validator.name}\" called synchronously`);\n continue;\n }\n\n if (!result.valid) {\n return {\n valid: false,\n error: result.error ?? validator.message ?? 'Validation failed',\n };\n }\n }\n\n return { valid: true };\n }\n\n // ============================================\n // Built-in Validators (Static Factory Methods)\n // ============================================\n\n static required(message = 'This field is required'): Validator {\n return {\n name: 'required',\n message,\n validate: (value: unknown): ValidationResult => {\n if (value === null || value === undefined) {\n return { valid: false, error: message };\n }\n if (typeof value === 'string' && value.trim() === '') {\n return { valid: false, error: message };\n }\n if (Array.isArray(value) && value.length === 0) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static email(message = 'Please enter a valid email address'): Validator {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n return {\n name: 'email',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n if (!emailRegex.test(value)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static workEmail(\n blockedDomains: string[] = DEFAULT_BLOCKED_DOMAINS,\n message = 'Please use your work email address'\n ): Validator {\n return {\n name: 'workEmail',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n\n const domain = value.split('@')[1]?.toLowerCase();\n if (domain && blockedDomains.includes(domain)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static pattern(regex: RegExp, message = 'Invalid format'): Validator {\n return {\n name: 'pattern',\n message,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string' || value.trim() === '') {\n return { valid: true }; // Let required validator handle empty\n }\n if (!regex.test(value)) {\n return { valid: false, error: message };\n }\n return { valid: true };\n },\n };\n }\n\n static minLength(min: number, message?: string): Validator {\n const errorMessage = message ?? `Minimum ${min} characters required`;\n\n return {\n name: 'minLength',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string') {\n return { valid: true };\n }\n if (value.length < min) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static maxLength(max: number, message?: string): Validator {\n const errorMessage = message ?? `Maximum ${max} characters allowed`;\n\n return {\n name: 'maxLength',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (typeof value !== 'string') {\n return { valid: true };\n }\n if (value.length > max) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static minSelections(min: number, message?: string): Validator {\n const errorMessage = message ?? `Select at least ${min} option${min > 1 ? 's' : ''}`;\n\n return {\n name: 'minSelections',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (!Array.isArray(value)) {\n return { valid: true };\n }\n if (value.length < min) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static maxSelections(max: number, message?: string): Validator {\n const errorMessage = message ?? `Select at most ${max} option${max > 1 ? 's' : ''}`;\n\n return {\n name: 'maxSelections',\n message: errorMessage,\n validate: (value: unknown): ValidationResult => {\n if (!Array.isArray(value)) {\n return { valid: true };\n }\n if (value.length > max) {\n return { valid: false, error: errorMessage };\n }\n return { valid: true };\n },\n };\n }\n\n static custom(name: string, validateFn: ValidatorFn, message?: string): Validator {\n return {\n name,\n message,\n validate: validateFn,\n };\n }\n}\n\n// Export default blocked domains for external use\nexport { DEFAULT_BLOCKED_DOMAINS };\n","/**\n * WF-Field - Generic field wrapper for wizard forms\n *\n * Wraps native form elements and provides validation, styling, and integration.\n *\n * @example\n * <wf-field name=\"company\" label=\"Company Name\" required>\n * <input type=\"text\" placeholder=\"Acme Inc.\" />\n * </wf-field>\n */\n\nimport { html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { FormInputBase } from './base/form-input-base.js';\nimport { ValidationController } from '../controllers/ValidationController.js';\n\n@customElement('wf-field')\nexport class WfField extends FormInputBase {\n\n // ============================================\n // Field-specific State\n // ============================================\n\n /**\n * Reference to slotted input element\n */\n @state()\n private _inputElement: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n\n // ============================================\n // Lifecycle Overrides\n // ============================================\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('input', this._handleInput);\n this.addEventListener('blur', this._handleBlur, true);\n this.addEventListener('focus', this._handleFocus, true);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('input', this._handleInput);\n this.removeEventListener('blur', this._handleBlur, true);\n this.removeEventListener('focus', this._handleFocus, true);\n }\n\n firstUpdated(): void {\n this._discoverInput();\n this._setupValidators();\n }\n\n // ============================================\n // Abstract Method Implementations\n // ============================================\n\n protected _getValidationTriggerProperties(): string[] {\n return ['required'];\n }\n\n /**\n * Field uses faster debounce (300ms) for responsive validation\n */\n protected override _getDebounceMs(): number {\n return 300;\n }\n\n protected _setupValidators(): void {\n if (!this._inputElement) {return;}\n\n this._validators = [];\n\n // Required validator\n if (this.required || this._inputElement.hasAttribute('required')) {\n this._validators.push(ValidationController.required());\n }\n\n // Email validator\n if (this._inputElement.getAttribute('type') === 'email') {\n this._validators.push(ValidationController.email());\n }\n\n // Work email validator\n if (this._inputElement.hasAttribute('data-work-email')) {\n const blockedDomainsAttr = this._inputElement.getAttribute('data-blocked-domains');\n const blockedDomains = blockedDomainsAttr\n ? blockedDomainsAttr.split(',').map((d) => d.trim())\n : undefined;\n this._validators.push(ValidationController.workEmail(blockedDomains));\n }\n\n // Pattern validator\n const pattern = this._inputElement.getAttribute('pattern');\n if (pattern) {\n const message =\n this._inputElement.getAttribute('data-pattern-message') || 'Invalid format';\n this._validators.push(ValidationController.pattern(new RegExp(pattern), message));\n }\n\n // Min length validator\n const minLength = this._inputElement.getAttribute('minlength');\n if (minLength) {\n this._validators.push(ValidationController.minLength(parseInt(minLength, 10)));\n }\n\n // Max length validator\n const maxLength = this._inputElement.getAttribute('maxlength');\n if (maxLength) {\n this._validators.push(ValidationController.maxLength(parseInt(maxLength, 10)));\n }\n }\n\n // ============================================\n // Slot Handling\n // ============================================\n\n private _handleSlotChange(): void {\n this._discoverInput();\n this._setupValidators();\n }\n\n private _discoverInput(): void {\n const slot = this.shadowRoot?.querySelector('slot');\n if (!slot) {return;}\n\n const elements = slot.assignedElements({ flatten: true });\n for (const el of elements) {\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n ) {\n this._inputElement = el;\n\n // Set id and name if not present\n if (!el.id) {el.id = this.name;}\n if (!el.name) {el.name = this.name;}\n\n // Sync initial value\n this._value = el.value;\n break;\n }\n }\n }\n\n // ============================================\n // Value Override (for slotted elements)\n // ============================================\n\n /**\n * Get current value from slotted element or internal state\n */\n override get value(): string {\n return (this._inputElement?.value ?? this._value) as string;\n }\n\n /**\n * Set value on both internal state and slotted element\n */\n override set value(val: string) {\n this._value = val;\n if (this._inputElement) {\n this._inputElement.value = String(val ?? '');\n }\n }\n\n // ============================================\n // Focus and Reset Overrides\n // ============================================\n\n /**\n * Focus the slotted input element\n */\n override focus(): void {\n this._inputElement?.focus();\n }\n\n /**\n * Reset field to initial state including slotted element\n */\n override reset(): void {\n super.reset();\n if (this._inputElement) {\n this._inputElement.value = '';\n }\n }\n\n // ============================================\n // Render\n // ============================================\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n >\n ${this.label}\n </label>`\n : ''}\n <div class=\"wf-input-wrapper\">\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-field': WfField;\n }\n}\n","/**\n * WF-Email - Email input component for wizard forms\n *\n * A convenience component for email inputs with optional work email validation.\n *\n * @example\n * <wf-email name=\"email\" label=\"Email Address\" work-email required />\n */\n\nimport { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { FormInputBase } from './base/form-input-base.js';\nimport { ValidationController, DEFAULT_BLOCKED_DOMAINS } from '../controllers/ValidationController.js';\n\n@customElement('wf-email')\nexport class WfEmail extends FormInputBase {\n\n // ============================================\n // Email-specific Properties\n // ============================================\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = 'you@company.com';\n\n /**\n * Whether to validate as work email (block personal domains)\n */\n @property({ type: Boolean, attribute: 'work-email' })\n workEmail = false;\n\n /**\n * Custom blocked domains (comma-separated or array)\n */\n @property({ type: String, attribute: 'blocked-domains' })\n blockedDomains = '';\n\n /**\n * Work email validation message\n */\n @property({ type: String, attribute: 'work-email-message' })\n workEmailMessage = 'Please use your work email address';\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n // ============================================\n // Abstract Method Implementations\n // ============================================\n\n protected _getValidationTriggerProperties(): string[] {\n return ['required', 'workEmail', 'blockedDomains'];\n }\n\n /**\n * Email uses faster debounce (300ms) for responsive validation\n */\n protected override _getDebounceMs(): number {\n return 300;\n }\n\n protected _setupValidators(): void {\n this._validators = [];\n\n // Required validator\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n // Email format validator (always applied)\n this._validators.push(ValidationController.email());\n\n // Work email validator\n if (this.workEmail) {\n let domains = DEFAULT_BLOCKED_DOMAINS;\n\n if (this.blockedDomains) {\n domains = this.blockedDomains.split(',').map((d) => d.trim().toLowerCase());\n }\n\n this._validators.push(\n ValidationController.workEmail(domains, this.workEmailMessage)\n );\n }\n }\n\n // ============================================\n // Render\n // ============================================\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"email\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-email': WfEmail;\n }\n}\n","/**\n * WF-Input - Base text input component for wizard forms\n *\n * A standalone text input with validation, styling, and form integration.\n *\n * @example\n * <wf-input name=\"fullName\" label=\"Full Name\" required placeholder=\"John Doe\" />\n */\n\nimport { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { FormInputBase } from './base/form-input-base.js';\nimport { ValidationController } from '../controllers/ValidationController.js';\n\n@customElement('wf-input')\nexport class WfInput extends FormInputBase {\n\n // ============================================\n // Input-specific Properties\n // ============================================\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = '';\n\n /**\n * Input type (text, tel, url, etc.)\n */\n @property({ type: String })\n type: 'text' | 'tel' | 'url' | 'search' = 'text';\n\n /**\n * Minimum length\n */\n @property({ type: Number })\n minlength?: number;\n\n /**\n * Maximum length\n */\n @property({ type: Number })\n maxlength?: number;\n\n /**\n * Pattern regex string\n */\n @property({ type: String })\n pattern?: string;\n\n /**\n * Pattern validation message\n */\n @property({ type: String, attribute: 'pattern-message' })\n patternMessage = 'Invalid format';\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n /**\n * Autocomplete attribute\n */\n @property({ type: String })\n autocomplete = '';\n\n // ============================================\n // Abstract Method Implementations\n // ============================================\n\n protected _getValidationTriggerProperties(): string[] {\n return ['required', 'minlength', 'maxlength', 'pattern'];\n }\n\n protected _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n if (this.minlength !== undefined) {\n this._validators.push(ValidationController.minLength(this.minlength));\n }\n\n if (this.maxlength !== undefined) {\n this._validators.push(ValidationController.maxLength(this.maxlength));\n }\n\n if (this.pattern) {\n this._validators.push(\n ValidationController.pattern(new RegExp(this.pattern), this.patternMessage)\n );\n }\n }\n\n // ============================================\n // Render\n // ============================================\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"${this.type}\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n autocomplete=\"${this.autocomplete || 'off'}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-input': WfInput;\n }\n}\n","/**\n * WF-Number - Number input component for wizard forms\n *\n * A specialized input for numeric values with min/max/step support.\n *\n * @example\n * <wf-number name=\"employees\" label=\"Number of Employees\" min=\"1\" max=\"10000\" />\n */\n\nimport { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { WfInput } from './wf-input.js';\nimport { ValidationController } from '../controllers/ValidationController.js';\n\n@customElement('wf-number')\nexport class WfNumber extends WfInput {\n\n /**\n * Minimum value\n */\n @property({ type: Number })\n min?: number;\n\n /**\n * Maximum value\n */\n @property({ type: Number })\n max?: number;\n\n /**\n * Step increment\n */\n @property({ type: Number })\n step = 1;\n\n protected _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n // Number range validator\n if (this.min !== undefined || this.max !== undefined) {\n this._validators.push(\n ValidationController.custom(\n 'range',\n (value: unknown) => {\n if (value === '' || value === null || value === undefined) {\n return { valid: true }; // Let required handle empty\n }\n\n const num = Number(value);\n if (isNaN(num)) {\n return { valid: false, error: 'Please enter a valid number' };\n }\n\n if (this.min !== undefined && num < this.min) {\n return { valid: false, error: `Value must be at least ${this.min}` };\n }\n\n if (this.max !== undefined && num > this.max) {\n return { valid: false, error: `Value must be at most ${this.max}` };\n }\n\n return { valid: true };\n },\n 'Value out of range'\n )\n );\n }\n }\n\n render() {\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <input\n type=\"number\"\n class=\"wf-input ${this._errorMessage ? 'wf-input-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n min=\"${this.min ?? ''}\"\n max=\"${this.max ?? ''}\"\n step=\"${this.step}\"\n autocomplete=\"${this.autocomplete || 'off'}\"\n data-testid=\"wf-input\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n />\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n\n /**\n * Get current value as number\n */\n get valueAsNumber(): number {\n return Number(this._value) || 0;\n }\n\n /**\n * Set value as number\n */\n set valueAsNumber(val: number) {\n this._value = String(val);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-number': WfNumber;\n }\n}\n","/**\n * WizardForm.init() - Imperative API for wizard forms\n *\n * Provides a simple way to initialize wizard forms from a script tag.\n *\n * @example\n * <script src=\"wizard-form.min.js\"></script>\n * <script>\n * WizardForm.init({\n * container: '#signup-form',\n * adapter: 'hubspot',\n * hubspot: { portalId: '123', formId: 'abc' },\n * onSubmit: (data) => console.log(data),\n * onSuccess: () => console.log('Success!'),\n * onError: (err) => console.error(err)\n * });\n * </script>\n */\n\nimport type { WizardForm } from './components/wizard-form.js';\nimport type { SubmissionAdapter, SubmissionContext } from './adapters/types.js';\nimport { createHubSpotAdapter } from './adapters/hubspot.js';\nimport { createWebhookAdapter } from './adapters/webhook.js';\nimport { createRevenueHeroAdapter } from './adapters/revenuehero.js';\n\n// Ensure components are registered\nimport './components/wizard-form.js';\nimport './components/wf-step.js';\nimport './components/wf-options.js';\nimport './components/wf-option.js';\nimport './components/wf-field.js';\nimport './components/wf-email.js';\nimport './components/wf-input.js';\nimport './components/wf-number.js';\nimport './components/wf-textarea.js';\n\nexport type FormData = Record<string, unknown>;\n\nexport interface WizardFormConfig {\n /**\n * Container element or selector\n */\n container: string | HTMLElement;\n\n /**\n * Adapter type or custom adapter\n */\n adapter?: 'hubspot' | 'webhook' | 'revenuehero' | 'json' | SubmissionAdapter;\n\n /**\n * HubSpot configuration\n */\n hubspot?: {\n portalId: string;\n formId: string;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * Webhook configuration\n */\n webhook?: {\n url: string;\n method?: 'POST' | 'PUT';\n headers?: Record<string, string>;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * RevenueHero configuration\n */\n revenuehero?: {\n routerId: string;\n fieldMapping?: Record<string, string>;\n };\n\n /**\n * Color theme\n */\n theme?: 'light' | 'dark' | 'auto';\n\n /**\n * Show progress bar\n */\n showProgress?: boolean;\n\n /**\n * Auto-advance after single-select option\n */\n autoAdvance?: boolean;\n\n /**\n * Mock mode (for testing)\n */\n mock?: boolean;\n\n /**\n * Callback before submission (can cancel)\n */\n onSubmit?: (data: FormData) => boolean | void;\n\n /**\n * Callback on successful submission\n */\n onSuccess?: (data: FormData, response?: unknown) => void;\n\n /**\n * Callback on submission error\n */\n onError?: (error: string, data?: FormData) => void;\n\n /**\n * Callback on step change\n */\n onStepChange?: (from: number, to: number, direction: 'forward' | 'backward') => void;\n\n /**\n * Callback on field value change\n */\n onFieldChange?: (name: string, value: unknown, formData: FormData) => void;\n\n /**\n * Transform form data before submission to adapter.\n * Called after validation, before adapter.submit().\n */\n serialize?: (data: FormData) => FormData;\n}\n\nexport interface WizardFormInstance {\n /**\n * The wizard-form element\n */\n element: WizardForm;\n\n /**\n * Current form data\n */\n readonly formData: FormData;\n\n /**\n * Current step number\n */\n readonly currentStep: number;\n\n /**\n * Total number of steps\n */\n readonly totalSteps: number;\n\n /**\n * Go to next step\n */\n next(): Promise<void>;\n\n /**\n * Go to previous step\n */\n back(): void;\n\n /**\n * Go to a specific step\n */\n goToStep(step: number): void;\n\n /**\n * Submit the form\n */\n submit(): Promise<void>;\n\n /**\n * Reset the form\n */\n reset(): void;\n\n /**\n * Set form data\n */\n setFormData(data: FormData): void;\n\n /**\n * Destroy the instance (remove event listeners)\n */\n destroy(): void;\n\n /**\n * Serialize function (if configured)\n */\n serialize?: (data: FormData) => FormData;\n}\n\n/**\n * Initialize a wizard form with the given configuration\n *\n * @deprecated Use event-based API instead. Listen to wf:submit, wf:success, wf:error events\n * directly on the wizard-form element. See https://github.com/atomicwork/aw-wizard-forms\n */\nexport function init(config: WizardFormConfig): WizardFormInstance {\n console.warn(\n '[WizardForm] init() is deprecated. Use the event-based API instead:\\n' +\n ' form.addEventListener(\"wf:submit\", (e) => { ... });\\n' +\n ' form.addEventListener(\"wf:success\", (e) => { ... });\\n' +\n 'See https://github.com/atomicwork/aw-wizard-forms for migration guide.'\n );\n\n // Get container element\n const container =\n typeof config.container === 'string'\n ? document.querySelector<HTMLElement>(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(`[WizardForm] Container not found: ${config.container}`);\n }\n\n // Find or create wizard-form element\n let wizardForm = container.querySelector<WizardForm>('wizard-form');\n if (!wizardForm) {\n wizardForm = container as unknown as WizardForm;\n if (wizardForm.tagName.toLowerCase() !== 'wizard-form') {\n throw new Error(\n '[WizardForm] Container must be a <wizard-form> element or contain one'\n );\n }\n }\n\n // Apply configuration attributes\n if (config.theme) {\n wizardForm.setAttribute('theme', config.theme);\n }\n if (config.showProgress !== undefined) {\n wizardForm.showProgress = config.showProgress;\n }\n if (config.autoAdvance !== undefined) {\n wizardForm.autoAdvance = config.autoAdvance;\n }\n if (config.mock) {\n wizardForm.mock = config.mock;\n }\n\n // Create adapter\n let adapter: SubmissionAdapter | null = null;\n\n if (typeof config.adapter === 'object') {\n // Custom adapter\n adapter = config.adapter;\n } else {\n const adapterType = config.adapter || 'json';\n\n switch (adapterType) {\n case 'hubspot':\n if (!config.hubspot?.portalId || !config.hubspot?.formId) {\n throw new Error('[WizardForm] HubSpot config requires portalId and formId');\n }\n adapter = createHubSpotAdapter({\n portalId: config.hubspot.portalId,\n formId: config.hubspot.formId,\n fieldMapping: config.hubspot.fieldMapping,\n mock: config.mock,\n });\n // Also set attributes for built-in HubSpot support\n wizardForm.setAttribute('hubspot-portal', config.hubspot.portalId);\n wizardForm.setAttribute('hubspot-form', config.hubspot.formId);\n break;\n\n case 'webhook':\n if (!config.webhook?.url) {\n throw new Error('[WizardForm] Webhook config requires url');\n }\n adapter = createWebhookAdapter({\n url: config.webhook.url,\n method: config.webhook.method,\n headers: config.webhook.headers,\n fieldMapping: config.webhook.fieldMapping,\n mock: config.mock,\n });\n break;\n\n case 'revenuehero':\n if (!config.revenuehero?.routerId) {\n throw new Error('[WizardForm] RevenueHero config requires routerId');\n }\n adapter = createRevenueHeroAdapter({\n routerId: config.revenuehero.routerId,\n fieldMapping: config.revenuehero.fieldMapping,\n mock: config.mock,\n });\n break;\n\n case 'json':\n // No adapter - just emit events\n adapter = null;\n break;\n }\n }\n\n // Event handlers\n const handleSubmit = (e: CustomEvent) => {\n const rawFormData = e.detail.formData;\n\n // Apply serialize transform if provided\n let submitData = { ...rawFormData };\n if (config.serialize) {\n submitData = config.serialize(submitData);\n }\n\n // Auto-expose test refs when mock mode is enabled\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormData = submitData;\n (window as unknown as Record<string, unknown>).__wizardFormRawData = rawFormData;\n (window as unknown as Record<string, unknown>).__wizardFormInstance = instance;\n }\n\n // Call user's onSubmit callback\n if (config.onSubmit) {\n const result = config.onSubmit(submitData);\n if (result === false) {\n e.preventDefault();\n return;\n }\n }\n\n // Submit via adapter if configured\n if (adapter) {\n e.preventDefault();\n\n const context: SubmissionContext = {\n pageUrl: window.location.href,\n pageTitle: document.title,\n referrer: document.referrer,\n timestamp: new Date().toISOString(),\n };\n\n adapter.submit(submitData, context).then((result) => {\n // Auto-expose response in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormResponse = result;\n }\n\n if (result.success) {\n // Manually show success screen\n (wizardForm as unknown as { _submitted: boolean })._submitted = true;\n wizardForm!.requestUpdate();\n\n // Dispatch wf:success event (triggers handleSuccess listener + progress bar hide)\n wizardForm!.dispatchEvent(\n new CustomEvent('wf:success', {\n detail: { formData: rawFormData, response: result.data },\n bubbles: true,\n composed: true,\n })\n );\n // Note: onSuccess callback is triggered by handleSuccess listener\n } else {\n // Auto-expose error in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormError = result.error;\n }\n\n if (config.onError) {\n // Pass raw form data (not serialized) for user callbacks\n config.onError(result.error || 'Submission failed', rawFormData);\n }\n }\n });\n }\n };\n\n const handleSuccess = (e: CustomEvent) => {\n // Auto-expose response in mock mode (for built-in HubSpot handler)\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormResponse = {\n success: true,\n data: e.detail.response,\n };\n }\n\n if (config.onSuccess) {\n config.onSuccess(e.detail.formData, e.detail.response);\n }\n };\n\n const handleError = (e: CustomEvent) => {\n // Auto-expose error in mock mode\n if (config.mock) {\n (window as unknown as Record<string, unknown>).__wizardFormError = e.detail.error;\n }\n\n if (config.onError) {\n config.onError(e.detail.error, e.detail.formData);\n }\n };\n\n const handleStepChange = (e: CustomEvent) => {\n if (config.onStepChange) {\n config.onStepChange(e.detail.from, e.detail.to, e.detail.direction);\n }\n };\n\n const handleFieldChange = (e: CustomEvent) => {\n if (config.onFieldChange) {\n config.onFieldChange(e.detail.name, e.detail.value, e.detail.formData);\n }\n };\n\n // Attach event listeners\n wizardForm.addEventListener('wf:submit', handleSubmit as EventListener);\n wizardForm.addEventListener('wf:success', handleSuccess as EventListener);\n wizardForm.addEventListener('wf:error', handleError as EventListener);\n wizardForm.addEventListener('wf:step-change', handleStepChange as EventListener);\n wizardForm.addEventListener('wf:field-change', handleFieldChange as EventListener);\n\n // Create instance\n const instance: WizardFormInstance = {\n element: wizardForm,\n\n get formData() {\n return wizardForm!.formData;\n },\n\n get currentStep() {\n return wizardForm!.currentStep;\n },\n\n get totalSteps() {\n return wizardForm!.totalSteps;\n },\n\n next() {\n return wizardForm!.next();\n },\n\n back() {\n wizardForm!.back();\n },\n\n goToStep(step: number) {\n wizardForm!.goToStep(step);\n },\n\n submit() {\n return wizardForm!.submit();\n },\n\n reset() {\n wizardForm!.reset();\n },\n\n setFormData(data: FormData) {\n wizardForm!.setFormData(data);\n },\n\n destroy() {\n wizardForm!.removeEventListener('wf:submit', handleSubmit as EventListener);\n wizardForm!.removeEventListener('wf:success', handleSuccess as EventListener);\n wizardForm!.removeEventListener('wf:error', handleError as EventListener);\n wizardForm!.removeEventListener('wf:step-change', handleStepChange as EventListener);\n wizardForm!.removeEventListener('wf:field-change', handleFieldChange as EventListener);\n },\n\n // Expose serialize function if configured\n serialize: config.serialize,\n };\n\n return instance;\n}\n\nexport default { init };\n","/**\n * WF-Textarea - Multiline text input component for wizard forms\n *\n * A textarea with validation, styling, and form integration.\n * Enter key inserts newline (does NOT submit the form).\n *\n * @example\n * <wf-textarea name=\"message\" label=\"Message\" rows=\"4\" required />\n */\n\nimport { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { FormInputBase } from './base/form-input-base.js';\nimport { ValidationController } from '../controllers/ValidationController.js';\n\n@customElement('wf-textarea')\nexport class WfTextarea extends FormInputBase {\n\n // ============================================\n // Textarea-specific Properties\n // ============================================\n\n /**\n * Placeholder text\n */\n @property({ type: String })\n placeholder = '';\n\n /**\n * Number of visible rows\n */\n @property({ type: Number })\n rows = 4;\n\n /**\n * Minimum length\n */\n @property({ type: Number })\n minlength?: number;\n\n /**\n * Maximum length\n */\n @property({ type: Number })\n maxlength?: number;\n\n /**\n * Whether field is disabled\n */\n @property({ type: Boolean })\n disabled = false;\n\n /**\n * Show character count\n */\n @property({ type: Boolean, attribute: 'show-count' })\n showCount = false;\n\n // ============================================\n // Abstract Method Implementations\n // ============================================\n\n protected _getValidationTriggerProperties(): string[] {\n return ['required', 'minlength', 'maxlength'];\n }\n\n protected override _getFocusableSelector(): string {\n return 'textarea';\n }\n\n protected _setupValidators(): void {\n this._validators = [];\n\n if (this.required) {\n this._validators.push(ValidationController.required());\n }\n\n if (this.minlength !== undefined) {\n this._validators.push(ValidationController.minLength(this.minlength));\n }\n\n if (this.maxlength !== undefined) {\n this._validators.push(ValidationController.maxLength(this.maxlength));\n }\n }\n\n // ============================================\n // Textarea-specific Event Handlers\n // ============================================\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n // Allow Enter to insert newline (don't trigger form navigation)\n if (e.key === 'Enter') {\n e.stopPropagation();\n }\n };\n\n // ============================================\n // Render\n // ============================================\n\n render() {\n const charCount = this._value.length;\n const isAtLimit = this.maxlength !== undefined && charCount >= this.maxlength;\n\n return html`\n <div class=\"wf-field-container\">\n ${this.label\n ? html`<label\n class=\"wf-label ${this.required ? 'wf-label-required' : ''}\"\n for=\"${this.name}\"\n data-testid=\"wf-label\"\n >\n ${this.label}\n </label>`\n : ''}\n <textarea\n class=\"wf-textarea ${this._errorMessage ? 'wf-textarea-error' : ''}\"\n id=\"${this.name}\"\n name=\"${this.name}\"\n placeholder=\"${this.placeholder}\"\n rows=\"${this.rows}\"\n .value=\"${this._value}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n maxlength=\"${this.maxlength ?? ''}\"\n data-testid=\"wf-textarea\"\n @input=\"${this._handleInput}\"\n @blur=\"${this._handleBlur}\"\n @focus=\"${this._handleFocus}\"\n @keydown=\"${this._handleKeydown}\"\n ></textarea>\n ${this.showCount && this.maxlength\n ? html`<span class=\"wf-char-count ${isAtLimit ? 'wf-char-limit' : ''}\" data-testid=\"wf-counter\">\n ${charCount}/${this.maxlength}\n </span>`\n : ''}\n ${this.hint && !this._errorMessage\n ? html`<span class=\"wf-hint\">${this.hint}</span>`\n : ''}\n <span class=\"wf-error-message\" role=\"alert\" aria-live=\"polite\" data-testid=\"wf-error\">\n ${this._errorMessage}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-textarea': WfTextarea;\n }\n}\n","/**\n * WF-Progress - Composable progress bar component for wizard forms\n *\n * A standalone progress indicator that can be placed inside or outside the wizard.\n * Connects to wizard-form via `for` attribute or auto-discovers parent wizard.\n *\n * @example\n * <!-- Inside wizard (auto-connects) -->\n * <wizard-form id=\"my-form\">\n * <wf-progress></wf-progress>\n * <wf-step>...</wf-step>\n * </wizard-form>\n *\n * @example\n * <!-- Outside wizard (uses for attribute) -->\n * <wf-progress for=\"my-form\"></wf-progress>\n * <wizard-form id=\"my-form\">...</wizard-form>\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { WizardForm, StepChangeDetail } from './wizard-form.js';\n\n@customElement('wf-progress')\nexport class WfProgress extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * ID of the wizard-form to connect to.\n * If not specified, auto-connects to parent wizard-form.\n */\n @property({ type: String })\n for = '';\n\n @state()\n private _currentStep = 1;\n\n @state()\n private _totalSteps = 1;\n\n @state()\n private _isComplete = false;\n\n private _wizard: WizardForm | null = null;\n private _boundHandleStepChange = this._handleStepChange.bind(this);\n private _boundHandleSuccess = this._handleSuccess.bind(this);\n\n connectedCallback(): void {\n super.connectedCallback();\n // Defer connection to allow DOM to settle\n requestAnimationFrame(() => {\n this._connectToWizard();\n // Double-RAF: retry after wizard has time to discover steps\n // This handles the case where wf-progress is before wizard-form in DOM order\n if (this._wizard && this._totalSteps <= 1) {\n requestAnimationFrame(() => {\n if (this._wizard) {\n this._totalSteps = this._wizard.totalSteps || this._totalSteps;\n this._currentStep = this._wizard.currentStep || this._currentStep;\n }\n });\n }\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._disconnectFromWizard();\n }\n\n private _connectToWizard(): void {\n // Find wizard by ID or by closest parent\n if (this.for) {\n this._wizard = document.getElementById(this.for) as WizardForm | null;\n } else {\n this._wizard = this.closest('wizard-form') as WizardForm | null;\n }\n\n if (this._wizard) {\n // Get initial state\n this._currentStep = this._wizard.currentStep || 1;\n this._totalSteps = this._wizard.totalSteps || 1;\n this._isComplete = this._wizard.isSubmitted || false;\n\n // Listen for step changes\n this._wizard.addEventListener('wf:step-change', this._boundHandleStepChange as EventListener);\n\n // Listen for success (form complete)\n this._wizard.addEventListener('wf:success', this._boundHandleSuccess as EventListener);\n\n // Also watch for slot changes (steps being added/removed)\n this._wizard.addEventListener('wf:steps-discovered', this._handleStepsDiscovered.bind(this) as EventListener);\n }\n }\n\n private _disconnectFromWizard(): void {\n if (this._wizard) {\n this._wizard.removeEventListener('wf:step-change', this._boundHandleStepChange as EventListener);\n this._wizard.removeEventListener('wf:success', this._boundHandleSuccess as EventListener);\n this._wizard = null;\n }\n }\n\n private _handleStepChange(e: CustomEvent<StepChangeDetail>): void {\n this._currentStep = e.detail.to;\n // Re-read total steps in case it changed\n if (this._wizard) {\n this._totalSteps = this._wizard.totalSteps;\n }\n }\n\n private _handleStepsDiscovered(): void {\n if (this._wizard) {\n this._totalSteps = this._wizard.totalSteps;\n this._currentStep = this._wizard.currentStep;\n }\n }\n\n private _handleSuccess(): void {\n this._isComplete = true;\n }\n\n render() {\n // Hide progress when form is complete\n if (this._isComplete) {\n return null;\n }\n\n const segments = [];\n for (let i = 1; i <= this._totalSteps; i++) {\n const completed = i < this._currentStep;\n const active = i === this._currentStep;\n segments.push(html`\n <div\n class=\"wf-progress-segment ${completed ? 'completed' : ''} ${active ? 'active' : ''}\"\n role=\"progressbar\"\n aria-valuenow=\"${this._currentStep}\"\n aria-valuemin=\"1\"\n aria-valuemax=\"${this._totalSteps}\"\n ></div>\n `);\n }\n return html`<div class=\"wf-progress\" role=\"group\" aria-label=\"Form progress\">${segments}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-progress': WfProgress;\n }\n}\n","/**\n * WF-Thank-You - Composable success screen component for wizard forms\n *\n * A reusable thank-you/success component with customizable title, subtitle, and slots.\n *\n * @example\n * <!-- Minimal usage -->\n * <wf-thank-you></wf-thank-you>\n *\n * @example\n * <!-- With props -->\n * <wf-thank-you\n * title=\"Thanks for your interest!\"\n * subtitle=\"We'll be in touch within 24 hours.\"\n * ></wf-thank-you>\n *\n * @example\n * <!-- With slots for full customization -->\n * <wf-thank-you>\n * <span slot=\"icon\">🎉</span>\n * <p>Custom message here</p>\n * <div slot=\"footer\">\n * <div id=\"revenuehero-container\"></div>\n * </div>\n * </wf-thank-you>\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('wf-thank-you')\nexport class WfThankYou extends LitElement {\n /**\n * Disable Shadow DOM - render to Light DOM for external styling\n */\n createRenderRoot() {\n return this;\n }\n\n /**\n * Main heading text\n */\n @property({ type: String })\n title = 'Thank you!';\n\n /**\n * Sub-message text\n */\n @property({ type: String })\n subtitle = \"We've received your request.\";\n\n /**\n * Hide the success icon\n */\n @property({ type: Boolean, attribute: 'hide-icon' })\n hideIcon = false;\n\n render() {\n return html`\n ${!this.hideIcon\n ? html`\n <div class=\"wf-thank-you-icon\">\n <slot name=\"icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </slot>\n </div>\n `\n : ''}\n <h2 class=\"wf-thank-you-title\">${this.title}</h2>\n <p class=\"wf-thank-you-subtitle\">${this.subtitle}</p>\n <slot></slot>\n <slot name=\"footer\"></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wf-thank-you': WfThankYou;\n }\n}\n","/**\n * Global CSS styles for all wizard form components\n *\n * These styles are injected into the document head when the module loads,\n * enabling Light DOM rendering without Shadow DOM encapsulation.\n */\n\nexport const GLOBAL_STYLES = `\n/* ========================================\n Wizard Form Global Styles\n ======================================== */\n\n/* ----------------------------------------\n wizard-form\n ---------------------------------------- */\nwizard-form {\n display: block;\n --wf-color-primary: #8040f0;\n --wf-color-primary-border: #602cbb;\n --wf-color-primary-light: rgba(128, 64, 240, 0.08);\n --wf-color-surface: #f3f3f5;\n --wf-color-surface-hover: #e9e9eb;\n --wf-color-border: #d4d4d4;\n --wf-color-text: #0a0a0a;\n --wf-color-text-secondary: #404040;\n --wf-color-text-muted: #646464;\n --wf-color-error: #dc3545;\n --wf-color-badge-bg: #fcfcfc;\n --wf-color-badge-border: #d4d4d4;\n --wf-color-badge-text: #5f5f5f;\n --wf-color-progress-active: rgba(139, 139, 139, 0.6);\n --wf-color-progress-inactive: rgba(217, 217, 217, 0.6);\n --wf-spacing-1: 4px;\n --wf-spacing-2: 8px;\n --wf-spacing-3: 12px;\n --wf-spacing-4: 16px;\n --wf-spacing-5: 20px;\n --wf-spacing-6: 24px;\n --wf-spacing-8: 32px;\n --wf-radius-sm: 4px;\n --wf-radius-md: 8px;\n --wf-radius-lg: 8px;\n --wf-radius-full: 99px;\n --wf-font-size-xs: 0.75rem;\n --wf-font-size-sm: 0.875rem;\n --wf-font-size-base: 1rem;\n --wf-font-size-lg: 1.25rem;\n --wf-font-size-xl: 1.5rem;\n --wf-font-size-2xl: 2rem;\n --wf-font-size-3xl: 2.5rem;\n --wf-input-min-height: 56px;\n\n /* Frosted glass effect (iOS-style) */\n --wf-glass-bg: rgba(255, 255, 255, 0.7);\n --wf-glass-bg-hover: rgba(255, 255, 255, 0.85);\n --wf-glass-border: rgba(0, 0, 0, 0.1);\n --wf-glass-blur: 20px;\n --wf-glass-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n}\n\n/* Dark theme */\nwizard-form[theme='dark'] {\n --wf-color-surface: #2d2d2d;\n --wf-color-surface-hover: #3d3d3d;\n --wf-color-border: #4d4d4d;\n --wf-color-text: #f8f9fa;\n --wf-color-text-secondary: #d0d0d0;\n --wf-color-text-muted: #adb5bd;\n --wf-color-badge-bg: #3d3d3d;\n --wf-color-badge-border: #4d4d4d;\n --wf-color-badge-text: #adb5bd;\n --wf-color-progress-active: rgba(200, 200, 200, 0.6);\n --wf-color-progress-inactive: rgba(100, 100, 100, 0.6);\n\n /* Dark theme frosted glass */\n --wf-glass-bg: rgba(45, 45, 45, 0.7);\n --wf-glass-bg-hover: rgba(60, 60, 60, 0.8);\n --wf-glass-border: rgba(255, 255, 255, 0.1);\n}\n\n/* Auto theme (respects system preference) */\n@media (prefers-color-scheme: dark) {\n wizard-form[theme='auto'] {\n --wf-color-surface: #2d2d2d;\n --wf-color-surface-hover: #3d3d3d;\n --wf-color-border: #4d4d4d;\n --wf-color-text: #f8f9fa;\n --wf-color-text-secondary: #d0d0d0;\n --wf-color-text-muted: #adb5bd;\n --wf-color-badge-bg: #3d3d3d;\n --wf-color-badge-border: #4d4d4d;\n --wf-color-badge-text: #adb5bd;\n --wf-color-progress-active: rgba(200, 200, 200, 0.6);\n --wf-color-progress-inactive: rgba(100, 100, 100, 0.6);\n\n /* Dark theme frosted glass */\n --wf-glass-bg: rgba(45, 45, 45, 0.7);\n --wf-glass-bg-hover: rgba(60, 60, 60, 0.8);\n --wf-glass-border: rgba(255, 255, 255, 0.1);\n }\n}\n\nwizard-form .wf-container {\n margin: 0 auto;\n}\n\nwizard-form .wf-progress {\n display: flex;\n gap: var(--wf-spacing-4, 16px);\n margin-top: var(--wf-spacing-6, 24px);\n}\n\nwizard-form .wf-progress-segment {\n width: 32px;\n height: 8px;\n background-color: var(--wf-color-progress-inactive, rgba(217, 217, 217, 0.6));\n border-radius: var(--wf-radius-full, 99px);\n transition: background-color 300ms ease;\n}\n\nwizard-form .wf-progress-segment.completed,\nwizard-form .wf-progress-segment.active {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n}\n\nwizard-form .wf-steps-container {\n min-height: 200px;\n}\n\nwizard-form .wf-navigation {\n display: flex;\n justify-content: space-between;\n gap: var(--wf-spacing-4, 16px);\n margin-top: var(--wf-spacing-6, 24px);\n}\n\nwizard-form .wf-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wf-spacing-2, 8px);\n padding: var(--wf-spacing-3, 12px) var(--wf-spacing-4, 16px);\n min-height: 48px;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 600;\n font-family: inherit;\n border-radius: var(--wf-radius-md, 8px);\n cursor: pointer;\n transition: all 150ms ease;\n border: 1px solid transparent;\n outline: none;\n}\n\nwizard-form .wf-btn:focus-visible {\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.3);\n}\n\nwizard-form .wf-btn-back {\n background: var(--wf-glass-bg, rgba(255, 255, 255, 0.7));\n backdrop-filter: blur(var(--wf-glass-blur, 20px));\n -webkit-backdrop-filter: blur(var(--wf-glass-blur, 20px));\n border: 1px solid var(--wf-glass-border, rgba(0, 0, 0, 0.1));\n box-shadow: var(--wf-glass-shadow, 0 4px 6px rgba(0, 0, 0, 0.05));\n color: var(--wf-color-text, #0a0a0a);\n}\n\nwizard-form .wf-btn-back:hover:not(:disabled) {\n background: var(--wf-glass-bg-hover, rgba(255, 255, 255, 0.85));\n}\n\nwizard-form .wf-btn-next {\n flex: 1;\n background-color: var(--wf-color-primary, #8040f0);\n border: 1px solid var(--wf-color-primary-border, #602cbb);\n color: white;\n margin-left: auto;\n position: relative;\n}\n\nwizard-form .wf-btn-next:hover:not(:disabled) {\n filter: brightness(1.1);\n}\n\nwizard-form .wf-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\nwizard-form .wf-btn-shortcut {\n position: absolute;\n right: var(--wf-spacing-4, 16px);\n display: inline-flex;\n align-items: center;\n gap: 2px;\n}\n\nwizard-form .wf-btn-back .wf-btn-shortcut {\n position: static;\n}\n\nwizard-form .wf-success-screen {\n text-align: center;\n padding: var(--wf-spacing-6, 24px);\n}\n\nwizard-form .wf-loading {\n display: inline-block;\n width: 20px;\n height: 20px;\n border: 2px solid rgba(0, 0, 0, 0.1);\n border-radius: 50%;\n border-top-color: white;\n animation: wf-spin 0.8s linear infinite;\n}\n\n@keyframes wf-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\nwizard-form .wf-form-error {\n padding: var(--wf-spacing-4, 16px);\n margin-bottom: var(--wf-spacing-4, 16px);\n background-color: rgba(220, 53, 69, 0.1);\n border: 1px solid var(--wf-color-error, #dc3545);\n border-radius: var(--wf-radius-md, 8px);\n color: var(--wf-color-error, #dc3545);\n font-size: var(--wf-font-size-base, 1rem);\n}\n\n/* wf-success */\nwf-success {\n display: block;\n}\n\nwf-success h1,\nwf-success h2,\nwf-success h3 {\n margin: 0 0 var(--wf-spacing-4, 16px) 0;\n font-weight: 600;\n color: var(--wf-color-text, #212529);\n}\n\nwf-success p {\n margin: 0;\n color: var(--wf-color-text-muted, #6c757d);\n}\n\n/* ----------------------------------------\n wf-step\n ---------------------------------------- */\nwf-step {\n display: none;\n width: 100%;\n}\n\nwf-step[active] {\n display: block;\n animation: wf-stepFadeIn 0.3s ease forwards;\n}\n\nwf-step[direction='forward'][active] {\n animation: wf-stepSlideInRight 0.3s ease forwards;\n}\n\nwf-step[direction='backward'][active] {\n animation: wf-stepSlideInLeft 0.3s ease forwards;\n}\n\nwf-step[leaving] {\n display: block;\n animation: wf-stepFadeOut 0.2s ease forwards;\n}\n\n@keyframes wf-stepFadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes wf-stepFadeOut {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(-10px);\n }\n}\n\n@keyframes wf-stepSlideInRight {\n from {\n opacity: 0;\n transform: translateX(30px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes wf-stepSlideInLeft {\n from {\n opacity: 0;\n transform: translateX(-30px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\nwf-step .wf-step-content {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-4, 16px);\n}\n\nwf-step h1,\nwf-step h2,\nwf-step h3 {\n margin: 0;\n font-weight: 600;\n color: var(--wf-color-text, #212529);\n}\n\nwf-step h2 {\n font-size: var(--wf-font-size-3xl, 2rem);\n}\n\nwf-step p {\n margin: 0;\n color: var(--wf-color-text-muted, #6c757d);\n font-size: var(--wf-font-size-xl, 1.375rem);\n}\n\n/* ----------------------------------------\n wf-options\n ---------------------------------------- */\nwf-options {\n display: block;\n}\n\nwf-options[hidden] {\n display: none;\n}\n\nwf-options .wf-options-container {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: var(--wf-spacing-4, 16px);\n}\n\nwf-options[columns='1'] .wf-options-container {\n grid-template-columns: 1fr;\n}\n\n@media (max-width: 600px) {\n wf-options .wf-options-container {\n grid-template-columns: 1fr;\n }\n}\n\nwf-options .wf-error-message {\n display: block;\n margin-top: var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n min-height: 20px;\n}\n\nwf-options .wf-other-container {\n margin-top: var(--wf-spacing-4, 16px);\n}\n\nwf-options .wf-other-label {\n display: block;\n margin-bottom: var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n}\n\nwf-options .wf-other-label span {\n font-weight: 400;\n color: var(--wf-color-text-muted, #646464);\n}\n\nwf-options .wf-other-input-wrapper {\n display: flex;\n align-items: center;\n gap: var(--wf-spacing-3, 12px);\n min-height: var(--wf-input-min-height, 56px);\n background: var(--wf-glass-bg, rgba(255, 255, 255, 0.7));\n backdrop-filter: blur(var(--wf-glass-blur, 20px));\n -webkit-backdrop-filter: blur(var(--wf-glass-blur, 20px));\n border: 1px solid var(--wf-glass-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--wf-radius-md, 8px);\n box-shadow: var(--wf-glass-shadow, 0 4px 6px rgba(0, 0, 0, 0.05));\n padding-left: var(--wf-spacing-4, 16px);\n transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;\n}\n\nwf-options .wf-other-input-wrapper:focus-within {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.1);\n}\n\nwf-options .wf-other-input {\n flex: 1;\n min-height: calc(var(--wf-input-min-height, 56px) - 2px);\n padding: var(--wf-spacing-4, 16px);\n padding-left: 0;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n background: transparent;\n border: none;\n outline: none;\n box-sizing: border-box;\n}\n\nwf-options .wf-other-input::placeholder {\n color: var(--wf-color-text-muted, #646464);\n font-weight: 500;\n}\n\n/* ----------------------------------------\n wf-option\n ---------------------------------------- */\nwf-option {\n display: block;\n}\n\nwf-option[hidden] {\n display: none;\n}\n\nwf-option .wf-option-card {\n display: flex;\n align-items: center;\n gap: var(--wf-spacing-3, 12px);\n width: 100%;\n min-height: var(--wf-input-min-height, 56px);\n padding: var(--wf-spacing-3, 12px);\n background: var(--wf-glass-bg, rgba(255, 255, 255, 0.7));\n backdrop-filter: blur(var(--wf-glass-blur, 20px));\n -webkit-backdrop-filter: blur(var(--wf-glass-blur, 20px));\n border: 1px solid var(--wf-glass-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--wf-radius-md, 8px);\n box-shadow: var(--wf-glass-shadow, 0 4px 6px rgba(0, 0, 0, 0.05));\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n transition: border-color 150ms ease, background 150ms ease, transform 100ms ease;\n outline: none;\n box-sizing: border-box;\n}\n\nwf-option .wf-option-card:hover:not(:disabled) {\n border-color: var(--wf-color-primary, #8040f0);\n background: var(--wf-glass-bg-hover, rgba(255, 255, 255, 0.85));\n}\n\nwf-option .wf-option-card:focus-visible {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.2);\n}\n\nwf-option .wf-option-card[aria-selected='true'] {\n border-color: var(--wf-color-primary, #8040f0);\n background-color: var(--wf-color-primary-light, rgba(128, 64, 240, 0.1));\n}\n\nwf-option .wf-option-card:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\nwf-option .wf-option-card:active:not(:disabled) {\n transform: scale(0.98);\n}\n\nwf-option .wf-option-card.selecting {\n animation: wf-blink 0.3s ease;\n}\n\n@keyframes wf-blink {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\nwf-option .wf-option-content {\n flex: 1;\n min-width: 0;\n}\n\nwf-option .wf-option-content strong,\nwf-option .wf-option-content h3,\nwf-option .wf-option-content h4 {\n display: block;\n font-weight: 600;\n margin: 0;\n}\n\nwf-option .wf-option-content span,\nwf-option .wf-option-content p {\n display: block;\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #646464);\n margin: 4px 0 0 0;\n}\n\n/* ----------------------------------------\n wf-progress\n ---------------------------------------- */\nwf-progress {\n display: block;\n}\n\nwf-progress[hidden] {\n display: none;\n}\n\nwf-progress .wf-progress {\n display: flex;\n gap: var(--wf-spacing-4, 16px);\n}\n\nwf-progress .wf-progress-segment {\n width: 32px;\n height: 8px;\n background-color: var(--wf-color-progress-inactive, rgba(217, 217, 217, 0.6));\n border-radius: var(--wf-radius-full, 99px);\n transition: background-color 300ms ease;\n}\n\nwf-progress .wf-progress-segment.completed,\nwf-progress .wf-progress-segment.active {\n background-color: var(--wf-color-progress-active, rgba(139, 139, 139, 0.6));\n}\n\n/* ----------------------------------------\n wf-badge\n ---------------------------------------- */\nwf-badge {\n display: inline-flex;\n}\n\nwf-badge[hidden] {\n display: none;\n}\n\nwf-badge .wf-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 24px;\n height: 24px;\n padding: var(--wf-spacing-1, 4px) var(--wf-spacing-2, 8px);\n font-size: var(--wf-font-size-xs, 0.75rem);\n font-weight: 500;\n font-family: inherit;\n text-transform: uppercase;\n flex-shrink: 0;\n line-height: 1;\n}\n\nwf-badge .wf-badge--default {\n background-color: var(--wf-color-badge-bg, #fcfcfc);\n border: 1px solid var(--wf-color-badge-border, #d4d4d4);\n border-radius: var(--wf-radius-sm, 4px);\n color: var(--wf-color-badge-text, #5f5f5f);\n}\n\nwf-badge .wf-badge--selected {\n background-color: var(--wf-color-primary, #8040f0);\n border: 1px solid var(--wf-color-primary, #8040f0);\n border-radius: var(--wf-radius-sm, 4px);\n color: white;\n}\n\nwf-badge .wf-badge--button {\n background-color: transparent;\n border: none;\n border-radius: var(--wf-radius-sm, 4px);\n color: rgba(255, 255, 255, 0.65);\n}\n\nwf-badge .wf-badge--button-secondary {\n background-color: transparent;\n border: none;\n border-radius: var(--wf-radius-sm, 4px);\n color: var(--wf-color-text-muted, #5f5f5f);\n}\n\n/* ----------------------------------------\n wf-layout\n ---------------------------------------- */\nwf-layout {\n display: block;\n box-sizing: border-box;\n}\n\nwf-layout[hidden] {\n display: none;\n}\n\n/* Width classes (applied via JS to host element) */\nwf-layout.wf-layout--width-full {\n width: 100%;\n}\n\nwf-layout.wf-layout--width-auto {\n width: auto;\n}\n\nwf-layout.wf-layout--width-fit {\n width: fit-content;\n}\n\n/* ----------------------------------------\n wf-thank-you\n ---------------------------------------- */\nwf-thank-you {\n display: block;\n text-align: center;\n padding: var(--wf-spacing-8, 48px) var(--wf-spacing-4, 24px);\n}\n\nwf-thank-you[hidden] {\n display: none;\n}\n\nwf-thank-you .wf-thank-you-icon {\n width: 72px;\n height: 72px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto var(--wf-spacing-4, 24px);\n box-shadow: 0 10px 25px -5px rgba(16, 185, 129, 0.4);\n}\n\nwf-thank-you .wf-thank-you-icon svg {\n width: 36px;\n height: 36px;\n color: white;\n}\n\nwf-thank-you .wf-thank-you-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--wf-color-text, #1e293b);\n margin: 0 0 12px 0;\n}\n\nwf-thank-you .wf-thank-you-subtitle {\n font-size: 16px;\n color: var(--wf-color-text-muted, #64748b);\n margin: 0 0 24px 0;\n line-height: 1.6;\n}\n\nwf-thank-you [slot=\"footer\"] {\n margin-top: var(--wf-spacing-4, 24px);\n}\n\n/* ----------------------------------------\n Form Input Components (wf-input, wf-email, wf-textarea, wf-field, wf-number)\n ---------------------------------------- */\nwf-input,\nwf-email,\nwf-textarea,\nwf-field,\nwf-number {\n display: block;\n}\n\nwf-input[hidden],\nwf-email[hidden],\nwf-textarea[hidden],\nwf-field[hidden],\nwf-number[hidden] {\n display: none;\n}\n\n.wf-field-container {\n display: flex;\n flex-direction: column;\n gap: var(--wf-spacing-2, 8px);\n}\n\n.wf-label {\n font-size: var(--wf-font-size-sm, 0.875rem);\n font-weight: 500;\n color: var(--wf-color-text, #0a0a0a);\n}\n\n.wf-label-required::after {\n content: ' *';\n color: var(--wf-color-error, #dc3545);\n}\n\n.wf-error-message {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-error, #dc3545);\n}\n\n.wf-hint {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #646464);\n}\n\n.wf-input {\n width: 100%;\n min-height: var(--wf-input-min-height, 56px);\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-weight: 400;\n font-family: inherit;\n background: var(--wf-glass-bg, rgba(255, 255, 255, 0.7));\n backdrop-filter: blur(var(--wf-glass-blur, 20px));\n -webkit-backdrop-filter: blur(var(--wf-glass-blur, 20px));\n border: 1px solid var(--wf-glass-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--wf-radius-md, 8px);\n box-shadow: var(--wf-glass-shadow, 0 4px 6px rgba(0, 0, 0, 0.05));\n color: var(--wf-color-text, #0a0a0a);\n transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;\n outline: none;\n box-sizing: border-box;\n}\n\n.wf-input::placeholder {\n color: var(--wf-color-text-muted, #646464);\n font-weight: 500;\n}\n\n.wf-input:focus {\n border-color: var(--wf-color-primary, #8040f0);\n box-shadow: 0 0 0 3px rgba(128, 64, 240, 0.2);\n}\n\n.wf-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.wf-input.wf-input-error {\n border-color: var(--wf-color-error, #dc3545);\n}\n\n.wf-input.wf-input-error:focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.2);\n}\n\n/* Textarea-specific styles */\n.wf-textarea {\n width: 100%;\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-family: inherit;\n background: var(--wf-glass-bg, rgba(255, 255, 255, 0.7));\n backdrop-filter: blur(var(--wf-glass-blur, 20px));\n -webkit-backdrop-filter: blur(var(--wf-glass-blur, 20px));\n border: 1px solid var(--wf-glass-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--wf-radius-lg, 12px);\n box-shadow: var(--wf-glass-shadow, 0 4px 6px rgba(0, 0, 0, 0.05));\n color: var(--wf-color-text, #212529);\n transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;\n outline: none;\n box-sizing: border-box;\n resize: vertical;\n min-height: 100px;\n}\n\n.wf-textarea::placeholder {\n color: var(--wf-color-text-muted, #6c757d);\n}\n\n.wf-textarea:focus {\n border-color: var(--wf-color-primary, #8b5cf6);\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2);\n}\n\n.wf-textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.wf-textarea.wf-textarea-error {\n border-color: var(--wf-color-error, #dc3545);\n}\n\n.wf-textarea.wf-textarea-error:focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.2);\n}\n\n.wf-char-count {\n font-size: var(--wf-font-size-sm, 0.875rem);\n color: var(--wf-color-text-muted, #6c757d);\n text-align: right;\n}\n\n.wf-char-count.wf-char-limit {\n color: var(--wf-color-error, #dc3545);\n}\n\n/* wf-field slotted input styles */\nwf-field .wf-input-wrapper {\n position: relative;\n}\n\nwf-field .wf-input-wrapper input,\nwf-field .wf-input-wrapper textarea,\nwf-field .wf-input-wrapper select {\n width: 100%;\n padding: var(--wf-spacing-4, 16px);\n font-size: var(--wf-font-size-base, 1rem);\n font-family: inherit;\n background-color: var(--wf-color-surface, #f8f9fa);\n border: 2px solid var(--wf-color-border, #dee2e6);\n border-radius: var(--wf-radius-lg, 12px);\n color: var(--wf-color-text, #212529);\n transition: border-color 150ms ease, box-shadow 150ms ease;\n outline: none;\n box-sizing: border-box;\n}\n\nwf-field .wf-input-wrapper input::placeholder,\nwf-field .wf-input-wrapper textarea::placeholder {\n color: var(--wf-color-text-muted, #6c757d);\n}\n\nwf-field .wf-input-wrapper input:focus,\nwf-field .wf-input-wrapper textarea:focus,\nwf-field .wf-input-wrapper select:focus {\n border-color: var(--wf-color-primary, #8b5cf6);\n box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2);\n}\n\nwf-field .wf-input-wrapper input:disabled,\nwf-field .wf-input-wrapper textarea:disabled,\nwf-field .wf-input-wrapper select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* wf-number - hide spinners */\nwf-number .wf-input::-webkit-outer-spin-button,\nwf-number .wf-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\nwf-number .wf-input[type='number'] {\n -moz-appearance: textfield;\n}\n`;\n\n/**\n * Inject global styles into the document head.\n * Only injects once per document.\n */\nexport function injectGlobalStyles(): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const STYLE_ID = 'wf-global-styles';\n if (document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = GLOBAL_STYLES;\n document.head.appendChild(style);\n}\n","/**\n * Wizard Form v3 - Lit-based reactive components\n *\n * @example\n * // ES Module usage\n * import { init } from 'aw-wizard-forms';\n * init({ container: '#form', adapter: 'hubspot', hubspot: { portalId: '...', formId: '...' } });\n *\n * @example\n * // UMD/Script tag usage\n * <script src=\"wizard-form.min.js\"></script>\n * <script>\n * WizardForm.init({ container: '#form', ... });\n * </script>\n *\n * // All components are auto-registered:\n * // <wizard-form>, <wf-step>, <wf-options>, <wf-option>, <wf-field>, <wf-email>,\n * // <wf-input>, <wf-number>, <wf-textarea>, <wf-badge>, <wf-layout>, <wf-progress>, <wf-thank-you>\n */\n\n// ============================================\n// Imperative API (main export)\n// ============================================\nexport { init, default } from './init.js';\nexport type { WizardFormConfig, WizardFormInstance, FormData } from './init.js';\n\n// ============================================\n// Components\n// ============================================\nexport { WizardForm, WfSuccess } from './components/wizard-form.js';\nexport { WfStep } from './components/wf-step.js';\nexport { WfOptions } from './components/wf-options.js';\nexport { WfOption } from './components/wf-option.js';\nexport { WfField } from './components/wf-field.js';\nexport { WfEmail } from './components/wf-email.js';\nexport { WfInput } from './components/wf-input.js';\nexport { WfNumber } from './components/wf-number.js';\nexport { WfTextarea } from './components/wf-textarea.js';\nexport { WfBadge } from './components/wf-badge.js';\nexport type { BadgeVariant } from './components/wf-badge.js';\nexport { WfLayout } from './components/wf-layout.js';\nexport { WfProgress } from './components/wf-progress.js';\nexport { WfThankYou } from './components/wf-thank-you.js';\nexport type {\n LayoutMode,\n FlexDirection,\n AlignItems,\n JustifyContent,\n WidthBehavior,\n SpacingPreset,\n} from './components/wf-layout.js';\n\n// ============================================\n// Controllers\n// ============================================\nexport { FormStateController } from './controllers/FormStateController.js';\nexport { ValidationController, DEFAULT_BLOCKED_DOMAINS } from './controllers/ValidationController.js';\nexport { KeyboardController } from './controllers/KeyboardController.js';\n\n// ============================================\n// Adapters\n// ============================================\nexport {\n createHubSpotAdapter,\n createWebhookAdapter,\n createRevenueHeroAdapter,\n getHubSpotCookie,\n isRevenueHeroLoaded,\n} from './adapters/index.js';\n\nexport type {\n SubmissionAdapter,\n SubmissionResult,\n SubmissionContext,\n AdapterConfig,\n HubSpotConfig as HubSpotAdapterConfig,\n WebhookConfig,\n RevenueHeroConfig,\n} from './adapters/index.js';\n\n// ============================================\n// Types\n// ============================================\nexport type {\n ValidationResult,\n ValidatorFn,\n Validator,\n FieldValidation,\n FormState,\n StepConfig,\n OptionData,\n OptionsConfig,\n FieldConfig,\n StepChangeDetail,\n FieldChangeDetail,\n SubmitDetail,\n SuccessDetail,\n ErrorDetail,\n HubSpotConfig,\n HubSpotSubmissionData,\n Theme,\n} from './types.js';\n\n// ============================================\n// Side-effect: Register all custom elements\n// ============================================\nimport './components/wizard-form.js';\nimport './components/wf-step.js';\nimport './components/wf-options.js';\nimport './components/wf-option.js';\nimport './components/wf-field.js';\nimport './components/wf-email.js';\nimport './components/wf-input.js';\nimport './components/wf-number.js';\nimport './components/wf-textarea.js';\nimport './components/wf-badge.js';\nimport './components/wf-layout.js';\nimport './components/wf-progress.js';\nimport './components/wf-thank-you.js';\n\n// ============================================\n// Side-effect: Inject global styles (Light DOM)\n// ============================================\nimport { injectGlobalStyles } from './styles/global.styles.js';\ninjectGlobalStyles();\n"],"names":["getHubSpotCookie","document","match","cookie","createHubSpotAdapter","config","portalId","formId","fieldMapping","mock","name","mapFields","data","mapped","key","value","Object","entries","submit","context","Promise","resolve","setTimeout","success","formData","endpoint","mappedData","this","payload","fields","map","Array","isArray","join","String","pageUri","pageUrl","pageName","pageTitle","hutk","response","fetch","method","headers","body","JSON","stringify","ok","json","error","catch","message","status","Error","createWebhookAdapter","url","referrer","submittedAt","timestamp","errorText","text","trim","responseData","isRevenueHeroLoaded","window","RevenueHero","createRevenueHeroAdapter","routerId","_context","scheduled","email","workEmail","schedule","t","globalThis","e","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","o","WeakMap","n$3","constructor","_$cssResult$","cssText","styleSheet","length","get","replaceSync","set","toString","c","cssRules","n","r","is","i","defineProperty","getOwnPropertyDescriptor","h","getOwnPropertyNames","getOwnPropertySymbols","getPrototypeOf","a","trustedTypes","l","emptyScript","p","reactiveElementPolyfillSupport","d","u","toAttribute","Boolean","fromAttribute","Number","parse","f","b","attribute","type","converter","reflect","useDefault","hasChanged","metadata","litPropertyMetadata","y$1","HTMLElement","addInitializer","_$Ei","push","observedAttributes","finalize","_$Eh","keys","createProperty","state","hasOwnProperty","create","wrapped","elementProperties","noAccessor","getPropertyDescriptor","call","requestUpdate","configurable","enumerable","getPropertyOptions","Map","finalized","properties","_$Eu","elementStyles","finalizeStyles","styles","Set","flat","reverse","unshift","toLowerCase","super","_$Ep","isUpdatePending","hasUpdated","_$Em","_$Ev","_$ES","enableUpdating","_$AL","_$E_","forEach","addController","_$EO","add","renderRoot","isConnected","hostConnected","removeController","delete","size","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$ET","removeAttribute","_$Ej","hasAttribute","C","_$EP","has","_$Eq","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$EM","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","y","mode","ReactiveElement","reactiveElementVersions","createPolicy","createHTML","Math","random","toFixed","slice","createComment","v","_","m","RegExp","g","$","_$litType$","strings","values","E","for","A","P","createTreeWalker","V","S","parts","lastIndex","exec","test","x","startsWith","N","el","currentNode","content","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","index","ctor","I","L","z","H","tagName","append","indexOf","innerHTML","M","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","k","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","options","startNode","endNode","_$AR","T","iterator","O","insertBefore","createTextNode","_$AC","_$AP","remove","setConnected","element","fill","j","arguments","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","B","litHtmlPolyfillSupport","litHtmlVersions","renderOptions","_$Do","_a","renderBefore","render","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPolyfillSupport","litElementVersions","customElements","define","kind","init","FormStateController","_formData","_validation","_currentStep","_totalSteps","_submitting","_submitted","_stepConfigs","_subscribers","clear","validation","currentStep","totalSteps","submitting","submitted","_error","setValue","dirty","result","valid","touched","_notifyChange","getValue","setValidation","existing","markTouched","setTotalSteps","total","setStepConfig","step","getStepConfig","getStepFields","goToStep","skipIf","nextStep","previousStep","isFirstStep","isLastStep","isStepValid","every","isCurrentStepValid","getFieldError","hasFieldError","setSubmitting","setSubmitted","setError","reset","subscribe","callback","KeyboardController","_enabled","_config","blockEnterOnTextarea","_boundHandler","_handleKeydown","bind","activeElement","_getActiveElement","isTextarea","isInput","isContentEditable","isTextInput","onEnter","preventDefault","onEscape","onArrowUp","onArrowDown","onArrowLeft","onArrowRight","active","updateConfig","enable","disable","enabled","WfBadge","shortcut","variant","html","__decorateClass","property","customElement","WizardForm","hubspotPortal","hubspotForm","theme","showProgress","autoAdvance","hideBack","submitOnStep","_steps","_cachedSuccessContent","_stateController","_handleFieldChange","extraFields","detail","fieldName","fieldValue","dispatchEvent","CustomEvent","bubbles","composed","_handleOptionSelect","optionsParent","target","closest","_goNext","_handleEnter","_handleEscape","querySelector","_discoverSteps","_showCurrentStep","style","display","nothing","_renderNavigation","_renderProgress","segments","completed","isFirst","isLast","showBack","_goBack","from","querySelectorAll","show","_getStepByNumber","stepNumber","validate","_submit","_navigateToStep","targetStep","direction","targetStepEl","shouldSkip","nextTarget","adapter","_submitPartialToHubSpot","_getFieldsUpToStep","currentStepEl","hide","to","rawData","submitEvent","cancelable","defaultPrevented","submitData","serialize","_submitToHubSpot","errorMessage","location","href","title","errorData","field","isSubmitting","isSubmitted","next","back","setFormData","WfSuccess","WfStep","leaving","_fields","_discoverFields","changedProperties","_focusFirstField","fieldElements","findFields","includes","children","requestAnimationFrame","focusable","_findFocusable","focus","child","found","expression","left","right","replace","handleAnimationEnd","invalidElements","allValid","validateElement","async","firstInvalid","scrollIntoView","behavior","block","SPACING_SCALE","none","xs","sm","md","lg","xl","WfLayout","gap","gapX","gapY","align","justify","padding","paddingX","paddingY","wrap","width","columns","minItemWidth","_resolveSpacing","num","parseFloat","isNaN","_getGapX","_getGapY","_getPadding","uniformPadding","px","_buildStyles","cols","parseInt","classList","WfOptions","multi","required","min","max","allowOther","otherLabel","otherPlaceholder","otherRequired","otherName","otherFieldValue","_selected","_otherValue","_errorMessage","_validationActivated","_options","_shortcutMap","_otherShortcut","stopPropagation","_selectValue","parentStep","actualTarget","composedPath","otherInput","toUpperCase","option","disabled","triggerSelect","layout","_discoverOptions","_updateOptionStates","_handleOtherInput","_handleOtherKeydown","_handleOtherFocus","input","_dispatchChange","blur","fromCharCode","setSelected","_handleMultiSelect","_handleSingleSelect","_validateSelection","_checkValidation","hasOtherValue","hasSelection","selectedArray","hasOtherText","currentValue","selected","val","getSelected","isSelected","select","deselect","isValid","showError","clearError","WfOption","_selecting","_cachedContent","node","cloneNode","_handleClick","_triggerSelect","button","FormInputBase","label","hint","_value","_debounceTimer","_validators","_handleInput","clearTimeout","_getDebounceMs","_handleBlur","_handleFocus","_setupValidators","_getValidationTriggerProperties","some","prop","_getFocusableSelector","addValidator","validator","DEFAULT_BLOCKED_DOMAINS","ValidationController","addValidators","validators","removeValidator","validatorName","filter","clearValidators","getValidators","validateSync","emailRegex","blockedDomains","domain","pattern","regex","minLength","maxLength","minSelections","maxSelections","custom","validateFn","WfField","_inputElement","_discoverInput","blockedDomainsAttr","_handleSlotChange","slot","elements","assignedElements","flatten","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","id","WfEmail","placeholder","workEmailMessage","domains","WfInput","patternMessage","autocomplete","minlength","maxlength","WfNumber","valueAsNumber","container","wizardForm","hubspot","webhook","revenuehero","handleSubmit","rawFormData","__wizardFormData","__wizardFormRawData","__wizardFormInstance","instance","onSubmit","Date","toISOString","then","__wizardFormResponse","__wizardFormError","onError","handleSuccess","onSuccess","handleError","handleStepChange","onStepChange","handleFieldChange","onFieldChange","destroy","WfTextarea","rows","showCount","charCount","isAtLimit","init_default","WfProgress","_isComplete","_wizard","_boundHandleStepChange","_handleStepChange","_boundHandleSuccess","_handleSuccess","_connectToWizard","_disconnectFromWizard","getElementById","_handleStepsDiscovered","WfThankYou","subtitle","hideIcon","STYLE_ID","head","injectGlobalStyles"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9]}