@dmitryvim/form-builder 0.2.8 → 0.2.9

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,4 +1,4 @@
1
- var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||e.maxLength!==null)&&(e.minLength!==null&&e.maxLength!==null?t.push(`length=${e.minLength}-${e.maxLength} characters`):e.maxLength!==null?t.push(`max=${e.maxLength} characters`):e.minLength!==null&&t.push(`min=${e.minLength} characters`))}function $e(e,t){(e.min!==null||e.max!==null)&&(e.min!==null&&e.max!==null?t.push(`range=${e.min}-${e.max}`):e.max!==null?t.push(`max=${e.max}`):e.min!==null&&t.push(`min=${e.min}`))}function we(e,t){e.maxSizeMB&&t.push(`max_size=${e.maxSizeMB}MB`)}function ke(e,t){var n;(n=e.accept)!=null&&n.extensions&&t.push(`formats=${e.accept.extensions.map(o=>o.toUpperCase()).join(",")}`)}function Se(e,t){var n;e.pattern&&!e.pattern.includes("\u0410-\u042F")?t.push("plain text only"):(n=e.pattern)!=null&&n.includes("\u0410-\u042F")&&t.push("text with punctuation")}function F(e){const t=[];return t.push(e.required?"required":"optional"),Ee(e,t),$e(e,t),we(e,t),ke(e,t),Se(e,t),t.join(" \u2022 ")}function D(e){const t=[];if(!e||typeof e!="object")return t.push("Schema must be an object"),t;if(!Array.isArray(e.elements))return t.push("Schema missing elements array"),t;function n(o,a){o.forEach((r,l)=>{const s=`${a}[${l}]`;if(r.type||t.push(`${s}: missing type`),r.key||t.push(`${s}: missing key`),r.displayIf){const i=r.displayIf;(!i.key||typeof i.key!="string")&&t.push(`${s}: displayIf must have a 'key' property of type string`),"equals"in i||t.push(`${s}: displayIf must have at least one operator (equals, etc.)`)}if(r.type==="group"&&"elements"in r&&r.elements&&n(r.elements,`${s}.elements`),r.type==="container"&&r.elements){if("columns"in r&&r.columns!==void 0){const i=r.columns,d=[1,2,3,4];(!Number.isInteger(i)||!d.includes(i))&&t.push(`${s}: columns must be 1, 2, 3, or 4 (got ${i})`)}if("prefillHints"in r&&r.prefillHints){const i=r.prefillHints;Array.isArray(i)&&i.forEach((d,u)=>{if((!d.label||typeof d.label!="string")&&t.push(`${s}: prefillHints[${u}] must have a 'label' property of type string`),!d.values||typeof d.values!="object")t.push(`${s}: prefillHints[${u}] must have a 'values' property of type object`);else for(const c in d.values)r.elements.some(m=>m.key===c)||t.push(`container "${r.key}": prefillHints[${u}] references non-existent field "${c}"`)})}n(r.elements,`${s}.elements`)}if(r.type==="select"&&r.options){const i=r.default;i!=null&&i!==""&&(r.options.some(d=>d.value===i)||t.push(`${s}: default "${i}" not in options`))}})}return Array.isArray(e.elements)&&n(e.elements,"elements"),t}function z(e){return e&&typeof e=="object"&&e.constructor===Object}function q(e,t){return e?`${e}.${t}`:t}function H(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function Le(e,t){if(!e||typeof e!="object")return;const n=t.match(/[^.[\]]+|\[\d+\]/g);if(!n||n.length===0)return;let o=e;for(const a of n){if(o==null)return;if(a.startsWith("[")&&a.endsWith("]")){const r=parseInt(a.slice(1,-1),10);if(!Array.isArray(o)||isNaN(r))return;o=o[r]}else o=o[a]}return o}function R(e,t){if(!e||!e.key)throw new Error("Invalid displayIf condition: must have a 'key' property");const n=Le(t,e.key);if("equals"in e)return Fe(n,e.equals);throw new Error("Invalid displayIf condition: no recognized operator (equals, etc.)")}function Fe(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;if(typeof e!=typeof t)return!1;if(typeof e=="object"&&typeof t=="object")try{return JSON.stringify(e)===JSON.stringify(t)}catch(n){if(n instanceof TypeError&&(n.message.includes("circular")||n.message.includes("cyclic")))return console.warn("deepEqual: Circular reference detected in displayIf comparison, using reference equality"),e===t;throw n}return e===t}function Ne(e,t,n,o){const a=t.state,r=document.createElement("input");if(r.type="text",r.className="w-full rounded-lg",r.style.cssText=`
1
+ var FormBuilder=(function(F){"use strict";function Ce(e,t){(e.minLength!==null||e.maxLength!==null)&&(e.minLength!==null&&e.maxLength!==null?t.push(`length=${e.minLength}-${e.maxLength} characters`):e.maxLength!==null?t.push(`max=${e.maxLength} characters`):e.minLength!==null&&t.push(`min=${e.minLength} characters`))}function Ee(e,t){(e.min!==null||e.max!==null)&&(e.min!==null&&e.max!==null?t.push(`range=${e.min}-${e.max}`):e.max!==null?t.push(`max=${e.max}`):e.min!==null&&t.push(`min=${e.min}`))}function $e(e,t){e.maxSizeMB&&t.push(`max_size=${e.maxSizeMB}MB`)}function we(e,t){var n;(n=e.accept)!=null&&n.extensions&&t.push(`formats=${e.accept.extensions.map(o=>o.toUpperCase()).join(",")}`)}function ke(e,t){var n;e.pattern&&!e.pattern.includes("\u0410-\u042F")?t.push("plain text only"):(n=e.pattern)!=null&&n.includes("\u0410-\u042F")&&t.push("text with punctuation")}function S(e){const t=[];return t.push(e.required?"required":"optional"),Ce(e,t),Ee(e,t),$e(e,t),we(e,t),ke(e,t),t.join(" \u2022 ")}function I(e){const t=[];if(!e||typeof e!="object")return t.push("Schema must be an object"),t;if(!Array.isArray(e.elements))return t.push("Schema missing elements array"),t;function n(o,a){o.forEach((r,l)=>{const i=`${a}[${l}]`;if(r.type||t.push(`${i}: missing type`),r.key||t.push(`${i}: missing key`),r.displayIf){const s=r.displayIf;(!s.key||typeof s.key!="string")&&t.push(`${i}: displayIf must have a 'key' property of type string`),"equals"in s||t.push(`${i}: displayIf must have at least one operator (equals, etc.)`)}if(r.type==="group"&&"elements"in r&&r.elements&&n(r.elements,`${i}.elements`),r.type==="container"&&r.elements){if("columns"in r&&r.columns!==void 0){const s=r.columns,d=[1,2,3,4];(!Number.isInteger(s)||!d.includes(s))&&t.push(`${i}: columns must be 1, 2, 3, or 4 (got ${s})`)}if("prefillHints"in r&&r.prefillHints){const s=r.prefillHints;Array.isArray(s)&&s.forEach((d,u)=>{if((!d.label||typeof d.label!="string")&&t.push(`${i}: prefillHints[${u}] must have a 'label' property of type string`),!d.values||typeof d.values!="object")t.push(`${i}: prefillHints[${u}] must have a 'values' property of type object`);else for(const c in d.values)r.elements.some(m=>m.key===c)||t.push(`container "${r.key}": prefillHints[${u}] references non-existent field "${c}"`)})}n(r.elements,`${i}.elements`)}if(r.type==="select"&&r.options){const s=r.default;s!=null&&s!==""&&(r.options.some(d=>d.value===s)||t.push(`${i}: default "${s}" not in options`))}})}return Array.isArray(e.elements)&&n(e.elements,"elements"),t}function M(e){return e&&typeof e=="object"&&e.constructor===Object}function q(e,t){return e?`${e}.${t}`:t}function T(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function Se(e,t){if(!e||typeof e!="object")return;const n=t.match(/[^.[\]]+|\[\d+\]/g);if(!n||n.length===0)return;let o=e;for(const a of n){if(o==null)return;if(a.startsWith("[")&&a.endsWith("]")){const r=parseInt(a.slice(1,-1),10);if(!Array.isArray(o)||isNaN(r))return;o=o[r]}else o=o[a]}return o}function R(e,t){if(!e||!e.key)throw new Error("Invalid displayIf condition: must have a 'key' property");const n=Se(t,e.key);if("equals"in e)return Le(n,e.equals);throw new Error("Invalid displayIf condition: no recognized operator (equals, etc.)")}function Le(e,t){if(e===t)return!0;if(e==null||t==null)return e===t;if(typeof e!=typeof t)return!1;if(typeof e=="object"&&typeof t=="object")try{return JSON.stringify(e)===JSON.stringify(t)}catch(n){if(n instanceof TypeError&&(n.message.includes("circular")||n.message.includes("cyclic")))return console.warn("deepEqual: Circular reference detected in displayIf comparison, using reference equality"),e===t;throw n}return e===t}function Fe(e,t,n,o){const a=t.state,r=document.createElement("input");if(r.type="text",r.className="w-full rounded-lg",r.style.cssText=`
2
2
  padding: var(--fb-input-padding-y) var(--fb-input-padding-x);
3
3
  border: var(--fb-border-width) solid var(--fb-border-color);
4
4
  border-radius: var(--fb-border-radius);
@@ -7,10 +7,10 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
7
7
  font-size: var(--fb-font-size);
8
8
  font-family: var(--fb-font-family);
9
9
  transition: all var(--fb-transition-duration) ease-in-out;
10
- `,r.name=o,r.placeholder=e.placeholder||"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,a.config.readonly||(r.addEventListener("focus",()=>{r.style.borderColor="var(--fb-border-focus-color)",r.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",r.style.outlineOffset="0"}),r.addEventListener("blur",()=>{r.style.borderColor="var(--fb-border-color)",r.style.outline="none"}),r.addEventListener("mouseenter",()=>{document.activeElement!==r&&(r.style.borderColor="var(--fb-border-hover-color)")}),r.addEventListener("mouseleave",()=>{document.activeElement!==r&&(r.style.borderColor="var(--fb-border-color)")})),!a.config.readonly&&t.instance){const s=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("blur",s),r.addEventListener("input",s)}n.appendChild(r);const l=document.createElement("p");l.className="mt-1",l.style.cssText=`
10
+ `,r.name=o,r.placeholder=e.placeholder||"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,a.config.readonly||(r.addEventListener("focus",()=>{r.style.borderColor="var(--fb-border-focus-color)",r.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",r.style.outlineOffset="0"}),r.addEventListener("blur",()=>{r.style.borderColor="var(--fb-border-color)",r.style.outline="none"}),r.addEventListener("mouseenter",()=>{document.activeElement!==r&&(r.style.borderColor="var(--fb-border-hover-color)")}),r.addEventListener("mouseleave",()=>{document.activeElement!==r&&(r.style.borderColor="var(--fb-border-color)")})),!a.config.readonly&&t.instance){const i=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("blur",i),r.addEventListener("input",i)}n.appendChild(r);const l=document.createElement("p");l.className="mt-1",l.style.cssText=`
11
11
  font-size: var(--fb-font-size-small);
12
12
  color: var(--fb-text-secondary-color);
13
- `,l.textContent=F(e),n.appendChild(l)}function Ae(e,t,n,o){var a,r;const l=t.state,s=t.prefill[e.key]||[],i=Array.isArray(s)?[...s]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;i.length<d;)i.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-text-item").forEach((x,v)=>{const y=x.querySelector("input");y&&(y.name=`${o}[${v}]`)})}function f(x="",v=-1){const y=document.createElement("div");y.className="multiple-text-item flex items-center gap-2";const p=document.createElement("input");if(p.type="text",p.className="flex-1",p.style.cssText=`
13
+ `,l.textContent=S(e),n.appendChild(l)}function Ne(e,t,n,o){var a,r;const l=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;s.length<d;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-text-item").forEach((x,h)=>{const g=x.querySelector("input");g&&(g.name=`${o}[${h}]`)})}function v(x="",h=-1){const g=document.createElement("div");g.className="multiple-text-item flex items-center gap-2";const p=document.createElement("input");if(p.type="text",p.className="flex-1",p.style.cssText=`
14
14
  padding: var(--fb-input-padding-y) var(--fb-input-padding-x);
15
15
  border: var(--fb-border-width) solid var(--fb-border-color);
16
16
  border-radius: var(--fb-border-radius);
@@ -19,32 +19,32 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
19
19
  font-size: var(--fb-font-size);
20
20
  font-family: var(--fb-font-family);
21
21
  transition: all var(--fb-transition-duration) ease-in-out;
22
- `,p.placeholder=e.placeholder||"Enter text",p.value=x,p.readOnly=l.config.readonly,l.config.readonly||(p.addEventListener("focus",()=>{p.style.borderColor="var(--fb-border-focus-color)",p.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",p.style.outlineOffset="0"}),p.addEventListener("blur",()=>{p.style.borderColor="var(--fb-border-color)",p.style.outline="none"}),p.addEventListener("mouseenter",()=>{document.activeElement!==p&&(p.style.borderColor="var(--fb-border-hover-color)")}),p.addEventListener("mouseleave",()=>{document.activeElement!==p&&(p.style.borderColor="var(--fb-border-color)")})),!l.config.readonly&&t.instance){const C=()=>{t.instance.triggerOnChange(p.name,p.value)};p.addEventListener("blur",C),p.addEventListener("input",C)}return y.appendChild(p),v===-1?c.appendChild(y):c.insertBefore(y,c.children[v]),m(),y}function h(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-text-item"),v=x.length;x.forEach(y=>{let p=y.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 rounded",p.style.cssText=`
22
+ `,p.placeholder=e.placeholder||"Enter text",p.value=x,p.readOnly=l.config.readonly,l.config.readonly||(p.addEventListener("focus",()=>{p.style.borderColor="var(--fb-border-focus-color)",p.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",p.style.outlineOffset="0"}),p.addEventListener("blur",()=>{p.style.borderColor="var(--fb-border-color)",p.style.outline="none"}),p.addEventListener("mouseenter",()=>{document.activeElement!==p&&(p.style.borderColor="var(--fb-border-hover-color)")}),p.addEventListener("mouseleave",()=>{document.activeElement!==p&&(p.style.borderColor="var(--fb-border-color)")})),!l.config.readonly&&t.instance){const C=()=>{t.instance.triggerOnChange(p.name,p.value)};p.addEventListener("blur",C),p.addEventListener("input",C)}return g.appendChild(p),h===-1?c.appendChild(g):c.insertBefore(g,c.children[h]),m(),g}function f(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-text-item"),h=x.length;x.forEach(g=>{let p=g.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 rounded",p.style.cssText=`
23
23
  color: var(--fb-error-color);
24
24
  background-color: transparent;
25
25
  transition: background-color var(--fb-transition-duration);
26
- `,p.innerHTML="\u2715",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{const E=Array.from(c.children).indexOf(y);c.children.length>d&&(i.splice(E,1),y.remove(),m(),g(),h())},y.appendChild(p));const C=v<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function g(){const x=n.querySelector(".add-text-btn");if(x&&x.remove(),!l.config.readonly&&i.length<u){const v=document.createElement("button");v.type="button",v.className="add-text-btn mt-2 px-3 py-1 rounded",v.style.cssText=`
26
+ `,p.innerHTML="\u2715",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{const E=Array.from(c.children).indexOf(g);c.children.length>d&&(s.splice(E,1),g.remove(),m(),y(),f())},g.appendChild(p));const C=h<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function y(){const x=n.querySelector(".add-text-btn");if(x&&x.remove(),!l.config.readonly&&s.length<u){const h=document.createElement("button");h.type="button",h.className="add-text-btn mt-2 px-3 py-1 rounded",h.style.cssText=`
27
27
  color: var(--fb-primary-color);
28
28
  border: var(--fb-border-width) solid var(--fb-primary-color);
29
29
  background-color: transparent;
30
30
  font-size: var(--fb-font-size);
31
31
  transition: all var(--fb-transition-duration);
32
- `,v.textContent=`+ Add ${e.label||"Text"}`,v.addEventListener("mouseenter",()=>{v.style.backgroundColor="var(--fb-background-hover-color)"}),v.addEventListener("mouseleave",()=>{v.style.backgroundColor="transparent"}),v.onclick=()=>{i.push(e.default||""),f(e.default||""),g(),h()},n.appendChild(v)}}i.forEach(x=>f(x)),g(),h();const b=document.createElement("p");b.className="mt-1",b.style.cssText=`
32
+ `,h.textContent="+",h.addEventListener("mouseenter",()=>{h.style.backgroundColor="var(--fb-background-hover-color)"}),h.addEventListener("mouseleave",()=>{h.style.backgroundColor="transparent"}),h.onclick=()=>{s.push(e.default||""),v(e.default||""),y(),f()},n.appendChild(h)}}s.forEach(x=>v(x)),y(),f();const b=document.createElement("p");b.className="mt-1",b.style.cssText=`
33
33
  font-size: var(--fb-font-size-small);
34
34
  color: var(--fb-text-secondary-color);
35
- `,b.textContent=F(e),n.appendChild(b)}function Y(e,t,n){var o,a,r;const l=[],{scopeRoot:s,skipValidation:i}=n,d=(c,m)=>{var f,h;if(!c)return;const g=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let b=document.getElementById(g);m?(c.classList.add("invalid"),c.title=m,b||(b=document.createElement("div"),b.id=g,b.className="error-message",b.style.cssText=`
35
+ `,b.textContent=S(e),n.appendChild(b)}function G(e,t,n){var o,a,r;const l=[],{scopeRoot:i,skipValidation:s}=n,d=(c,m)=>{var v,f;if(!c)return;const y=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let b=document.getElementById(y);m?(c.classList.add("invalid"),c.title=m,b||(b=document.createElement("div"),b.id=y,b.className="error-message",b.style.cssText=`
36
36
  color: var(--fb-error-color);
37
37
  font-size: var(--fb-font-size-small);
38
38
  margin-top: 0.25rem;
39
- `,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(b,c.nextSibling):(h=c.parentNode)==null||h.appendChild(b)),b.textContent=m,b.style.display="block"):(c.classList.remove("invalid"),c.title="",b&&b.remove())},u=(c,m,f)=>{let h=!1;if(!i&&m){if(e.minLength!==void 0&&e.minLength!==null&&m.length<e.minLength)l.push(`${f}: minLength=${e.minLength}`),d(c,`minLength=${e.minLength}`),h=!0;else if(e.maxLength!==void 0&&e.maxLength!==null&&m.length>e.maxLength)l.push(`${f}: maxLength=${e.maxLength}`),d(c,`maxLength=${e.maxLength}`),h=!0;else if(e.pattern)try{new RegExp(e.pattern).test(m)||(l.push(`${f}: pattern mismatch`),d(c,"pattern mismatch"),h=!0)}catch(g){l.push(`${f}: invalid pattern`),d(c,"invalid pattern"),h=!0}}h||d(c,null)};if(e.multiple){const c=s.querySelectorAll(`[name^="${t}["]`),m=[];if(c.forEach((f,h)=>{var g;const b=(g=f==null?void 0:f.value)!=null?g:"";m.push(b),u(f,b,`${t}[${h}]`)}),!i){const f=(o=e.minCount)!=null?o:1,h=(a=e.maxCount)!=null?a:1/0,g=m.filter(b=>b.trim()!=="");e.required&&g.length===0&&l.push(`${t}: required`),g.length<f&&l.push(`${t}: minimum ${f} items required`),g.length>h&&l.push(`${t}: maximum ${h} items allowed`)}return{value:m,errors:l}}else{const c=s.querySelector(`[name$="${t}"]`),m=(r=c==null?void 0:c.value)!=null?r:"";return!i&&e.required&&m===""?(l.push(`${t}: required`),d(c,"required"),{value:"",errors:l}):(u(c,m,t),{value:m,errors:l})}}function X(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateTextField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,s)=>{s<n.length&&(l.value=n[s]!=null?String(n[s]):"",l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateTextField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.classList.remove("invalid"),r.title="")}}function qe(e,t,n,o){const a=t.state,r=document.createElement("textarea");if(r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none",r.name=o,r.placeholder=e.placeholder||"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",r.rows=e.rows||4,r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,!a.config.readonly&&t.instance){const s=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("blur",s),r.addEventListener("input",s)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=F(e),n.appendChild(l)}function Te(e,t,n,o){var a,r;const l=t.state,s=t.prefill[e.key]||[],i=Array.isArray(s)?[...s]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;i.length<d;)i.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-textarea-item").forEach((x,v)=>{const y=x.querySelector("textarea");y&&(y.name=`${o}[${v}]`)})}function f(x="",v=-1){const y=document.createElement("div");y.className="multiple-textarea-item";const p=document.createElement("textarea");if(p.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none",p.placeholder=e.placeholder||"Enter text",p.rows=e.rows||4,p.value=x,p.readOnly=l.config.readonly,!l.config.readonly&&t.instance){const C=()=>{t.instance.triggerOnChange(p.name,p.value)};p.addEventListener("blur",C),p.addEventListener("input",C)}return y.appendChild(p),v===-1?c.appendChild(y):c.insertBefore(y,c.children[v]),m(),y}function h(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-textarea-item"),v=x.length;x.forEach(y=>{let p=y.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm",p.innerHTML="\u2715 Remove",p.onclick=()=>{const E=Array.from(c.children).indexOf(y);c.children.length>d&&(i.splice(E,1),y.remove(),m(),g(),h())},y.appendChild(p));const C=v<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function g(){const x=n.querySelector(".add-textarea-btn");if(x&&x.remove(),!l.config.readonly&&i.length<u){const v=document.createElement("button");v.type="button",v.className="add-textarea-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",v.textContent=`+ Add ${e.label||"Textarea"}`,v.onclick=()=>{i.push(e.default||""),f(e.default||""),g(),h()},n.appendChild(v)}}i.forEach(x=>f(x)),g(),h();const b=document.createElement("p");b.className="text-xs text-gray-500 mt-1",b.textContent=F(e),n.appendChild(b)}function He(e,t,n){return Y(e,t,n)}function Me(e,t,n,o){X(e,t,n,o)}function ze(e,t,n,o){const a=t.state,r=document.createElement("input");if(r.type="number",r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",r.name=o,r.placeholder=e.placeholder||"0",e.min!==void 0&&(r.min=e.min.toString()),e.max!==void 0&&(r.max=e.max.toString()),e.step!==void 0&&(r.step=e.step.toString()),r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,!a.config.readonly&&t.instance){const s=()=>{const i=r.value?parseFloat(r.value):null;t.instance.triggerOnChange(o,i)};r.addEventListener("blur",s),r.addEventListener("input",s)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=F(e),n.appendChild(l)}function Be(e,t,n,o){var a,r;const l=t.state,s=t.prefill[e.key]||[],i=Array.isArray(s)?[...s]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;i.length<d;)i.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-number-item").forEach((x,v)=>{const y=x.querySelector("input");y&&(y.name=`${o}[${v}]`)})}function f(x="",v=-1){const y=document.createElement("div");y.className="multiple-number-item flex items-center gap-2";const p=document.createElement("input");if(p.type="number",p.className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",p.placeholder=e.placeholder||"0",e.min!==void 0&&(p.min=e.min.toString()),e.max!==void 0&&(p.max=e.max.toString()),e.step!==void 0&&(p.step=e.step.toString()),p.value=x.toString(),p.readOnly=l.config.readonly,!l.config.readonly&&t.instance){const C=()=>{const E=p.value?parseFloat(p.value):null;t.instance.triggerOnChange(p.name,E)};p.addEventListener("blur",C),p.addEventListener("input",C)}return y.appendChild(p),v===-1?c.appendChild(y):c.insertBefore(y,c.children[v]),m(),y}function h(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-number-item"),v=x.length;x.forEach(y=>{let p=y.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",p.innerHTML="\u2715",p.onclick=()=>{const E=Array.from(c.children).indexOf(y);c.children.length>d&&(i.splice(E,1),y.remove(),m(),g(),h())},y.appendChild(p));const C=v<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function g(){const x=n.querySelector(".add-number-btn");if(x&&x.remove(),!l.config.readonly&&i.length<u){const v=document.createElement("button");v.type="button",v.className="add-number-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",v.textContent=`+ Add ${e.label||"Number"}`,v.onclick=()=>{i.push(e.default||""),f(e.default||""),g(),h()},n.appendChild(v)}}i.forEach(x=>f(x)),g(),h();const b=document.createElement("p");b.className="text-xs text-gray-500 mt-1",b.textContent=F(e),n.appendChild(b)}function je(e,t,n){var o,a,r,l,s;const i=[],{scopeRoot:d,skipValidation:u}=n,c=(f,h)=>{var g,b;if(!f)return;const x=`error-${f.getAttribute("name")||Math.random().toString(36).substring(7)}`;let v=document.getElementById(x);h?(f.classList.add("invalid"),f.title=h,v||(v=document.createElement("div"),v.id=x,v.className="error-message",v.style.cssText=`
39
+ `,c.nextSibling?(v=c.parentNode)==null||v.insertBefore(b,c.nextSibling):(f=c.parentNode)==null||f.appendChild(b)),b.textContent=m,b.style.display="block"):(c.classList.remove("invalid"),c.title="",b&&b.remove())},u=(c,m,v)=>{let f=!1;if(!s&&m){if(e.minLength!==void 0&&e.minLength!==null&&m.length<e.minLength)l.push(`${v}: minLength=${e.minLength}`),d(c,`minLength=${e.minLength}`),f=!0;else if(e.maxLength!==void 0&&e.maxLength!==null&&m.length>e.maxLength)l.push(`${v}: maxLength=${e.maxLength}`),d(c,`maxLength=${e.maxLength}`),f=!0;else if(e.pattern)try{new RegExp(e.pattern).test(m)||(l.push(`${v}: pattern mismatch`),d(c,"pattern mismatch"),f=!0)}catch(y){l.push(`${v}: invalid pattern`),d(c,"invalid pattern"),f=!0}}f||d(c,null)};if(e.multiple){const c=i.querySelectorAll(`[name^="${t}["]`),m=[];if(c.forEach((v,f)=>{var y;const b=(y=v==null?void 0:v.value)!=null?y:"";m.push(b),u(v,b,`${t}[${f}]`)}),!s){const v=(o=e.minCount)!=null?o:1,f=(a=e.maxCount)!=null?a:1/0,y=m.filter(b=>b.trim()!=="");e.required&&y.length===0&&l.push(`${t}: required`),y.length<v&&l.push(`${t}: minimum ${v} items required`),y.length>f&&l.push(`${t}: maximum ${f} items allowed`)}return{value:m,errors:l}}else{const c=i.querySelector(`[name$="${t}"]`),m=(r=c==null?void 0:c.value)!=null?r:"";return!s&&e.required&&m===""?(l.push(`${t}: required`),d(c,"required"),{value:"",errors:l}):(u(c,m,t),{value:m,errors:l})}}function Y(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateTextField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,i)=>{i<n.length&&(l.value=n[i]!=null?String(n[i]):"",l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateTextField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.classList.remove("invalid"),r.title="")}}function qe(e,t,n,o){const a=t.state,r=document.createElement("textarea");if(r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none",r.name=o,r.placeholder=e.placeholder||"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",r.rows=e.rows||4,r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,!a.config.readonly&&t.instance){const i=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("blur",i),r.addEventListener("input",i)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=S(e),n.appendChild(l)}function Ae(e,t,n,o){var a,r;const l=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;s.length<d;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-textarea-item").forEach((x,h)=>{const g=x.querySelector("textarea");g&&(g.name=`${o}[${h}]`)})}function v(x="",h=-1){const g=document.createElement("div");g.className="multiple-textarea-item";const p=document.createElement("textarea");if(p.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none",p.placeholder=e.placeholder||"Enter text",p.rows=e.rows||4,p.value=x,p.readOnly=l.config.readonly,!l.config.readonly&&t.instance){const C=()=>{t.instance.triggerOnChange(p.name,p.value)};p.addEventListener("blur",C),p.addEventListener("input",C)}return g.appendChild(p),h===-1?c.appendChild(g):c.insertBefore(g,c.children[h]),m(),g}function f(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-textarea-item"),h=x.length;x.forEach(g=>{let p=g.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm",p.innerHTML="\u2715",p.onclick=()=>{const E=Array.from(c.children).indexOf(g);c.children.length>d&&(s.splice(E,1),g.remove(),m(),y(),f())},g.appendChild(p));const C=h<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function y(){const x=n.querySelector(".add-textarea-btn");if(x&&x.remove(),!l.config.readonly&&s.length<u){const h=document.createElement("button");h.type="button",h.className="add-textarea-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",h.textContent="+",h.onclick=()=>{s.push(e.default||""),v(e.default||""),y(),f()},n.appendChild(h)}}s.forEach(x=>v(x)),y(),f();const b=document.createElement("p");b.className="text-xs text-gray-500 mt-1",b.textContent=S(e),n.appendChild(b)}function Te(e,t,n){return G(e,t,n)}function He(e,t,n,o){Y(e,t,n,o)}function Me(e,t,n,o){const a=t.state,r=document.createElement("input");if(r.type="number",r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",r.name=o,r.placeholder=e.placeholder||"0",e.min!==void 0&&(r.min=e.min.toString()),e.max!==void 0&&(r.max=e.max.toString()),e.step!==void 0&&(r.step=e.step.toString()),r.value=t.prefill[e.key]||e.default||"",r.readOnly=a.config.readonly,!a.config.readonly&&t.instance){const i=()=>{const s=r.value?parseFloat(r.value):null;t.instance.triggerOnChange(o,s)};r.addEventListener("blur",i),r.addEventListener("input",i)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=S(e),n.appendChild(l)}function ze(e,t,n,o){var a,r;const l=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;s.length<d;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-number-item").forEach((x,h)=>{const g=x.querySelector("input");g&&(g.name=`${o}[${h}]`)})}function v(x="",h=-1){const g=document.createElement("div");g.className="multiple-number-item flex items-center gap-2";const p=document.createElement("input");if(p.type="number",p.className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",p.placeholder=e.placeholder||"0",e.min!==void 0&&(p.min=e.min.toString()),e.max!==void 0&&(p.max=e.max.toString()),e.step!==void 0&&(p.step=e.step.toString()),p.value=x.toString(),p.readOnly=l.config.readonly,!l.config.readonly&&t.instance){const C=()=>{const E=p.value?parseFloat(p.value):null;t.instance.triggerOnChange(p.name,E)};p.addEventListener("blur",C),p.addEventListener("input",C)}return g.appendChild(p),h===-1?c.appendChild(g):c.insertBefore(g,c.children[h]),m(),g}function f(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-number-item"),h=x.length;x.forEach(g=>{let p=g.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",p.innerHTML="\u2715",p.onclick=()=>{const E=Array.from(c.children).indexOf(g);c.children.length>d&&(s.splice(E,1),g.remove(),m(),y(),f())},g.appendChild(p));const C=h<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function y(){const x=n.querySelector(".add-number-btn");if(x&&x.remove(),!l.config.readonly&&s.length<u){const h=document.createElement("button");h.type="button",h.className="add-number-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",h.textContent="+",h.onclick=()=>{s.push(e.default||""),v(e.default||""),y(),f()},n.appendChild(h)}}s.forEach(x=>v(x)),y(),f();const b=document.createElement("p");b.className="text-xs text-gray-500 mt-1",b.textContent=S(e),n.appendChild(b)}function Be(e,t,n){var o,a,r,l,i;const s=[],{scopeRoot:d,skipValidation:u}=n,c=(v,f)=>{var y,b;if(!v)return;const x=`error-${v.getAttribute("name")||Math.random().toString(36).substring(7)}`;let h=document.getElementById(x);f?(v.classList.add("invalid"),v.title=f,h||(h=document.createElement("div"),h.id=x,h.className="error-message",h.style.cssText=`
40
40
  color: var(--fb-error-color);
41
41
  font-size: var(--fb-font-size-small);
42
42
  margin-top: 0.25rem;
43
- `,f.nextSibling?(g=f.parentNode)==null||g.insertBefore(v,f.nextSibling):(b=f.parentNode)==null||b.appendChild(v)),v.textContent=h,v.style.display="block"):(f.classList.remove("invalid"),f.title="",v&&v.remove())},m=(f,h,g)=>{let b=!1;!u&&e.min!==void 0&&e.min!==null&&h<e.min?(i.push(`${g}: < min=${e.min}`),c(f,`< min=${e.min}`),b=!0):!u&&e.max!==void 0&&e.max!==null&&h>e.max&&(i.push(`${g}: > max=${e.max}`),c(f,`> max=${e.max}`),b=!0),b||c(f,null)};if(e.multiple){const f=d.querySelectorAll(`[name^="${t}["]`),h=[];if(f.forEach((g,b)=>{var x,v,y;const p=(x=g==null?void 0:g.value)!=null?x:"";if(p===""){h.push(null),c(g,null);return}const C=parseFloat(p);if(!u&&!Number.isFinite(C)){i.push(`${t}[${b}]: not a number`),c(g,"not a number"),h.push(null);return}m(g,C,`${t}[${b}]`);const E=Number.isInteger((v=e.decimals)!=null?v:0)&&(y=e.decimals)!=null?y:0;h.push(Number(C.toFixed(E)))}),!u){const g=(o=e.minCount)!=null?o:1,b=(a=e.maxCount)!=null?a:1/0,x=h.filter(v=>v!==null);e.required&&x.length===0&&i.push(`${t}: required`),x.length<g&&i.push(`${t}: minimum ${g} items required`),x.length>b&&i.push(`${t}: maximum ${b} items allowed`)}return{value:h,errors:i}}else{const f=d.querySelector(`[name$="${t}"]`),h=(r=f==null?void 0:f.value)!=null?r:"";if(!u&&e.required&&h==="")return i.push(`${t}: required`),c(f,"required"),{value:null,errors:i};if(h==="")return c(f,null),{value:null,errors:i};const g=parseFloat(h);if(!u&&!Number.isFinite(g))return i.push(`${t}: not a number`),c(f,"not a number"),{value:null,errors:i};m(f,g,t);const b=Number.isInteger((l=e.decimals)!=null?l:0)&&(s=e.decimals)!=null?s:0;return{value:Number(g.toFixed(b)),errors:i}}}function Ie(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateNumberField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,s)=>{s<n.length&&(l.value=n[s]!=null?String(n[s]):"",l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateNumberField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.classList.remove("invalid"),r.title="")}}function De(e,t,n,o){const a=t.state,r=document.createElement("select");if(r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",r.name=o,r.disabled=a.config.readonly,(e.options||[]).forEach(s=>{const i=document.createElement("option");i.value=s.value,i.textContent=s.label,(t.prefill[e.key]||e.default)===s.value&&(i.selected=!0),r.appendChild(i)}),!a.config.readonly&&t.instance){const s=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("change",s)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=F(e),n.appendChild(l)}function Re(e,t,n,o){var a,r,l,s;const i=t.state,d=t.prefill[e.key]||[],u=Array.isArray(d)?[...d]:[],c=(a=e.minCount)!=null?a:1,m=(r=e.maxCount)!=null?r:1/0;for(;u.length<c;)u.push(e.default||((s=(l=e.options)==null?void 0:l[0])==null?void 0:s.value)||"");const f=document.createElement("div");f.className="space-y-2",n.appendChild(f);function h(){f.querySelectorAll(".multiple-select-item").forEach((y,p)=>{const C=y.querySelector("select");C&&(C.name=`${o}[${p}]`)})}function g(y="",p=-1){const C=document.createElement("div");C.className="multiple-select-item flex items-center gap-2";const E=document.createElement("select");if(E.className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",E.disabled=i.config.readonly,(e.options||[]).forEach(w=>{const $=document.createElement("option");$.value=w.value,$.textContent=w.label,y===w.value&&($.selected=!0),E.appendChild($)}),!i.config.readonly&&t.instance){const w=()=>{t.instance.triggerOnChange(E.name,E.value)};E.addEventListener("change",w)}return C.appendChild(E),p===-1?f.appendChild(C):f.insertBefore(C,f.children[p]),h(),C}function b(){if(i.config.readonly)return;const y=f.querySelectorAll(".multiple-select-item"),p=y.length;y.forEach(C=>{let E=C.querySelector(".remove-item-btn");E||(E=document.createElement("button"),E.type="button",E.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",E.innerHTML="\u2715",E.onclick=()=>{const $=Array.from(f.children).indexOf(C);f.children.length>c&&(u.splice($,1),C.remove(),h(),x(),b())},C.appendChild(E));const w=p<=c;E.disabled=w,E.style.opacity=w?"0.5":"1",E.style.pointerEvents=w?"none":"auto"})}function x(){const y=n.querySelector(".add-select-btn");if(y&&y.remove(),!i.config.readonly&&u.length<m){const p=document.createElement("button");p.type="button",p.className="add-select-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",p.textContent=`+ Add ${e.label||"Selection"}`,p.onclick=()=>{var C,E;const w=e.default||((E=(C=e.options)==null?void 0:C[0])==null?void 0:E.value)||"";u.push(w),g(w),x(),b()},n.appendChild(p)}}u.forEach(y=>g(y)),x(),b();const v=document.createElement("p");v.className="text-xs text-gray-500 mt-1",v.textContent=F(e),n.appendChild(v)}function Oe(e,t,n){var o;const a=[],{scopeRoot:r,skipValidation:l}=n,s=(d,u)=>{var c,m;if(!d)return;const f=`error-${d.getAttribute("name")||Math.random().toString(36).substring(7)}`;let h=document.getElementById(f);u?(d.classList.add("invalid"),d.title=u,h||(h=document.createElement("div"),h.id=f,h.className="error-message",h.style.cssText=`
43
+ `,v.nextSibling?(y=v.parentNode)==null||y.insertBefore(h,v.nextSibling):(b=v.parentNode)==null||b.appendChild(h)),h.textContent=f,h.style.display="block"):(v.classList.remove("invalid"),v.title="",h&&h.remove())},m=(v,f,y)=>{let b=!1;!u&&e.min!==void 0&&e.min!==null&&f<e.min?(s.push(`${y}: < min=${e.min}`),c(v,`< min=${e.min}`),b=!0):!u&&e.max!==void 0&&e.max!==null&&f>e.max&&(s.push(`${y}: > max=${e.max}`),c(v,`> max=${e.max}`),b=!0),b||c(v,null)};if(e.multiple){const v=d.querySelectorAll(`[name^="${t}["]`),f=[];if(v.forEach((y,b)=>{var x,h,g;const p=(x=y==null?void 0:y.value)!=null?x:"";if(p===""){f.push(null),c(y,null);return}const C=parseFloat(p);if(!u&&!Number.isFinite(C)){s.push(`${t}[${b}]: not a number`),c(y,"not a number"),f.push(null);return}m(y,C,`${t}[${b}]`);const E=Number.isInteger((h=e.decimals)!=null?h:0)&&(g=e.decimals)!=null?g:0;f.push(Number(C.toFixed(E)))}),!u){const y=(o=e.minCount)!=null?o:1,b=(a=e.maxCount)!=null?a:1/0,x=f.filter(h=>h!==null);e.required&&x.length===0&&s.push(`${t}: required`),x.length<y&&s.push(`${t}: minimum ${y} items required`),x.length>b&&s.push(`${t}: maximum ${b} items allowed`)}return{value:f,errors:s}}else{const v=d.querySelector(`[name$="${t}"]`),f=(r=v==null?void 0:v.value)!=null?r:"";if(!u&&e.required&&f==="")return s.push(`${t}: required`),c(v,"required"),{value:null,errors:s};if(f==="")return c(v,null),{value:null,errors:s};const y=parseFloat(f);if(!u&&!Number.isFinite(y))return s.push(`${t}: not a number`),c(v,"not a number"),{value:null,errors:s};m(v,y,t);const b=Number.isInteger((l=e.decimals)!=null?l:0)&&(i=e.decimals)!=null?i:0;return{value:Number(y.toFixed(b)),errors:s}}}function je(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateNumberField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,i)=>{i<n.length&&(l.value=n[i]!=null?String(n[i]):"",l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateNumberField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.classList.remove("invalid"),r.title="")}}function Ie(e,t,n,o){const a=t.state,r=document.createElement("select");if(r.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",r.name=o,r.disabled=a.config.readonly,(e.options||[]).forEach(i=>{const s=document.createElement("option");s.value=i.value,s.textContent=i.label,(t.prefill[e.key]||e.default)===i.value&&(s.selected=!0),r.appendChild(s)}),!a.config.readonly&&t.instance){const i=()=>{t.instance.triggerOnChange(o,r.value)};r.addEventListener("change",i)}n.appendChild(r);const l=document.createElement("p");l.className="text-xs text-gray-500 mt-1",l.textContent=S(e),n.appendChild(l)}function Re(e,t,n,o){var a,r,l,i;const s=t.state,d=t.prefill[e.key]||[],u=Array.isArray(d)?[...d]:[],c=(a=e.minCount)!=null?a:1,m=(r=e.maxCount)!=null?r:1/0;for(;u.length<c;)u.push(e.default||((i=(l=e.options)==null?void 0:l[0])==null?void 0:i.value)||"");const v=document.createElement("div");v.className="space-y-2",n.appendChild(v);function f(){v.querySelectorAll(".multiple-select-item").forEach((g,p)=>{const C=g.querySelector("select");C&&(C.name=`${o}[${p}]`)})}function y(g="",p=-1){const C=document.createElement("div");C.className="multiple-select-item flex items-center gap-2";const E=document.createElement("select");if(E.className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",E.disabled=s.config.readonly,(e.options||[]).forEach($=>{const w=document.createElement("option");w.value=$.value,w.textContent=$.label,g===$.value&&(w.selected=!0),E.appendChild(w)}),!s.config.readonly&&t.instance){const $=()=>{t.instance.triggerOnChange(E.name,E.value)};E.addEventListener("change",$)}return C.appendChild(E),p===-1?v.appendChild(C):v.insertBefore(C,v.children[p]),f(),C}function b(){if(s.config.readonly)return;const g=v.querySelectorAll(".multiple-select-item"),p=g.length;g.forEach(C=>{let E=C.querySelector(".remove-item-btn");E||(E=document.createElement("button"),E.type="button",E.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",E.innerHTML="\u2715",E.onclick=()=>{const w=Array.from(v.children).indexOf(C);v.children.length>c&&(u.splice(w,1),C.remove(),f(),x(),b())},C.appendChild(E));const $=p<=c;E.disabled=$,E.style.opacity=$?"0.5":"1",E.style.pointerEvents=$?"none":"auto"})}function x(){const g=n.querySelector(".add-select-btn");if(g&&g.remove(),!s.config.readonly&&u.length<m){const p=document.createElement("button");p.type="button",p.className="add-select-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm",p.textContent="+",p.onclick=()=>{var C,E;const $=e.default||((E=(C=e.options)==null?void 0:C[0])==null?void 0:E.value)||"";u.push($),y($),x(),b()},n.appendChild(p)}}u.forEach(g=>y(g)),x(),b();const h=document.createElement("p");h.className="text-xs text-gray-500 mt-1",h.textContent=S(e),n.appendChild(h)}function De(e,t,n){var o;const a=[],{scopeRoot:r,skipValidation:l}=n,i=(d,u)=>{var c,m;if(!d)return;const v=`error-${d.getAttribute("name")||Math.random().toString(36).substring(7)}`;let f=document.getElementById(v);u?(d.classList.add("invalid"),d.title=u,f||(f=document.createElement("div"),f.id=v,f.className="error-message",f.style.cssText=`
44
44
  color: var(--fb-error-color);
45
45
  font-size: var(--fb-font-size-small);
46
46
  margin-top: 0.25rem;
47
- `,d.nextSibling?(c=d.parentNode)==null||c.insertBefore(h,d.nextSibling):(m=d.parentNode)==null||m.appendChild(h)),h.textContent=u,h.style.display="block"):(d.classList.remove("invalid"),d.title="",h&&h.remove())},i=(d,u,c,m)=>{var f,h;if(l)return;const g=u.filter(m),b="minCount"in c&&(f=c.minCount)!=null?f:1,x="maxCount"in c&&(h=c.maxCount)!=null?h:1/0;c.required&&g.length===0&&a.push(`${d}: required`),g.length<b&&a.push(`${d}: minimum ${b} items required`),g.length>x&&a.push(`${d}: maximum ${x} items allowed`)};if("multiple"in e&&e.multiple){const d=r.querySelectorAll(`[name^="${t}["]`),u=[];return d.forEach(c=>{var m;const f=(m=c==null?void 0:c.value)!=null?m:"";u.push(f),s(c,null)}),i(t,u,e,c=>c!==""),{value:u,errors:a}}else{const d=r.querySelector(`[name$="${t}"]`),u=(o=d==null?void 0:d.value)!=null?o:"";return!l&&e.required&&u===""?(a.push(`${t}: required`),s(d,"required"),{value:null,errors:a}):(s(d,null),{value:u===""?null:u,errors:a})}}function Ue(e,t,n,o){const{scopeRoot:a}=o;if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateSelectField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,s)=>{s<n.length&&(l.value=n[s]!=null?String(n[s]):"",l.querySelectorAll("option").forEach(i=>{i.selected=i.value===String(n[s])}),l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateSelectField: Multiple field "${t}" has ${r.length} selects but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.querySelectorAll("option").forEach(l=>{l.selected=l.value===String(n)}),r.classList.remove("invalid"),r.title="")}}function S(e,t){const n=t.config.locale||"en";return(t.config.translations[n]||t.config.translations.en)[e]||e}function Pe(e,t,n){const o=document.createElement("img");o.className="w-full h-full object-contain",o.alt=n||"Preview";const a=new FileReader;a.onload=r=>{var l;o.src=((l=r.target)==null?void 0:l.result)||""},a.readAsDataURL(t),e.appendChild(o)}function Ve(e,t,n,o,a,r){const l=URL.createObjectURL(t);e.onclick=null;const s=e.cloneNode(!1);return e.parentNode&&e.parentNode.replaceChild(s,e),s.innerHTML=`
47
+ `,d.nextSibling?(c=d.parentNode)==null||c.insertBefore(f,d.nextSibling):(m=d.parentNode)==null||m.appendChild(f)),f.textContent=u,f.style.display="block"):(d.classList.remove("invalid"),d.title="",f&&f.remove())},s=(d,u,c,m)=>{var v,f;if(l)return;const y=u.filter(m),b="minCount"in c&&(v=c.minCount)!=null?v:1,x="maxCount"in c&&(f=c.maxCount)!=null?f:1/0;c.required&&y.length===0&&a.push(`${d}: required`),y.length<b&&a.push(`${d}: minimum ${b} items required`),y.length>x&&a.push(`${d}: maximum ${x} items allowed`)};if("multiple"in e&&e.multiple){const d=r.querySelectorAll(`[name^="${t}["]`),u=[];return d.forEach(c=>{var m;const v=(m=c==null?void 0:c.value)!=null?m:"";u.push(v),i(c,null)}),s(t,u,e,c=>c!==""),{value:u,errors:a}}else{const d=r.querySelector(`[name$="${t}"]`),u=(o=d==null?void 0:d.value)!=null?o:"";return!l&&e.required&&u===""?(a.push(`${t}: required`),i(d,"required"),{value:null,errors:a}):(i(d,null),{value:u===""?null:u,errors:a})}}function Oe(e,t,n,o){const{scopeRoot:a}=o;if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateSelectField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(`[name^="${t}["]`);r.forEach((l,i)=>{i<n.length&&(l.value=n[i]!=null?String(n[i]):"",l.querySelectorAll("option").forEach(s=>{s.selected=s.value===String(n[i])}),l.classList.remove("invalid"),l.title="")}),n.length!==r.length&&console.warn(`updateSelectField: Multiple field "${t}" has ${r.length} selects but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"]`);r&&(r.value=n!=null?String(n):"",r.querySelectorAll("option").forEach(l=>{l.selected=l.value===String(n)}),r.classList.remove("invalid"),r.title="")}}function L(e,t){const n=t.config.locale||"en";return(t.config.translations[n]||t.config.translations.en)[e]||e}function Ue(e,t,n){const o=document.createElement("img");o.className="w-full h-full object-contain",o.alt=n||"Preview";const a=new FileReader;a.onload=r=>{var l;o.src=((l=r.target)==null?void 0:l.result)||""},a.readAsDataURL(t),e.appendChild(o)}function Pe(e,t,n,o,a,r){const l=URL.createObjectURL(t);e.onclick=null;const i=e.cloneNode(!1);return e.parentNode&&e.parentNode.replaceChild(i,e),i.innerHTML=`
48
48
  <div class="relative group h-full">
49
49
  <video class="w-full h-full object-contain" controls preload="auto" muted>
50
50
  <source src="${l}" type="${n}">
@@ -52,38 +52,38 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
52
52
  </video>
53
53
  <div class="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1">
54
54
  <button class="bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn">
55
- ${S("removeElement",a)}
55
+ ${L("removeElement",a)}
56
56
  </button>
57
57
  <button class="bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn">
58
58
  Change
59
59
  </button>
60
60
  </div>
61
61
  </div>
62
- `,_e(s,o,a,r),s}function _e(e,t,n,o){const a=e.querySelector(".change-file-btn");a&&(a.onclick=l=>{l.stopPropagation(),o!=null&&o.picker&&o.picker.click()});const r=e.querySelector(".delete-file-btn");r&&(r.onclick=l=>{l.stopPropagation(),We(e,t,n,o)})}function We(e,t,n,o){var a;n.resourceIndex.delete(t);const r=(a=e.parentElement)==null?void 0:a.querySelector('input[type="hidden"]');r&&(r.value=""),o!=null&&o.fileUploadHandler&&(e.onclick=o.fileUploadHandler),o!=null&&o.dragHandler&&P(e,o.dragHandler),e.innerHTML=`
62
+ `,Ve(i,o,a,r),i}function Ve(e,t,n,o){const a=e.querySelector(".change-file-btn");a&&(a.onclick=l=>{l.stopPropagation(),o!=null&&o.picker&&o.picker.click()});const r=e.querySelector(".delete-file-btn");r&&(r.onclick=l=>{l.stopPropagation(),_e(e,t,n,o)})}function _e(e,t,n,o){var a;n.resourceIndex.delete(t);const r=(a=e.parentElement)==null?void 0:a.querySelector('input[type="hidden"]');r&&(r.value=""),o!=null&&o.fileUploadHandler&&(e.onclick=o.fileUploadHandler),o!=null&&o.dragHandler&&U(e,o.dragHandler),e.innerHTML=`
63
63
  <div class="flex flex-col items-center justify-center h-full text-gray-400">
64
64
  <svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
65
65
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
66
66
  </svg>
67
- <div class="text-sm text-center">${S("clickDragText",n)}</div>
67
+ <div class="text-sm text-center">${L("clickDragText",n)}</div>
68
68
  </div>
69
- `}function Je(e,t,n){const o=document.createElement("video");o.className="w-full h-full object-contain",o.controls=!0,o.preload="metadata",o.muted=!0;const a=document.createElement("source");a.src=t,a.type=n,o.appendChild(a),o.appendChild(document.createTextNode("Your browser does not support the video tag.")),e.appendChild(o)}function Ge(e,t,n){Ke(e,n,()=>{var o;n.resourceIndex.delete(t);const a=(o=e.parentElement)==null?void 0:o.querySelector('input[type="hidden"]');a&&(a.value=""),e.innerHTML=`
69
+ `}function We(e,t,n){const o=document.createElement("video");o.className="w-full h-full object-contain",o.controls=!0,o.preload="metadata",o.muted=!0;const a=document.createElement("source");a.src=t,a.type=n,o.appendChild(a),o.appendChild(document.createTextNode("Your browser does not support the video tag.")),e.appendChild(o)}function Je(e,t,n){Ze(e,n,()=>{var o;n.resourceIndex.delete(t);const a=(o=e.parentElement)==null?void 0:o.querySelector('input[type="hidden"]');a&&(a.value=""),e.innerHTML=`
70
70
  <div class="flex flex-col items-center justify-center h-full text-gray-400">
71
71
  <svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
72
72
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
73
73
  </svg>
74
- <div class="text-sm text-center">${S("clickDragText",n)}</div>
74
+ <div class="text-sm text-center">${L("clickDragText",n)}</div>
75
75
  </div>
76
- `})}async function Ye(e,t,n,o,a,r,l){!t.file||!(t.file instanceof File)||(t.type&&t.type.startsWith("image/")?Pe(e,t.file,n):t.type&&t.type.startsWith("video/")?e=Ve(e,t.file,t.type,o,r,l):e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400"><div class="text-2xl mb-2">\u{1F4C1}</div><div class="text-sm">${n}</div></div>`,!a&&!(t.type&&t.type.startsWith("video/"))&&Ge(e,o,r))}async function Xe(e,t,n,o,a){if(!a.config.getThumbnail){U(e,a);return}try{const r=await a.config.getThumbnail(t);if(r)if(H(e),o&&o.type&&o.type.startsWith("video/"))Je(e,r,o.type);else{const l=document.createElement("img");l.className="w-full h-full object-contain",l.alt=n||"Preview",l.src=r,e.appendChild(l)}else U(e,a)}catch(r){console.error("Failed to get thumbnail:",r),e.innerHTML=`
76
+ `})}async function Ge(e,t,n,o,a,r,l){!t.file||!(t.file instanceof File)||(t.type&&t.type.startsWith("image/")?Ue(e,t.file,n):t.type&&t.type.startsWith("video/")?e=Pe(e,t.file,t.type,o,r,l):e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400"><div class="text-2xl mb-2">\u{1F4C1}</div><div class="text-sm">${n}</div></div>`,!a&&!(t.type&&t.type.startsWith("video/"))&&Je(e,o,r))}async function Ye(e,t,n,o,a){if(!a.config.getThumbnail){O(e,a);return}try{const r=await a.config.getThumbnail(t);if(r)if(T(e),o&&o.type&&o.type.startsWith("video/"))We(e,r,o.type);else{const l=document.createElement("img");l.className="w-full h-full object-contain",l.alt=n||"Preview",l.src=r,e.appendChild(l)}else O(e,a)}catch(r){console.error("Failed to get thumbnail:",r),e.innerHTML=`
77
77
  <div class="flex flex-col items-center justify-center h-full text-gray-400">
78
78
  <svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
79
79
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
80
80
  </svg>
81
81
  <div class="text-sm text-center">${n||"Preview unavailable"}</div>
82
82
  </div>
83
- `}}async function Z(e,t,n,o={}){const{fileName:a="",isReadonly:r=!1,deps:l=null}=o;if(!r&&l&&(!l.picker||!l.fileUploadHandler||!l.dragHandler))throw new Error("renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}");H(e),r&&e.classList.add("cursor-pointer");const s=n.resourceIndex.get(t);s&&s.file&&s.file instanceof File?await Ye(e,s,a,t,r,n,l):await Xe(e,t,a,s,n)}async function O(e,t,n){var o,a;const r=t.resourceIndex.get(e),l=(r==null?void 0:r.name)||e.split("/").pop()||"file",s=l.toLowerCase().match(/\.psd$/),i=document.createElement("div");i.className=s?"space-y-2":"space-y-3";const d=document.createElement("div");s?d.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm":d.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity";const u=!s&&(((o=r==null?void 0:r.type)==null?void 0:o.startsWith("image/"))||l.toLowerCase().match(/\.(jpg|jpeg|png|gif|webp)$/)),c=((a=r==null?void 0:r.type)==null?void 0:a.startsWith("video/"))||l.toLowerCase().match(/\.(mp4|webm|avi|mov)$/);if(u)if(t.config.getThumbnail)try{const h=await t.config.getThumbnail(e);h?d.innerHTML=`<img src="${h}" alt="${l}" class="w-full h-auto">`:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`}catch(h){console.warn("getThumbnail failed for",e,h),d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`}else d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`;else if(c)if(t.config.getThumbnail)try{const h=await t.config.getThumbnail(e);h?d.innerHTML=`
83
+ `}}async function X(e,t,n,o={}){const{fileName:a="",isReadonly:r=!1,deps:l=null}=o;if(!r&&l&&(!l.picker||!l.fileUploadHandler||!l.dragHandler))throw new Error("renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}");T(e),r&&e.classList.add("cursor-pointer");const i=n.resourceIndex.get(t);i&&i.file&&i.file instanceof File?await Ge(e,i,a,t,r,n,l):await Ye(e,t,a,i,n)}async function D(e,t,n){var o,a;const r=t.resourceIndex.get(e),l=(r==null?void 0:r.name)||e.split("/").pop()||"file",i=l.toLowerCase().match(/\.psd$/),s=document.createElement("div");s.className=i?"space-y-2":"space-y-3";const d=document.createElement("div");i?d.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm":d.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity";const u=!i&&(((o=r==null?void 0:r.type)==null?void 0:o.startsWith("image/"))||l.toLowerCase().match(/\.(jpg|jpeg|png|gif|webp)$/)),c=((a=r==null?void 0:r.type)==null?void 0:a.startsWith("video/"))||l.toLowerCase().match(/\.(mp4|webm|avi|mov)$/);if(u)if(t.config.getThumbnail)try{const f=await t.config.getThumbnail(e);f?d.innerHTML=`<img src="${f}" alt="${l}" class="w-full h-auto">`:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`}catch(f){console.warn("getThumbnail failed for",e,f),d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`}else d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F5BC}\uFE0F</div><div class="text-sm">${l}</div></div></div>`;else if(c)if(t.config.getThumbnail)try{const f=await t.config.getThumbnail(e);f?d.innerHTML=`
84
84
  <div class="relative group">
85
85
  <video class="w-full h-auto" controls preload="auto" muted>
86
- <source src="${h}" type="${(r==null?void 0:r.type)||"video/mp4"}">
86
+ <source src="${f}" type="${(r==null?void 0:r.type)||"video/mp4"}">
87
87
  \u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0438\u0434\u0435\u043E.
88
88
  </video>
89
89
  <div class="absolute inset-0 bg-black bg-opacity-20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center pointer-events-none">
@@ -94,27 +94,27 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
94
94
  </div>
95
95
  </div>
96
96
  </div>
97
- `:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`}catch(h){console.warn("getThumbnail failed for video",e,h),d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`}else d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`;else{const h=s?"\u{1F3A8}":"\u{1F4C1}",g=s?"PSD File":"Document";s?d.innerHTML=`
97
+ `:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`}catch(f){console.warn("getThumbnail failed for video",e,f),d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`}else d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">\u{1F3A5}</div><div class="text-sm">${l}</div></div></div>`;else{const f=i?"\u{1F3A8}":"\u{1F4C1}",y=i?"PSD File":"Document";i?d.innerHTML=`
98
98
  <div class="flex items-center space-x-3">
99
- <div class="text-3xl text-gray-400">${h}</div>
99
+ <div class="text-3xl text-gray-400">${f}</div>
100
100
  <div class="flex-1 min-w-0">
101
101
  <div class="text-sm font-medium text-gray-900 truncate">${l}</div>
102
- <div class="text-xs text-gray-500">${g}</div>
102
+ <div class="text-xs text-gray-500">${y}</div>
103
103
  </div>
104
104
  </div>
105
- `:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">${h}</div><div class="text-sm">${l}</div><div class="text-xs text-gray-500 mt-1">${g}</div></div></div>`}const m=document.createElement("p");m.className=s?"hidden":"text-sm font-medium text-gray-900 text-center",m.textContent=l;const f=document.createElement("button");return f.className="w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",f.textContent=S("downloadButton",t),f.onclick=h=>{h.preventDefault(),h.stopPropagation(),t.config.downloadFile?t.config.downloadFile(e,l):Qe(e,l,t)},i.appendChild(d),i.appendChild(m),i.appendChild(f),i}function K(e,t,n,o){H(e);const a=!e.classList.contains("grid");if((!t||t.length===0)&&a){const s=document.createElement("div");s.className="grid grid-cols-4 gap-3 mb-3";for(let u=0;u<4;u++){const c=document.createElement("div");c.className="aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors";const m=document.createElementNS("http://www.w3.org/2000/svg","svg");m.setAttribute("class","w-12 h-12 text-gray-400"),m.setAttribute("fill","currentColor"),m.setAttribute("viewBox","0 0 24 24");const f=document.createElementNS("http://www.w3.org/2000/svg","path");f.setAttribute("d","M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"),m.appendChild(f),c.appendChild(m),c.onclick=()=>{let h=e.parentElement;for(;h&&!h.classList.contains("space-y-2");)h=h.parentElement;!h&&e.classList.contains("space-y-2")&&(h=e);const g=h==null?void 0:h.querySelector('input[type="file"]');g&&g.click()},s.appendChild(c)}const i=document.createElement("div");i.className="text-center text-xs text-gray-600";const d=document.createElement("span");d.className="underline cursor-pointer",d.textContent=S("uploadText",n),d.onclick=u=>{u.stopPropagation();let c=e.parentElement;for(;c&&!c.classList.contains("space-y-2");)c=c.parentElement;!c&&e.classList.contains("space-y-2")&&(c=e);const m=c==null?void 0:c.querySelector('input[type="file"]');m&&m.click()},i.appendChild(d),i.appendChild(document.createTextNode(` ${S("dragDropText",n)}`)),e.appendChild(s),e.appendChild(i);return}e.className="files-list grid grid-cols-4 gap-3 mt-2";const r=t?t.length:0,l=(Math.floor(r/4)+1)*4;for(let s=0;s<l;s++){const i=document.createElement("div");if(t&&s<t.length){const d=t[s],u=n.resourceIndex.get(d);if(i.className="resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300",i.dataset.resourceId=d,Ze(i,d,u,n).catch(c=>{console.error("Failed to render thumbnail:",c),i.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
105
+ `:d.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">${f}</div><div class="text-sm">${l}</div><div class="text-xs text-gray-500 mt-1">${y}</div></div></div>`}const m=document.createElement("p");m.className=i?"hidden":"text-sm font-medium text-gray-900 text-center",m.textContent=l;const v=document.createElement("button");return v.className="w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",v.textContent=L("downloadButton",t),v.onclick=f=>{f.preventDefault(),f.stopPropagation(),t.config.downloadFile?t.config.downloadFile(e,l):Ke(e,l,t)},s.appendChild(d),s.appendChild(m),s.appendChild(v),s}function Z(e,t,n,o){T(e);const a=!e.classList.contains("grid");if((!t||t.length===0)&&a){const i=document.createElement("div");i.className="grid grid-cols-4 gap-3 mb-3";for(let u=0;u<4;u++){const c=document.createElement("div");c.className="aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors";const m=document.createElementNS("http://www.w3.org/2000/svg","svg");m.setAttribute("class","w-12 h-12 text-gray-400"),m.setAttribute("fill","currentColor"),m.setAttribute("viewBox","0 0 24 24");const v=document.createElementNS("http://www.w3.org/2000/svg","path");v.setAttribute("d","M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"),m.appendChild(v),c.appendChild(m),c.onclick=()=>{let f=e.parentElement;for(;f&&!f.classList.contains("space-y-2");)f=f.parentElement;!f&&e.classList.contains("space-y-2")&&(f=e);const y=f==null?void 0:f.querySelector('input[type="file"]');y&&y.click()},i.appendChild(c)}const s=document.createElement("div");s.className="text-center text-xs text-gray-600";const d=document.createElement("span");d.className="underline cursor-pointer",d.textContent=L("uploadText",n),d.onclick=u=>{u.stopPropagation();let c=e.parentElement;for(;c&&!c.classList.contains("space-y-2");)c=c.parentElement;!c&&e.classList.contains("space-y-2")&&(c=e);const m=c==null?void 0:c.querySelector('input[type="file"]');m&&m.click()},s.appendChild(d),s.appendChild(document.createTextNode(` ${L("dragDropText",n)}`)),e.appendChild(i),e.appendChild(s);return}e.className="files-list grid grid-cols-4 gap-3 mt-2";const r=t?t.length:0,l=(Math.floor(r/4)+1)*4;for(let i=0;i<l;i++){const s=document.createElement("div");if(t&&i<t.length){const d=t[i],u=n.resourceIndex.get(d);if(s.className="resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300",s.dataset.resourceId=d,Xe(s,d,u,n).catch(c=>{console.error("Failed to render thumbnail:",c),s.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
106
106
  <div class="text-2xl mb-1">\u{1F4C1}</div>
107
107
  <div class="text-xs">Preview error</div>
108
- </div>`}),o){const c=document.createElement("div");c.className="absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center";const m=document.createElement("button");m.className="bg-red-600 text-white px-2 py-1 rounded text-xs",m.textContent=S("removeElement",n),m.onclick=f=>{f.stopPropagation(),o(d)},c.appendChild(m),i.appendChild(c)}}else i.className="aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors",i.innerHTML='<svg class="w-12 h-12 text-gray-400" fill="currentColor" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',i.onclick=()=>{let d=e.parentElement;for(;d&&!d.classList.contains("space-y-2");)d=d.parentElement;!d&&e.classList.contains("space-y-2")&&(d=e);const u=d==null?void 0:d.querySelector('input[type="file"]');u&&u.click()};e.appendChild(i)}}function Q(e,t="w-12 h-12"){e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
108
+ </div>`}),o){const c=document.createElement("div");c.className="absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center";const m=document.createElement("button");m.className="bg-red-600 text-white px-2 py-1 rounded text-xs",m.textContent=L("removeElement",n),m.onclick=v=>{v.stopPropagation(),o(d)},c.appendChild(m),s.appendChild(c)}}else s.className="aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors",s.innerHTML='<svg class="w-12 h-12 text-gray-400" fill="currentColor" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',s.onclick=()=>{let d=e.parentElement;for(;d&&!d.classList.contains("space-y-2");)d=d.parentElement;!d&&e.classList.contains("space-y-2")&&(d=e);const u=d==null?void 0:d.querySelector('input[type="file"]');u&&u.click()};e.appendChild(s)}}function K(e,t="w-12 h-12"){e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
109
109
  <svg class="${t} text-red-400" fill="currentColor" viewBox="0 0 24 24">
110
110
  <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>
111
111
  </svg>
112
112
  <div class="text-xs mt-1 text-red-600">Preview error</div>
113
- </div>`}async function Ze(e,t,n,o){var a,r;if(n&&(a=n.type)!=null&&a.startsWith("image/"))if(n.file&&n.file instanceof File){const l=document.createElement("img");l.className="w-full h-full object-contain",l.alt=n.name;const s=new FileReader;s.onload=i=>{var d;l.src=((d=i.target)==null?void 0:d.result)||""},s.readAsDataURL(n.file),e.appendChild(l)}else if(o.config.getThumbnail)try{const l=await o.config.getThumbnail(t);if(l){const s=document.createElement("img");s.className="w-full h-full object-contain",s.alt=n.name,s.src=l,e.appendChild(s)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
113
+ </div>`}async function Xe(e,t,n,o){var a,r;if(n&&(a=n.type)!=null&&a.startsWith("image/"))if(n.file&&n.file instanceof File){const l=document.createElement("img");l.className="w-full h-full object-contain",l.alt=n.name;const i=new FileReader;i.onload=s=>{var d;l.src=((d=s.target)==null?void 0:d.result)||""},i.readAsDataURL(n.file),e.appendChild(l)}else if(o.config.getThumbnail)try{const l=await o.config.getThumbnail(t);if(l){const i=document.createElement("img");i.className="w-full h-full object-contain",i.alt=n.name,i.src=l,e.appendChild(i)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
114
114
  <svg class="w-12 h-12" fill="currentColor" viewBox="0 0 24 24">
115
115
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
116
116
  </svg>
117
- </div>`}catch(l){const s=l instanceof Error?l:new Error(String(l));o.config.onThumbnailError&&o.config.onThumbnailError(s,t),Q(e)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
117
+ </div>`}catch(l){const i=l instanceof Error?l:new Error(String(l));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),K(e)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
118
118
  <svg class="w-12 h-12" fill="currentColor" viewBox="0 0 24 24">
119
119
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
120
120
  </svg>
@@ -149,7 +149,7 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
149
149
  <path d="M8 5v14l11-7z"/>
150
150
  </svg>
151
151
  <div class="text-xs mt-1">${(n==null?void 0:n.name)||"Video"}</div>
152
- </div>`}catch(l){const s=l instanceof Error?l:new Error(String(l));o.config.onThumbnailError&&o.config.onThumbnailError(s,t),Q(e,"w-8 h-8")}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
152
+ </div>`}catch(l){const i=l instanceof Error?l:new Error(String(l));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),K(e,"w-8 h-8")}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
153
153
  <svg class="w-8 h-8" fill="currentColor" viewBox="0 0 24 24">
154
154
  <path d="M8 5v14l11-7z"/>
155
155
  </svg>
@@ -157,14 +157,14 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
157
157
  </div>`;else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
158
158
  <div class="text-2xl mb-1">\u{1F4C1}</div>
159
159
  <div class="text-xs">${(n==null?void 0:n.name)||"File"}</div>
160
- </div>`}function U(e,t){e.innerHTML=`
160
+ </div>`}function O(e,t){e.innerHTML=`
161
161
  <div class="flex flex-col items-center justify-center h-full text-gray-400">
162
162
  <svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
163
163
  <path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/>
164
164
  </svg>
165
- <div class="text-sm text-center">${S("clickDragText",t)}</div>
165
+ <div class="text-sm text-center">${L("clickDragText",t)}</div>
166
166
  </div>
167
- `}async function ee(e,t,n,o,a=null,r){var l,s;let i;if(o.config.uploadFile)try{if(i=await o.config.uploadFile(e),typeof i!="string")throw new Error("Upload handler must return a string resource ID")}catch(u){const c=u instanceof Error?u:new Error(String(u));throw o.config.onUploadError&&o.config.onUploadError(c,e),new Error(`File upload failed: ${c.message}`)}else throw new Error("No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()");o.resourceIndex.set(i,{name:e.name,type:e.type,size:e.size,uploadedAt:new Date,file:e});let d=(l=t.parentElement)==null?void 0:l.querySelector('input[type="hidden"]');d||(d=document.createElement("input"),d.type="hidden",d.name=n,(s=t.parentElement)==null||s.appendChild(d)),d.value=i,Z(t,i,o,{fileName:e.name,isReadonly:!1,deps:a}).catch(console.error),r&&!o.config.readonly&&r.triggerOnChange(n,i)}function P(e,t){e.addEventListener("dragover",n=>{n.preventDefault(),e.classList.add("border-blue-500","bg-blue-50")}),e.addEventListener("dragleave",n=>{n.preventDefault(),e.classList.remove("border-blue-500","bg-blue-50")}),e.addEventListener("drop",n=>{var o;n.preventDefault(),e.classList.remove("border-blue-500","bg-blue-50"),(o=n.dataTransfer)!=null&&o.files&&t(n.dataTransfer.files)})}function Ke(e,t,n){const o=e.querySelector(".delete-overlay");o&&o.remove();const a=document.createElement("div");a.className="delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center";const r=document.createElement("button");r.className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors",r.textContent=S("removeElement",t),r.onclick=l=>{l.stopPropagation(),n()},a.appendChild(r),e.appendChild(a)}async function te(e,t){if(t.config.uploadFile)try{const n=await t.config.uploadFile(e);if(typeof n!="string")throw new Error("Upload handler must return a string resource ID");return n}catch(n){const o=n instanceof Error?n:new Error(String(n));throw t.config.onUploadError&&t.config.onUploadError(o,e),new Error(`File upload failed: ${o.message}`)}else throw new Error("No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()")}async function Qe(e,t,n){try{let o=null;if(n.config.getDownloadUrl?o=n.config.getDownloadUrl(e):n.config.getThumbnail&&(o=await n.config.getThumbnail(e)),o){const a=o.startsWith("http")?o:new URL(o,window.location.href).href,r=await fetch(a);if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);const l=await r.blob();et(l,t)}else throw new Error("No download URL available for resource")}catch(o){const a=o instanceof Error?o:new Error(String(o));throw n.config.onDownloadError&&n.config.onDownloadError(a,e,t),console.error(`File download failed for ${t}:`,a),a}}function et(e,t){try{const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.style.display="none",document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(()=>{URL.revokeObjectURL(n)},100)}catch(n){throw new Error(`Blob download failed: ${n.message}`)}}function ne(e,t){e.length>0&&e.forEach(n=>{var o;if(!t.resourceIndex.has(n)){const a=n.split("/").pop()||"file",r=(o=a.split(".").pop())==null?void 0:o.toLowerCase();let l="application/octet-stream";r&&(["jpg","jpeg","png","gif","webp"].includes(r)?l=`image/${r==="jpg"?"jpeg":r}`:["mp4","webm","mov","avi"].includes(r)&&(l=`video/${r==="mov"?"quicktime":r}`)),t.resourceIndex.set(n,{name:a,type:l,size:0,uploadedAt:new Date,file:void 0})}})}function tt(e,t,n,o,a,r){var l;if(!a.resourceIndex.has(e)){const i=e.split("/").pop()||"file",d=(l=i.split(".").pop())==null?void 0:l.toLowerCase();let u="application/octet-stream";d&&(["jpg","jpeg","png","gif","webp"].includes(d)?u=`image/${d==="jpg"?"jpeg":d}`:["mp4","webm","mov","avi"].includes(d)&&(u=`video/${d==="mov"?"quicktime":d}`)),a.resourceIndex.set(e,{name:i,type:u,size:0,uploadedAt:new Date,file:void 0})}Z(t,e,a,{fileName:e,isReadonly:!1,deps:r}).catch(console.error);const s=document.createElement("input");s.type="hidden",s.name=n,s.value=e,o.appendChild(s)}function re(e,t,n,o,a,r){P(e,async l=>{const s=Array.from(l);for(const i of s){const d=await te(i,n);n.resourceIndex.set(d,{name:i.name,type:i.type,size:i.size,uploadedAt:new Date,file:void 0}),t.push(d)}o(),r&&a&&!n.config.readonly&&r.triggerOnChange(a,t)})}function oe(e,t,n,o,a,r){e.onchange=async()=>{if(e.files)for(const l of Array.from(e.files)){const s=await te(l,n);n.resourceIndex.set(s,{name:l.name,type:l.type,size:l.size,uploadedAt:new Date,file:void 0}),t.push(s)}o(),e.value="",r&&a&&!n.config.readonly&&r.triggerOnChange(a,t)}}function nt(e,t,n,o){var a;const r=t.state;if(r.config.readonly){const l=t.prefill[e.key];if(l)O(l,r).then(s=>{n.appendChild(s)}).catch(s=>{console.error("Failed to render file preview:",s);const i=document.createElement("div");i.className="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500",i.innerHTML='<div class="text-center">Preview unavailable</div>',n.appendChild(i)});else{const s=document.createElement("div");s.className="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500",s.innerHTML=`<div class="text-center">${S("noFileSelected",r)}</div>`,n.appendChild(s)}}else{const l=document.createElement("div");l.className="space-y-2";const s=document.createElement("input");s.type="file",s.name=o,s.style.display="none",e.accept&&(s.accept=typeof e.accept=="string"?e.accept:((a=e.accept.extensions)==null?void 0:a.map(g=>`.${g}`).join(","))||"");const i=document.createElement("div");i.className="file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer";const d=t.prefill[e.key],u=()=>s.click(),c=g=>{if(g.length>0){const b={picker:s,fileUploadHandler:u,dragHandler:c};ee(g[0],i,o,r,b,t.instance)}};d?tt(d,i,o,l,r,{picker:s,fileUploadHandler:u,dragHandler:c}):U(i,r),i.onclick=u,P(i,c),s.onchange=()=>{if(s.files&&s.files.length>0){const g={picker:s,fileUploadHandler:u,dragHandler:c};ee(s.files[0],i,o,r,g,t.instance)}},l.appendChild(i),l.appendChild(s);const m=document.createElement("p");m.className="text-xs text-gray-600 mt-2 text-center",m.innerHTML=`<span class="underline cursor-pointer">${S("uploadText",r)}</span> ${S("dragDropTextSingle",r)}`;const f=m.querySelector("span");f&&(f.onclick=()=>s.click()),l.appendChild(m);const h=document.createElement("p");h.className="text-xs text-gray-500 mt-1 text-center",h.textContent=F(e),l.appendChild(h),n.appendChild(l)}}function rt(e,t,n,o){var a;const r=t.state;if(r.config.readonly){const l=document.createElement("div");l.className="space-y-4";const s=t.prefill[e.key]||[];s.length>0?s.forEach(i=>{O(i,r).then(d=>{l.appendChild(d)}).catch(d=>{console.error("Failed to render file preview:",d)})}):l.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${S("noFilesSelected",r)}</div></div>`,n.appendChild(l)}else{let l=function(){K(u,c,r,f=>{const h=c.indexOf(f);h>-1&&c.splice(h,1),l()})};const s=document.createElement("div");s.className="space-y-2";const i=document.createElement("input");i.type="file",i.name=o,i.multiple=!0,i.style.display="none",e.accept&&(i.accept=typeof e.accept=="string"?e.accept:((a=e.accept.extensions)==null?void 0:a.map(f=>`.${f}`).join(","))||"");const d=document.createElement("div");d.className="border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors";const u=document.createElement("div");u.className="files-list";const c=t.prefill[e.key]||[];ne(c,r),l(),re(d,c,r,l,o,t.instance),oe(i,c,r,l,o,t.instance),d.appendChild(u),s.appendChild(d),s.appendChild(i);const m=document.createElement("p");m.className="text-xs text-gray-500 mt-1 text-center",m.textContent=F(e),s.appendChild(m),n.appendChild(s)}}function ot(e,t,n,o){var a,r,l;const s=t.state,i=(a=e.minCount)!=null?a:0,d=(r=e.maxCount)!=null?r:1/0;if(s.config.readonly){const u=document.createElement("div");u.className="space-y-4";const c=t.prefill[e.key]||[];c.length>0?c.forEach(m=>{O(m,s).then(f=>{u.appendChild(f)}).catch(f=>{console.error("Failed to render file preview:",f)})}):u.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${S("noFilesSelected",s)}</div></div>`,n.appendChild(u)}else{const u=document.createElement("div");u.className="space-y-2";const c=document.createElement("input");c.type="file",c.name=o,c.multiple=!0,c.style.display="none",e.accept&&(c.accept=typeof e.accept=="string"?e.accept:((l=e.accept.extensions)==null?void 0:l.map(g=>`.${g}`).join(","))||"");const m=document.createElement("div");m.className="files-list space-y-2",u.appendChild(c),u.appendChild(m);const f=Array.isArray(t.prefill[e.key])?[...t.prefill[e.key]]:[];ne(f,s);const h=()=>{K(m,f,s,y=>{f.splice(f.indexOf(y),1),h()});const g=document.createElement("div");g.className="text-xs text-gray-500 mt-2 file-count-info";const b=`${f.length} file${f.length!==1?"s":""}`,x=i>0||d<1/0?` (${i}-${d} allowed)`:"";g.textContent=b+x;const v=u.querySelector(".file-count-info");v&&v.remove(),u.appendChild(g)};re(m,f,s,h,o,t.instance),oe(c,f,s,h,o,t.instance),h(),n.appendChild(u)}}function le(e,t,n){var o;const a=[],{scopeRoot:r,skipValidation:l,path:s}=n,i=e.type==="files"||"multiple"in e&&!!e.multiple,d=(u,c,m)=>{var f,h;if(l)return;const g="minCount"in m&&(f=m.minCount)!=null?f:0,b="maxCount"in m&&(h=m.maxCount)!=null?h:1/0;m.required&&c.length===0&&a.push(`${u}: required`),c.length<g&&a.push(`${u}: minimum ${g} files required`),c.length>b&&a.push(`${u}: maximum ${b} files allowed`)};if(i){const u=q(s,t),c=r.querySelector(`input[type="file"][name="${u}"]`),m=c==null?void 0:c.closest(".space-y-2"),f=(m==null?void 0:m.querySelector(".files-list"))||null,h=[];return f&&f.querySelectorAll(".resource-pill").forEach(g=>{const b=g.dataset.resourceId;b&&h.push(b)}),d(t,h,e),{value:h,errors:a}}else{const u=r.querySelector(`input[name$="${t}"][type="hidden"]`),c=(o=u==null?void 0:u.value)!=null?o:"";return!l&&e.required&&c===""?(a.push(`${t}: required`),{value:null,errors:a}):{value:c||null,errors:a}}}function ae(e,t,n,o){var a;const{scopeRoot:r,state:l}=o;if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateFileField: Expected array for multiple file field "${t}", got ${typeof n}`);return}n.forEach(s=>{var i;if(s&&typeof s=="string"&&!l.resourceIndex.has(s)){const d=s.split("/").pop()||"file",u=(i=d.split(".").pop())==null?void 0:i.toLowerCase();let c="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?c=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(c=`video/${u==="mov"?"quicktime":u}`)),l.resourceIndex.set(s,{name:d,type:c,size:0,uploadedAt:new Date,file:void 0})}}),console.info(`updateFileField: Multiple file field "${t}" updated. Preview update requires re-render.`)}else{const s=r.querySelector(`input[name="${t}"][type="hidden"]`);if(!s){console.warn(`updateFileField: Hidden input not found for file field "${t}"`);return}if(s.value=n!=null?String(n):"",n&&typeof n=="string"){if(!l.resourceIndex.has(n)){const i=n.split("/").pop()||"file",d=(a=i.split(".").pop())==null?void 0:a.toLowerCase();let u="application/octet-stream";d&&(["jpg","jpeg","png","gif","webp"].includes(d)?u=`image/${d==="jpg"?"jpeg":d}`:["mp4","webm","mov","avi"].includes(d)&&(u=`video/${d==="mov"?"quicktime":d}`)),l.resourceIndex.set(n,{name:i,type:u,size:0,uploadedAt:new Date,file:void 0})}console.info(`updateFileField: File field "${t}" updated. Preview update requires re-render.`)}}}function T(e){return e?e.toUpperCase():"#000000"}function V(e){return/^#[0-9A-F]{6}$/i.test(e)||/^#[0-9A-F]{3}$/i.test(e)}function ie(e){if(/^#[0-9A-F]{3}$/i.test(e)){const t=e[1],n=e[2],o=e[3];return`#${t}${t}${n}${n}${o}${o}`.toUpperCase()}return e.toUpperCase()}function se(e){const t=document.createElement("div");t.className="flex items-center gap-2";const n=T(e),o=document.createElement("div");o.style.cssText=`
167
+ `}async function Q(e,t,n,o,a=null,r){var l,i;let s;if(o.config.uploadFile)try{if(s=await o.config.uploadFile(e),typeof s!="string")throw new Error("Upload handler must return a string resource ID")}catch(u){const c=u instanceof Error?u:new Error(String(u));throw o.config.onUploadError&&o.config.onUploadError(c,e),new Error(`File upload failed: ${c.message}`)}else throw new Error("No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()");o.resourceIndex.set(s,{name:e.name,type:e.type,size:e.size,uploadedAt:new Date,file:e});let d=(l=t.parentElement)==null?void 0:l.querySelector('input[type="hidden"]');d||(d=document.createElement("input"),d.type="hidden",d.name=n,(i=t.parentElement)==null||i.appendChild(d)),d.value=s,X(t,s,o,{fileName:e.name,isReadonly:!1,deps:a}).catch(console.error),r&&!o.config.readonly&&r.triggerOnChange(n,s)}function U(e,t){e.addEventListener("dragover",n=>{n.preventDefault(),e.classList.add("border-blue-500","bg-blue-50")}),e.addEventListener("dragleave",n=>{n.preventDefault(),e.classList.remove("border-blue-500","bg-blue-50")}),e.addEventListener("drop",n=>{var o;n.preventDefault(),e.classList.remove("border-blue-500","bg-blue-50"),(o=n.dataTransfer)!=null&&o.files&&t(n.dataTransfer.files)})}function Ze(e,t,n){const o=e.querySelector(".delete-overlay");o&&o.remove();const a=document.createElement("div");a.className="delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center";const r=document.createElement("button");r.className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors",r.textContent=L("removeElement",t),r.onclick=l=>{l.stopPropagation(),n()},a.appendChild(r),e.appendChild(a)}async function ee(e,t){if(t.config.uploadFile)try{const n=await t.config.uploadFile(e);if(typeof n!="string")throw new Error("Upload handler must return a string resource ID");return n}catch(n){const o=n instanceof Error?n:new Error(String(n));throw t.config.onUploadError&&t.config.onUploadError(o,e),new Error(`File upload failed: ${o.message}`)}else throw new Error("No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()")}async function Ke(e,t,n){try{let o=null;if(n.config.getDownloadUrl?o=n.config.getDownloadUrl(e):n.config.getThumbnail&&(o=await n.config.getThumbnail(e)),o){const a=o.startsWith("http")?o:new URL(o,window.location.href).href,r=await fetch(a);if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);const l=await r.blob();Qe(l,t)}else throw new Error("No download URL available for resource")}catch(o){const a=o instanceof Error?o:new Error(String(o));throw n.config.onDownloadError&&n.config.onDownloadError(a,e,t),console.error(`File download failed for ${t}:`,a),a}}function Qe(e,t){try{const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.style.display="none",document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(()=>{URL.revokeObjectURL(n)},100)}catch(n){throw new Error(`Blob download failed: ${n.message}`)}}function te(e,t){e.length>0&&e.forEach(n=>{var o;if(!t.resourceIndex.has(n)){const a=n.split("/").pop()||"file",r=(o=a.split(".").pop())==null?void 0:o.toLowerCase();let l="application/octet-stream";r&&(["jpg","jpeg","png","gif","webp"].includes(r)?l=`image/${r==="jpg"?"jpeg":r}`:["mp4","webm","mov","avi"].includes(r)&&(l=`video/${r==="mov"?"quicktime":r}`)),t.resourceIndex.set(n,{name:a,type:l,size:0,uploadedAt:new Date,file:void 0})}})}function et(e,t,n,o,a,r){var l;if(!a.resourceIndex.has(e)){const s=e.split("/").pop()||"file",d=(l=s.split(".").pop())==null?void 0:l.toLowerCase();let u="application/octet-stream";d&&(["jpg","jpeg","png","gif","webp"].includes(d)?u=`image/${d==="jpg"?"jpeg":d}`:["mp4","webm","mov","avi"].includes(d)&&(u=`video/${d==="mov"?"quicktime":d}`)),a.resourceIndex.set(e,{name:s,type:u,size:0,uploadedAt:new Date,file:void 0})}X(t,e,a,{fileName:e,isReadonly:!1,deps:r}).catch(console.error);const i=document.createElement("input");i.type="hidden",i.name=n,i.value=e,o.appendChild(i)}function ne(e,t,n,o,a,r){U(e,async l=>{const i=Array.from(l);for(const s of i){const d=await ee(s,n);n.resourceIndex.set(d,{name:s.name,type:s.type,size:s.size,uploadedAt:new Date,file:void 0}),t.push(d)}o(),r&&a&&!n.config.readonly&&r.triggerOnChange(a,t)})}function re(e,t,n,o,a,r){e.onchange=async()=>{if(e.files)for(const l of Array.from(e.files)){const i=await ee(l,n);n.resourceIndex.set(i,{name:l.name,type:l.type,size:l.size,uploadedAt:new Date,file:void 0}),t.push(i)}o(),e.value="",r&&a&&!n.config.readonly&&r.triggerOnChange(a,t)}}function tt(e,t,n,o){var a;const r=t.state;if(r.config.readonly){const l=t.prefill[e.key];if(l)D(l,r).then(i=>{n.appendChild(i)}).catch(i=>{console.error("Failed to render file preview:",i);const s=document.createElement("div");s.className="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500",s.innerHTML='<div class="text-center">Preview unavailable</div>',n.appendChild(s)});else{const i=document.createElement("div");i.className="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500",i.innerHTML=`<div class="text-center">${L("noFileSelected",r)}</div>`,n.appendChild(i)}}else{const l=document.createElement("div");l.className="space-y-2";const i=document.createElement("input");i.type="file",i.name=o,i.style.display="none",e.accept&&(i.accept=typeof e.accept=="string"?e.accept:((a=e.accept.extensions)==null?void 0:a.map(y=>`.${y}`).join(","))||"");const s=document.createElement("div");s.className="file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer";const d=t.prefill[e.key],u=()=>i.click(),c=y=>{if(y.length>0){const b={picker:i,fileUploadHandler:u,dragHandler:c};Q(y[0],s,o,r,b,t.instance)}};d?et(d,s,o,l,r,{picker:i,fileUploadHandler:u,dragHandler:c}):O(s,r),s.onclick=u,U(s,c),i.onchange=()=>{if(i.files&&i.files.length>0){const y={picker:i,fileUploadHandler:u,dragHandler:c};Q(i.files[0],s,o,r,y,t.instance)}},l.appendChild(s),l.appendChild(i);const m=document.createElement("p");m.className="text-xs text-gray-600 mt-2 text-center",m.innerHTML=`<span class="underline cursor-pointer">${L("uploadText",r)}</span> ${L("dragDropTextSingle",r)}`;const v=m.querySelector("span");v&&(v.onclick=()=>i.click()),l.appendChild(m);const f=document.createElement("p");f.className="text-xs text-gray-500 mt-1 text-center",f.textContent=S(e),l.appendChild(f),n.appendChild(l)}}function nt(e,t,n,o){var a;const r=t.state;if(r.config.readonly){const l=document.createElement("div");l.className="space-y-4";const i=t.prefill[e.key]||[];i.length>0?i.forEach(s=>{D(s,r).then(d=>{l.appendChild(d)}).catch(d=>{console.error("Failed to render file preview:",d)})}):l.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${L("noFilesSelected",r)}</div></div>`,n.appendChild(l)}else{let l=function(){Z(u,c,r,v=>{const f=c.indexOf(v);f>-1&&c.splice(f,1),l()})};const i=document.createElement("div");i.className="space-y-2";const s=document.createElement("input");s.type="file",s.name=o,s.multiple=!0,s.style.display="none",e.accept&&(s.accept=typeof e.accept=="string"?e.accept:((a=e.accept.extensions)==null?void 0:a.map(v=>`.${v}`).join(","))||"");const d=document.createElement("div");d.className="border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors";const u=document.createElement("div");u.className="files-list";const c=t.prefill[e.key]||[];te(c,r),l(),ne(d,c,r,l,o,t.instance),re(s,c,r,l,o,t.instance),d.appendChild(u),i.appendChild(d),i.appendChild(s);const m=document.createElement("p");m.className="text-xs text-gray-500 mt-1 text-center",m.textContent=S(e),i.appendChild(m),n.appendChild(i)}}function rt(e,t,n,o){var a,r,l;const i=t.state,s=(a=e.minCount)!=null?a:0,d=(r=e.maxCount)!=null?r:1/0;if(i.config.readonly){const u=document.createElement("div");u.className="space-y-4";const c=t.prefill[e.key]||[];c.length>0?c.forEach(m=>{D(m,i).then(v=>{u.appendChild(v)}).catch(v=>{console.error("Failed to render file preview:",v)})}):u.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${L("noFilesSelected",i)}</div></div>`,n.appendChild(u)}else{const u=document.createElement("div");u.className="space-y-2";const c=document.createElement("input");c.type="file",c.name=o,c.multiple=!0,c.style.display="none",e.accept&&(c.accept=typeof e.accept=="string"?e.accept:((l=e.accept.extensions)==null?void 0:l.map(y=>`.${y}`).join(","))||"");const m=document.createElement("div");m.className="files-list space-y-2",u.appendChild(c),u.appendChild(m);const v=Array.isArray(t.prefill[e.key])?[...t.prefill[e.key]]:[];te(v,i);const f=()=>{Z(m,v,i,g=>{v.splice(v.indexOf(g),1),f()});const y=document.createElement("div");y.className="text-xs text-gray-500 mt-2 file-count-info";const b=`${v.length} file${v.length!==1?"s":""}`,x=s>0||d<1/0?` (${s}-${d} allowed)`:"";y.textContent=b+x;const h=u.querySelector(".file-count-info");h&&h.remove(),u.appendChild(y)};ne(m,v,i,f,o,t.instance),re(c,v,i,f,o,t.instance),f(),n.appendChild(u)}}function oe(e,t,n){var o;const a=[],{scopeRoot:r,skipValidation:l,path:i}=n,s=e.type==="files"||"multiple"in e&&!!e.multiple,d=(u,c,m)=>{var v,f;if(l)return;const y="minCount"in m&&(v=m.minCount)!=null?v:0,b="maxCount"in m&&(f=m.maxCount)!=null?f:1/0;m.required&&c.length===0&&a.push(`${u}: required`),c.length<y&&a.push(`${u}: minimum ${y} files required`),c.length>b&&a.push(`${u}: maximum ${b} files allowed`)};if(s){const u=q(i,t),c=r.querySelector(`input[type="file"][name="${u}"]`),m=c==null?void 0:c.closest(".space-y-2"),v=(m==null?void 0:m.querySelector(".files-list"))||null,f=[];return v&&v.querySelectorAll(".resource-pill").forEach(y=>{const b=y.dataset.resourceId;b&&f.push(b)}),d(t,f,e),{value:f,errors:a}}else{const u=r.querySelector(`input[name$="${t}"][type="hidden"]`),c=(o=u==null?void 0:u.value)!=null?o:"";return!l&&e.required&&c===""?(a.push(`${t}: required`),{value:null,errors:a}):{value:c||null,errors:a}}}function le(e,t,n,o){var a;const{scopeRoot:r,state:l}=o;if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateFileField: Expected array for multiple file field "${t}", got ${typeof n}`);return}n.forEach(i=>{var s;if(i&&typeof i=="string"&&!l.resourceIndex.has(i)){const d=i.split("/").pop()||"file",u=(s=d.split(".").pop())==null?void 0:s.toLowerCase();let c="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?c=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(c=`video/${u==="mov"?"quicktime":u}`)),l.resourceIndex.set(i,{name:d,type:c,size:0,uploadedAt:new Date,file:void 0})}}),console.info(`updateFileField: Multiple file field "${t}" updated. Preview update requires re-render.`)}else{const i=r.querySelector(`input[name="${t}"][type="hidden"]`);if(!i){console.warn(`updateFileField: Hidden input not found for file field "${t}"`);return}if(i.value=n!=null?String(n):"",n&&typeof n=="string"){if(!l.resourceIndex.has(n)){const s=n.split("/").pop()||"file",d=(a=s.split(".").pop())==null?void 0:a.toLowerCase();let u="application/octet-stream";d&&(["jpg","jpeg","png","gif","webp"].includes(d)?u=`image/${d==="jpg"?"jpeg":d}`:["mp4","webm","mov","avi"].includes(d)&&(u=`video/${d==="mov"?"quicktime":d}`)),l.resourceIndex.set(n,{name:s,type:u,size:0,uploadedAt:new Date,file:void 0})}console.info(`updateFileField: File field "${t}" updated. Preview update requires re-render.`)}}}function A(e){return e?e.toUpperCase():"#000000"}function P(e){return/^#[0-9A-F]{6}$/i.test(e)||/^#[0-9A-F]{3}$/i.test(e)}function ae(e){if(/^#[0-9A-F]{3}$/i.test(e)){const t=e[1],n=e[2],o=e[3];return`#${t}${t}${n}${n}${o}${o}`.toUpperCase()}return e.toUpperCase()}function ie(e){const t=document.createElement("div");t.className="flex items-center gap-2";const n=A(e),o=document.createElement("div");o.style.cssText=`
168
168
  width: 32px;
169
169
  height: 32px;
170
170
  border-radius: var(--fb-border-radius);
@@ -174,7 +174,7 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
174
174
  font-size: var(--fb-font-size);
175
175
  color: var(--fb-text-color);
176
176
  font-family: var(--fb-font-family-mono, monospace);
177
- `,a.textContent=n,t.appendChild(o),t.appendChild(a),t}function ce(e,t,n){const o=T(e),a=document.createElement("div");a.className="colour-picker-wrapper",a.style.cssText=`
177
+ `,a.textContent=n,t.appendChild(o),t.appendChild(a),t}function se(e,t,n){const o=A(e),a=document.createElement("div");a.className="colour-picker-wrapper",a.style.cssText=`
178
178
  display: flex;
179
179
  align-items: center;
180
180
  gap: 8px;
@@ -197,31 +197,31 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
197
197
  font-size: var(--fb-font-size);
198
198
  font-family: var(--fb-font-family-mono, monospace);
199
199
  transition: all var(--fb-transition-duration) ease-in-out;
200
- `;const s=document.createElement("input");return s.type="color",s.className="colour-picker-hidden",s.value=o.toLowerCase(),s.style.cssText=`
200
+ `;const i=document.createElement("input");return i.type="color",i.className="colour-picker-hidden",i.value=o.toLowerCase(),i.style.cssText=`
201
201
  position: absolute;
202
202
  opacity: 0;
203
203
  pointer-events: none;
204
- `,l.addEventListener("input",()=>{const i=l.value.trim();if(V(i)){const d=ie(i);r.style.backgroundColor=d,s.value=d.toLowerCase(),l.classList.remove("invalid"),n.instance&&n.instance.triggerOnChange(t,d)}else l.classList.add("invalid")}),l.addEventListener("blur",()=>{const i=l.value.trim();if(V(i)){const d=ie(i);l.value=d,r.style.backgroundColor=d,s.value=d.toLowerCase(),l.classList.remove("invalid")}}),s.addEventListener("change",()=>{const i=T(s.value);l.value=i,r.style.backgroundColor=i,n.instance&&n.instance.triggerOnChange(t,i)}),r.addEventListener("click",()=>{s.click()}),r.addEventListener("mouseenter",()=>{r.style.borderColor="var(--fb-border-hover-color)"}),r.addEventListener("mouseleave",()=>{r.style.borderColor="var(--fb-border-color)"}),l.addEventListener("focus",()=>{l.style.borderColor="var(--fb-border-focus-color)",l.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",l.style.outlineOffset="0"}),l.addEventListener("blur",()=>{l.style.borderColor="var(--fb-border-color)",l.style.outline="none"}),l.addEventListener("mouseenter",()=>{document.activeElement!==l&&(l.style.borderColor="var(--fb-border-hover-color)")}),l.addEventListener("mouseleave",()=>{document.activeElement!==l&&(l.style.borderColor="var(--fb-border-color)")}),a.appendChild(r),a.appendChild(l),a.appendChild(s),a}function lt(e,t,n,o){const a=t.state,r=t.prefill[e.key]||e.default||"#000000";if(a.config.readonly){const s=se(r);n.appendChild(s)}else{const s=ce(r,o,t);n.appendChild(s)}const l=document.createElement("p");l.className="mt-1",l.style.cssText=`
204
+ `,l.addEventListener("input",()=>{const s=l.value.trim();if(P(s)){const d=ae(s);r.style.backgroundColor=d,i.value=d.toLowerCase(),l.classList.remove("invalid"),n.instance&&n.instance.triggerOnChange(t,d)}else l.classList.add("invalid")}),l.addEventListener("blur",()=>{const s=l.value.trim();if(P(s)){const d=ae(s);l.value=d,r.style.backgroundColor=d,i.value=d.toLowerCase(),l.classList.remove("invalid")}}),i.addEventListener("change",()=>{const s=A(i.value);l.value=s,r.style.backgroundColor=s,n.instance&&n.instance.triggerOnChange(t,s)}),r.addEventListener("click",()=>{i.click()}),r.addEventListener("mouseenter",()=>{r.style.borderColor="var(--fb-border-hover-color)"}),r.addEventListener("mouseleave",()=>{r.style.borderColor="var(--fb-border-color)"}),l.addEventListener("focus",()=>{l.style.borderColor="var(--fb-border-focus-color)",l.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",l.style.outlineOffset="0"}),l.addEventListener("blur",()=>{l.style.borderColor="var(--fb-border-color)",l.style.outline="none"}),l.addEventListener("mouseenter",()=>{document.activeElement!==l&&(l.style.borderColor="var(--fb-border-hover-color)")}),l.addEventListener("mouseleave",()=>{document.activeElement!==l&&(l.style.borderColor="var(--fb-border-color)")}),a.appendChild(r),a.appendChild(l),a.appendChild(i),a}function ot(e,t,n,o){const a=t.state,r=t.prefill[e.key]||e.default||"#000000";if(a.config.readonly){const i=ie(r);n.appendChild(i)}else{const i=se(r,o,t);n.appendChild(i)}const l=document.createElement("p");l.className="mt-1",l.style.cssText=`
205
205
  font-size: var(--fb-font-size-small);
206
206
  color: var(--fb-text-secondary-color);
207
- `,l.textContent=F(e),n.appendChild(l)}function at(e,t,n,o){var a,r;const l=t.state,s=t.prefill[e.key]||[],i=Array.isArray(s)?[...s]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;i.length<d;)i.push(e.default||"#000000");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-colour-item").forEach((x,v)=>{const y=x.querySelector("input");y&&(y.name=`${o}[${v}]`)})}function f(x="#000000",v=-1){const y=document.createElement("div");if(y.className="multiple-colour-item flex items-center gap-2",l.config.readonly){const p=se(x);for(;p.firstChild;)y.appendChild(p.firstChild)}else{const p=`${o}[${c.children.length}]`,C=ce(x,p,t);C.style.flex="1",y.appendChild(C)}return v===-1?c.appendChild(y):c.insertBefore(y,c.children[v]),m(),y}function h(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-colour-item"),v=x.length;x.forEach(y=>{let p=y.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 rounded",p.style.cssText=`
207
+ `,l.textContent=S(e),n.appendChild(l)}function lt(e,t,n,o){var a,r;const l=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0;for(;s.length<d;)s.push(e.default||"#000000");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function m(){c.querySelectorAll(".multiple-colour-item").forEach((x,h)=>{const g=x.querySelector("input");g&&(g.name=`${o}[${h}]`)})}function v(x="#000000",h=-1){const g=document.createElement("div");if(g.className="multiple-colour-item flex items-center gap-2",l.config.readonly){const p=ie(x);for(;p.firstChild;)g.appendChild(p.firstChild)}else{const p=`${o}[${c.children.length}]`,C=se(x,p,t);C.style.flex="1",g.appendChild(C)}return h===-1?c.appendChild(g):c.insertBefore(g,c.children[h]),m(),g}function f(){if(l.config.readonly)return;const x=c.querySelectorAll(".multiple-colour-item"),h=x.length;x.forEach(g=>{let p=g.querySelector(".remove-item-btn");p||(p=document.createElement("button"),p.type="button",p.className="remove-item-btn px-2 py-1 rounded",p.style.cssText=`
208
208
  color: var(--fb-error-color);
209
209
  background-color: transparent;
210
210
  transition: background-color var(--fb-transition-duration);
211
- `,p.innerHTML="\u2715",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{const E=Array.from(c.children).indexOf(y);c.children.length>d&&(i.splice(E,1),y.remove(),m(),g(),h())},y.appendChild(p));const C=v<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function g(){const x=n.querySelector(".add-colour-btn");if(x&&x.remove(),!l.config.readonly&&i.length<u){const v=document.createElement("button");v.type="button",v.className="add-colour-btn mt-2 px-3 py-1 rounded",v.style.cssText=`
211
+ `,p.innerHTML="\u2715",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{const E=Array.from(c.children).indexOf(g);c.children.length>d&&(s.splice(E,1),g.remove(),m(),y(),f())},g.appendChild(p));const C=h<=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"})}function y(){const x=n.querySelector(".add-colour-btn");if(x&&x.remove(),!l.config.readonly&&s.length<u){const h=document.createElement("button");h.type="button",h.className="add-colour-btn mt-2 px-3 py-1 rounded",h.style.cssText=`
212
212
  color: var(--fb-primary-color);
213
213
  border: var(--fb-border-width) solid var(--fb-primary-color);
214
214
  background-color: transparent;
215
215
  font-size: var(--fb-font-size);
216
216
  transition: all var(--fb-transition-duration);
217
- `,v.textContent=`+ Add ${e.label||"Colour"}`,v.addEventListener("mouseenter",()=>{v.style.backgroundColor="var(--fb-background-hover-color)"}),v.addEventListener("mouseleave",()=>{v.style.backgroundColor="transparent"}),v.onclick=()=>{const y=e.default||"#000000";i.push(y),f(y),g(),h()},n.appendChild(v)}}i.forEach(x=>f(x)),g(),h();const b=document.createElement("p");b.className="mt-1",b.style.cssText=`
217
+ `,h.textContent="+",h.addEventListener("mouseenter",()=>{h.style.backgroundColor="var(--fb-background-hover-color)"}),h.addEventListener("mouseleave",()=>{h.style.backgroundColor="transparent"}),h.onclick=()=>{const g=e.default||"#000000";s.push(g),v(g),y(),f()},n.appendChild(h)}}s.forEach(x=>v(x)),y(),f();const b=document.createElement("p");b.className="mt-1",b.style.cssText=`
218
218
  font-size: var(--fb-font-size-small);
219
219
  color: var(--fb-text-secondary-color);
220
- `,b.textContent=F(e),n.appendChild(b)}function it(e,t,n){var o,a,r;const l=[],{scopeRoot:s,skipValidation:i}=n,d=(c,m)=>{var f,h;if(!c)return;const g=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let b=document.getElementById(g);m?(c.classList.add("invalid"),c.title=m,b||(b=document.createElement("div"),b.id=g,b.className="error-message",b.style.cssText=`
220
+ `,b.textContent=S(e),n.appendChild(b)}function at(e,t,n){var o,a,r;const l=[],{scopeRoot:i,skipValidation:s}=n,d=(c,m)=>{var v,f;if(!c)return;const y=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let b=document.getElementById(y);m?(c.classList.add("invalid"),c.title=m,b||(b=document.createElement("div"),b.id=y,b.className="error-message",b.style.cssText=`
221
221
  color: var(--fb-error-color);
222
222
  font-size: var(--fb-font-size-small);
223
223
  margin-top: 0.25rem;
224
- `,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(b,c.nextSibling):(h=c.parentNode)==null||h.appendChild(b)),b.textContent=m,b.style.display="block"):(c.classList.remove("invalid"),c.title="",b&&b.remove())},u=(c,m,f)=>{if(!m)return!i&&e.required?(l.push(`${f}: required`),d(c,"required"),""):(d(c,null),"");const h=T(m);return!i&&!V(h)?(l.push(`${f}: invalid hex colour format`),d(c,"invalid hex colour format"),m):(d(c,null),h)};if(e.multiple){const c=s.querySelectorAll(".colour-hex-input"),m=[];if(c.forEach((f,h)=>{var g;const b=(g=f==null?void 0:f.value)!=null?g:"",x=u(f,b,`${t}[${h}]`);m.push(x)}),!i){const f=(o=e.minCount)!=null?o:1,h=(a=e.maxCount)!=null?a:1/0,g=m.filter(b=>b!=="");e.required&&g.length===0&&l.push(`${t}: required`),g.length<f&&l.push(`${t}: minimum ${f} items required`),g.length>h&&l.push(`${t}: maximum ${h} items allowed`)}return{value:m,errors:l}}else{const c=s.querySelector(`[name="${t}"].colour-hex-input`),m=(r=c==null?void 0:c.value)!=null?r:"";return!i&&e.required&&m===""?(l.push(`${t}: required`),d(c,"required"),{value:"",errors:l}):{value:u(c,m,t),errors:l}}}function st(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateColourField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(".colour-hex-input");r.forEach((l,s)=>{if(s<n.length){const i=T(n[s]);l.value=i,l.classList.remove("invalid"),l.title="";const d=l.closest(".colour-picker-wrapper");if(d){const u=d.querySelector(".colour-swatch"),c=d.querySelector(".colour-picker-hidden");u&&(u.style.backgroundColor=i),c&&(c.value=i.toLowerCase())}}}),n.length!==r.length&&console.warn(`updateColourField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"].colour-hex-input`);if(r){const l=T(n);r.value=l,r.classList.remove("invalid"),r.title="";const s=r.closest(".colour-picker-wrapper");if(s){const i=s.querySelector(".colour-swatch"),d=s.querySelector(".colour-picker-hidden");i&&(i.style.backgroundColor=l),d&&(d.value=l.toLowerCase())}}}}function de(e,t,n){if(t<=0)throw new Error("Exponential scale requires min > 0");const o=Math.log(t),a=Math.log(n);return Math.exp(o+e*(a-o))}function _(e,t,n){if(t<=0)throw new Error("Exponential scale requires min > 0");const o=Math.log(t),a=Math.log(n);return(Math.log(e)-o)/(a-o)}function B(e,t){return Math.round(e/t)*t}function ue(e,t,n,o,a){var r;const l=document.createElement("div");l.className="slider-container space-y-2";const s=document.createElement("div");s.className="flex items-center gap-3";const i=document.createElement("input");i.type="range",i.name=t,i.className="slider-input flex-1",i.disabled=a;const d=n.scale||"linear",u=n.min,c=n.max,m=(r=n.step)!=null?r:1;if(d==="exponential"){if(u<=0)throw new Error(`Slider "${n.key}": exponential scale requires min > 0 (got ${u})`);i.min="0",i.max="1000",i.step="1";const x=_(e,u,c);i.value=(x*1e3).toString()}else i.min=u.toString(),i.max=c.toString(),i.step=m.toString(),i.value=e.toString();i.style.cssText=`
224
+ `,c.nextSibling?(v=c.parentNode)==null||v.insertBefore(b,c.nextSibling):(f=c.parentNode)==null||f.appendChild(b)),b.textContent=m,b.style.display="block"):(c.classList.remove("invalid"),c.title="",b&&b.remove())},u=(c,m,v)=>{if(!m)return!s&&e.required?(l.push(`${v}: required`),d(c,"required"),""):(d(c,null),"");const f=A(m);return!s&&!P(f)?(l.push(`${v}: invalid hex colour format`),d(c,"invalid hex colour format"),m):(d(c,null),f)};if(e.multiple){const c=i.querySelectorAll(".colour-hex-input"),m=[];if(c.forEach((v,f)=>{var y;const b=(y=v==null?void 0:v.value)!=null?y:"",x=u(v,b,`${t}[${f}]`);m.push(x)}),!s){const v=(o=e.minCount)!=null?o:1,f=(a=e.maxCount)!=null?a:1/0,y=m.filter(b=>b!=="");e.required&&y.length===0&&l.push(`${t}: required`),y.length<v&&l.push(`${t}: minimum ${v} items required`),y.length>f&&l.push(`${t}: maximum ${f} items allowed`)}return{value:m,errors:l}}else{const c=i.querySelector(`[name="${t}"].colour-hex-input`),m=(r=c==null?void 0:c.value)!=null?r:"";return!s&&e.required&&m===""?(l.push(`${t}: required`),d(c,"required"),{value:"",errors:l}):{value:u(c,m,t),errors:l}}}function it(e,t,n,o){const{scopeRoot:a}=o;if(e.multiple){if(!Array.isArray(n)){console.warn(`updateColourField: Expected array for multiple field "${t}", got ${typeof n}`);return}const r=a.querySelectorAll(".colour-hex-input");r.forEach((l,i)=>{if(i<n.length){const s=A(n[i]);l.value=s,l.classList.remove("invalid"),l.title="";const d=l.closest(".colour-picker-wrapper");if(d){const u=d.querySelector(".colour-swatch"),c=d.querySelector(".colour-picker-hidden");u&&(u.style.backgroundColor=s),c&&(c.value=s.toLowerCase())}}}),n.length!==r.length&&console.warn(`updateColourField: Multiple field "${t}" has ${r.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const r=a.querySelector(`[name="${t}"].colour-hex-input`);if(r){const l=A(n);r.value=l,r.classList.remove("invalid"),r.title="";const i=r.closest(".colour-picker-wrapper");if(i){const s=i.querySelector(".colour-swatch"),d=i.querySelector(".colour-picker-hidden");s&&(s.style.backgroundColor=l),d&&(d.value=l.toLowerCase())}}}}function ce(e,t,n){if(t<=0)throw new Error("Exponential scale requires min > 0");const o=Math.log(t),a=Math.log(n);return Math.exp(o+e*(a-o))}function V(e,t,n){if(t<=0)throw new Error("Exponential scale requires min > 0");const o=Math.log(t),a=Math.log(n);return(Math.log(e)-o)/(a-o)}function z(e,t){return Math.round(e/t)*t}function de(e,t,n,o,a){var r;const l=document.createElement("div");l.className="slider-container space-y-2";const i=document.createElement("div");i.className="flex items-center gap-3";const s=document.createElement("input");s.type="range",s.name=t,s.className="slider-input flex-1",s.disabled=a;const d=n.scale||"linear",u=n.min,c=n.max,m=(r=n.step)!=null?r:1;if(d==="exponential"){if(u<=0)throw new Error(`Slider "${n.key}": exponential scale requires min > 0 (got ${u})`);s.min="0",s.max="1000",s.step="1";const x=V(e,u,c);s.value=(x*1e3).toString()}else s.min=u.toString(),s.max=c.toString(),s.step=m.toString(),s.value=e.toString();s.style.cssText=`
225
225
  height: 6px;
226
226
  border-radius: 3px;
227
227
  background: linear-gradient(
@@ -235,61 +235,79 @@ var FormBuilder=(function(N){"use strict";function Ee(e,t){(e.minLength!==null||
235
235
  transition: background 0.1s ease-in-out;
236
236
  cursor: ${a?"not-allowed":"pointer"};
237
237
  opacity: ${a?"0.6":"1"};
238
- `;const f=document.createElement("span");f.className="slider-value",f.style.cssText=`
238
+ `;const v=document.createElement("span");v.className="slider-value",v.style.cssText=`
239
239
  min-width: 60px;
240
240
  text-align: right;
241
241
  font-size: var(--fb-font-size);
242
242
  color: var(--fb-text-color);
243
243
  font-family: var(--fb-font-family-mono, monospace);
244
244
  font-weight: 500;
245
- `,f.textContent=e.toFixed(m<1?2:0),s.appendChild(i),s.appendChild(f),l.appendChild(s);const h=document.createElement("div");h.className="flex justify-between",h.style.cssText=`
245
+ `,v.textContent=e.toFixed(m<1?2:0),i.appendChild(s),i.appendChild(v),l.appendChild(i);const f=document.createElement("div");f.className="flex justify-between",f.style.cssText=`
246
246
  font-size: var(--fb-font-size-small);
247
247
  color: var(--fb-text-secondary-color);
248
- `;const g=document.createElement("span");g.textContent=u.toString();const b=document.createElement("span");if(b.textContent=c.toString(),h.appendChild(g),h.appendChild(b),l.appendChild(h),!a){const x=()=>{let v;if(d==="exponential"){const p=parseFloat(i.value)/1e3;v=de(p,u,c),v=B(v,m),v=Math.max(u,Math.min(c,v))}else v=parseFloat(i.value),v=B(v,m);f.textContent=v.toFixed(m<1?2:0);const y=(v-u)/(c-u)*100;i.style.background=`linear-gradient(
248
+ `;const y=document.createElement("span");y.textContent=u.toString();const b=document.createElement("span");if(b.textContent=c.toString(),f.appendChild(y),f.appendChild(b),l.appendChild(f),!a){const x=()=>{let h;if(d==="exponential"){const p=parseFloat(s.value)/1e3;h=ce(p,u,c),h=z(h,m),h=Math.max(u,Math.min(c,h))}else h=parseFloat(s.value),h=z(h,m);v.textContent=h.toFixed(m<1?2:0);const g=(h-u)/(c-u)*100;s.style.background=`linear-gradient(
249
249
  to right,
250
250
  var(--fb-primary-color) 0%,
251
- var(--fb-primary-color) ${y}%,
252
- var(--fb-border-color) ${y}%,
251
+ var(--fb-primary-color) ${g}%,
252
+ var(--fb-border-color) ${g}%,
253
253
  var(--fb-border-color) 100%
254
- )`,o.instance&&o.instance.triggerOnChange(t,v)};i.addEventListener("input",x),i.addEventListener("change",x)}return l}function ct(e,t,n,o){var a;if(e.min===void 0||e.min===null)throw new Error(`Slider field "${e.key}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider field "${e.key}" requires "max" property`);if(e.min>=e.max)throw new Error(`Slider field "${e.key}": min (${e.min}) must be less than max (${e.max})`);const r=t.state,l=e.default!==void 0?e.default:(e.min+e.max)/2,s=(a=t.prefill[e.key])!=null?a:l,i=ue(s,o,e,t,r.config.readonly);n.appendChild(i);const d=document.createElement("p");d.className="mt-1",d.style.cssText=`
254
+ )`,o.instance&&o.instance.triggerOnChange(t,h)};s.addEventListener("input",x),s.addEventListener("change",x)}return l}function st(e,t,n,o){var a;if(e.min===void 0||e.min===null)throw new Error(`Slider field "${e.key}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider field "${e.key}" requires "max" property`);if(e.min>=e.max)throw new Error(`Slider field "${e.key}": min (${e.min}) must be less than max (${e.max})`);const r=t.state,l=e.default!==void 0?e.default:(e.min+e.max)/2,i=(a=t.prefill[e.key])!=null?a:l,s=de(i,o,e,t,r.config.readonly);n.appendChild(s);const d=document.createElement("p");d.className="mt-1",d.style.cssText=`
255
255
  font-size: var(--fb-font-size-small);
256
256
  color: var(--fb-text-secondary-color);
257
- `,d.textContent=F(e),n.appendChild(d)}function dt(e,t,n,o){var a,r;if(e.min===void 0||e.min===null)throw new Error(`Slider field "${e.key}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider field "${e.key}" requires "max" property`);if(e.min>=e.max)throw new Error(`Slider field "${e.key}": min (${e.min}) must be less than max (${e.max})`);const l=t.state,s=t.prefill[e.key]||[],i=Array.isArray(s)?[...s]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0,c=e.default!==void 0?e.default:(e.min+e.max)/2;for(;i.length<d;)i.push(c);const m=document.createElement("div");m.className="space-y-3",n.appendChild(m);function f(){m.querySelectorAll(".multiple-slider-item").forEach((v,y)=>{const p=v.querySelector("input[type=range]");p&&p.setAttribute("name",`${o}[${y}]`)})}function h(v=c,y=-1){const p=document.createElement("div");p.className="multiple-slider-item flex items-start gap-2";const C=`${o}[${m.children.length}]`,E=ue(v,C,e,t,l.config.readonly);return E.style.flex="1",p.appendChild(E),y===-1?m.appendChild(p):m.insertBefore(p,m.children[y]),f(),p}function g(){if(l.config.readonly)return;const v=m.querySelectorAll(".multiple-slider-item"),y=v.length;v.forEach(p=>{let C=p.querySelector(".remove-item-btn");C||(C=document.createElement("button"),C.type="button",C.className="remove-item-btn px-2 py-1 rounded",C.style.cssText=`
257
+ `,d.textContent=S(e),n.appendChild(d)}function ct(e,t,n,o){var a,r;if(e.min===void 0||e.min===null)throw new Error(`Slider field "${e.key}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider field "${e.key}" requires "max" property`);if(e.min>=e.max)throw new Error(`Slider field "${e.key}": min (${e.min}) must be less than max (${e.max})`);const l=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],d=(a=e.minCount)!=null?a:1,u=(r=e.maxCount)!=null?r:1/0,c=e.default!==void 0?e.default:(e.min+e.max)/2;for(;s.length<d;)s.push(c);const m=document.createElement("div");m.className="space-y-3",n.appendChild(m);function v(){m.querySelectorAll(".multiple-slider-item").forEach((h,g)=>{const p=h.querySelector("input[type=range]");p&&p.setAttribute("name",`${o}[${g}]`)})}function f(h=c,g=-1){const p=document.createElement("div");p.className="multiple-slider-item flex items-start gap-2";const C=`${o}[${m.children.length}]`,E=de(h,C,e,t,l.config.readonly);return E.style.flex="1",p.appendChild(E),g===-1?m.appendChild(p):m.insertBefore(p,m.children[g]),v(),p}function y(){if(l.config.readonly)return;const h=m.querySelectorAll(".multiple-slider-item"),g=h.length;h.forEach(p=>{let C=p.querySelector(".remove-item-btn");C||(C=document.createElement("button"),C.type="button",C.className="remove-item-btn px-2 py-1 rounded",C.style.cssText=`
258
258
  color: var(--fb-error-color);
259
259
  background-color: transparent;
260
260
  transition: background-color var(--fb-transition-duration);
261
261
  margin-top: 8px;
262
- `,C.innerHTML="\u2715",C.addEventListener("mouseenter",()=>{C.style.backgroundColor="var(--fb-background-hover-color)"}),C.addEventListener("mouseleave",()=>{C.style.backgroundColor="transparent"}),C.onclick=()=>{const w=Array.from(m.children).indexOf(p);m.children.length>d&&(i.splice(w,1),p.remove(),f(),b(),g())},p.appendChild(C));const E=y<=d;C.disabled=E,C.style.opacity=E?"0.5":"1",C.style.pointerEvents=E?"none":"auto"})}function b(){const v=n.querySelector(".add-slider-btn");if(v&&v.remove(),!l.config.readonly&&i.length<u){const y=document.createElement("button");y.type="button",y.className="add-slider-btn mt-2 px-3 py-1 rounded",y.style.cssText=`
262
+ `,C.innerHTML="\u2715",C.addEventListener("mouseenter",()=>{C.style.backgroundColor="var(--fb-background-hover-color)"}),C.addEventListener("mouseleave",()=>{C.style.backgroundColor="transparent"}),C.onclick=()=>{const $=Array.from(m.children).indexOf(p);m.children.length>d&&(s.splice($,1),p.remove(),v(),b(),y())},p.appendChild(C));const E=g<=d;C.disabled=E,C.style.opacity=E?"0.5":"1",C.style.pointerEvents=E?"none":"auto"})}function b(){const h=n.querySelector(".add-slider-btn");if(h&&h.remove(),!l.config.readonly&&s.length<u){const g=document.createElement("button");g.type="button",g.className="add-slider-btn mt-2 px-3 py-1 rounded",g.style.cssText=`
263
263
  color: var(--fb-primary-color);
264
264
  border: var(--fb-border-width) solid var(--fb-primary-color);
265
265
  background-color: transparent;
266
266
  font-size: var(--fb-font-size);
267
267
  transition: all var(--fb-transition-duration);
268
- `,y.textContent=`+ Add ${e.label||"Slider"}`,y.addEventListener("mouseenter",()=>{y.style.backgroundColor="var(--fb-background-hover-color)"}),y.addEventListener("mouseleave",()=>{y.style.backgroundColor="transparent"}),y.onclick=()=>{i.push(c),h(c),b(),g()},n.appendChild(y)}}i.forEach(v=>h(v)),b(),g();const x=document.createElement("p");x.className="mt-1",x.style.cssText=`
268
+ `,g.textContent="+",g.addEventListener("mouseenter",()=>{g.style.backgroundColor="var(--fb-background-hover-color)"}),g.addEventListener("mouseleave",()=>{g.style.backgroundColor="transparent"}),g.onclick=()=>{s.push(c),f(c),b(),y()},n.appendChild(g)}}s.forEach(h=>f(h)),b(),y();const x=document.createElement("p");x.className="mt-1",x.style.cssText=`
269
269
  font-size: var(--fb-font-size-small);
270
270
  color: var(--fb-text-secondary-color);
271
- `,x.textContent=F(e),n.appendChild(x)}function ut(e,t,n){var o,a,r;const l=[],{scopeRoot:s,skipValidation:i}=n;if(e.min===void 0||e.min===null)throw new Error(`Slider validation: field "${t}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider validation: field "${t}" requires "max" property`);const d=e.min,u=e.max,c=(o=e.step)!=null?o:1,m=e.scale||"linear",f=(g,b)=>{var x,v;if(!g)return;const y=`error-${g.getAttribute("name")||Math.random().toString(36).substring(7)}`;let p=document.getElementById(y);if(b){if(g.classList.add("invalid"),g.title=b,!p){p=document.createElement("div"),p.id=y,p.className="error-message",p.style.cssText=`
271
+ `,x.textContent=S(e),n.appendChild(x)}function dt(e,t,n){var o,a,r;const l=[],{scopeRoot:i,skipValidation:s}=n;if(e.min===void 0||e.min===null)throw new Error(`Slider validation: field "${t}" requires "min" property`);if(e.max===void 0||e.max===null)throw new Error(`Slider validation: field "${t}" requires "max" property`);const d=e.min,u=e.max,c=(o=e.step)!=null?o:1,m=e.scale||"linear",v=(y,b)=>{var x,h;if(!y)return;const g=`error-${y.getAttribute("name")||Math.random().toString(36).substring(7)}`;let p=document.getElementById(g);if(b){if(y.classList.add("invalid"),y.title=b,!p){p=document.createElement("div"),p.id=g,p.className="error-message",p.style.cssText=`
272
272
  color: var(--fb-error-color);
273
273
  font-size: var(--fb-font-size-small);
274
274
  margin-top: 0.25rem;
275
- `;const C=g.closest(".slider-container");C&&C.nextSibling?(x=C.parentNode)==null||x.insertBefore(p,C.nextSibling):C&&((v=C.parentNode)==null||v.appendChild(p))}p.textContent=b,p.style.display="block"}else g.classList.remove("invalid"),g.title="",p&&p.remove()},h=(g,b)=>{const x=g.value;if(!x)return!i&&e.required?(l.push(`${b}: required`),f(g,"required"),null):(f(g,null),null);let v;if(m==="exponential"){const y=parseFloat(x)/1e3;v=de(y,d,u),v=B(v,c)}else v=parseFloat(x),v=B(v,c);if(!i){if(v<d)return l.push(`${b}: value ${v} < min ${d}`),f(g,`value must be >= ${d}`),v;if(v>u)return l.push(`${b}: value ${v} > max ${u}`),f(g,`value must be <= ${u}`),v}return f(g,null),v};if(e.multiple){const g=s.querySelectorAll(`input[type="range"][name^="${t}["]`),b=[];if(g.forEach((x,v)=>{const y=h(x,`${t}[${v}]`);b.push(y)}),!i){const x=(a=e.minCount)!=null?a:1,v=(r=e.maxCount)!=null?r:1/0,y=b.filter(p=>p!==null);e.required&&y.length===0&&l.push(`${t}: required`),y.length<x&&l.push(`${t}: minimum ${x} items required`),y.length>v&&l.push(`${t}: maximum ${v} items allowed`)}return{value:b,errors:l}}else{const g=s.querySelector(`input[type="range"][name="${t}"]`);return g?{value:h(g,t),errors:l}:(!i&&e.required&&l.push(`${t}: required`),{value:null,errors:l})}}function pt(e,t,n,o){var a;const{scopeRoot:r}=o,l=e.min,s=e.max,i=(a=e.step)!=null?a:1,d=e.scale||"linear";if(e.multiple){if(!Array.isArray(n)){console.warn(`updateSliderField: Expected array for multiple field "${t}", got ${typeof n}`);return}const u=r.querySelectorAll(`input[type="range"][name^="${t}["]`);u.forEach((c,m)=>{if(m<n.length&&n[m]!==null){const f=Number(n[m]);if(d==="exponential"){const g=_(f,l,s);c.value=(g*1e3).toString()}else c.value=f.toString();const h=c.closest(".slider-container");if(h){const g=h.querySelector(".slider-value");g&&(g.textContent=f.toFixed(i<1?2:0));const b=(f-l)/(s-l)*100;c.style.background=`linear-gradient(
275
+ `;const C=y.closest(".slider-container");C&&C.nextSibling?(x=C.parentNode)==null||x.insertBefore(p,C.nextSibling):C&&((h=C.parentNode)==null||h.appendChild(p))}p.textContent=b,p.style.display="block"}else y.classList.remove("invalid"),y.title="",p&&p.remove()},f=(y,b)=>{const x=y.value;if(!x)return!s&&e.required?(l.push(`${b}: required`),v(y,"required"),null):(v(y,null),null);let h;if(m==="exponential"){const g=parseFloat(x)/1e3;h=ce(g,d,u),h=z(h,c)}else h=parseFloat(x),h=z(h,c);if(!s){if(h<d)return l.push(`${b}: value ${h} < min ${d}`),v(y,`value must be >= ${d}`),h;if(h>u)return l.push(`${b}: value ${h} > max ${u}`),v(y,`value must be <= ${u}`),h}return v(y,null),h};if(e.multiple){const y=i.querySelectorAll(`input[type="range"][name^="${t}["]`),b=[];if(y.forEach((x,h)=>{const g=f(x,`${t}[${h}]`);b.push(g)}),!s){const x=(a=e.minCount)!=null?a:1,h=(r=e.maxCount)!=null?r:1/0,g=b.filter(p=>p!==null);e.required&&g.length===0&&l.push(`${t}: required`),g.length<x&&l.push(`${t}: minimum ${x} items required`),g.length>h&&l.push(`${t}: maximum ${h} items allowed`)}return{value:b,errors:l}}else{const y=i.querySelector(`input[type="range"][name="${t}"]`);return y?{value:f(y,t),errors:l}:(!s&&e.required&&l.push(`${t}: required`),{value:null,errors:l})}}function ut(e,t,n,o){var a;const{scopeRoot:r}=o,l=e.min,i=e.max,s=(a=e.step)!=null?a:1,d=e.scale||"linear";if(e.multiple){if(!Array.isArray(n)){console.warn(`updateSliderField: Expected array for multiple field "${t}", got ${typeof n}`);return}const u=r.querySelectorAll(`input[type="range"][name^="${t}["]`);u.forEach((c,m)=>{if(m<n.length&&n[m]!==null){const v=Number(n[m]);if(d==="exponential"){const y=V(v,l,i);c.value=(y*1e3).toString()}else c.value=v.toString();const f=c.closest(".slider-container");if(f){const y=f.querySelector(".slider-value");y&&(y.textContent=v.toFixed(s<1?2:0));const b=(v-l)/(i-l)*100;c.style.background=`linear-gradient(
276
276
  to right,
277
277
  var(--fb-primary-color) 0%,
278
278
  var(--fb-primary-color) ${b}%,
279
279
  var(--fb-border-color) ${b}%,
280
280
  var(--fb-border-color) 100%
281
- )`}c.classList.remove("invalid"),c.title=""}}),n.length!==u.length&&console.warn(`updateSliderField: Multiple field "${t}" has ${u.length} sliders but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const u=r.querySelector(`input[type="range"][name="${t}"]`);if(u&&n!==null&&n!==void 0){const c=Number(n);if(d==="exponential"){const f=_(c,l,s);u.value=(f*1e3).toString()}else u.value=c.toString();const m=u.closest(".slider-container");if(m){const f=m.querySelector(".slider-value");f&&(f.textContent=c.toFixed(i<1?2:0));const h=(c-l)/(s-l)*100;u.style.background=`linear-gradient(
281
+ )`}c.classList.remove("invalid"),c.title=""}}),n.length!==u.length&&console.warn(`updateSliderField: Multiple field "${t}" has ${u.length} sliders but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const u=r.querySelector(`input[type="range"][name="${t}"]`);if(u&&n!==null&&n!==void 0){const c=Number(n);if(d==="exponential"){const v=V(c,l,i);u.value=(v*1e3).toString()}else u.value=c.toString();const m=u.closest(".slider-container");if(m){const v=m.querySelector(".slider-value");v&&(v.textContent=c.toFixed(s<1?2:0));const f=(c-l)/(i-l)*100;u.style.background=`linear-gradient(
282
282
  to right,
283
283
  var(--fb-primary-color) 0%,
284
- var(--fb-primary-color) ${h}%,
285
- var(--fb-border-color) ${h}%,
284
+ var(--fb-primary-color) ${f}%,
285
+ var(--fb-border-color) ${f}%,
286
286
  var(--fb-border-color) 100%
287
- )`}u.classList.remove("invalid"),u.title=""}}}let W=null;function mt(e){W=e}function j(e,t){if(!W)throw new Error("renderElement not initialized. Import from components/index.ts");return W(e,t)}function pe(e,t){if(!e.prefillHints||e.prefillHints.length===0)return null;const n=document.createElement("div");return n.className="fb-prefill-hints flex flex-wrap gap-2 mb-4",e.prefillHints.forEach((o,a)=>{const r=document.createElement("button");r.type="button",r.className="fb-prefill-hint",r.textContent=o.label,r.setAttribute("data-hint-values",JSON.stringify(o.values)),r.setAttribute("data-container-key",t),r.setAttribute("data-hint-index",String(a)),n.appendChild(r)}),n}function me(e,t,n,o){var a,r;const l=document.createElement("div");l.className="border border-gray-200 rounded-lg p-4 bg-gray-50",l.setAttribute("data-container",o);const s=document.createElement("div");s.className="flex justify-between items-center mb-4";const i=document.createElement("div");i.className="flex-1";const d=document.createElement("div"),u=e.columns||1;if(u===1?d.className="space-y-4":d.className=`grid grid-cols-${u} gap-4`,l.appendChild(s),s.appendChild(i),!t.state.config.readonly){const m=pe(e,o);m&&l.appendChild(m)}const c={path:q(t.path,e.key),prefill:((a=t.prefill)==null?void 0:a[e.key])||{},formData:(r=t.formData)!=null?r:t.prefill,state:t.state};e.elements.forEach(m=>{m.hidden||d.appendChild(j(m,c))}),l.appendChild(d),i.innerHTML=`<span>${e.label||e.key}</span>`,n.appendChild(l)}function fe(e,t,n,o){var a,r,l,s;const i=t.state,d=document.createElement("div");d.className="border border-gray-200 rounded-lg p-4 bg-gray-50";const u=document.createElement("div");u.className="flex justify-between items-center mb-4";const c=document.createElement("div");c.className="flex-1";const m=document.createElement("div");m.className="flex gap-2";const f=document.createElement("div");if(f.className="space-y-4",d.appendChild(u),u.appendChild(c),i.config.readonly||u.appendChild(m),!t.state.config.readonly){const p=pe(e,e.key);p&&d.appendChild(p)}const h=(a=e.minCount)!=null?a:0,g=(r=e.maxCount)!=null?r:1/0,b=Array.isArray((l=t.prefill)==null?void 0:l[e.key])?t.prefill[e.key]:null,x=()=>f.querySelectorAll(":scope > .containerItem").length,v=()=>{const p=document.createElement("button");return p.type="button",p.className="px-3 py-1.5 bg-blue-600 text-white text-sm rounded-lg hover:bg-blue-700 transition-colors",p.textContent=S("addElement",i),p.onclick=()=>{var C;if(x()<g){const E=x(),w={state:t.state,path:q(t.path,`${e.key}[${E}]`),prefill:{},formData:(C=t.formData)!=null?C:t.prefill},$=document.createElement("div");$.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",$.setAttribute("data-container-item",`${e.key}[${E}]`);const L=document.createElement("div"),A=e.columns||1;if(A===1?L.className="space-y-4":L.className=`grid grid-cols-${A} gap-4`,e.elements.forEach(k=>{k.hidden||L.appendChild(j(k,w))}),$.appendChild(L),!i.config.readonly){const k=document.createElement("button");k.type="button",k.className="absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors",k.textContent="\xD7",k.onclick=()=>{$.remove(),y()},$.style.position="relative",$.appendChild(k)}f.appendChild($),y()}},p},y=()=>{const p=x(),C=m.querySelector("button");C&&(C.disabled=p>=g,C.style.opacity=p>=g?"0.5":"1"),c.innerHTML=`<span>${e.label||e.key}</span> <span class="text-sm text-gray-500">(${p}/${g===1/0?"\u221E":g})</span>`};if(i.config.readonly||m.appendChild(v()),b&&Array.isArray(b)&&b.forEach((p,C)=>{var E;const w={state:t.state,path:q(t.path,`${e.key}[${C}]`),prefill:p||{},formData:(E=t.formData)!=null?E:t.prefill},$=document.createElement("div");$.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",$.setAttribute("data-container-item",`${e.key}[${C}]`);const L=document.createElement("div"),A=e.columns||1;if(A===1?L.className="space-y-4":L.className=`grid grid-cols-${A} gap-4`,e.elements.forEach(k=>{k.hidden||L.appendChild(j(k,w))}),$.appendChild(L),!i.config.readonly){const k=document.createElement("button");k.type="button",k.className="absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors",k.textContent="\xD7",k.onclick=()=>{$.remove(),y()},$.style.position="relative",$.appendChild(k)}f.appendChild($)}),!i.config.readonly)for(;x()<h;){const p=x(),C={state:t.state,path:q(t.path,`${e.key}[${p}]`),prefill:{},formData:(s=t.formData)!=null?s:t.prefill},E=document.createElement("div");E.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",E.setAttribute("data-container-item",`${e.key}[${p}]`);const w=document.createElement("div"),$=e.columns||1;$===1?w.className="space-y-4":w.className=`grid grid-cols-${$} gap-4`,e.elements.forEach(A=>{A.hidden||w.appendChild(j(A,C))}),E.appendChild(w);const L=document.createElement("button");L.type="button",L.className="absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors",L.textContent="\xD7",L.onclick=()=>{x()>h&&(E.remove(),y())},E.style.position="relative",E.appendChild(L),f.appendChild(E)}d.appendChild(f),y(),n.appendChild(d)}let J=null;function ft(e){J=e}function he(e,t,n){if(!J)throw new Error("validateElement not initialized. Should be set from FormBuilderInstance");return J(e,t,n)}function ve(e,t,n){const o=[],{scopeRoot:a,skipValidation:r,path:l}=n;if(!("elements"in e))return{value:null,errors:o};const s=(i,d,u)=>{var c,m;if(r)return;const f="minCount"in u&&(c=u.minCount)!=null?c:0,h="maxCount"in u&&(m=u.maxCount)!=null?m:1/0;u.required&&d.length===0&&o.push(`${i}: required`),d.length<f&&o.push(`${i}: minimum ${f} items required`),d.length>h&&o.push(`${i}: maximum ${h} items allowed`)};if("multiple"in e&&e.multiple){const i=[],d=a.querySelectorAll("[data-container-item]"),u=Array.from(d).filter(c=>{const m=c.getAttribute("data-container-item");return m==null?void 0:m.startsWith(`${t}[`)}).length;for(let c=0;c<u;c++){const m={},f=a.querySelector(`[data-container-item="${t}[${c}]"]`)||a;e.elements.forEach(h=>{if(h.hidden||h.type==="hidden")m[h.key]=h.default!==void 0?h.default:null;else{const g=`${t}[${c}].${h.key}`;m[h.key]=he({...h,key:g},{path:l},f)}}),i.push(m)}return s(t,i,e),{value:i,errors:o}}else{const i={},d=a.querySelector(`[data-container="${t}"]`)||a;return e.elements.forEach(u=>{if(u.hidden||u.type==="hidden")i[u.key]=u.default!==void 0?u.default:null;else{const c=`${t}.${u.key}`;i[u.key]=he({...u,key:c},{path:l},d)}}),{value:i,errors:o}}}function ge(e,t,n,o){const{instance:a,scopeRoot:r}=o;if("elements"in e)if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateContainerField: Expected array for multiple container field "${t}", got ${typeof n}`);return}n.forEach((s,i)=>{z(s)&&e.elements.forEach(d=>{const u=d.key,c=`${t}[${i}].${u}`,m=s[u];m!==void 0&&a.updateField(c,m)})});const l=r.querySelectorAll(`[data-container-item^="${t}["]`);n.length!==l.length&&console.warn(`updateContainerField: Multiple container field "${t}" item count mismatch. Consider re-rendering for add/remove.`)}else{if(!z(n)){console.warn(`updateContainerField: Expected object for container field "${t}", got ${typeof n}`);return}e.elements.forEach(l=>{const s=l.key,i=`${t}.${s}`,d=n[s];d!==void 0&&a.updateField(i,d)})}}function ht(e,t,n,o){var a,r;typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated and will be removed in a future version. Please use type: "container" with multiple: true instead. Field key: "${e.key}"`);const l={key:e.key,label:e.label,description:e.description,hint:e.hint,required:e.required,hidden:e.hidden,default:e.default,actions:e.actions,elements:e.elements,multiple:!!(e.repeat&&z(e.repeat)),minCount:(a=e.repeat)==null?void 0:a.min,maxCount:(r=e.repeat)==null?void 0:r.max};l.multiple?fe(l,t,n):me(l,t,n,o)}function ye(e){var t,n;const o=e;return{type:"container",key:o.key,label:o.label,description:o.description,hint:o.hint,required:o.required,hidden:o.hidden,default:o.default,actions:o.actions,elements:o.elements,multiple:!!(o.repeat&&z(o.repeat)),minCount:(t=o.repeat)==null?void 0:t.min,maxCount:(n=o.repeat)==null?void 0:n.max}}function vt(e,t,n){typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated. Please use type: "container" instead. Field key: "${t}"`);const o=ye(e);return ve(o,t,n)}function gt(e,t,n,o){typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated. Please use type: "container" instead. Field path: "${t}"`);const a=ye(e);return ge(a,t,n,o)}function yt(e,t){const n=document.getElementById(e);if(!n)return;const o=!n.classList.contains("hidden");if(document.querySelectorAll('[id^="tooltip-"]').forEach(u=>{u.classList.add("hidden")}),o)return;const a=t.getBoundingClientRect(),r=window.innerWidth,l=window.innerHeight;n&&n.parentElement!==document.body&&document.body.appendChild(n),n.style.visibility="hidden",n.style.position="fixed",n.classList.remove("hidden");const s=n.getBoundingClientRect();n.classList.add("hidden"),n.style.visibility="visible";let i=a.left,d=a.bottom+5;i+s.width>r&&(i=a.right-s.width),d+s.height>l&&(d=a.top-s.height-5),i<10&&(i=10),d<10&&(d=a.bottom+5),n.style.left=`${i}px`,n.style.top=`${d}px`,n.classList.remove("hidden"),setTimeout(()=>{n.classList.add("hidden")},25e3)}typeof document!="undefined"&&document.addEventListener("click",e=>{const t=e.target,n=t.closest("button")&&t.closest("button").onclick,o=t.closest('[id^="tooltip-"]');!n&&!o&&document.querySelectorAll('[id^="tooltip-"]').forEach(a=>{a.classList.add("hidden")})});function bt(e,t){var n;if(!e.displayIf)return null;try{const o=(n=t.formData)!=null?n:t.prefill;if(!R(e.displayIf,o)){const a=document.createElement("div");return a.className="fb-field-wrapper-hidden",a.style.display="none",a.setAttribute("data-field-key",e.key),a.setAttribute("data-conditionally-hidden","true"),a}}catch(o){console.error(`Error evaluating displayIf for field "${e.key}":`,o)}return null}function xt(e){const t=document.createElement("label");if(t.className="text-sm font-medium text-gray-900",t.textContent=e.label||e.key,e.required){const n=document.createElement("span");n.className="text-red-500 ml-1",n.textContent="*",t.appendChild(n)}return t}function Ct(e){const t=document.createElement("button");t.type="button",t.className="ml-2 text-gray-400 hover:text-gray-600",t.innerHTML='<svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>';const n=`tooltip-${e.key}-${Math.random().toString(36).substr(2,9)}`,o=document.createElement("div");return o.id=n,o.className="hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg",o.style.position="fixed",o.textContent=e.description||e.hint||"Field information",document.body.appendChild(o),t.onclick=a=>{a.preventDefault(),a.stopPropagation(),yt(n,t)},t}function Et(e){const t=document.createElement("div");t.className="flex items-center mb-2";const n=xt(e);if(t.appendChild(n),e.description||e.hint){const o=Ct(e);t.appendChild(o)}return t}function $t(e,t,n,o){const a="multiple"in e&&e.multiple;switch(e.type){case"text":a?Ae(e,t,n,o):Ne(e,t,n,o);break;case"textarea":a?Te(e,t,n,o):qe(e,t,n,o);break;case"number":a?Be(e,t,n,o):ze(e,t,n,o);break;case"select":a?Re(e,t,n,o):De(e,t,n,o);break;case"file":a?ot(e,t,n,o):nt(e,t,n,o);break;case"files":rt(e,t,n,o);break;case"colour":a?at(e,t,n,o):lt(e,t,n,o);break;case"slider":a?dt(e,t,n,o):ct(e,t,n,o);break;case"group":ht(e,t,n,o);break;case"container":a?fe(e,t,n):me(e,t,n,o);break;default:{const r=document.createElement("div");r.className="text-red-500 text-sm",r.textContent=`Unsupported field type: ${e.type}`,n.appendChild(r)}}}function G(e,t){const n=bt(e,t);if(n)return n;const o=document.createElement("div");o.className="mb-6 fb-field-wrapper",o.setAttribute("data-field-key",e.key);const a=Et(e);o.appendChild(a);const r=q(t.path,e.key);return $t(e,t,o,r),o}mt(G);const wt={uploadFile:null,downloadFile:null,getThumbnail:null,getDownloadUrl:null,actionHandler:null,onChange:null,onFieldChange:null,onThumbnailError:null,onUploadError:null,onDownloadError:null,debounceMs:300,verboseErrors:!1,enableFilePreview:!0,maxPreviewSize:"200px",readonly:!1,locale:"en",translations:{en:{addElement:"Add Element",removeElement:"Remove",uploadText:"Upload",dragDropText:"or drag and drop files",dragDropTextSingle:"or drag and drop file",clickDragText:"Click or drag file",noFileSelected:"No file selected",noFilesSelected:"No files selected",downloadButton:"Download"},ru:{addElement:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442",removeElement:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",uploadText:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435",dragDropText:"\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B",dragDropTextSingle:"\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B",clickDragText:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B",noFileSelected:"\u0424\u0430\u0439\u043B \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D",noFilesSelected:"\u041D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432",downloadButton:"\u0421\u043A\u0430\u0447\u0430\u0442\u044C"}},theme:{}};function kt(e){return{schema:null,formRoot:null,resourceIndex:new Map,externalActions:null,version:"1.0.0",config:{...wt,...e},debounceTimer:null}}function St(){const e=Date.now().toString(36),t=Math.random().toString(36).substring(2,9);return`inst-${e}-${t}`}const M={primaryColor:"#3b82f6",primaryHoverColor:"#2563eb",errorColor:"#ef4444",errorHoverColor:"#dc2626",successColor:"#10b981",borderColor:"#d1d5db",borderHoverColor:"#9ca3af",borderFocusColor:"#3b82f6",backgroundColor:"#ffffff",backgroundHoverColor:"#f9fafb",backgroundReadonlyColor:"#f3f4f6",textColor:"#1f2937",textSecondaryColor:"#6b7280",textPlaceholderColor:"#9ca3af",textDisabledColor:"#d1d5db",buttonBgColor:"#3b82f6",buttonTextColor:"#ffffff",buttonBorderColor:"#2563eb",buttonHoverBgColor:"#2563eb",buttonHoverBorderColor:"#1d4ed8",actionBgColor:"#ffffff",actionTextColor:"#374151",actionBorderColor:"#e5e7eb",actionHoverBgColor:"#f9fafb",actionHoverBorderColor:"#d1d5db",fileUploadBgColor:"#f3f4f6",fileUploadBorderColor:"#d1d5db",fileUploadTextColor:"#9ca3af",fileUploadHoverBorderColor:"#3b82f6",inputPaddingX:"0.75rem",inputPaddingY:"0.5rem",borderRadius:"0.5rem",borderWidth:"1px",fontSize:"0.875rem",fontSizeSmall:"0.75rem",fontSizeExtraSmall:"0.625rem",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontWeightNormal:"400",fontWeightMedium:"500",focusRingWidth:"2px",focusRingColor:"#3b82f6",focusRingOpacity:"0.5",transitionDuration:"200ms"};function Lt(e){const t={...M,...e},n=[];return Object.entries(t).forEach(([o,a])=>{const r=o.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(` --fb-${r}: ${a};`)}),n.join(`
288
- `)}function Ft(e,t){const n=Lt(t);let o=e.querySelector("style[data-fb-theme]");o||(o=document.createElement("style"),o.setAttribute("data-fb-theme","true"),e.appendChild(o)),o.textContent=`
287
+ )`}u.classList.remove("invalid"),u.title=""}}}let _=null;function pt(e){_=e}function B(e,t){if(!_)throw new Error("renderElement not initialized. Import from components/index.ts");return _(e,t)}function ue(e,t){if(!e.prefillHints||e.prefillHints.length===0)return null;const n=document.createElement("div");return n.className="fb-prefill-hints flex flex-wrap gap-2 mb-4",e.prefillHints.forEach((o,a)=>{const r=document.createElement("button");r.type="button",r.className="fb-prefill-hint",r.textContent=o.label,r.setAttribute("data-hint-values",JSON.stringify(o.values)),r.setAttribute("data-container-key",t),r.setAttribute("data-hint-index",String(a)),n.appendChild(r)}),n}function pe(e,t,n,o){var a,r;const l=document.createElement("div");l.className="border border-gray-200 rounded-lg p-4 bg-gray-50",l.setAttribute("data-container",o);const i=document.createElement("div");i.className="flex justify-between items-center mb-4";const s=document.createElement("div");s.className="flex-1";const d=document.createElement("div"),u=e.columns||1;if(u===1?d.className="space-y-4":d.className=`grid grid-cols-${u} gap-4`,l.appendChild(i),i.appendChild(s),!t.state.config.readonly){const m=ue(e,o);m&&l.appendChild(m)}const c={path:q(t.path,e.key),prefill:((a=t.prefill)==null?void 0:a[e.key])||{},formData:(r=t.formData)!=null?r:t.prefill,state:t.state};e.elements.forEach(m=>{m.hidden||d.appendChild(B(m,c))}),l.appendChild(d),s.innerHTML=`<span>${e.label||e.key}</span>`,n.appendChild(l)}function me(e,t,n,o){var a,r,l,i;const s=t.state,d=document.createElement("div");d.className="border border-gray-200 rounded-lg p-4 bg-gray-50";const u=document.createElement("div");u.className="flex justify-between items-center mb-4";const c=document.createElement("div");c.className="flex-1";const m=document.createElement("div");if(m.className="space-y-4",d.appendChild(u),u.appendChild(c),!t.state.config.readonly){const g=ue(e,e.key);g&&d.appendChild(g)}const v=(a=e.minCount)!=null?a:0,f=(r=e.maxCount)!=null?r:1/0,y=Array.isArray((l=t.prefill)==null?void 0:l[e.key])?t.prefill[e.key]:null,b=()=>m.querySelectorAll(":scope > .containerItem").length,x=()=>{const g=document.createElement("button");return g.type="button",g.className="add-container-btn mt-2 px-3 py-1 rounded",g.style.cssText=`
288
+ color: var(--fb-primary-color);
289
+ border: var(--fb-border-width) solid var(--fb-primary-color);
290
+ background-color: transparent;
291
+ font-size: var(--fb-font-size);
292
+ transition: all var(--fb-transition-duration);
293
+ `,g.textContent="+",g.addEventListener("mouseenter",()=>{g.style.backgroundColor="var(--fb-background-hover-color)"}),g.addEventListener("mouseleave",()=>{g.style.backgroundColor="transparent"}),g.onclick=()=>{var p;if(b()<f){const C=b(),E={state:t.state,path:q(t.path,`${e.key}[${C}]`),prefill:{},formData:(p=t.formData)!=null?p:t.prefill},$=document.createElement("div");$.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",$.setAttribute("data-container-item",`${e.key}[${C}]`);const w=document.createElement("div"),N=e.columns||1;if(N===1?w.className="space-y-4":w.className=`grid grid-cols-${N} gap-4`,e.elements.forEach(k=>{k.hidden||w.appendChild(B(k,E))}),$.appendChild(w),!s.config.readonly){const k=document.createElement("button");k.type="button",k.className="absolute top-2 right-2 px-2 py-1 rounded",k.style.cssText=`
294
+ color: var(--fb-error-color);
295
+ background-color: transparent;
296
+ transition: background-color var(--fb-transition-duration);
297
+ `,k.textContent="\u2715",k.addEventListener("mouseenter",()=>{k.style.backgroundColor="var(--fb-background-hover-color)"}),k.addEventListener("mouseleave",()=>{k.style.backgroundColor="transparent"}),k.onclick=()=>{$.remove(),h()},$.style.position="relative",$.appendChild(k)}m.appendChild($),h()}},g},h=()=>{const g=b(),p=d.querySelector(".add-container-btn");p&&(p.disabled=g>=f,p.style.opacity=g>=f?"0.5":"1",p.style.pointerEvents=g>=f?"none":"auto"),c.innerHTML=`<span>${e.label||e.key}</span> <span class="text-sm text-gray-500">(${g}/${f===1/0?"\u221E":f})</span>`};if(y&&Array.isArray(y)&&y.forEach((g,p)=>{var C;const E={state:t.state,path:q(t.path,`${e.key}[${p}]`),prefill:g||{},formData:(C=t.formData)!=null?C:t.prefill},$=document.createElement("div");$.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",$.setAttribute("data-container-item",`${e.key}[${p}]`);const w=document.createElement("div"),N=e.columns||1;if(N===1?w.className="space-y-4":w.className=`grid grid-cols-${N} gap-4`,e.elements.forEach(k=>{k.hidden||w.appendChild(B(k,E))}),$.appendChild(w),!s.config.readonly){const k=document.createElement("button");k.type="button",k.className="absolute top-2 right-2 px-2 py-1 rounded",k.style.cssText=`
298
+ color: var(--fb-error-color);
299
+ background-color: transparent;
300
+ transition: background-color var(--fb-transition-duration);
301
+ `,k.textContent="\u2715",k.addEventListener("mouseenter",()=>{k.style.backgroundColor="var(--fb-background-hover-color)"}),k.addEventListener("mouseleave",()=>{k.style.backgroundColor="transparent"}),k.onclick=()=>{$.remove(),h()},$.style.position="relative",$.appendChild(k)}m.appendChild($)}),!s.config.readonly)for(;b()<v;){const g=b(),p={state:t.state,path:q(t.path,`${e.key}[${g}]`),prefill:{},formData:(i=t.formData)!=null?i:t.prefill},C=document.createElement("div");C.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",C.setAttribute("data-container-item",`${e.key}[${g}]`);const E=document.createElement("div"),$=e.columns||1;$===1?E.className="space-y-4":E.className=`grid grid-cols-${$} gap-4`,e.elements.forEach(N=>{N.hidden||E.appendChild(B(N,p))}),C.appendChild(E);const w=document.createElement("button");w.type="button",w.className="absolute top-2 right-2 px-2 py-1 rounded",w.style.cssText=`
302
+ color: var(--fb-error-color);
303
+ background-color: transparent;
304
+ transition: background-color var(--fb-transition-duration);
305
+ `,w.textContent="\u2715",w.addEventListener("mouseenter",()=>{w.style.backgroundColor="var(--fb-background-hover-color)"}),w.addEventListener("mouseleave",()=>{w.style.backgroundColor="transparent"}),w.onclick=()=>{b()>v&&(C.remove(),h())},C.style.position="relative",C.appendChild(w),m.appendChild(C)}d.appendChild(m),s.config.readonly||d.appendChild(x()),h(),n.appendChild(d)}let W=null;function mt(e){W=e}function fe(e,t,n){if(!W)throw new Error("validateElement not initialized. Should be set from FormBuilderInstance");return W(e,t,n)}function ve(e,t,n){const o=[],{scopeRoot:a,skipValidation:r,path:l}=n;if(!("elements"in e))return{value:null,errors:o};const i=(s,d,u)=>{var c,m;if(r)return;const v="minCount"in u&&(c=u.minCount)!=null?c:0,f="maxCount"in u&&(m=u.maxCount)!=null?m:1/0;u.required&&d.length===0&&o.push(`${s}: required`),d.length<v&&o.push(`${s}: minimum ${v} items required`),d.length>f&&o.push(`${s}: maximum ${f} items allowed`)};if("multiple"in e&&e.multiple){const s=[],d=a.querySelectorAll("[data-container-item]"),u=Array.from(d).filter(c=>{const m=c.getAttribute("data-container-item");return m==null?void 0:m.startsWith(`${t}[`)}).length;for(let c=0;c<u;c++){const m={},v=a.querySelector(`[data-container-item="${t}[${c}]"]`)||a;e.elements.forEach(f=>{if(f.hidden||f.type==="hidden")m[f.key]=f.default!==void 0?f.default:null;else{const y=`${t}[${c}].${f.key}`;m[f.key]=fe({...f,key:y},{path:l},v)}}),s.push(m)}return i(t,s,e),{value:s,errors:o}}else{const s={},d=a.querySelector(`[data-container="${t}"]`)||a;return e.elements.forEach(u=>{if(u.hidden||u.type==="hidden")s[u.key]=u.default!==void 0?u.default:null;else{const c=`${t}.${u.key}`;s[u.key]=fe({...u,key:c},{path:l},d)}}),{value:s,errors:o}}}function he(e,t,n,o){const{instance:a,scopeRoot:r}=o;if("elements"in e)if("multiple"in e&&e.multiple){if(!Array.isArray(n)){console.warn(`updateContainerField: Expected array for multiple container field "${t}", got ${typeof n}`);return}n.forEach((i,s)=>{M(i)&&e.elements.forEach(d=>{const u=d.key,c=`${t}[${s}].${u}`,m=i[u];m!==void 0&&a.updateField(c,m)})});const l=r.querySelectorAll(`[data-container-item^="${t}["]`);n.length!==l.length&&console.warn(`updateContainerField: Multiple container field "${t}" item count mismatch. Consider re-rendering for add/remove.`)}else{if(!M(n)){console.warn(`updateContainerField: Expected object for container field "${t}", got ${typeof n}`);return}e.elements.forEach(l=>{const i=l.key,s=`${t}.${i}`,d=n[i];d!==void 0&&a.updateField(s,d)})}}function ft(e,t,n,o){var a,r;typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated and will be removed in a future version. Please use type: "container" with multiple: true instead. Field key: "${e.key}"`);const l={key:e.key,label:e.label,description:e.description,hint:e.hint,required:e.required,hidden:e.hidden,default:e.default,actions:e.actions,elements:e.elements,multiple:!!(e.repeat&&M(e.repeat)),minCount:(a=e.repeat)==null?void 0:a.min,maxCount:(r=e.repeat)==null?void 0:r.max};l.multiple?me(l,t,n):pe(l,t,n,o)}function ge(e){var t,n;const o=e;return{type:"container",key:o.key,label:o.label,description:o.description,hint:o.hint,required:o.required,hidden:o.hidden,default:o.default,actions:o.actions,elements:o.elements,multiple:!!(o.repeat&&M(o.repeat)),minCount:(t=o.repeat)==null?void 0:t.min,maxCount:(n=o.repeat)==null?void 0:n.max}}function vt(e,t,n){typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated. Please use type: "container" instead. Field key: "${t}"`);const o=ge(e);return ve(o,t,n)}function ht(e,t,n,o){typeof console!="undefined"&&console.warn&&console.warn(`[Form Builder] The "group" field type is deprecated. Please use type: "container" instead. Field path: "${t}"`);const a=ge(e);return he(a,t,n,o)}function gt(e,t){const n=document.getElementById(e);if(!n)return;const o=!n.classList.contains("hidden");if(document.querySelectorAll('[id^="tooltip-"]').forEach(u=>{u.classList.add("hidden")}),o)return;const a=t.getBoundingClientRect(),r=window.innerWidth,l=window.innerHeight;n&&n.parentElement!==document.body&&document.body.appendChild(n),n.style.visibility="hidden",n.style.position="fixed",n.classList.remove("hidden");const i=n.getBoundingClientRect();n.classList.add("hidden"),n.style.visibility="visible";let s=a.left,d=a.bottom+5;s+i.width>r&&(s=a.right-i.width),d+i.height>l&&(d=a.top-i.height-5),s<10&&(s=10),d<10&&(d=a.bottom+5),n.style.left=`${s}px`,n.style.top=`${d}px`,n.classList.remove("hidden"),setTimeout(()=>{n.classList.add("hidden")},25e3)}typeof document!="undefined"&&document.addEventListener("click",e=>{const t=e.target,n=t.closest("button")&&t.closest("button").onclick,o=t.closest('[id^="tooltip-"]');!n&&!o&&document.querySelectorAll('[id^="tooltip-"]').forEach(a=>{a.classList.add("hidden")})});function yt(e,t){var n;if(!e.displayIf)return null;try{const o=(n=t.formData)!=null?n:t.prefill;if(!R(e.displayIf,o)){const a=document.createElement("div");return a.className="fb-field-wrapper-hidden",a.style.display="none",a.setAttribute("data-field-key",e.key),a.setAttribute("data-conditionally-hidden","true"),a}}catch(o){console.error(`Error evaluating displayIf for field "${e.key}":`,o)}return null}function bt(e){const t=document.createElement("label");if(t.className="text-sm font-medium text-gray-900",t.textContent=e.label||e.key,e.required){const n=document.createElement("span");n.className="text-red-500 ml-1",n.textContent="*",t.appendChild(n)}return t}function xt(e){const t=document.createElement("button");t.type="button",t.className="ml-2 text-gray-400 hover:text-gray-600",t.innerHTML='<svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>';const n=`tooltip-${e.key}-${Math.random().toString(36).substr(2,9)}`,o=document.createElement("div");return o.id=n,o.className="hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg",o.style.position="fixed",o.textContent=e.description||e.hint||"Field information",document.body.appendChild(o),t.onclick=a=>{a.preventDefault(),a.stopPropagation(),gt(n,t)},t}function Ct(e){const t=document.createElement("div");t.className="flex items-center mb-2";const n=bt(e);if(t.appendChild(n),e.description||e.hint){const o=xt(e);t.appendChild(o)}return t}function Et(e,t,n,o){const a="multiple"in e&&e.multiple;switch(e.type){case"text":a?Ne(e,t,n,o):Fe(e,t,n,o);break;case"textarea":a?Ae(e,t,n,o):qe(e,t,n,o);break;case"number":a?ze(e,t,n,o):Me(e,t,n,o);break;case"select":a?Re(e,t,n,o):Ie(e,t,n,o);break;case"file":a?rt(e,t,n,o):tt(e,t,n,o);break;case"files":nt(e,t,n,o);break;case"colour":a?lt(e,t,n,o):ot(e,t,n,o);break;case"slider":a?ct(e,t,n,o):st(e,t,n,o);break;case"group":ft(e,t,n,o);break;case"container":a?me(e,t,n):pe(e,t,n,o);break;default:{const r=document.createElement("div");r.className="text-red-500 text-sm",r.textContent=`Unsupported field type: ${e.type}`,n.appendChild(r)}}}function J(e,t){const n=yt(e,t);if(n)return n;const o=document.createElement("div");o.className="mb-6 fb-field-wrapper",o.setAttribute("data-field-key",e.key);const a=Ct(e);o.appendChild(a);const r=q(t.path,e.key);return Et(e,t,o,r),o}pt(J);const $t={uploadFile:null,downloadFile:null,getThumbnail:null,getDownloadUrl:null,actionHandler:null,onChange:null,onFieldChange:null,onThumbnailError:null,onUploadError:null,onDownloadError:null,debounceMs:300,verboseErrors:!1,enableFilePreview:!0,maxPreviewSize:"200px",readonly:!1,locale:"en",translations:{en:{addElement:"Add Element",removeElement:"Remove",uploadText:"Upload",dragDropText:"or drag and drop files",dragDropTextSingle:"or drag and drop file",clickDragText:"Click or drag file",noFileSelected:"No file selected",noFilesSelected:"No files selected",downloadButton:"Download"},ru:{addElement:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442",removeElement:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",uploadText:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435",dragDropText:"\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B",dragDropTextSingle:"\u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B",clickDragText:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B",noFileSelected:"\u0424\u0430\u0439\u043B \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D",noFilesSelected:"\u041D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432",downloadButton:"\u0421\u043A\u0430\u0447\u0430\u0442\u044C"}},theme:{}};function wt(e){return{schema:null,formRoot:null,resourceIndex:new Map,externalActions:null,version:"1.0.0",config:{...$t,...e},debounceTimer:null}}function kt(){const e=Date.now().toString(36),t=Math.random().toString(36).substring(2,9);return`inst-${e}-${t}`}const H={primaryColor:"#3b82f6",primaryHoverColor:"#2563eb",errorColor:"#ef4444",errorHoverColor:"#dc2626",successColor:"#10b981",borderColor:"#d1d5db",borderHoverColor:"#9ca3af",borderFocusColor:"#3b82f6",backgroundColor:"#ffffff",backgroundHoverColor:"#f9fafb",backgroundReadonlyColor:"#f3f4f6",textColor:"#1f2937",textSecondaryColor:"#6b7280",textPlaceholderColor:"#9ca3af",textDisabledColor:"#d1d5db",buttonBgColor:"#3b82f6",buttonTextColor:"#ffffff",buttonBorderColor:"#2563eb",buttonHoverBgColor:"#2563eb",buttonHoverBorderColor:"#1d4ed8",actionBgColor:"#ffffff",actionTextColor:"#374151",actionBorderColor:"#e5e7eb",actionHoverBgColor:"#f9fafb",actionHoverBorderColor:"#d1d5db",fileUploadBgColor:"#f3f4f6",fileUploadBorderColor:"#d1d5db",fileUploadTextColor:"#9ca3af",fileUploadHoverBorderColor:"#3b82f6",inputPaddingX:"0.75rem",inputPaddingY:"0.5rem",borderRadius:"0.5rem",borderWidth:"1px",fontSize:"0.875rem",fontSizeSmall:"0.75rem",fontSizeExtraSmall:"0.625rem",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontWeightNormal:"400",fontWeightMedium:"500",focusRingWidth:"2px",focusRingColor:"#3b82f6",focusRingOpacity:"0.5",transitionDuration:"200ms"};function St(e){const t={...H,...e},n=[];return Object.entries(t).forEach(([o,a])=>{const r=o.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(` --fb-${r}: ${a};`)}),n.join(`
306
+ `)}function Lt(e,t){const n=St(t);let o=e.querySelector("style[data-fb-theme]");o||(o=document.createElement("style"),o.setAttribute("data-fb-theme","true"),e.appendChild(o)),o.textContent=`
289
307
  [data-fb-root="true"] {
290
308
  ${n}
291
309
  }
292
- `}const Nt={default:M,dark:{...M,primaryColor:"#60a5fa",primaryHoverColor:"#3b82f6",borderColor:"#4b5563",borderHoverColor:"#6b7280",borderFocusColor:"#60a5fa",backgroundColor:"#1f2937",backgroundHoverColor:"#374151",backgroundReadonlyColor:"#111827",textColor:"#f9fafb",textSecondaryColor:"#9ca3af",textPlaceholderColor:"#6b7280",fileUploadBgColor:"#374151",fileUploadBorderColor:"#4b5563",fileUploadTextColor:"#9ca3af"},klein:{...M,primaryColor:"#0066cc",primaryHoverColor:"#0052a3",errorColor:"#d32f2f",errorHoverColor:"#c62828",successColor:"#388e3c",borderColor:"#e0e0e0",borderHoverColor:"#bdbdbd",borderFocusColor:"#0066cc",borderRadius:"4px",fontSize:"16px",fontSizeSmall:"14px",fontFamily:'"Roboto", "Helvetica", "Arial", sans-serif'}};function be(e,t=!1){e.style.cssText=`
310
+ `}const Ft={default:H,dark:{...H,primaryColor:"#60a5fa",primaryHoverColor:"#3b82f6",borderColor:"#4b5563",borderHoverColor:"#6b7280",borderFocusColor:"#60a5fa",backgroundColor:"#1f2937",backgroundHoverColor:"#374151",backgroundReadonlyColor:"#111827",textColor:"#f9fafb",textSecondaryColor:"#9ca3af",textPlaceholderColor:"#6b7280",fileUploadBgColor:"#374151",fileUploadBorderColor:"#4b5563",fileUploadTextColor:"#9ca3af"},klein:{...H,primaryColor:"#0066cc",primaryHoverColor:"#0052a3",errorColor:"#d32f2f",errorHoverColor:"#c62828",successColor:"#388e3c",borderColor:"#e0e0e0",borderHoverColor:"#bdbdbd",borderFocusColor:"#0066cc",borderRadius:"4px",fontSize:"16px",fontSizeSmall:"14px",fontFamily:'"Roboto", "Helvetica", "Arial", sans-serif'}};function ye(e,t=!1){e.style.cssText=`
293
311
  background-color: var(--fb-action-bg-color);
294
312
  color: var(--fb-action-text-color);
295
313
  border: var(--fb-border-width) solid var(--fb-action-border-color);
@@ -299,6 +317,6 @@ ${n}
299
317
  border-radius: var(--fb-border-radius);
300
318
  transition: all var(--fb-transition-duration);
301
319
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
302
- `,e.addEventListener("mouseenter",()=>{e.style.backgroundColor="var(--fb-action-hover-bg-color)",e.style.borderColor="var(--fb-action-hover-border-color)"}),e.addEventListener("mouseleave",()=>{e.style.backgroundColor="var(--fb-action-bg-color)",e.style.borderColor="var(--fb-action-border-color)"})}const At={text:{validate:Y,update:X},textarea:{validate:He,update:Me},number:{validate:je,update:Ie},select:{validate:Oe,update:Ue},file:{validate:le,update:ae},files:{validate:le,update:ae},colour:{validate:it,update:st},slider:{validate:ut,update:pt},container:{validate:ve,update:ge},group:{validate:vt,update:gt}};function xe(e){return At[e]||null}function qt(e,t,n){const o=xe(e.type);return o&&o.validate?o.validate(e,t,n):null}function Tt(e,t,n,o){const a=xe(e.type);return a&&a.update?(a.update(e,t,n,o),!0):!1}class I{constructor(t){this.instanceId=St(),this.state=kt(t),this.state.config.verboseErrors&&(globalThis.__formBuilderInstances||(globalThis.__formBuilderInstances=new Set),globalThis.__formBuilderInstances.add(this.instanceId),globalThis.__formBuilderInstances.size>10&&console.warn(`[form-builder] ${globalThis.__formBuilderInstances.size} instances active. Possible memory leak - ensure you call destroy() when done.`))}getInstanceId(){return this.instanceId}getState(){return this.state}setFormRoot(t){this.state.formRoot=t}configure(t){Object.assign(this.state.config,t)}setUploadHandler(t){this.state.config.uploadFile=t}setDownloadHandler(t){this.state.config.downloadFile=t}setThumbnailHandler(t){this.state.config.getThumbnail=t}setActionHandler(t){this.state.config.actionHandler=t}setMode(t){this.state.config.readonly=t==="readonly"}setLocale(t){this.state.config.translations[t]&&(this.state.config.locale=t)}triggerOnChange(t,n){this.state.config.readonly||(this.state.debounceTimer!==null&&clearTimeout(this.state.debounceTimer),this.state.debounceTimer=setTimeout(()=>{const o=this.validateForm(!0);this.reevaluateConditionalFields(),this.state.config.onChange&&this.state.config.onChange(o),this.state.config.onFieldChange&&t!==void 0&&n!==void 0&&this.state.config.onFieldChange(t,n,o),this.state.debounceTimer=null},this.state.config.debounceMs))}registerAction(t){if(!t||!t.value)throw new Error("Action must have a value property");this.state.externalActions||(this.state.externalActions=[]);const n=this.state.externalActions.findIndex(o=>o.value===t.value&&o.related_field===t.related_field);n>=0?this.state.externalActions[n]=t:this.state.externalActions.push(t)}findFormElementByFieldPath(t){if(!this.state.formRoot)return null;if(!this.state.config.readonly){let a=this.state.formRoot.querySelector(`[name="${t}"]`);if(a)return a;const r=[t,t.replace(/\[(\d+)\]/g,"[$1]"),t.replace(/\./g,"[")+"]".repeat((t.match(/\./g)||[]).length)];for(const l of r)if(a=this.state.formRoot.querySelector(`[name="${l}"]`),a)return a}const n=this.findSchemaElement(t);if(!n)return null;const o=this.state.formRoot.querySelectorAll(".fb-field-wrapper");for(const a of o){const r=n.label||n.key,l=a.querySelector("label");if(l&&(l.textContent===r||l.textContent===`${r}*`)){let s=a.querySelector(".field-placeholder");return s||(s=document.createElement("div"),s.className="field-placeholder",s.style.display="none",a.appendChild(s)),s}}return null}findSchemaElement(t){if(!this.state.schema||!this.state.schema.elements)return null;let n=this.state.schema.elements,o=null;const a=t.replace(/\[\d+\]/g,"").split(".").filter(Boolean);for(const r of a){if(o=n.find(l=>l.key===r)||null,!o)return null;"elements"in o&&o.elements&&(n=o.elements)}return o}resolveActionLabel(t,n,o,a=!1){if(o&&"actions"in o&&o.actions){const r=o.actions.find(l=>l.key===t);if(r&&r.label)return r.label}if(a&&this.state.schema&&"actions"in this.state.schema&&this.state.schema.actions){const r=this.state.schema.actions.find(l=>l.key===t);if(r&&r.label)return r.label}return n||t}renderFormLevelActions(t,n=[]){if(!this.state.formRoot)return;const o=this.state.formRoot.querySelector(".form-level-actions-container");o&&o.remove();const a=document.createElement("div");a.className="form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center",a.style.cssText=`
320
+ `,e.addEventListener("mouseenter",()=>{e.style.backgroundColor="var(--fb-action-hover-bg-color)",e.style.borderColor="var(--fb-action-hover-border-color)"}),e.addEventListener("mouseleave",()=>{e.style.backgroundColor="var(--fb-action-bg-color)",e.style.borderColor="var(--fb-action-border-color)"})}const Nt={text:{validate:G,update:Y},textarea:{validate:Te,update:He},number:{validate:Be,update:je},select:{validate:De,update:Oe},file:{validate:oe,update:le},files:{validate:oe,update:le},colour:{validate:at,update:it},slider:{validate:dt,update:ut},container:{validate:ve,update:he},group:{validate:vt,update:ht}};function be(e){return Nt[e]||null}function qt(e,t,n){const o=be(e.type);return o&&o.validate?o.validate(e,t,n):null}function At(e,t,n,o){const a=be(e.type);return a&&a.update?(a.update(e,t,n,o),!0):!1}class j{constructor(t){this.instanceId=kt(),this.state=wt(t),this.state.config.verboseErrors&&(globalThis.__formBuilderInstances||(globalThis.__formBuilderInstances=new Set),globalThis.__formBuilderInstances.add(this.instanceId),globalThis.__formBuilderInstances.size>10&&console.warn(`[form-builder] ${globalThis.__formBuilderInstances.size} instances active. Possible memory leak - ensure you call destroy() when done.`))}getInstanceId(){return this.instanceId}getState(){return this.state}setFormRoot(t){this.state.formRoot=t}configure(t){Object.assign(this.state.config,t)}setUploadHandler(t){this.state.config.uploadFile=t}setDownloadHandler(t){this.state.config.downloadFile=t}setThumbnailHandler(t){this.state.config.getThumbnail=t}setActionHandler(t){this.state.config.actionHandler=t}setMode(t){this.state.config.readonly=t==="readonly"}setLocale(t){this.state.config.translations[t]&&(this.state.config.locale=t)}triggerOnChange(t,n){this.state.config.readonly||(this.state.debounceTimer!==null&&clearTimeout(this.state.debounceTimer),this.state.debounceTimer=setTimeout(()=>{const o=this.validateForm(!0);this.reevaluateConditionalFields(),this.state.config.onChange&&this.state.config.onChange(o),this.state.config.onFieldChange&&t!==void 0&&n!==void 0&&this.state.config.onFieldChange(t,n,o),this.state.debounceTimer=null},this.state.config.debounceMs))}registerAction(t){if(!t||!t.value)throw new Error("Action must have a value property");this.state.externalActions||(this.state.externalActions=[]);const n=this.state.externalActions.findIndex(o=>o.value===t.value&&o.related_field===t.related_field);n>=0?this.state.externalActions[n]=t:this.state.externalActions.push(t)}findFormElementByFieldPath(t){if(!this.state.formRoot)return null;if(!this.state.config.readonly){let a=this.state.formRoot.querySelector(`[name="${t}"]`);if(a)return a;const r=[t,t.replace(/\[(\d+)\]/g,"[$1]"),t.replace(/\./g,"[")+"]".repeat((t.match(/\./g)||[]).length)];for(const l of r)if(a=this.state.formRoot.querySelector(`[name="${l}"]`),a)return a}const n=this.findSchemaElement(t);if(!n)return null;const o=this.state.formRoot.querySelectorAll(".fb-field-wrapper");for(const a of o){const r=n.label||n.key,l=a.querySelector("label");if(l&&(l.textContent===r||l.textContent===`${r}*`)){let i=a.querySelector(".field-placeholder");return i||(i=document.createElement("div"),i.className="field-placeholder",i.style.display="none",a.appendChild(i)),i}}return null}findSchemaElement(t){if(!this.state.schema||!this.state.schema.elements)return null;let n=this.state.schema.elements,o=null;const a=t.replace(/\[\d+\]/g,"").split(".").filter(Boolean);for(const r of a){if(o=n.find(l=>l.key===r)||null,!o)return null;"elements"in o&&o.elements&&(n=o.elements)}return o}resolveActionLabel(t,n,o,a=!1){if(o&&"actions"in o&&o.actions){const r=o.actions.find(l=>l.key===t);if(r&&r.label)return r.label}if(a&&this.state.schema&&"actions"in this.state.schema&&this.state.schema.actions){const r=this.state.schema.actions.find(l=>l.key===t);if(r&&r.label)return r.label}return n||t}renderFormLevelActions(t,n=[]){if(!this.state.formRoot)return;const o=this.state.formRoot.querySelector(".form-level-actions-container");o&&o.remove();const a=document.createElement("div");a.className="form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center",a.style.cssText=`
303
321
  border-top: var(--fb-border-width) solid var(--fb-border-color);
304
- `,t.forEach(r=>{const l=document.createElement("button");l.type="button",be(l,!0);const s=n.includes(r),i=this.resolveActionLabel(r.key,r.label,null,s);l.textContent=i,l.addEventListener("click",d=>{d.preventDefault(),d.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(r.value,r.key,null)}),a.appendChild(l)}),this.state.formRoot.appendChild(a)}renderExternalActions(){if(!this.state.externalActions||!Array.isArray(this.state.externalActions))return;const t=new Map,n=[],o=[];this.state.externalActions.forEach(r=>{!r.key||!r.value||(r.related_field?(t.has(r.related_field)||t.set(r.related_field,[]),t.get(r.related_field).push(r)):n.push(r))}),t.forEach((r,l)=>{const s=this.findFormElementByFieldPath(l);if(!s){console.warn(`External action: Could not find form element for field "${l}", treating as form-level actions`),o.push(...r);return}let i=s.closest(".fb-field-wrapper");if(i||(i=s.parentElement),!i){console.warn(`External action: Could not find wrapper for field "${l}"`);return}const d=i.querySelector(".external-actions-container");d&&d.remove();const u=document.createElement("div");u.className="external-actions-container mt-3 flex flex-wrap gap-2";const c=this.findSchemaElement(l);r.forEach(m=>{const f=document.createElement("button");f.type="button",be(f,!1);const h=this.resolveActionLabel(m.key,m.label,c);f.textContent=h,f.addEventListener("click",g=>{g.preventDefault(),g.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(m.value,m.key,m.related_field)}),u.appendChild(f)}),i.appendChild(u)});const a=[...n,...o];a.length>0&&this.renderFormLevelActions(a,n)}handlePrefillHintClick(t){const n=t.target;if(!n.classList.contains("fb-prefill-hint"))return;t.preventDefault(),t.stopPropagation();const o=n.getAttribute("data-hint-values"),a=n.getAttribute("data-container-key");if(!o||!a){console.warn("Prefill hint missing required data attributes");return}try{const r=JSON.parse(o);for(const l in r){const s=`${a}.${l}`,i=r[l];this.updateField(s,i)}}catch(r){console.error("Error parsing prefill hint values:",r)}}renderForm(t,n,o,a){const r=D(n);if(r.length>0){console.error("Schema validation errors:",r);return}this.state.formRoot=t,this.state.schema=n,this.state.externalActions=a||null,H(t),t.setAttribute("data-fb-root","true"),Ft(t,this.state.config.theme);const l=document.createElement("div");l.className="space-y-6",n.elements.forEach(s=>{if(s.hidden)return;const i=G(s,{path:"",prefill:o||{},formData:o||{},state:this.state,instance:this});l.appendChild(i)}),t.appendChild(l),this.state.config.readonly||t.addEventListener("click",this.handlePrefillHintClick.bind(this)),this.state.config.readonly&&this.state.externalActions&&Array.isArray(this.state.externalActions)&&this.renderExternalActions()}validateForm(t=!1){if(!this.state.schema||!this.state.formRoot)return{valid:!0,errors:[],data:{}};const n=[],o={},a=(r,l,s=null)=>{const i=r.key,d={scopeRoot:s||this.state.formRoot,state:this.state,instance:this,path:l.path,skipValidation:t},u=qt(r,i,d);return u!==null?(n.push(...u.errors),u.value):(console.warn(`Unknown field type "${r.type}" for key "${i}"`),null)};return ft(a),this.state.schema.elements.forEach(r=>{if(r.displayIf)try{if(!R(r.displayIf,o))return}catch(l){console.error(`Error evaluating displayIf for field "${r.key}" during validation:`,l)}r.hidden?o[r.key]=r.default!==void 0?r.default:null:o[r.key]=a(r,{path:""})}),{valid:n.length===0,errors:n,data:o}}getFormData(){return this.validateForm(!1)}submitForm(){const t=this.validateForm(!1);return t.valid&&typeof window!="undefined"&&window.parent&&window.parent.postMessage({type:"formSubmit",data:t.data,schema:this.state.schema},"*"),t}saveDraft(){const t=this.validateForm(!0);return typeof window!="undefined"&&window.parent&&window.parent.postMessage({type:"formDraft",data:t.data,schema:this.state.schema},"*"),t}clearForm(){if(!this.state.schema||!this.state.formRoot){console.warn("clearForm: Form not initialized. Call renderForm() first.");return}const t=this.state.schema,n=this.state.formRoot,o=this.state.externalActions,a=this.buildHiddenFieldsData(t.elements);this.renderForm(n,t,a,o||void 0)}buildHiddenFieldsData(t){const n={};for(const o of t){const a=o.key;if(o.hidden&&o.default!==void 0&&(n[a]=o.default),o.type==="container"||o.type==="group"){const r=o,l=this.buildHiddenFieldsData(r.elements);Object.keys(l).length>0&&(a in n?typeof n[a]=="object"&&n[a]!==null&&!Array.isArray(n[a])&&(n[a]={...n[a],...l}):n[a]=l)}}return n}setFormData(t){if(!this.state.schema||!this.state.formRoot){console.warn("setFormData: Form not initialized. Call renderForm() first.");return}for(const n in t)this.updateField(n,t[n])}updateField(t,n){if(!this.state.schema||!this.state.formRoot){console.warn("updateField: Form not initialized. Call renderForm() first.");return}const o=this.findSchemaElement(t);if(!o){console.warn(`updateField: Schema element not found for path "${t}"`);return}const a=this.findFormElementByFieldPath(t);if(!a){console.warn(`updateField: DOM element not found for path "${t}"`);return}this.updateFieldValue(a,o,t,n),(this.state.config.onChange||this.state.config.onFieldChange)&&this.triggerOnChange(t,n)}updateFieldValue(t,n,o,a){const r={scopeRoot:this.state.formRoot,state:this.state,instance:this,path:""};Tt(n,o,a,r)||console.warn(`updateField: No updater found for field type "${n.type}" at path "${o}"`)}reevaluateConditionalFields(){if(!this.state.schema||!this.state.formRoot)return;const t=this.validateForm(!0).data,n=(o,a)=>{o.forEach(r=>{const l=a?`${a}.${r.key}`:r.key;if(r.displayIf&&this.state.formRoot.querySelectorAll(`[data-field-key="${r.key}"]`).forEach(s=>{var i,d;try{const u=R(r.displayIf,t),c=s.getAttribute("data-conditionally-hidden")==="true";if(u&&c){const m=G(r,{path:l,prefill:t,formData:t,state:this.state,instance:this});(i=s.parentNode)==null||i.replaceChild(m,s)}else if(!u&&!c){const m=document.createElement("div");m.className="fb-field-wrapper-hidden",m.style.display="none",m.setAttribute("data-field-key",r.key),m.setAttribute("data-conditionally-hidden","true"),(d=s.parentNode)==null||d.replaceChild(m,s)}}catch(u){console.error(`Error re-evaluating displayIf for field "${r.key}":`,u)}}),(r.type==="container"||r.type==="group")&&"elements"in r&&r.elements){const s=t==null?void 0:t[r.key];Array.isArray(s)?s.forEach((i,d)=>{n(r.elements,`${l}[${d}]`)}):n(r.elements,l)}})};n(this.state.schema.elements,"")}destroy(){var t;this.state.debounceTimer!==null&&(clearTimeout(this.state.debounceTimer),this.state.debounceTimer=null),this.state.resourceIndex.clear(),this.state.formRoot&&H(this.state.formRoot),this.state.formRoot=null,this.state.schema=null,this.state.externalActions=null,this.state.config.verboseErrors&&((t=globalThis.__formBuilderInstances)==null||t.delete(this.instanceId))}}function Ce(e){return new I(e)}return typeof window!="undefined"&&(window.FormBuilder=I,window.createFormBuilder=Ce,window.validateSchema=D),N.FormBuilderInstance=I,N.createFormBuilder=Ce,N.default=I,N.defaultTheme=M,N.exampleThemes=Nt,N.validateSchema=D,Object.defineProperty(N,"__esModule",{value:!0}),N})({});
322
+ `,t.forEach(r=>{const l=document.createElement("button");l.type="button",ye(l,!0);const i=n.includes(r),s=this.resolveActionLabel(r.key,r.label,null,i);l.textContent=s,l.addEventListener("click",d=>{d.preventDefault(),d.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(r.value,r.key,null)}),a.appendChild(l)}),this.state.formRoot.appendChild(a)}renderExternalActions(){if(!this.state.externalActions||!Array.isArray(this.state.externalActions))return;const t=new Map,n=[],o=[];this.state.externalActions.forEach(r=>{!r.key||!r.value||(r.related_field?(t.has(r.related_field)||t.set(r.related_field,[]),t.get(r.related_field).push(r)):n.push(r))}),t.forEach((r,l)=>{const i=this.findFormElementByFieldPath(l);if(!i){console.warn(`External action: Could not find form element for field "${l}", treating as form-level actions`),o.push(...r);return}let s=i.closest(".fb-field-wrapper");if(s||(s=i.parentElement),!s){console.warn(`External action: Could not find wrapper for field "${l}"`);return}const d=s.querySelector(".external-actions-container");d&&d.remove();const u=document.createElement("div");u.className="external-actions-container mt-3 flex flex-wrap gap-2";const c=this.findSchemaElement(l);r.forEach(m=>{const v=document.createElement("button");v.type="button",ye(v,!1);const f=this.resolveActionLabel(m.key,m.label,c);v.textContent=f,v.addEventListener("click",y=>{y.preventDefault(),y.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(m.value,m.key,m.related_field)}),u.appendChild(v)}),s.appendChild(u)});const a=[...n,...o];a.length>0&&this.renderFormLevelActions(a,n)}handlePrefillHintClick(t){const n=t.target;if(!n.classList.contains("fb-prefill-hint"))return;t.preventDefault(),t.stopPropagation();const o=n.getAttribute("data-hint-values"),a=n.getAttribute("data-container-key");if(!o||!a){console.warn("Prefill hint missing required data attributes");return}try{const r=JSON.parse(o);for(const l in r){const i=`${a}.${l}`,s=r[l];this.updateField(i,s)}}catch(r){console.error("Error parsing prefill hint values:",r)}}renderForm(t,n,o,a){const r=I(n);if(r.length>0){console.error("Schema validation errors:",r);return}this.state.formRoot=t,this.state.schema=n,this.state.externalActions=a||null,T(t),t.setAttribute("data-fb-root","true"),Lt(t,this.state.config.theme);const l=document.createElement("div");l.className="space-y-6",n.elements.forEach(i=>{if(i.hidden)return;const s=J(i,{path:"",prefill:o||{},formData:o||{},state:this.state,instance:this});l.appendChild(s)}),t.appendChild(l),this.state.config.readonly||t.addEventListener("click",this.handlePrefillHintClick.bind(this)),this.state.config.readonly&&this.state.externalActions&&Array.isArray(this.state.externalActions)&&this.renderExternalActions()}validateForm(t=!1){if(!this.state.schema||!this.state.formRoot)return{valid:!0,errors:[],data:{}};const n=[],o={},a=(r,l,i=null)=>{const s=r.key,d={scopeRoot:i||this.state.formRoot,state:this.state,instance:this,path:l.path,skipValidation:t},u=qt(r,s,d);return u!==null?(n.push(...u.errors),u.value):(console.warn(`Unknown field type "${r.type}" for key "${s}"`),null)};return mt(a),this.state.schema.elements.forEach(r=>{if(r.displayIf)try{if(!R(r.displayIf,o))return}catch(l){console.error(`Error evaluating displayIf for field "${r.key}" during validation:`,l)}r.hidden?o[r.key]=r.default!==void 0?r.default:null:o[r.key]=a(r,{path:""})}),{valid:n.length===0,errors:n,data:o}}getFormData(){return this.validateForm(!1)}submitForm(){const t=this.validateForm(!1);return t.valid&&typeof window!="undefined"&&window.parent&&window.parent.postMessage({type:"formSubmit",data:t.data,schema:this.state.schema},"*"),t}saveDraft(){const t=this.validateForm(!0);return typeof window!="undefined"&&window.parent&&window.parent.postMessage({type:"formDraft",data:t.data,schema:this.state.schema},"*"),t}clearForm(){if(!this.state.schema||!this.state.formRoot){console.warn("clearForm: Form not initialized. Call renderForm() first.");return}const t=this.state.schema,n=this.state.formRoot,o=this.state.externalActions,a=this.buildHiddenFieldsData(t.elements);this.renderForm(n,t,a,o||void 0)}buildHiddenFieldsData(t){const n={};for(const o of t){const a=o.key;if(o.hidden&&o.default!==void 0&&(n[a]=o.default),o.type==="container"||o.type==="group"){const r=o,l=this.buildHiddenFieldsData(r.elements);Object.keys(l).length>0&&(a in n?typeof n[a]=="object"&&n[a]!==null&&!Array.isArray(n[a])&&(n[a]={...n[a],...l}):n[a]=l)}}return n}setFormData(t){if(!this.state.schema||!this.state.formRoot){console.warn("setFormData: Form not initialized. Call renderForm() first.");return}for(const n in t)this.updateField(n,t[n])}updateField(t,n){if(!this.state.schema||!this.state.formRoot){console.warn("updateField: Form not initialized. Call renderForm() first.");return}const o=this.findSchemaElement(t);if(!o){console.warn(`updateField: Schema element not found for path "${t}"`);return}const a=this.findFormElementByFieldPath(t);if(!a){console.warn(`updateField: DOM element not found for path "${t}"`);return}this.updateFieldValue(a,o,t,n),(this.state.config.onChange||this.state.config.onFieldChange)&&this.triggerOnChange(t,n)}updateFieldValue(t,n,o,a){const r={scopeRoot:this.state.formRoot,state:this.state,instance:this,path:""};At(n,o,a,r)||console.warn(`updateField: No updater found for field type "${n.type}" at path "${o}"`)}reevaluateConditionalFields(){if(!this.state.schema||!this.state.formRoot)return;const t=this.validateForm(!0).data,n=(o,a)=>{o.forEach(r=>{const l=a?`${a}.${r.key}`:r.key;if(r.displayIf&&this.state.formRoot.querySelectorAll(`[data-field-key="${r.key}"]`).forEach(i=>{var s,d;try{const u=R(r.displayIf,t),c=i.getAttribute("data-conditionally-hidden")==="true";if(u&&c){const m=J(r,{path:l,prefill:t,formData:t,state:this.state,instance:this});(s=i.parentNode)==null||s.replaceChild(m,i)}else if(!u&&!c){const m=document.createElement("div");m.className="fb-field-wrapper-hidden",m.style.display="none",m.setAttribute("data-field-key",r.key),m.setAttribute("data-conditionally-hidden","true"),(d=i.parentNode)==null||d.replaceChild(m,i)}}catch(u){console.error(`Error re-evaluating displayIf for field "${r.key}":`,u)}}),(r.type==="container"||r.type==="group")&&"elements"in r&&r.elements){const i=t==null?void 0:t[r.key];Array.isArray(i)?i.forEach((s,d)=>{n(r.elements,`${l}[${d}]`)}):n(r.elements,l)}})};n(this.state.schema.elements,"")}destroy(){var t;this.state.debounceTimer!==null&&(clearTimeout(this.state.debounceTimer),this.state.debounceTimer=null),this.state.resourceIndex.clear(),this.state.formRoot&&T(this.state.formRoot),this.state.formRoot=null,this.state.schema=null,this.state.externalActions=null,this.state.config.verboseErrors&&((t=globalThis.__formBuilderInstances)==null||t.delete(this.instanceId))}}function xe(e){return new j(e)}return typeof window!="undefined"&&(window.FormBuilder=j,window.createFormBuilder=xe,window.validateSchema=I),F.FormBuilderInstance=j,F.createFormBuilder=xe,F.default=j,F.defaultTheme=H,F.exampleThemes=Ft,F.validateSchema=I,Object.defineProperty(F,"__esModule",{value:!0}),F})({});