@dmitryvim/form-builder 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/formbuilder.min.js +70 -70
- package/dist/browser/formbuilder.v0.2.17.min.js +358 -0
- package/dist/cjs/index.cjs +58 -29
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +57 -28
- package/dist/esm/index.js.map +1 -1
- package/dist/form-builder.js +70 -70
- package/package.json +1 -1
- package/dist/browser/formbuilder.v0.2.15.min.js +0 -358
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var FormBuilder=(function(
|
|
1
|
+
var FormBuilder=(function(q){"use strict";function $(e,t,n){const o=t.config.locale||"en",a=t.config.translations[o],l=t.config.translations.en;let r=(a==null?void 0:a[e])||(l==null?void 0:l[e])||e;if(n)for(const[i,s]of Object.entries(n))r=r.replace(new RegExp(`\\{${i}\\}`,"g"),String(s));return r}function qe(e,t,n){(e.minLength!=null||e.maxLength!=null)&&(e.minLength!=null&&e.maxLength!=null?t.push($("hintLengthRange",n,{min:e.minLength,max:e.maxLength})):e.maxLength!=null?t.push($("hintMaxLength",n,{max:e.maxLength})):e.minLength!=null&&t.push($("hintMinLength",n,{min:e.minLength})))}function Me(e,t,n){(e.min!=null||e.max!=null)&&(e.min!=null&&e.max!=null?t.push($("hintValueRange",n,{min:e.min,max:e.max})):e.max!=null?t.push($("hintMaxValue",n,{max:e.max})):e.min!=null&&t.push($("hintMinValue",n,{min:e.min})))}function He(e,t,n){e.maxSizeMB&&t.push($("hintMaxSize",n,{size:e.maxSizeMB}))}function Be(e,t,n){var o;(o=e.accept)!=null&&o.extensions&&t.push($("hintFormats",n,{formats:e.accept.extensions.map(a=>a.toUpperCase()).join(",")}))}function Ie(e,t,n){e.pattern&&t.push($("hintPattern",n,{pattern:e.pattern}))}function T(e,t){const n=[];return qe(e,n,t),e.type!=="slider"&&Me(e,n,t),He(e,n,t),Be(e,n,t),Ie(e,n,t),n.join(" \u2022 ")}function V(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;if("columns"in e&&e.columns!==void 0){const o=e.columns,a=[1,2,3,4];(!Number.isInteger(o)||!a.includes(o))&&t.push(`schema.columns must be 1, 2, 3, or 4 (got ${o})`)}if("prefillHints"in e&&e.prefillHints){const o=e.prefillHints;Array.isArray(o)&&o.forEach((a,l)=>{if((!a.label||typeof a.label!="string")&&t.push(`schema.prefillHints[${l}] must have a 'label' property of type string`),!a.values||typeof a.values!="object")t.push(`schema.prefillHints[${l}] must have a 'values' property of type object`);else for(const r in a.values)e.elements.some(i=>i.key===r)||t.push(`schema.prefillHints[${l}] references non-existent field "${r}"`)})}function n(o,a){o.forEach((l,r)=>{const i=`${a}[${r}]`;if(l.type||t.push(`${i}: missing type`),l.key||t.push(`${i}: missing key`),l.enableIf){const s=l.enableIf;(!s.key||typeof s.key!="string")&&t.push(`${i}: enableIf must have a 'key' property of type string`),"equals"in s||t.push(`${i}: enableIf must have at least one operator (equals, etc.)`)}if(l.type==="group"&&"elements"in l&&l.elements&&n(l.elements,`${i}.elements`),l.type==="container"&&l.elements){if("columns"in l&&l.columns!==void 0){const s=l.columns,u=[1,2,3,4];(!Number.isInteger(s)||!u.includes(s))&&t.push(`${i}: columns must be 1, 2, 3, or 4 (got ${s})`)}if("prefillHints"in l&&l.prefillHints){const s=l.prefillHints;Array.isArray(s)&&s.forEach((u,d)=>{if((!u.label||typeof u.label!="string")&&t.push(`${i}: prefillHints[${d}] must have a 'label' property of type string`),!u.values||typeof u.values!="object")t.push(`${i}: prefillHints[${d}] must have a 'values' property of type object`);else for(const c in u.values)l.elements.some(h=>h.key===c)||t.push(`container "${l.key}": prefillHints[${d}] references non-existent field "${c}"`)})}n(l.elements,`${i}.elements`)}if(l.type==="select"&&l.options){const s=l.default;s!=null&&s!==""&&(l.options.some(u=>u.value===s)||t.push(`${i}: default "${s}" not in options`))}})}return Array.isArray(e.elements)&&n(e.elements,"elements"),t}function R(e){return e&&typeof e=="object"&&e.constructor===Object}function S(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function M(e,t){return e?`${e}.${t}`:t}function I(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function W(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 l=parseInt(a.slice(1,-1),10);if(!Array.isArray(o)||isNaN(l))return;o=o[l]}else o=o[a]}return o}function H(e,t,n){var o;if(!e||!e.key)throw new Error("Invalid enableIf condition: must have a 'key' property");const a=(o=e.scope)!=null?o:"relative";let l;if(a==="relative")l=n!=null?n:t;else if(a==="absolute")l=t;else throw new Error(`Invalid enableIf scope: must be "relative" or "absolute" (got "${a}")`);const r=W(l,e.key);if("equals"in e)return ze(r,e.equals);throw new Error("Invalid enableIf condition: no recognized operator (equals, etc.)")}function ze(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 enableIf comparison, using reference equality"),e===t;throw n}return e===t}function D(e,t,n=!1){const o=document.createElement("span");o.className="char-counter",o.style.cssText=`
|
|
2
2
|
position: absolute;
|
|
3
3
|
${n?"bottom: 8px":"top: 50%; transform: translateY(-50%)"};
|
|
4
4
|
right: 10px;
|
|
@@ -7,7 +7,7 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
7
7
|
pointer-events: none;
|
|
8
8
|
background: var(--fb-background-color);
|
|
9
9
|
padding: 0 4px;
|
|
10
|
-
`;const a=()=>{const l=t.value.length,r=e.minLength,i=e.maxLength;if(r==null&&i==null){o.textContent="";return}l===0||r!=null&&l<r?(r!=null&&i!=null?o.textContent=`${r}-${i}`:i!=null?o.textContent=`\u2264${i}`:r!=null&&(o.textContent=`\u2265${r}`),o.style.color="var(--fb-text-secondary-color)"):i!=null&&l>i?(o.textContent=`${l}/${i}`,o.style.color="var(--fb-error-color)"):(i!=null?o.textContent=`${l}/${i}`:o.textContent=`${l}`,o.style.color="var(--fb-text-secondary-color)")};return t.addEventListener("input",a),a(),o}function
|
|
10
|
+
`;const a=()=>{const l=t.value.length,r=e.minLength,i=e.maxLength;if(r==null&&i==null){o.textContent="";return}l===0||r!=null&&l<r?(r!=null&&i!=null?o.textContent=`${r}-${i}`:i!=null?o.textContent=`\u2264${i}`:r!=null&&(o.textContent=`\u2265${r}`),o.style.color="var(--fb-text-secondary-color)"):i!=null&&l>i?(o.textContent=`${l}/${i}`,o.style.color="var(--fb-error-color)"):(i!=null?o.textContent=`${l}/${i}`:o.textContent=`${l}`,o.style.color="var(--fb-text-secondary-color)")};return t.addEventListener("input",a),a(),o}function Re(e,t,n,o){const a=t.state,l=document.createElement("div");l.style.cssText="position: relative;";const r=document.createElement("input");if(r.type="text",r.className="w-full rounded-lg",r.style.cssText=`
|
|
11
11
|
padding: var(--fb-input-padding-y) var(--fb-input-padding-x);
|
|
12
12
|
padding-right: 60px;
|
|
13
13
|
border: var(--fb-border-width) solid var(--fb-border-color);
|
|
@@ -19,7 +19,7 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
19
19
|
transition: all var(--fb-transition-duration) ease-in-out;
|
|
20
20
|
width: 100%;
|
|
21
21
|
box-sizing: border-box;
|
|
22
|
-
`,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=()=>{const s=r.value===""?null:r.value;t.instance.triggerOnChange(o,s)};r.addEventListener("blur",i),r.addEventListener("input",i)}if(l.appendChild(r),!a.config.readonly&&(e.minLength!=null||e.maxLength!=null)){const i=
|
|
22
|
+
`,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=()=>{const s=r.value===""?null:r.value;t.instance.triggerOnChange(o,s)};r.addEventListener("blur",i),r.addEventListener("input",i)}if(l.appendChild(r),!a.config.readonly&&(e.minLength!=null||e.maxLength!=null)){const i=D(e,r,!1);l.appendChild(i)}n.appendChild(l)}function De(e,t,n,o){var a,l;const r=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],u=(a=e.minCount)!=null?a:1,d=(l=e.maxCount)!=null?l:1/0;for(;s.length<u;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function h(){c.querySelectorAll(".multiple-text-item").forEach((p,C)=>{const y=p.querySelector("input");y&&(y.name=`${o}[${C}]`)})}function f(p="",C=-1){const y=document.createElement("div");y.className="multiple-text-item flex items-center gap-2";const b=document.createElement("div");b.style.cssText="position: relative; flex: 1;";const x=document.createElement("input");if(x.type="text",x.style.cssText=`
|
|
23
23
|
padding: var(--fb-input-padding-y) var(--fb-input-padding-x);
|
|
24
24
|
padding-right: 60px;
|
|
25
25
|
border: var(--fb-border-width) solid var(--fb-border-color);
|
|
@@ -31,27 +31,27 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
31
31
|
transition: all var(--fb-transition-duration) ease-in-out;
|
|
32
32
|
width: 100%;
|
|
33
33
|
box-sizing: border-box;
|
|
34
|
-
`,x.placeholder=e.placeholder||$("placeholderText",r),x.value=
|
|
34
|
+
`,x.placeholder=e.placeholder||$("placeholderText",r),x.value=p,x.readOnly=r.config.readonly,r.config.readonly||(x.addEventListener("focus",()=>{x.style.borderColor="var(--fb-border-focus-color)",x.style.outline="var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)",x.style.outlineOffset="0"}),x.addEventListener("blur",()=>{x.style.borderColor="var(--fb-border-color)",x.style.outline="none"}),x.addEventListener("mouseenter",()=>{document.activeElement!==x&&(x.style.borderColor="var(--fb-border-hover-color)")}),x.addEventListener("mouseleave",()=>{document.activeElement!==x&&(x.style.borderColor="var(--fb-border-color)")})),!r.config.readonly&&t.instance){const w=()=>{const k=x.value===""?null:x.value;t.instance.triggerOnChange(x.name,k)};x.addEventListener("blur",w),x.addEventListener("input",w)}if(b.appendChild(x),!r.config.readonly&&(e.minLength!=null||e.maxLength!=null)){const w=D(e,x,!1);b.appendChild(w)}return y.appendChild(b),C===-1?c.appendChild(y):c.insertBefore(y,c.children[C]),h(),y}function m(){if(r.config.readonly)return;const p=c.querySelectorAll(".multiple-text-item"),C=p.length;p.forEach(y=>{let b=y.querySelector(".remove-item-btn");b||(b=document.createElement("button"),b.type="button",b.className="remove-item-btn px-2 py-1 rounded",b.style.cssText=`
|
|
35
35
|
color: var(--fb-error-color);
|
|
36
36
|
background-color: transparent;
|
|
37
37
|
transition: background-color var(--fb-transition-duration);
|
|
38
|
-
`,
|
|
38
|
+
`,b.innerHTML="\u2715",b.addEventListener("mouseenter",()=>{b.style.backgroundColor="var(--fb-background-hover-color)"}),b.addEventListener("mouseleave",()=>{b.style.backgroundColor="transparent"}),b.onclick=()=>{const w=Array.from(c.children).indexOf(y);c.children.length>u&&(s.splice(w,1),y.remove(),h(),E(),m())},y.appendChild(b));const x=C<=u;b.disabled=x,b.style.opacity=x?"0.5":"1",b.style.pointerEvents=x?"none":"auto"})}let g=null,v=null;if(!r.config.readonly){g=document.createElement("div"),g.className="flex items-center gap-3 mt-2";const p=document.createElement("button");p.type="button",p.className="add-text-btn px-3 py-1 rounded",p.style.cssText=`
|
|
39
39
|
color: var(--fb-primary-color);
|
|
40
40
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
41
41
|
background-color: transparent;
|
|
42
42
|
font-size: var(--fb-font-size);
|
|
43
43
|
transition: all var(--fb-transition-duration);
|
|
44
|
-
`,
|
|
44
|
+
`,p.textContent="+",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{s.push(e.default||""),f(e.default||""),E(),m()},v=document.createElement("span"),v.className="text-sm text-gray-500",g.appendChild(p),g.appendChild(v),n.appendChild(g)}function E(){if(!g||!v)return;const p=g.querySelector(".add-text-btn");if(p){const C=s.length>=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"}v.textContent=`${s.length}/${d===1/0?"\u221E":d}`}s.forEach(p=>f(p)),E(),m()}function ne(e,t,n){var o,a,l;const r=[],{scopeRoot:i,skipValidation:s}=n,u=(c,h)=>{var f,m;if(!c)return;const g=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let v=document.getElementById(g);h?(c.classList.add("invalid"),c.title=h,v||(v=document.createElement("div"),v.id=g,v.className="error-message",v.style.cssText=`
|
|
45
45
|
color: var(--fb-error-color);
|
|
46
46
|
font-size: var(--fb-font-size-small);
|
|
47
47
|
margin-top: 0.25rem;
|
|
48
|
-
`,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(
|
|
48
|
+
`,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(v,c.nextSibling):(m=c.parentNode)==null||m.appendChild(v)),v.textContent=h,v.style.display="block"):(c.classList.remove("invalid"),c.title="",v&&v.remove())},d=(c,h,f)=>{let m=!1;const{state:g}=n;if(!s&&h){if(e.minLength!==void 0&&e.minLength!==null&&h.length<e.minLength){const v=$("minLength",g,{min:e.minLength});r.push(`${f}: ${v}`),u(c,v),m=!0}else if(e.maxLength!==void 0&&e.maxLength!==null&&h.length>e.maxLength){const v=$("maxLength",g,{max:e.maxLength});r.push(`${f}: ${v}`),u(c,v),m=!0}else if(e.pattern)try{if(!new RegExp(e.pattern).test(h)){const v=$("patternMismatch",g);r.push(`${f}: ${v}`),u(c,v),m=!0}}catch(v){const E=$("invalidPattern",g);r.push(`${f}: ${E}`),u(c,E),m=!0}}m||u(c,null)};if(e.multiple){const c=i.querySelectorAll(`[name^="${t}["]`),h=[],f=[];if(c.forEach((m,g)=>{var v;const E=(v=m==null?void 0:m.value)!=null?v:"";f.push(E),h.push(E===""?null:E),d(m,E,`${t}[${g}]`)}),!s){const{state:m}=n,g=(o=e.minCount)!=null?o:1,v=(a=e.maxCount)!=null?a:1/0,E=f.filter(p=>p.trim()!=="");e.required&&E.length===0&&r.push(`${t}: ${$("required",m)}`),E.length<g&&r.push(`${t}: ${$("minItems",m,{min:g})}`),E.length>v&&r.push(`${t}: ${$("maxItems",m,{max:v})}`)}return{value:h,errors:r}}else{const c=i.querySelector(`[name$="${t}"]`),h=(l=c==null?void 0:c.value)!=null?l:"";if(!s&&e.required&&h===""){const f=$("required",n.state);return r.push(`${t}: ${f}`),u(c,f),{value:null,errors:r}}return c&&d(c,h,t),{value:h===""?null:h,errors:r}}}function re(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 l=a.querySelectorAll(`[name^="${t}["]`);l.forEach((r,i)=>{i<n.length&&(r.value=n[i]!=null?String(n[i]):"",r.classList.remove("invalid"),r.title="")}),n.length!==l.length&&console.warn(`updateTextField: Multiple field "${t}" has ${l.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const l=a.querySelector(`[name="${t}"]`);l&&(l.value=n!=null?String(n):"",l.classList.remove("invalid"),l.title="")}}function je(e,t,n,o){const a=t.state,l=document.createElement("div");l.style.cssText="position: relative;";const 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.style.cssText="padding-bottom: 24px;",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=()=>{const s=r.value===""?null:r.value;t.instance.triggerOnChange(o,s)};r.addEventListener("blur",i),r.addEventListener("input",i)}if(l.appendChild(r),!a.config.readonly&&(e.minLength!=null||e.maxLength!=null)){const i=D(e,r,!0);l.appendChild(i)}n.appendChild(l)}function Oe(e,t,n,o){var a,l;const r=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],u=(a=e.minCount)!=null?a:1,d=(l=e.maxCount)!=null?l:1/0;for(;s.length<u;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function h(){c.querySelectorAll(".multiple-textarea-item").forEach((p,C)=>{const y=p.querySelector("textarea");y&&(y.name=`${o}[${C}]`)})}function f(p="",C=-1){const y=document.createElement("div");y.className="multiple-textarea-item";const b=document.createElement("div");b.style.cssText="position: relative;";const x=document.createElement("textarea");if(x.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",x.style.cssText="padding-bottom: 24px;",x.placeholder=e.placeholder||$("placeholderText",r),x.rows=e.rows||4,x.value=p,x.readOnly=r.config.readonly,!r.config.readonly&&t.instance){const w=()=>{const k=x.value===""?null:x.value;t.instance.triggerOnChange(x.name,k)};x.addEventListener("blur",w),x.addEventListener("input",w)}if(b.appendChild(x),!r.config.readonly&&(e.minLength!=null||e.maxLength!=null)){const w=D(e,x,!0);b.appendChild(w)}return y.appendChild(b),C===-1?c.appendChild(y):c.insertBefore(y,c.children[C]),h(),y}function m(){if(r.config.readonly)return;const p=c.querySelectorAll(".multiple-textarea-item"),C=p.length;p.forEach(y=>{let b=y.querySelector(".remove-item-btn");b||(b=document.createElement("button"),b.type="button",b.className="remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm",b.innerHTML="\u2715",b.onclick=()=>{const w=Array.from(c.children).indexOf(y);c.children.length>u&&(s.splice(w,1),y.remove(),h(),E(),m())},y.appendChild(b));const x=C<=u;b.disabled=x,b.style.opacity=x?"0.5":"1",b.style.pointerEvents=x?"none":"auto"})}let g=null,v=null;if(!r.config.readonly){g=document.createElement("div"),g.className="flex items-center gap-3 mt-2";const p=document.createElement("button");p.type="button",p.className="add-textarea-btn px-3 py-1 rounded",p.style.cssText=`
|
|
49
49
|
color: var(--fb-primary-color);
|
|
50
50
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
51
51
|
background-color: transparent;
|
|
52
52
|
font-size: var(--fb-font-size);
|
|
53
53
|
transition: all var(--fb-transition-duration);
|
|
54
|
-
`,
|
|
54
|
+
`,p.textContent="+",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{s.push(e.default||""),f(e.default||""),E(),m()},v=document.createElement("span"),v.className="text-sm text-gray-500",g.appendChild(p),g.appendChild(v),n.appendChild(g)}function E(){if(!g||!v)return;const p=g.querySelector(".add-textarea-btn");if(p){const C=s.length>=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"}v.textContent=`${s.length}/${d===1/0?"\u221E":d}`}s.forEach(p=>f(p)),E(),m()}function Pe(e,t,n){return ne(e,t,n)}function Ue(e,t,n,o){re(e,t,n,o)}function oe(e,t){const n=document.createElement("span");n.className="number-range-hint",n.style.cssText=`
|
|
55
55
|
position: absolute;
|
|
56
56
|
top: 50%;
|
|
57
57
|
transform: translateY(-50%);
|
|
@@ -61,65 +61,65 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
61
61
|
pointer-events: none;
|
|
62
62
|
background: var(--fb-background-color);
|
|
63
63
|
padding: 0 4px;
|
|
64
|
-
`;const o=e.min,a=e.max;let l="";o!=null&&a!=null?l=`${o} \u2013 ${a}`:a!=null?l=`\u2264${a}`:o!=null&&(l=`\u2265${o}`),n.textContent=l;const r=()=>{const i=t.value?parseFloat(t.value):null;if(i!=null){const s=o!=null&&i<o,u=a!=null&&i>a;n.style.color=s||u?"var(--fb-error-color)":"var(--fb-text-secondary-color)"}else n.style.color="var(--fb-text-secondary-color)"};return t.addEventListener("input",r),r(),n}function
|
|
64
|
+
`;const o=e.min,a=e.max;let l="";o!=null&&a!=null?l=`${o} \u2013 ${a}`:a!=null?l=`\u2264${a}`:o!=null&&(l=`\u2265${o}`),n.textContent=l;const r=()=>{const i=t.value?parseFloat(t.value):null;if(i!=null){const s=o!=null&&i<o,u=a!=null&&i>a;n.style.color=s||u?"var(--fb-error-color)":"var(--fb-text-secondary-color)"}else n.style.color="var(--fb-text-secondary-color)"};return t.addEventListener("input",r),r(),n}function Ve(e,t,n,o){const a=t.state,l=document.createElement("div");l.style.cssText="position: relative;";const 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.style.cssText="padding-right: 60px; width: 100%; box-sizing: border-box;",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)}if(l.appendChild(r),!a.config.readonly&&(e.min!=null||e.max!=null)){const i=oe(e,r);l.appendChild(i)}n.appendChild(l)}function We(e,t,n,o){var a,l;const r=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],u=(a=e.minCount)!=null?a:1,d=(l=e.maxCount)!=null?l:1/0;for(;s.length<u;)s.push(e.default||"");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function h(){c.querySelectorAll(".multiple-number-item").forEach((p,C)=>{const y=p.querySelector("input");y&&(y.name=`${o}[${C}]`)})}function f(p="",C=-1){const y=document.createElement("div");y.className="multiple-number-item flex items-center gap-2";const b=document.createElement("div");b.style.cssText="position: relative; flex: 1;";const x=document.createElement("input");if(x.type="number",x.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",x.style.cssText="padding-right: 60px; width: 100%; box-sizing: border-box;",x.placeholder=e.placeholder||"0",e.min!==void 0&&(x.min=e.min.toString()),e.max!==void 0&&(x.max=e.max.toString()),e.step!==void 0&&(x.step=e.step.toString()),x.value=p.toString(),x.readOnly=r.config.readonly,!r.config.readonly&&t.instance){const w=()=>{const k=x.value?parseFloat(x.value):null;t.instance.triggerOnChange(x.name,k)};x.addEventListener("blur",w),x.addEventListener("input",w)}if(b.appendChild(x),!r.config.readonly&&(e.min!=null||e.max!=null)){const w=oe(e,x);b.appendChild(w)}return y.appendChild(b),C===-1?c.appendChild(y):c.insertBefore(y,c.children[C]),h(),y}function m(){if(r.config.readonly)return;const p=c.querySelectorAll(".multiple-number-item"),C=p.length;p.forEach(y=>{let b=y.querySelector(".remove-item-btn");b||(b=document.createElement("button"),b.type="button",b.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",b.innerHTML="\u2715",b.onclick=()=>{const w=Array.from(c.children).indexOf(y);c.children.length>u&&(s.splice(w,1),y.remove(),h(),E(),m())},y.appendChild(b));const x=C<=u;b.disabled=x,b.style.opacity=x?"0.5":"1",b.style.pointerEvents=x?"none":"auto"})}let g=null,v=null;if(!r.config.readonly){g=document.createElement("div"),g.className="flex items-center gap-3 mt-2";const p=document.createElement("button");p.type="button",p.className="add-number-btn px-3 py-1 rounded",p.style.cssText=`
|
|
65
65
|
color: var(--fb-primary-color);
|
|
66
66
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
67
67
|
background-color: transparent;
|
|
68
68
|
font-size: var(--fb-font-size);
|
|
69
69
|
transition: all var(--fb-transition-duration);
|
|
70
|
-
`,
|
|
70
|
+
`,p.textContent="+",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{s.push(e.default||""),f(e.default||""),E(),m()},v=document.createElement("span"),v.className="text-sm text-gray-500",g.appendChild(p),g.appendChild(v),n.appendChild(g)}function E(){if(!g||!v)return;const p=g.querySelector(".add-number-btn");if(p){const C=s.length>=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"}v.textContent=`${s.length}/${d===1/0?"\u221E":d}`}s.forEach(p=>f(p)),E(),m()}function _e(e,t,n){var o,a,l,r,i;const s=[],{scopeRoot:u,skipValidation:d}=n,c=(f,m)=>{var g,v;if(!f)return;const E=`error-${f.getAttribute("name")||Math.random().toString(36).substring(7)}`;let p=document.getElementById(E);m?(f.classList.add("invalid"),f.title=m,p||(p=document.createElement("div"),p.id=E,p.className="error-message",p.style.cssText=`
|
|
71
71
|
color: var(--fb-error-color);
|
|
72
72
|
font-size: var(--fb-font-size-small);
|
|
73
73
|
margin-top: 0.25rem;
|
|
74
|
-
`,f.nextSibling?(
|
|
74
|
+
`,f.nextSibling?(g=f.parentNode)==null||g.insertBefore(p,f.nextSibling):(v=f.parentNode)==null||v.appendChild(p)),p.textContent=m,p.style.display="block"):(f.classList.remove("invalid"),f.title="",p&&p.remove())},h=(f,m,g)=>{let v=!1;const{state:E}=n;if(!d&&e.min!==void 0&&e.min!==null&&m<e.min){const p=$("minValue",E,{min:e.min});s.push(`${g}: ${p}`),c(f,p),v=!0}else if(!d&&e.max!==void 0&&e.max!==null&&m>e.max){const p=$("maxValue",E,{max:e.max});s.push(`${g}: ${p}`),c(f,p),v=!0}v||c(f,null)};if(e.multiple){const f=u.querySelectorAll(`[name^="${t}["]`),m=[];if(f.forEach((g,v)=>{var E,p,C;const y=(E=g==null?void 0:g.value)!=null?E:"";if(y===""){m.push(null),c(g,null);return}const b=parseFloat(y);if(!d&&!Number.isFinite(b)){const w=$("notANumber",n.state);s.push(`${t}[${v}]: ${w}`),c(g,w),m.push(null);return}h(g,b,`${t}[${v}]`);const x=Number.isInteger((p=e.decimals)!=null?p:0)&&(C=e.decimals)!=null?C:0;m.push(Number(b.toFixed(x)))}),!d){const{state:g}=n,v=(o=e.minCount)!=null?o:1,E=(a=e.maxCount)!=null?a:1/0,p=m.filter(C=>C!==null);e.required&&p.length===0&&s.push(`${t}: ${$("required",g)}`),p.length<v&&s.push(`${t}: ${$("minItems",g,{min:v})}`),p.length>E&&s.push(`${t}: ${$("maxItems",g,{max:E})}`)}return{value:m,errors:s}}else{const f=u.querySelector(`[name$="${t}"]`),m=(l=f==null?void 0:f.value)!=null?l:"",{state:g}=n;if(!d&&e.required&&m===""){const p=$("required",g);return s.push(`${t}: ${p}`),c(f,p),{value:null,errors:s}}if(m==="")return c(f,null),{value:null,errors:s};const v=parseFloat(m);if(!d&&!Number.isFinite(v)){const p=$("notANumber",g);return s.push(`${t}: ${p}`),c(f,p),{value:null,errors:s}}h(f,v,t);const E=Number.isInteger((r=e.decimals)!=null?r:0)&&(i=e.decimals)!=null?i:0;return{value:Number(v.toFixed(E)),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 l=a.querySelectorAll(`[name^="${t}["]`);l.forEach((r,i)=>{i<n.length&&(r.value=n[i]!=null?String(n[i]):"",r.classList.remove("invalid"),r.title="")}),n.length!==l.length&&console.warn(`updateNumberField: Multiple field "${t}" has ${l.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const l=a.querySelector(`[name="${t}"]`);l&&(l.value=n!=null?String(n):"",l.classList.remove("invalid"),l.title="")}}function Ye(e,t,n,o){const a=t.state,l=document.createElement("select");if(l.className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",l.name=o,l.disabled=a.config.readonly,(e.options||[]).forEach(r=>{const i=document.createElement("option");i.value=r.value,i.textContent=r.label,(t.prefill[e.key]||e.default)===r.value&&(i.selected=!0),l.appendChild(i)}),!a.config.readonly&&t.instance){const r=()=>{t.instance.triggerOnChange(o,l.value)};l.addEventListener("change",r)}if(n.appendChild(l),!a.config.readonly){const r=document.createElement("p");r.className="text-xs text-gray-500 mt-1",r.textContent=T(e,a),n.appendChild(r)}}function Ge(e,t,n,o){var a,l,r,i;const s=t.state,u=t.prefill[e.key]||[],d=Array.isArray(u)?[...u]:[],c=(a=e.minCount)!=null?a:1,h=(l=e.maxCount)!=null?l:1/0;for(;d.length<c;)d.push(e.default||((i=(r=e.options)==null?void 0:r[0])==null?void 0:i.value)||"");const f=document.createElement("div");f.className="space-y-2",n.appendChild(f);function m(){f.querySelectorAll(".multiple-select-item").forEach((y,b)=>{const x=y.querySelector("select");x&&(x.name=`${o}[${b}]`)})}function g(y="",b=-1){const x=document.createElement("div");x.className="multiple-select-item flex items-center gap-2";const w=document.createElement("select");if(w.className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",w.disabled=s.config.readonly,(e.options||[]).forEach(k=>{const L=document.createElement("option");L.value=k.value,L.textContent=k.label,y===k.value&&(L.selected=!0),w.appendChild(L)}),!s.config.readonly&&t.instance){const k=()=>{t.instance.triggerOnChange(w.name,w.value)};w.addEventListener("change",k)}return x.appendChild(w),b===-1?f.appendChild(x):f.insertBefore(x,f.children[b]),m(),x}function v(){if(s.config.readonly)return;const y=f.querySelectorAll(".multiple-select-item"),b=y.length;y.forEach(x=>{let w=x.querySelector(".remove-item-btn");w||(w=document.createElement("button"),w.type="button",w.className="remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded",w.innerHTML="\u2715",w.onclick=()=>{const L=Array.from(f.children).indexOf(x);f.children.length>c&&(d.splice(L,1),x.remove(),m(),C(),v())},x.appendChild(w));const k=b<=c;w.disabled=k,w.style.opacity=k?"0.5":"1",w.style.pointerEvents=k?"none":"auto"})}let E=null,p=null;if(!s.config.readonly){E=document.createElement("div"),E.className="flex items-center gap-3 mt-2";const y=document.createElement("button");y.type="button",y.className="add-select-btn px-3 py-1 rounded",y.style.cssText=`
|
|
75
75
|
color: var(--fb-primary-color);
|
|
76
76
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
77
77
|
background-color: transparent;
|
|
78
78
|
font-size: var(--fb-font-size);
|
|
79
79
|
transition: all var(--fb-transition-duration);
|
|
80
|
-
`,
|
|
80
|
+
`,y.textContent="+",y.addEventListener("mouseenter",()=>{y.style.backgroundColor="var(--fb-background-hover-color)"}),y.addEventListener("mouseleave",()=>{y.style.backgroundColor="transparent"}),y.onclick=()=>{var b,x;const w=e.default||((x=(b=e.options)==null?void 0:b[0])==null?void 0:x.value)||"";d.push(w),g(w),C(),v()},p=document.createElement("span"),p.className="text-sm text-gray-500",E.appendChild(y),E.appendChild(p),n.appendChild(E)}function C(){if(!E||!p)return;const y=E.querySelector(".add-select-btn");if(y){const b=d.length>=h;y.disabled=b,y.style.opacity=b?"0.5":"1",y.style.pointerEvents=b?"none":"auto"}p.textContent=`${d.length}/${h===1/0?"\u221E":h}`}if(d.forEach(y=>g(y)),C(),v(),!s.config.readonly){const y=document.createElement("p");y.className="text-xs text-gray-500 mt-1",y.textContent=T(e,s),n.appendChild(y)}}function Xe(e,t,n){var o;const a=[],{scopeRoot:l,skipValidation:r}=n,i=(u,d)=>{var c,h;if(!u)return;const f=`error-${u.getAttribute("name")||Math.random().toString(36).substring(7)}`;let m=document.getElementById(f);d?(u.classList.add("invalid"),u.title=d,m||(m=document.createElement("div"),m.id=f,m.className="error-message",m.style.cssText=`
|
|
81
81
|
color: var(--fb-error-color);
|
|
82
82
|
font-size: var(--fb-font-size-small);
|
|
83
83
|
margin-top: 0.25rem;
|
|
84
|
-
`,u.nextSibling?(c=u.parentNode)==null||c.insertBefore(m,u.nextSibling):(h=u.parentNode)==null||h.appendChild(m)),m.textContent=
|
|
84
|
+
`,u.nextSibling?(c=u.parentNode)==null||c.insertBefore(m,u.nextSibling):(h=u.parentNode)==null||h.appendChild(m)),m.textContent=d,m.style.display="block"):(u.classList.remove("invalid"),u.title="",m&&m.remove())},s=(u,d,c,h)=>{var f,m;if(r)return;const{state:g}=n,v=d.filter(h),E="minCount"in c&&(f=c.minCount)!=null?f:1,p="maxCount"in c&&(m=c.maxCount)!=null?m:1/0;c.required&&v.length===0&&a.push(`${u}: ${$("required",g)}`),v.length<E&&a.push(`${u}: ${$("minItems",g,{min:E})}`),v.length>p&&a.push(`${u}: ${$("maxItems",g,{max:p})}`)};if("multiple"in e&&e.multiple){const u=l.querySelectorAll(`[name^="${t}["]`),d=[];return u.forEach(c=>{var h;const f=(h=c==null?void 0:c.value)!=null?h:"";d.push(f),i(c,null)}),s(t,d,e,c=>c!==""),{value:d,errors:a}}else{const u=l.querySelector(`[name$="${t}"]`),d=(o=u==null?void 0:u.value)!=null?o:"";if(!r&&e.required&&d===""){const c=$("required",n.state);return a.push(`${t}: ${c}`),i(u,c),{value:null,errors:a}}else i(u,null);return{value:d===""?null:d,errors:a}}}function Ze(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 l=a.querySelectorAll(`[name^="${t}["]`);l.forEach((r,i)=>{i<n.length&&(r.value=n[i]!=null?String(n[i]):"",r.querySelectorAll("option").forEach(s=>{s.selected=s.value===String(n[i])}),r.classList.remove("invalid"),r.title="")}),n.length!==l.length&&console.warn(`updateSelectField: Multiple field "${t}" has ${l.length} selects but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const l=a.querySelector(`[name="${t}"]`);l&&(l.value=n!=null?String(n):"",l.querySelectorAll("option").forEach(r=>{r.selected=r.value===String(n)}),l.classList.remove("invalid"),l.title="")}}function Qe(e,t,n,o){const a=document.createElement("img");a.className="w-full h-full object-contain",a.alt=n||$("previewAlt",o);const l=new FileReader;l.onload=r=>{var i;a.src=((i=r.target)==null?void 0:i.result)||""},l.readAsDataURL(t),e.appendChild(a)}function Ke(e,t,n,o,a,l){const r=URL.createObjectURL(t);e.onclick=null;const i=e.cloneNode(!1);return e.parentNode&&e.parentNode.replaceChild(i,e),i.innerHTML=`
|
|
85
85
|
<div class="relative group h-full">
|
|
86
86
|
<video class="w-full h-full object-contain" controls preload="auto" muted src="${r}">
|
|
87
|
-
${
|
|
87
|
+
${S($("videoNotSupported",a))}
|
|
88
88
|
</video>
|
|
89
89
|
<div class="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1">
|
|
90
90
|
<button class="bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn">
|
|
91
|
-
${
|
|
91
|
+
${S($("removeElement",a))}
|
|
92
92
|
</button>
|
|
93
93
|
<button class="bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn">
|
|
94
|
-
${
|
|
94
|
+
${S($("changeButton",a))}
|
|
95
95
|
</button>
|
|
96
96
|
</div>
|
|
97
97
|
</div>
|
|
98
|
-
`,
|
|
98
|
+
`,et(i,o,a,l),i}function et(e,t,n,o){const a=e.querySelector(".change-file-btn");a&&(a.onclick=r=>{r.stopPropagation(),o!=null&&o.picker&&o.picker.click()});const l=e.querySelector(".delete-file-btn");l&&(l.onclick=r=>{r.stopPropagation(),tt(e,t,n,o)})}function tt(e,t,n,o){var a;n.resourceIndex.delete(t);const l=(a=e.parentElement)==null?void 0:a.querySelector('input[type="hidden"]');l&&(l.value=""),o!=null&&o.fileUploadHandler&&(e.onclick=o.fileUploadHandler),o!=null&&o.dragHandler&&Y(e,o.dragHandler),e.innerHTML=`
|
|
99
99
|
<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
100
100
|
<svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
|
|
101
101
|
<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"/>
|
|
102
102
|
</svg>
|
|
103
|
-
<div class="text-sm text-center">${
|
|
103
|
+
<div class="text-sm text-center">${S($("clickDragText",n))}</div>
|
|
104
104
|
</div>
|
|
105
|
-
`}function
|
|
105
|
+
`}function nt(e,t,n,o){const a=document.createElement("video");a.className="w-full h-full object-contain",a.controls=!0,a.preload="metadata",a.muted=!0,a.src=t,a.appendChild(document.createTextNode($("videoNotSupported",o))),e.appendChild(a)}function rt(e,t,n){it(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=`
|
|
106
106
|
<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
107
107
|
<svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
|
|
108
108
|
<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"/>
|
|
109
109
|
</svg>
|
|
110
|
-
<div class="text-sm text-center">${
|
|
110
|
+
<div class="text-sm text-center">${S($("clickDragText",n))}</div>
|
|
111
111
|
</div>
|
|
112
|
-
`})}async function
|
|
112
|
+
`})}async function ot(e,t,n,o,a,l,r){!t.file||!(t.file instanceof File)||(t.type&&t.type.startsWith("image/")?Qe(e,t.file,n,l):t.type&&t.type.startsWith("video/")?e=Ke(e,t.file,t.type,o,l,r):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">${S(n)}</div></div>`,!a&&!(t.type&&t.type.startsWith("video/"))&&rt(e,o,l))}async function lt(e,t,n,o,a){if(!a.config.getThumbnail){J(e,a);return}try{const l=await a.config.getThumbnail(t);if(l)if(I(e),o&&o.type&&o.type.startsWith("video/"))nt(e,l,o.type,a);else{const r=document.createElement("img");r.className="w-full h-full object-contain",r.alt=n||$("previewAlt",a),r.src=l,e.appendChild(r)}else J(e,a)}catch(l){console.error("Failed to get thumbnail:",l),e.innerHTML=`
|
|
113
113
|
<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
114
114
|
<svg class="w-6 h-6 mb-2" 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 class="text-sm text-center">${
|
|
117
|
+
<div class="text-sm text-center">${S(n||$("previewUnavailable",a))}</div>
|
|
118
118
|
</div>
|
|
119
|
-
`}}async function
|
|
119
|
+
`}}async function le(e,t,n,o={}){const{fileName:a="",isReadonly:l=!1,deps:r=null}=o;if(!l&&r&&(!r.picker||!r.fileUploadHandler||!r.dragHandler))throw new Error("renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}");I(e),l&&e.classList.add("cursor-pointer");const i=n.resourceIndex.get(t);i&&i.file&&i.file instanceof File?await ot(e,i,a,t,l,n,r):await lt(e,t,a,i,n)}async function _(e,t,n){var o,a;const l=t.resourceIndex.get(e),r=(l==null?void 0:l.name)||e.split("/").pop()||"file",i=r.toLowerCase().match(/\.psd$/),s=document.createElement("div");s.className=i?"space-y-2":"space-y-3";const u=document.createElement("div");i?u.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm":u.className="bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity";const d=!i&&(((o=l==null?void 0:l.type)==null?void 0:o.startsWith("image/"))||r.toLowerCase().match(/\.(jpg|jpeg|png|gif|webp)$/)),c=((a=l==null?void 0:l.type)==null?void 0:a.startsWith("video/"))||r.toLowerCase().match(/\.(mp4|webm|avi|mov)$/);if(d)if(t.config.getThumbnail)try{const m=await t.config.getThumbnail(e);m?u.innerHTML=`<img src="${m}" alt="${S(r)}" class="w-full h-auto">`:u.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">${S(r)}</div></div></div>`}catch(m){console.warn("getThumbnail failed for",e,m),u.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">${S(r)}</div></div></div>`}else u.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">${S(r)}</div></div></div>`;else if(c)if(t.config.getThumbnail)try{const m=await t.config.getThumbnail(e);m?u.innerHTML=`
|
|
120
120
|
<div class="relative group">
|
|
121
121
|
<video class="w-full h-auto" controls preload="auto" muted src="${m}">
|
|
122
|
-
${
|
|
122
|
+
${S($("videoNotSupported",t))}
|
|
123
123
|
</video>
|
|
124
124
|
<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">
|
|
125
125
|
<div class="bg-white bg-opacity-90 rounded-full p-3">
|
|
@@ -129,27 +129,27 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
129
129
|
</div>
|
|
130
130
|
</div>
|
|
131
131
|
</div>
|
|
132
|
-
`:u.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">${
|
|
132
|
+
`:u.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">${S(r)}</div></div></div>`}catch(m){console.warn("getThumbnail failed for video",e,m),u.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">${S(r)}</div></div></div>`}else u.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">${S(r)}</div></div></div>`;else{const m=i?"\u{1F3A8}":"\u{1F4C1}",g=i?"PSD File":"Document";i?u.innerHTML=`
|
|
133
133
|
<div class="flex items-center space-x-3">
|
|
134
134
|
<div class="text-3xl text-gray-400">${m}</div>
|
|
135
135
|
<div class="flex-1 min-w-0">
|
|
136
|
-
<div class="text-sm font-medium text-gray-900 truncate">${
|
|
137
|
-
<div class="text-xs text-gray-500">${
|
|
136
|
+
<div class="text-sm font-medium text-gray-900 truncate">${S(r)}</div>
|
|
137
|
+
<div class="text-xs text-gray-500">${g}</div>
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
|
-
`:u.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">${m}</div><div class="text-sm">${
|
|
140
|
+
`:u.innerHTML=`<div class="aspect-video flex items-center justify-center text-gray-400"><div class="text-center"><div class="text-4xl mb-2">${m}</div><div class="text-sm">${S(r)}</div><div class="text-xs text-gray-500 mt-1">${g}</div></div></div>`}const h=document.createElement("p");h.className=i?"hidden":"text-sm font-medium text-gray-900 text-center",h.textContent=r;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=$("downloadButton",t),f.onclick=m=>{m.preventDefault(),m.stopPropagation(),t.config.downloadFile?t.config.downloadFile(e,r):st(e,r,t)},s.appendChild(u),s.appendChild(h),s.appendChild(f),s}function ae(e,t,n,o,a,l){I(e);const r=()=>{const h=[$("clickDragTextMultiple",n)];return a&&h.push(a),l&&h.push(l),h.join(" \u2022 ")},i=!e.classList.contains("grid");if((!t||t.length===0)&&i){const h=document.createElement("div");h.className="grid grid-cols-4 gap-3 mb-3";for(let m=0;m<4;m++){const g=document.createElement("div");g.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 v=document.createElementNS("http://www.w3.org/2000/svg","svg");v.setAttribute("class","w-12 h-12 text-gray-400"),v.setAttribute("fill","currentColor"),v.setAttribute("viewBox","0 0 24 24");const E=document.createElementNS("http://www.w3.org/2000/svg","path");E.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"),v.appendChild(E),g.appendChild(v),g.onclick=()=>{let p=e.parentElement;for(;p&&!p.classList.contains("space-y-2");)p=p.parentElement;!p&&e.classList.contains("space-y-2")&&(p=e);const C=p==null?void 0:p.querySelector('input[type="file"]');C&&C.click()},h.appendChild(g)}const f=document.createElement("div");f.className="text-center text-xs text-gray-500 mt-2",f.textContent=r(),e.appendChild(h),e.appendChild(f);return}const s=document.createElement("div");s.className="files-list grid grid-cols-4 gap-3";const u=t?t.length:0,d=(Math.floor(u/4)+1)*4;for(let h=0;h<d;h++){const f=document.createElement("div");if(t&&h<t.length){const m=t[h],g=n.resourceIndex.get(m);if(f.className="resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300",f.dataset.resourceId=m,at(f,m,g,n).catch(v=>{console.error("Failed to render thumbnail:",v),f.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
141
141
|
<div class="text-2xl mb-1">\u{1F4C1}</div>
|
|
142
|
-
<div class="text-xs">${
|
|
143
|
-
</div>`}),o){const
|
|
144
|
-
<svg class="${
|
|
142
|
+
<div class="text-xs">${S($("previewError",n))}</div>
|
|
143
|
+
</div>`}),o){const v=document.createElement("div");v.className="absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center";const E=document.createElement("button");E.className="bg-red-600 text-white px-2 py-1 rounded text-xs",E.textContent=$("removeElement",n),E.onclick=p=>{p.stopPropagation(),o(m)},v.appendChild(E),f.appendChild(v)}}else f.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",f.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>',f.onclick=()=>{let m=e.parentElement;for(;m&&!m.classList.contains("space-y-2");)m=m.parentElement;!m&&e.classList.contains("space-y-2")&&(m=e);const g=m==null?void 0:m.querySelector('input[type="file"]');g&&g.click()};s.appendChild(f)}e.appendChild(s);const c=document.createElement("div");c.className="text-center text-xs text-gray-500 mt-2",c.textContent=r(),e.appendChild(c)}function ie(e,t,n="w-12 h-12"){e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
144
|
+
<svg class="${S(n)} text-red-400" fill="currentColor" viewBox="0 0 24 24">
|
|
145
145
|
<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"/>
|
|
146
146
|
</svg>
|
|
147
|
-
<div class="text-xs mt-1 text-red-600">${
|
|
148
|
-
</div>`}async function
|
|
147
|
+
<div class="text-xs mt-1 text-red-600">${S($("previewError",t))}</div>
|
|
148
|
+
</div>`}async function at(e,t,n,o){var a,l;if(n&&(a=n.type)!=null&&a.startsWith("image/"))if(n.file&&n.file instanceof File){const r=document.createElement("img");r.className="w-full h-full object-contain",r.alt=n.name;const i=new FileReader;i.onload=s=>{var u;r.src=((u=s.target)==null?void 0:u.result)||""},i.readAsDataURL(n.file),e.appendChild(r)}else if(o.config.getThumbnail)try{const r=await o.config.getThumbnail(t);if(r){const i=document.createElement("img");i.className="w-full h-full object-contain",i.alt=n.name,i.src=r,e.appendChild(i)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
149
149
|
<svg class="w-12 h-12" fill="currentColor" viewBox="0 0 24 24">
|
|
150
150
|
<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"/>
|
|
151
151
|
</svg>
|
|
152
|
-
</div>`}catch(r){const i=r instanceof Error?r:new Error(String(r));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),
|
|
152
|
+
</div>`}catch(r){const i=r instanceof Error?r:new Error(String(r));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),ie(e,o)}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
153
153
|
<svg class="w-12 h-12" fill="currentColor" viewBox="0 0 24 24">
|
|
154
154
|
<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"/>
|
|
155
155
|
</svg>
|
|
@@ -181,24 +181,24 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
181
181
|
<svg class="w-8 h-8" fill="currentColor" viewBox="0 0 24 24">
|
|
182
182
|
<path d="M8 5v14l11-7z"/>
|
|
183
183
|
</svg>
|
|
184
|
-
<div class="text-xs mt-1">${
|
|
185
|
-
</div>`}catch(r){const i=r instanceof Error?r:new Error(String(r));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),
|
|
184
|
+
<div class="text-xs mt-1">${S((n==null?void 0:n.name)||"Video")}</div>
|
|
185
|
+
</div>`}catch(r){const i=r instanceof Error?r:new Error(String(r));o.config.onThumbnailError&&o.config.onThumbnailError(i,t),ie(e,o,"w-8 h-8")}else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
186
186
|
<svg class="w-8 h-8" fill="currentColor" viewBox="0 0 24 24">
|
|
187
187
|
<path d="M8 5v14l11-7z"/>
|
|
188
188
|
</svg>
|
|
189
|
-
<div class="text-xs mt-1">${
|
|
189
|
+
<div class="text-xs mt-1">${S((n==null?void 0:n.name)||"Video")}</div>
|
|
190
190
|
</div>`;else e.innerHTML=`<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
191
191
|
<div class="text-2xl mb-1">\u{1F4C1}</div>
|
|
192
|
-
<div class="text-xs">${
|
|
193
|
-
</div>`}function
|
|
192
|
+
<div class="text-xs">${S((n==null?void 0:n.name)||"File")}</div>
|
|
193
|
+
</div>`}function J(e,t,n){const o=n?`<div class="text-xs text-gray-500 mt-1">${S(n)}</div>`:"";e.innerHTML=`
|
|
194
194
|
<div class="flex flex-col items-center justify-center h-full text-gray-400">
|
|
195
195
|
<svg class="w-6 h-6 mb-2" fill="currentColor" viewBox="0 0 24 24">
|
|
196
196
|
<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"/>
|
|
197
197
|
</svg>
|
|
198
|
-
<div class="text-sm text-center">${
|
|
198
|
+
<div class="text-sm text-center">${S($("clickDragText",t))}</div>
|
|
199
199
|
${o}
|
|
200
200
|
</div>
|
|
201
|
-
`}async function le(e,t,n,o,a=null,l){var r,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(p){const c=p instanceof Error?p:new Error(String(p));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 u=(r=t.parentElement)==null?void 0:r.querySelector('input[type="hidden"]');u||(u=document.createElement("input"),u.type="hidden",u.name=n,(i=t.parentElement)==null||i.appendChild(u)),u.value=s,ne(t,s,o,{fileName:e.name,isReadonly:!1,deps:a}).catch(console.error),l&&!o.config.readonly&&l.triggerOnChange(n,s)}function _(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 nt(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 l=document.createElement("button");l.className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors",l.textContent=$("removeElement",t),l.onclick=r=>{r.stopPropagation(),n()},a.appendChild(l),e.appendChild(a)}async function ae(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 rt(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,l=await fetch(a);if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const r=await l.blob();ot(r,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 ot(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 ie(e,t){e.length>0&&e.forEach(n=>{var o;if(!t.resourceIndex.has(n)){const a=n.split("/").pop()||"file",l=(o=a.split(".").pop())==null?void 0:o.toLowerCase();let r="application/octet-stream";l&&(["jpg","jpeg","png","gif","webp"].includes(l)?r=`image/${l==="jpg"?"jpeg":l}`:["mp4","webm","mov","avi"].includes(l)&&(r=`video/${l==="mov"?"quicktime":l}`)),t.resourceIndex.set(n,{name:a,type:r,size:0,uploadedAt:new Date,file:void 0})}})}function lt(e,t,n,o,a,l){var r;if(!a.resourceIndex.has(e)){const s=e.split("/").pop()||"file",u=(r=s.split(".").pop())==null?void 0:r.toLowerCase();let p="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?p=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(p=`video/${u==="mov"?"quicktime":u}`)),a.resourceIndex.set(e,{name:s,type:p,size:0,uploadedAt:new Date,file:void 0})}ne(t,e,a,{fileName:e,isReadonly:!1,deps:l}).catch(console.error);const i=document.createElement("input");i.type="hidden",i.name=n,i.value=e,o.appendChild(i)}function se(e,t,n,o,a,l){_(e,async r=>{const i=Array.from(r);for(const s of i){const u=await ae(s,n);n.resourceIndex.set(u,{name:s.name,type:s.type,size:s.size,uploadedAt:new Date,file:void 0}),t.push(u)}o(),l&&a&&!n.config.readonly&&l.triggerOnChange(a,t)})}function ce(e,t,n,o,a,l){e.onchange=async()=>{if(e.files)for(const r of Array.from(e.files)){const i=await ae(r,n);n.resourceIndex.set(i,{name:r.name,type:r.type,size:r.size,uploadedAt:new Date,file:void 0}),t.push(i)}o(),e.value="",l&&a&&!n.config.readonly&&l.triggerOnChange(a,t)}}function at(e,t,n,o){var a;const l=t.state;if(l.config.readonly){const r=t.prefill[e.key];if(r)P(r,l).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">${L($("previewUnavailable",l))}</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",l))}</div>`,n.appendChild(i)}}else{const r=document.createElement("div");r.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(h=>`.${h}`).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 u=t.prefill[e.key],p=()=>i.click(),c=h=>{if(h.length>0){const f={picker:i,fileUploadHandler:p,dragHandler:c};le(h[0],s,o,l,f,t.instance)}};if(u)lt(u,s,o,r,l,{picker:i,fileUploadHandler:p,dragHandler:c});else{const h=F(e,l);V(s,l,h)}s.onclick=p,_(s,c),i.onchange=()=>{if(i.files&&i.files.length>0){const h={picker:i,fileUploadHandler:p,dragHandler:c};le(i.files[0],s,o,l,h,t.instance)}},r.appendChild(s),r.appendChild(i),n.appendChild(r)}}function it(e,t,n,o){var a;const l=t.state;if(l.config.readonly){const r=document.createElement("div");r.className="space-y-4";const i=t.prefill[e.key]||[];i.length>0?i.forEach(s=>{P(s,l).then(u=>{r.appendChild(u)}).catch(u=>{console.error("Failed to render file preview:",u)})}):r.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${L($("noFilesSelected",l))}</div></div>`,n.appendChild(r)}else{let r=function(){re(p,c,l,f=>{const m=c.indexOf(f);m>-1&&c.splice(m,1),r()},h)};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(f=>`.${f}`).join(","))||"");const u=document.createElement("div");u.className="border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors";const p=document.createElement("div");p.className="files-list";const c=t.prefill[e.key]||[];ie(c,l);const h=F(e,l);r(),se(u,c,l,r,o,t.instance),ce(s,c,l,r,o,t.instance),u.appendChild(p),i.appendChild(u),i.appendChild(s),n.appendChild(i)}}function st(e,t,n,o){var a,l,r;const i=t.state,s=(a=e.minCount)!=null?a:0,u=(l=e.maxCount)!=null?l:1/0;if(i.config.readonly){const p=document.createElement("div");p.className="space-y-4";const c=t.prefill[e.key]||[];c.length>0?c.forEach(h=>{P(h,i).then(f=>{p.appendChild(f)}).catch(f=>{console.error("Failed to render file preview:",f)})}):p.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(p)}else{const p=document.createElement("div");p.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:((r=e.accept.extensions)==null?void 0:r.map(E=>`.${E}`).join(","))||"");const h=document.createElement("div");h.className="files-list space-y-2",p.appendChild(c),p.appendChild(h);const f=Array.isArray(t.prefill[e.key])?[...t.prefill[e.key]]:[];ie(f,i);const m=F(e,i),v=()=>{const E=f.length===1?$("fileCountSingle",i,{count:f.length}):$("fileCountPlural",i,{count:f.length}),d=s>0||u<1/0?` ${$("fileCountRange",i,{min:s,max:u})}`:"";return E+d},g=()=>{re(h,f,i,E=>{f.splice(f.indexOf(E),1),g()},m,v())};se(h,f,i,g,o,t.instance),ce(c,f,i,g,o,t.instance),g(),n.appendChild(p)}}function ue(e,t,n){var o;const a=[],{scopeRoot:l,skipValidation:r,path:i}=n,s=e.type==="files"||"multiple"in e&&!!e.multiple,u=(p,c,h)=>{var f,m;if(r)return;const{state:v}=n,g="minCount"in h&&(f=h.minCount)!=null?f:0,E="maxCount"in h&&(m=h.maxCount)!=null?m:1/0;h.required&&c.length===0&&a.push(`${p}: ${$("required",v)}`),c.length<g&&a.push(`${p}: ${$("minFiles",v,{min:g})}`),c.length>E&&a.push(`${p}: ${$("maxFiles",v,{max:E})}`)};if(s){const p=A(i,t),c=l.querySelector(`input[type="file"][name="${p}"]`),h=c==null?void 0:c.closest(".space-y-2"),f=(h==null?void 0:h.querySelector(".files-list"))||null,m=[];return f&&f.querySelectorAll(".resource-pill").forEach(v=>{const g=v.dataset.resourceId;g&&m.push(g)}),u(t,m,e),{value:m,errors:a}}else{const p=l.querySelector(`input[name$="${t}"][type="hidden"]`),c=(o=p==null?void 0:p.value)!=null?o:"";return!r&&e.required&&c===""?(a.push(`${t}: ${$("required",n.state)}`),{value:null,errors:a}):{value:c||null,errors:a}}}function de(e,t,n,o){var a;const{scopeRoot:l,state:r}=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"&&!r.resourceIndex.has(i)){const u=i.split("/").pop()||"file",p=(s=u.split(".").pop())==null?void 0:s.toLowerCase();let c="application/octet-stream";p&&(["jpg","jpeg","png","gif","webp"].includes(p)?c=`image/${p==="jpg"?"jpeg":p}`:["mp4","webm","mov","avi"].includes(p)&&(c=`video/${p==="mov"?"quicktime":p}`)),r.resourceIndex.set(i,{name:u,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=l.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(!r.resourceIndex.has(n)){const s=n.split("/").pop()||"file",u=(a=s.split(".").pop())==null?void 0:a.toLowerCase();let p="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?p=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(p=`video/${u==="mov"?"quicktime":u}`)),r.resourceIndex.set(n,{name:s,type:p,size:0,uploadedAt:new Date,file:void 0})}console.info(`updateFileField: File field "${t}" updated. Preview update requires re-render.`)}}}function q(e){return e?e.toUpperCase():"#000000"}function W(e){return/^#[0-9A-F]{6}$/i.test(e)||/^#[0-9A-F]{3}$/i.test(e)}function pe(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 fe(e){const t=document.createElement("div");t.className="flex items-center gap-2";const n=q(e),o=document.createElement("div");o.style.cssText=`
|
|
201
|
+
`}async function se(e,t,n,o,a=null,l){var r,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(d){const c=d instanceof Error?d:new Error(String(d));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 u=(r=t.parentElement)==null?void 0:r.querySelector('input[type="hidden"]');u||(u=document.createElement("input"),u.type="hidden",u.name=n,(i=t.parentElement)==null||i.appendChild(u)),u.value=s,le(t,s,o,{fileName:e.name,isReadonly:!1,deps:a}).catch(console.error),l&&!o.config.readonly&&l.triggerOnChange(n,s)}function Y(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 it(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 l=document.createElement("button");l.className="bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors",l.textContent=$("removeElement",t),l.onclick=r=>{r.stopPropagation(),n()},a.appendChild(l),e.appendChild(a)}async function ce(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 st(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,l=await fetch(a);if(!l.ok)throw new Error(`HTTP error! status: ${l.status}`);const r=await l.blob();ct(r,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 ct(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 ue(e,t){e.length>0&&e.forEach(n=>{var o;if(!t.resourceIndex.has(n)){const a=n.split("/").pop()||"file",l=(o=a.split(".").pop())==null?void 0:o.toLowerCase();let r="application/octet-stream";l&&(["jpg","jpeg","png","gif","webp"].includes(l)?r=`image/${l==="jpg"?"jpeg":l}`:["mp4","webm","mov","avi"].includes(l)&&(r=`video/${l==="mov"?"quicktime":l}`)),t.resourceIndex.set(n,{name:a,type:r,size:0,uploadedAt:new Date,file:void 0})}})}function ut(e,t,n,o,a,l){var r;if(!a.resourceIndex.has(e)){const s=e.split("/").pop()||"file",u=(r=s.split(".").pop())==null?void 0:r.toLowerCase();let d="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?d=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(d=`video/${u==="mov"?"quicktime":u}`)),a.resourceIndex.set(e,{name:s,type:d,size:0,uploadedAt:new Date,file:void 0})}le(t,e,a,{fileName:e,isReadonly:!1,deps:l}).catch(console.error);const i=document.createElement("input");i.type="hidden",i.name=n,i.value=e,o.appendChild(i)}function de(e,t,n,o,a,l){Y(e,async r=>{const i=Array.from(r);for(const s of i){const u=await ce(s,n);n.resourceIndex.set(u,{name:s.name,type:s.type,size:s.size,uploadedAt:new Date,file:void 0}),t.push(u)}o(),l&&a&&!n.config.readonly&&l.triggerOnChange(a,t)})}function fe(e,t,n,o,a,l){e.onchange=async()=>{if(e.files)for(const r of Array.from(e.files)){const i=await ce(r,n);n.resourceIndex.set(i,{name:r.name,type:r.type,size:r.size,uploadedAt:new Date,file:void 0}),t.push(i)}o(),e.value="",l&&a&&!n.config.readonly&&l.triggerOnChange(a,t)}}function dt(e,t,n,o){var a;const l=t.state;if(l.config.readonly){const r=t.prefill[e.key];if(r)_(r,l).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">${S($("previewUnavailable",l))}</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">${S($("noFileSelected",l))}</div>`,n.appendChild(i)}}else{const r=document.createElement("div");r.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(h=>`.${h}`).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 u=t.prefill[e.key],d=()=>i.click(),c=h=>{if(h.length>0){const f={picker:i,fileUploadHandler:d,dragHandler:c};se(h[0],s,o,l,f,t.instance)}};if(u)ut(u,s,o,r,l,{picker:i,fileUploadHandler:d,dragHandler:c});else{const h=T(e,l);J(s,l,h)}s.onclick=d,Y(s,c),i.onchange=()=>{if(i.files&&i.files.length>0){const h={picker:i,fileUploadHandler:d,dragHandler:c};se(i.files[0],s,o,l,h,t.instance)}},r.appendChild(s),r.appendChild(i),n.appendChild(r)}}function ft(e,t,n,o){var a;const l=t.state;if(l.config.readonly){const r=document.createElement("div");r.className="space-y-4";const i=t.prefill[e.key]||[];i.length>0?i.forEach(s=>{_(s,l).then(u=>{r.appendChild(u)}).catch(u=>{console.error("Failed to render file preview:",u)})}):r.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${S($("noFilesSelected",l))}</div></div>`,n.appendChild(r)}else{let r=function(){ae(d,c,l,f=>{const m=c.indexOf(f);m>-1&&c.splice(m,1),r()},h)};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(f=>`.${f}`).join(","))||"");const u=document.createElement("div");u.className="border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors";const d=document.createElement("div");d.className="files-list";const c=t.prefill[e.key]||[];ue(c,l);const h=T(e,l);r(),de(u,c,l,r,o,t.instance),fe(s,c,l,r,o,t.instance),u.appendChild(d),i.appendChild(u),i.appendChild(s),n.appendChild(i)}}function pt(e,t,n,o){var a,l,r;const i=t.state,s=(a=e.minCount)!=null?a:0,u=(l=e.maxCount)!=null?l:1/0;if(i.config.readonly){const d=document.createElement("div");d.className="space-y-4";const c=t.prefill[e.key]||[];c.length>0?c.forEach(h=>{_(h,i).then(f=>{d.appendChild(f)}).catch(f=>{console.error("Failed to render file preview:",f)})}):d.innerHTML=`<div class="aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500"><div class="text-center">${S($("noFilesSelected",i))}</div></div>`,n.appendChild(d)}else{const d=document.createElement("div");d.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:((r=e.accept.extensions)==null?void 0:r.map(E=>`.${E}`).join(","))||"");const h=document.createElement("div");h.className="files-list space-y-2",d.appendChild(c),d.appendChild(h);const f=Array.isArray(t.prefill[e.key])?[...t.prefill[e.key]]:[];ue(f,i);const m=T(e,i),g=()=>{const E=f.length===1?$("fileCountSingle",i,{count:f.length}):$("fileCountPlural",i,{count:f.length}),p=s>0||u<1/0?` ${$("fileCountRange",i,{min:s,max:u})}`:"";return E+p},v=()=>{ae(h,f,i,E=>{f.splice(f.indexOf(E),1),v()},m,g())};de(h,f,i,v,o,t.instance),fe(c,f,i,v,o,t.instance),v(),n.appendChild(d)}}function pe(e,t,n){var o;const a=[],{scopeRoot:l,skipValidation:r,path:i}=n,s=e.type==="files"||"multiple"in e&&!!e.multiple,u=(d,c,h)=>{var f,m;if(r)return;const{state:g}=n,v="minCount"in h&&(f=h.minCount)!=null?f:0,E="maxCount"in h&&(m=h.maxCount)!=null?m:1/0;h.required&&c.length===0&&a.push(`${d}: ${$("required",g)}`),c.length<v&&a.push(`${d}: ${$("minFiles",g,{min:v})}`),c.length>E&&a.push(`${d}: ${$("maxFiles",g,{max:E})}`)};if(s){const d=M(i,t),c=l.querySelector(`input[type="file"][name="${d}"]`),h=c==null?void 0:c.closest(".space-y-2"),f=(h==null?void 0:h.querySelector(".files-list"))||null,m=[];return f&&f.querySelectorAll(".resource-pill").forEach(g=>{const v=g.dataset.resourceId;v&&m.push(v)}),u(t,m,e),{value:m,errors:a}}else{const d=l.querySelector(`input[name$="${t}"][type="hidden"]`),c=(o=d==null?void 0:d.value)!=null?o:"";return!r&&e.required&&c===""?(a.push(`${t}: ${$("required",n.state)}`),{value:null,errors:a}):{value:c||null,errors:a}}}function me(e,t,n,o){var a;const{scopeRoot:l,state:r}=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"&&!r.resourceIndex.has(i)){const u=i.split("/").pop()||"file",d=(s=u.split(".").pop())==null?void 0:s.toLowerCase();let c="application/octet-stream";d&&(["jpg","jpeg","png","gif","webp"].includes(d)?c=`image/${d==="jpg"?"jpeg":d}`:["mp4","webm","mov","avi"].includes(d)&&(c=`video/${d==="mov"?"quicktime":d}`)),r.resourceIndex.set(i,{name:u,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=l.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(!r.resourceIndex.has(n)){const s=n.split("/").pop()||"file",u=(a=s.split(".").pop())==null?void 0:a.toLowerCase();let d="application/octet-stream";u&&(["jpg","jpeg","png","gif","webp"].includes(u)?d=`image/${u==="jpg"?"jpeg":u}`:["mp4","webm","mov","avi"].includes(u)&&(d=`video/${u==="mov"?"quicktime":u}`)),r.resourceIndex.set(n,{name:s,type:d,size:0,uploadedAt:new Date,file:void 0})}console.info(`updateFileField: File field "${t}" updated. Preview update requires re-render.`)}}}function B(e){return e?e.toUpperCase():"#000000"}function G(e){return/^#[0-9A-F]{6}$/i.test(e)||/^#[0-9A-F]{3}$/i.test(e)}function he(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 ve(e){const t=document.createElement("div");t.className="flex items-center gap-2";const n=B(e),o=document.createElement("div");o.style.cssText=`
|
|
202
202
|
width: 32px;
|
|
203
203
|
height: 32px;
|
|
204
204
|
border-radius: var(--fb-border-radius);
|
|
@@ -208,7 +208,7 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
208
208
|
font-size: var(--fb-font-size);
|
|
209
209
|
color: var(--fb-text-color);
|
|
210
210
|
font-family: var(--fb-font-family-mono, monospace);
|
|
211
|
-
`,a.textContent=n,t.appendChild(o),t.appendChild(a),t}function
|
|
211
|
+
`,a.textContent=n,t.appendChild(o),t.appendChild(a),t}function ge(e,t,n){const o=B(e),a=document.createElement("div");a.className="colour-picker-wrapper",a.style.cssText=`
|
|
212
212
|
display: flex;
|
|
213
213
|
align-items: center;
|
|
214
214
|
gap: 8px;
|
|
@@ -235,27 +235,27 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
235
235
|
position: absolute;
|
|
236
236
|
opacity: 0;
|
|
237
237
|
pointer-events: none;
|
|
238
|
-
`,r.addEventListener("input",()=>{const s=r.value.trim();if(
|
|
238
|
+
`,r.addEventListener("input",()=>{const s=r.value.trim();if(G(s)){const u=he(s);l.style.backgroundColor=u,i.value=u.toLowerCase(),r.classList.remove("invalid"),n.instance&&n.instance.triggerOnChange(t,u)}else r.classList.add("invalid")}),r.addEventListener("blur",()=>{const s=r.value.trim();if(G(s)){const u=he(s);r.value=u,l.style.backgroundColor=u,i.value=u.toLowerCase(),r.classList.remove("invalid")}}),i.addEventListener("change",()=>{const s=B(i.value);r.value=s,l.style.backgroundColor=s,n.instance&&n.instance.triggerOnChange(t,s)}),l.addEventListener("click",()=>{i.click()}),l.addEventListener("mouseenter",()=>{l.style.borderColor="var(--fb-border-hover-color)"}),l.addEventListener("mouseleave",()=>{l.style.borderColor="var(--fb-border-color)"}),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.appendChild(l),a.appendChild(r),a.appendChild(i),a}function mt(e,t,n,o){const a=t.state,l=t.prefill[e.key]||e.default||"#000000";if(a.config.readonly){const r=ve(l);n.appendChild(r)}else{const r=ge(l,o,t);n.appendChild(r)}if(!a.config.readonly){const r=document.createElement("p");r.className="mt-1",r.style.cssText=`
|
|
239
239
|
font-size: var(--fb-font-size-small);
|
|
240
240
|
color: var(--fb-text-secondary-color);
|
|
241
|
-
`,r.textContent=
|
|
241
|
+
`,r.textContent=T(e,a),n.appendChild(r)}}function ht(e,t,n,o){var a,l;const r=t.state,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],u=(a=e.minCount)!=null?a:1,d=(l=e.maxCount)!=null?l:1/0;for(;s.length<u;)s.push(e.default||"#000000");const c=document.createElement("div");c.className="space-y-2",n.appendChild(c);function h(){c.querySelectorAll(".multiple-colour-item").forEach((p,C)=>{const y=p.querySelector("input");y&&(y.name=`${o}[${C}]`)})}function f(p="#000000",C=-1){const y=document.createElement("div");if(y.className="multiple-colour-item flex items-center gap-2",r.config.readonly){const b=ve(p);for(;b.firstChild;)y.appendChild(b.firstChild)}else{const b=`${o}[${c.children.length}]`,x=ge(p,b,t);x.style.flex="1",y.appendChild(x)}return C===-1?c.appendChild(y):c.insertBefore(y,c.children[C]),h(),y}function m(){if(r.config.readonly)return;const p=c.querySelectorAll(".multiple-colour-item"),C=p.length;p.forEach(y=>{let b=y.querySelector(".remove-item-btn");b||(b=document.createElement("button"),b.type="button",b.className="remove-item-btn px-2 py-1 rounded",b.style.cssText=`
|
|
242
242
|
color: var(--fb-error-color);
|
|
243
243
|
background-color: transparent;
|
|
244
244
|
transition: background-color var(--fb-transition-duration);
|
|
245
|
-
`,
|
|
245
|
+
`,b.innerHTML="\u2715",b.addEventListener("mouseenter",()=>{b.style.backgroundColor="var(--fb-background-hover-color)"}),b.addEventListener("mouseleave",()=>{b.style.backgroundColor="transparent"}),b.onclick=()=>{const w=Array.from(c.children).indexOf(y);c.children.length>u&&(s.splice(w,1),y.remove(),h(),E(),m())},y.appendChild(b));const x=C<=u;b.disabled=x,b.style.opacity=x?"0.5":"1",b.style.pointerEvents=x?"none":"auto"})}let g=null,v=null;if(!r.config.readonly){g=document.createElement("div"),g.className="flex items-center gap-3 mt-2";const p=document.createElement("button");p.type="button",p.className="add-colour-btn px-3 py-1 rounded",p.style.cssText=`
|
|
246
246
|
color: var(--fb-primary-color);
|
|
247
247
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
248
248
|
background-color: transparent;
|
|
249
249
|
font-size: var(--fb-font-size);
|
|
250
250
|
transition: all var(--fb-transition-duration);
|
|
251
|
-
`,
|
|
251
|
+
`,p.textContent="+",p.addEventListener("mouseenter",()=>{p.style.backgroundColor="var(--fb-background-hover-color)"}),p.addEventListener("mouseleave",()=>{p.style.backgroundColor="transparent"}),p.onclick=()=>{const C=e.default||"#000000";s.push(C),f(C),E(),m()},v=document.createElement("span"),v.className="text-sm text-gray-500",g.appendChild(p),g.appendChild(v),n.appendChild(g)}function E(){if(!g||!v)return;const p=g.querySelector(".add-colour-btn");if(p){const C=s.length>=d;p.disabled=C,p.style.opacity=C?"0.5":"1",p.style.pointerEvents=C?"none":"auto"}v.textContent=`${s.length}/${d===1/0?"\u221E":d}`}if(s.forEach(p=>f(p)),E(),m(),!r.config.readonly){const p=document.createElement("p");p.className="mt-1",p.style.cssText=`
|
|
252
252
|
font-size: var(--fb-font-size-small);
|
|
253
253
|
color: var(--fb-text-secondary-color);
|
|
254
|
-
`,
|
|
254
|
+
`,p.textContent=T(e,r),n.appendChild(p)}}function vt(e,t,n){var o,a,l;const r=[],{scopeRoot:i,skipValidation:s}=n,u=(c,h)=>{var f,m;if(!c)return;const g=`error-${c.getAttribute("name")||Math.random().toString(36).substring(7)}`;let v=document.getElementById(g);h?(c.classList.add("invalid"),c.title=h,v||(v=document.createElement("div"),v.id=g,v.className="error-message",v.style.cssText=`
|
|
255
255
|
color: var(--fb-error-color);
|
|
256
256
|
font-size: var(--fb-font-size-small);
|
|
257
257
|
margin-top: 0.25rem;
|
|
258
|
-
`,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(
|
|
258
|
+
`,c.nextSibling?(f=c.parentNode)==null||f.insertBefore(v,c.nextSibling):(m=c.parentNode)==null||m.appendChild(v)),v.textContent=h,v.style.display="block"):(c.classList.remove("invalid"),c.title="",v&&v.remove())},d=(c,h,f)=>{const{state:m}=n;if(!h){if(!s&&e.required){const v=$("required",m);return r.push(`${f}: ${v}`),u(c,v),""}return u(c,null),""}const g=B(h);if(!s&&!G(g)){const v=$("invalidHexColour",m);return r.push(`${f}: ${v}`),u(c,v),h}return u(c,null),g};if(e.multiple){const c=i.querySelectorAll(`[name^="${t}["].colour-hex-input`),h=[];if(c.forEach((f,m)=>{var g;const v=(g=f==null?void 0:f.value)!=null?g:"",E=d(f,v,`${t}[${m}]`);h.push(E)}),!s){const{state:f}=n,m=(o=e.minCount)!=null?o:1,g=(a=e.maxCount)!=null?a:1/0,v=h.filter(E=>E!=="");e.required&&v.length===0&&r.push(`${t}: ${$("required",f)}`),v.length<m&&r.push(`${t}: ${$("minItems",f,{min:m})}`),v.length>g&&r.push(`${t}: ${$("maxItems",f,{max:g})}`)}return{value:h,errors:r}}else{const c=i.querySelector(`[name="${t}"].colour-hex-input`),h=(l=c==null?void 0:c.value)!=null?l:"";if(!s&&e.required&&h===""){const f=$("required",n.state);return r.push(`${t}: ${f}`),u(c,f),{value:"",errors:r}}return{value:d(c,h,t),errors:r}}}function gt(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 l=a.querySelectorAll(`[name^="${t}["].colour-hex-input`);l.forEach((r,i)=>{if(i<n.length){const s=B(n[i]);r.value=s,r.classList.remove("invalid"),r.title="";const u=r.closest(".colour-picker-wrapper");if(u){const d=u.querySelector(".colour-swatch"),c=u.querySelector(".colour-picker-hidden");d&&(d.style.backgroundColor=s),c&&(c.value=s.toLowerCase())}}}),n.length!==l.length&&console.warn(`updateColourField: Multiple field "${t}" has ${l.length} inputs but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const l=a.querySelector(`[name="${t}"].colour-hex-input`);if(l){const r=B(n);l.value=r,l.classList.remove("invalid"),l.title="";const i=l.closest(".colour-picker-wrapper");if(i){const s=i.querySelector(".colour-swatch"),u=i.querySelector(".colour-picker-hidden");s&&(s.style.backgroundColor=r),u&&(u.value=r.toLowerCase())}}}}function ye(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 X(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 j(e,t){return Math.round(e/t)*t}function be(e,t,n,o,a){var l;const r=document.createElement("div");r.className="slider-container";const i=document.createElement("div");i.className="flex items-start gap-3";const s=document.createElement("div");s.className="flex-1";const u=document.createElement("input");u.type="range",u.name=t,u.className="slider-input w-full",u.disabled=a;const d=n.scale||"linear",c=n.min,h=n.max,f=(l=n.step)!=null?l:1;if(d==="exponential"){if(c<=0)throw new Error(`Slider "${n.key}": exponential scale requires min > 0 (got ${c})`);u.min="0",u.max="1000",u.step="1";const p=X(e,c,h);u.value=(p*1e3).toString()}else u.min=c.toString(),u.max=h.toString(),u.step=f.toString(),u.value=e.toString();u.style.cssText=`
|
|
259
259
|
height: 6px;
|
|
260
260
|
border-radius: 3px;
|
|
261
261
|
background: linear-gradient(
|
|
@@ -273,7 +273,7 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
273
273
|
font-size: var(--fb-font-size-small);
|
|
274
274
|
color: var(--fb-text-secondary-color);
|
|
275
275
|
margin-top: 4px;
|
|
276
|
-
`;const
|
|
276
|
+
`;const g=document.createElement("span");g.textContent=c.toString();const v=document.createElement("span");v.textContent=h.toString(),m.appendChild(g),m.appendChild(v),s.appendChild(m);const E=document.createElement("span");if(E.className="slider-value",E.style.cssText=`
|
|
277
277
|
min-width: 60px;
|
|
278
278
|
text-align: right;
|
|
279
279
|
font-size: var(--fb-font-size);
|
|
@@ -281,69 +281,69 @@ var FormBuilder=(function(N){"use strict";function $(e,t,n){const o=t.config.loc
|
|
|
281
281
|
font-family: var(--fb-font-family-mono, monospace);
|
|
282
282
|
font-weight: 500;
|
|
283
283
|
padding-top: 2px;
|
|
284
|
-
`,E.textContent=e.toFixed(f<1?2:0),i.appendChild(s),i.appendChild(E),r.appendChild(i),!a){const
|
|
284
|
+
`,E.textContent=e.toFixed(f<1?2:0),i.appendChild(s),i.appendChild(E),r.appendChild(i),!a){const p=()=>{let C;if(d==="exponential"){const b=parseFloat(u.value)/1e3;C=ye(b,c,h),C=j(C,f),C=Math.max(c,Math.min(h,C))}else C=parseFloat(u.value),C=j(C,f);E.textContent=C.toFixed(f<1?2:0);const y=(C-c)/(h-c)*100;u.style.background=`linear-gradient(
|
|
285
285
|
to right,
|
|
286
286
|
var(--fb-primary-color) 0%,
|
|
287
|
-
var(--fb-primary-color) ${
|
|
288
|
-
var(--fb-border-color) ${
|
|
287
|
+
var(--fb-primary-color) ${y}%,
|
|
288
|
+
var(--fb-border-color) ${y}%,
|
|
289
289
|
var(--fb-border-color) 100%
|
|
290
|
-
)`,o.instance&&o.instance.triggerOnChange(t,
|
|
290
|
+
)`,o.instance&&o.instance.triggerOnChange(t,C)};u.addEventListener("input",p),u.addEventListener("change",p)}return r}function yt(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 l=t.state,r=e.default!==void 0?e.default:(e.min+e.max)/2,i=(a=t.prefill[e.key])!=null?a:r,s=be(i,o,e,t,l.config.readonly);if(n.appendChild(s),!l.config.readonly){const u=document.createElement("p");u.className="mt-1",u.style.cssText=`
|
|
291
291
|
font-size: var(--fb-font-size-small);
|
|
292
292
|
color: var(--fb-text-secondary-color);
|
|
293
|
-
`,u.textContent=
|
|
293
|
+
`,u.textContent=T(e,l),n.appendChild(u)}}function bt(e,t,n,o){var a,l;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,i=t.prefill[e.key]||[],s=Array.isArray(i)?[...i]:[],u=(a=e.minCount)!=null?a:1,d=(l=e.maxCount)!=null?l:1/0,c=e.default!==void 0?e.default:(e.min+e.max)/2;for(;s.length<u;)s.push(c);const h=document.createElement("div");h.className="space-y-3",n.appendChild(h);function f(){h.querySelectorAll(".multiple-slider-item").forEach((C,y)=>{const b=C.querySelector("input[type=range]");b&&b.setAttribute("name",`${o}[${y}]`)})}function m(C=c,y=-1){const b=document.createElement("div");b.className="multiple-slider-item flex items-start gap-2";const x=`${o}[${h.children.length}]`,w=be(C,x,e,t,r.config.readonly);return w.style.flex="1",b.appendChild(w),y===-1?h.appendChild(b):h.insertBefore(b,h.children[y]),f(),b}function g(){if(r.config.readonly)return;const C=h.querySelectorAll(".multiple-slider-item"),y=C.length;C.forEach(b=>{let x=b.querySelector(".remove-item-btn");x||(x=document.createElement("button"),x.type="button",x.className="remove-item-btn px-2 py-1 rounded",x.style.cssText=`
|
|
294
294
|
color: var(--fb-error-color);
|
|
295
295
|
background-color: transparent;
|
|
296
296
|
transition: background-color var(--fb-transition-duration);
|
|
297
297
|
margin-top: 8px;
|
|
298
|
-
`,x.innerHTML="\u2715",x.addEventListener("mouseenter",()=>{x.style.backgroundColor="var(--fb-background-hover-color)"}),x.addEventListener("mouseleave",()=>{x.style.backgroundColor="transparent"}),x.onclick=()=>{const
|
|
298
|
+
`,x.innerHTML="\u2715",x.addEventListener("mouseenter",()=>{x.style.backgroundColor="var(--fb-background-hover-color)"}),x.addEventListener("mouseleave",()=>{x.style.backgroundColor="transparent"}),x.onclick=()=>{const k=Array.from(h.children).indexOf(b);h.children.length>u&&(s.splice(k,1),b.remove(),f(),p(),g())},b.appendChild(x));const w=y<=u;x.disabled=w,x.style.opacity=w?"0.5":"1",x.style.pointerEvents=w?"none":"auto"})}let v=null,E=null;if(!r.config.readonly){v=document.createElement("div"),v.className="flex items-center gap-3 mt-2";const C=document.createElement("button");C.type="button",C.className="add-slider-btn px-3 py-1 rounded",C.style.cssText=`
|
|
299
299
|
color: var(--fb-primary-color);
|
|
300
300
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
301
301
|
background-color: transparent;
|
|
302
302
|
font-size: var(--fb-font-size);
|
|
303
303
|
transition: all var(--fb-transition-duration);
|
|
304
|
-
`,
|
|
304
|
+
`,C.textContent="+",C.addEventListener("mouseenter",()=>{C.style.backgroundColor="var(--fb-background-hover-color)"}),C.addEventListener("mouseleave",()=>{C.style.backgroundColor="transparent"}),C.onclick=()=>{s.push(c),m(c),p(),g()},E=document.createElement("span"),E.className="text-sm text-gray-500",v.appendChild(C),v.appendChild(E),n.appendChild(v)}function p(){if(!v||!E)return;const C=v.querySelector(".add-slider-btn");if(C){const y=s.length>=d;C.disabled=y,C.style.opacity=y?"0.5":"1",C.style.pointerEvents=y?"none":"auto"}E.textContent=`${s.length}/${d===1/0?"\u221E":d}`}if(s.forEach(C=>m(C)),p(),g(),!r.config.readonly){const C=document.createElement("p");C.className="mt-1",C.style.cssText=`
|
|
305
305
|
font-size: var(--fb-font-size-small);
|
|
306
306
|
color: var(--fb-text-secondary-color);
|
|
307
|
-
`,
|
|
307
|
+
`,C.textContent=T(e,r),n.appendChild(C)}}function xt(e,t,n){var o,a,l;const r=[],{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 u=e.min,d=e.max,c=(o=e.step)!=null?o:1,h=e.scale||"linear",f=(g,v)=>{var E,p;if(!g)return;const C=`error-${g.getAttribute("name")||Math.random().toString(36).substring(7)}`;let y=document.getElementById(C);if(v){if(g.classList.add("invalid"),g.title=v,!y){y=document.createElement("div"),y.id=C,y.className="error-message",y.style.cssText=`
|
|
308
308
|
color: var(--fb-error-color);
|
|
309
309
|
font-size: var(--fb-font-size-small);
|
|
310
310
|
margin-top: 0.25rem;
|
|
311
|
-
`;const
|
|
311
|
+
`;const b=g.closest(".slider-container");b&&b.nextSibling?(E=b.parentNode)==null||E.insertBefore(y,b.nextSibling):b&&((p=b.parentNode)==null||p.appendChild(y))}y.textContent=v,y.style.display="block"}else g.classList.remove("invalid"),g.title="",y&&y.remove()},m=(g,v)=>{const{state:E}=n,p=g.value;if(!p){if(!s&&e.required){const y=$("required",E);return r.push(`${v}: ${y}`),f(g,y),null}return f(g,null),null}let C;if(h==="exponential"){const y=parseFloat(p)/1e3;C=ye(y,u,d),C=j(C,c)}else C=parseFloat(p),C=j(C,c);if(!s){if(C<u){const y=$("minValue",E,{min:u});return r.push(`${v}: ${y}`),f(g,y),C}if(C>d){const y=$("maxValue",E,{max:d});return r.push(`${v}: ${y}`),f(g,y),C}}return f(g,null),C};if(e.multiple){const g=i.querySelectorAll(`input[type="range"][name^="${t}["]`),v=[];if(g.forEach((E,p)=>{const C=m(E,`${t}[${p}]`);v.push(C)}),!s){const{state:E}=n,p=(a=e.minCount)!=null?a:1,C=(l=e.maxCount)!=null?l:1/0,y=v.filter(b=>b!==null);e.required&&y.length===0&&r.push(`${t}: ${$("required",E)}`),y.length<p&&r.push(`${t}: ${$("minItems",E,{min:p})}`),y.length>C&&r.push(`${t}: ${$("maxItems",E,{max:C})}`)}return{value:v,errors:r}}else{const g=i.querySelector(`input[type="range"][name="${t}"]`);return g?{value:m(g,t),errors:r}:(!s&&e.required&&r.push(`${t}: ${$("required",n.state)}`),{value:null,errors:r})}}function Ct(e,t,n,o){var a;const{scopeRoot:l}=o,r=e.min,i=e.max,s=(a=e.step)!=null?a:1,u=e.scale||"linear";if(e.multiple){if(!Array.isArray(n)){console.warn(`updateSliderField: Expected array for multiple field "${t}", got ${typeof n}`);return}const d=l.querySelectorAll(`input[type="range"][name^="${t}["]`);d.forEach((c,h)=>{if(h<n.length&&n[h]!==null){const f=Number(n[h]);if(u==="exponential"){const g=X(f,r,i);c.value=(g*1e3).toString()}else c.value=f.toString();const m=c.closest(".slider-container");if(m){const g=m.querySelector(".slider-value");g&&(g.textContent=f.toFixed(s<1?2:0));const v=(f-r)/(i-r)*100;c.style.background=`linear-gradient(
|
|
312
312
|
to right,
|
|
313
313
|
var(--fb-primary-color) 0%,
|
|
314
|
-
var(--fb-primary-color) ${
|
|
315
|
-
var(--fb-border-color) ${
|
|
314
|
+
var(--fb-primary-color) ${v}%,
|
|
315
|
+
var(--fb-border-color) ${v}%,
|
|
316
316
|
var(--fb-border-color) 100%
|
|
317
|
-
)`}c.classList.remove("invalid"),c.title=""}}),n.length!==
|
|
317
|
+
)`}c.classList.remove("invalid"),c.title=""}}),n.length!==d.length&&console.warn(`updateSliderField: Multiple field "${t}" has ${d.length} sliders but received ${n.length} values. Consider re-rendering for add/remove.`)}else{const d=l.querySelector(`input[type="range"][name="${t}"]`);if(d&&n!==null&&n!==void 0){const c=Number(n);if(u==="exponential"){const f=X(c,r,i);d.value=(f*1e3).toString()}else d.value=c.toString();const h=d.closest(".slider-container");if(h){const f=h.querySelector(".slider-value");f&&(f.textContent=c.toFixed(s<1?2:0));const m=(c-r)/(i-r)*100;d.style.background=`linear-gradient(
|
|
318
318
|
to right,
|
|
319
319
|
var(--fb-primary-color) 0%,
|
|
320
320
|
var(--fb-primary-color) ${m}%,
|
|
321
321
|
var(--fb-border-color) ${m}%,
|
|
322
322
|
var(--fb-border-color) 100%
|
|
323
|
-
)`}
|
|
323
|
+
)`}d.classList.remove("invalid"),d.title=""}}}function xe(e){const t={};for(const n of e)"default"in n&&n.default!==void 0&&(t[n.key]=n.default);return t}function Ce(e,t){return{...t,...e}}function Z(e){const t={};return e.querySelectorAll("input, select, textarea").forEach(n=>{const o=n.getAttribute("name");o&&!o.includes("[")&&!o.includes(".")&&(n instanceof HTMLSelectElement?t[o]=n.value:n instanceof HTMLInputElement?n.type==="checkbox"?t[o]=n.checked:n.type==="radio"?n.checked&&(t[o]=n.value):t[o]=n.value:n instanceof HTMLTextAreaElement&&(t[o]=n.value))}),t}let Q=null;function Et(e){Q=e}function O(e,t){if(!Q)throw new Error("renderElement not initialized. Import from components/index.ts");return Q(e,t)}function Ee(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 l=document.createElement("button");l.type="button",l.className="fb-prefill-hint",l.textContent=o.label,l.setAttribute("data-hint-values",JSON.stringify(o.values)),l.setAttribute("data-container-key",t),l.setAttribute("data-hint-index",String(a)),n.appendChild(l)}),n}function $e(e,t,n,o){var a,l;const r=document.createElement("div");r.className="border border-gray-200 rounded-lg p-4 bg-gray-50",r.setAttribute("data-container",o);const i=document.createElement("div"),s=e.columns||1;if(s===1?i.className="space-y-4":i.className=`grid grid-cols-${s} gap-4`,!t.state.config.readonly){const f=Ee(e,o);f&&r.appendChild(f)}const u=xe(e.elements),d=((a=t.prefill)==null?void 0:a[e.key])||{},c=Ce(d,u),h={path:M(t.path,e.key),prefill:c,formData:(l=t.formData)!=null?l:t.prefill,state:t.state};e.elements.forEach(f=>{f.hidden||i.appendChild(O(f,h))}),r.appendChild(i),n.appendChild(r)}function we(e,t,n,o){var a,l,r,i;const s=t.state,u=document.createElement("div");u.className="border border-gray-200 rounded-lg p-4 bg-gray-50";const d=document.createElement("span");d.className="text-sm text-gray-500";const c=document.createElement("div");if(c.className="space-y-4",!t.state.config.readonly){const y=Ee(e,e.key);y&&u.appendChild(y)}const h=(a=e.minCount)!=null?a:0,f=(l=e.maxCount)!=null?l:1/0,m=Array.isArray((r=t.prefill)==null?void 0:r[e.key])?t.prefill[e.key]:null,g=xe(e.elements),v=()=>c.querySelectorAll(":scope > .containerItem").length,E=()=>{const y=document.createElement("button");return y.type="button",y.className="add-container-btn px-3 py-1 rounded",y.style.cssText=`
|
|
324
324
|
color: var(--fb-primary-color);
|
|
325
325
|
border: var(--fb-border-width) solid var(--fb-primary-color);
|
|
326
326
|
background-color: transparent;
|
|
327
327
|
font-size: var(--fb-font-size);
|
|
328
328
|
transition: all var(--fb-transition-duration);
|
|
329
|
-
`,
|
|
329
|
+
`,y.textContent="+",y.addEventListener("mouseenter",()=>{y.style.backgroundColor="var(--fb-background-hover-color)"}),y.addEventListener("mouseleave",()=>{y.style.backgroundColor="transparent"}),y.onclick=()=>{if(v()<f){const b=v(),x=s.formRoot?Z(s.formRoot):{},w={state:t.state,path:M(t.path,`${e.key}[${b}]`),prefill:g,formData:x},k=document.createElement("div");k.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",k.setAttribute("data-container-item",`${e.key}[${b}]`);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(F=>{F.hidden||L.appendChild(O(F,w))}),k.appendChild(L),!s.config.readonly){const F=document.createElement("button");F.type="button",F.className="absolute top-2 right-2 px-2 py-1 rounded",F.style.cssText=`
|
|
330
330
|
color: var(--fb-error-color);
|
|
331
331
|
background-color: transparent;
|
|
332
332
|
transition: background-color var(--fb-transition-duration);
|
|
333
|
-
`,
|
|
333
|
+
`,F.textContent="\u2715",F.addEventListener("mouseenter",()=>{F.style.backgroundColor="var(--fb-background-hover-color)"}),F.addEventListener("mouseleave",()=>{F.style.backgroundColor="transparent"}),F.onclick=()=>C(k),k.style.position="relative",k.appendChild(F)}c.appendChild(k),p()}},y},p=()=>{const y=v(),b=u.querySelector(".add-container-btn");b&&(b.disabled=y>=f,b.style.opacity=y>=f?"0.5":"1",b.style.pointerEvents=y>=f?"none":"auto"),d.textContent=`${y}/${f===1/0?"\u221E":f}`},C=y=>{y.remove(),p()};if(m&&Array.isArray(m)&&m.forEach((y,b)=>{var x;const w=Ce(y||{},g),k={state:t.state,path:M(t.path,`${e.key}[${b}]`),prefill:w,formData:(x=t.formData)!=null?x:t.prefill},L=document.createElement("div");L.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",L.setAttribute("data-container-item",`${e.key}[${b}]`);const A=document.createElement("div"),F=e.columns||1;if(F===1?A.className="space-y-4":A.className=`grid grid-cols-${F} gap-4`,e.elements.forEach(N=>{N.hidden||A.appendChild(O(N,k))}),L.appendChild(A),!s.config.readonly){const N=document.createElement("button");N.type="button",N.className="absolute top-2 right-2 px-2 py-1 rounded",N.style.cssText=`
|
|
334
334
|
color: var(--fb-error-color);
|
|
335
335
|
background-color: transparent;
|
|
336
336
|
transition: background-color var(--fb-transition-duration);
|
|
337
|
-
`,
|
|
337
|
+
`,N.textContent="\u2715",N.addEventListener("mouseenter",()=>{N.style.backgroundColor="var(--fb-background-hover-color)"}),N.addEventListener("mouseleave",()=>{N.style.backgroundColor="transparent"}),N.onclick=()=>C(L),L.style.position="relative",L.appendChild(N)}c.appendChild(L)}),!s.config.readonly)for(;v()<h;){const y=v(),b={state:t.state,path:M(t.path,`${e.key}[${y}]`),prefill:g,formData:(i=t.formData)!=null?i:t.prefill},x=document.createElement("div");x.className="containerItem border border-gray-300 rounded-lg p-4 bg-white",x.setAttribute("data-container-item",`${e.key}[${y}]`);const w=document.createElement("div"),k=e.columns||1;k===1?w.className="space-y-4":w.className=`grid grid-cols-${k} gap-4`,e.elements.forEach(A=>{A.hidden||w.appendChild(O(A,b))}),x.appendChild(w);const L=document.createElement("button");L.type="button",L.className="absolute top-2 right-2 px-2 py-1 rounded",L.style.cssText=`
|
|
338
338
|
color: var(--fb-error-color);
|
|
339
339
|
background-color: transparent;
|
|
340
340
|
transition: background-color var(--fb-transition-duration);
|
|
341
|
-
`,w.textContent="\u2715",w.addEventListener("mouseenter",()=>{w.style.backgroundColor="var(--fb-background-hover-color)"}),w.addEventListener("mouseleave",()=>{w.style.backgroundColor="transparent"}),w.onclick=()=>{v()>h&&(b.remove(),E())},b.style.position="relative",b.appendChild(w),c.appendChild(b)}if(u.appendChild(c),!s.config.readonly){const d=document.createElement("div");d.className="flex items-center gap-3 mt-2",d.appendChild(g()),d.appendChild(p),u.appendChild(d)}E(),n.appendChild(u)}let X=null;function bt(e){X=e}function xe(e,t,n){if(!X)throw new Error("validateElement not initialized. Should be set from FormBuilderInstance");return X(e,t,n)}function Ce(e,t,n){const o=[],{scopeRoot:a,skipValidation:l,path:r}=n;if(!("elements"in e))return{value:null,errors:o};const i=(s,u,p)=>{var c,h;if(l)return;const{state:f}=n,m="minCount"in p&&(c=p.minCount)!=null?c:0,v="maxCount"in p&&(h=p.maxCount)!=null?h:1/0;p.required&&u.length===0&&o.push(`${s}: ${$("required",f)}`),u.length<m&&o.push(`${s}: ${$("minItems",f,{min:m})}`),u.length>v&&o.push(`${s}: ${$("maxItems",f,{max:v})}`)};if("multiple"in e&&e.multiple){const s=[],u=a.querySelectorAll("[data-container-item]"),p=Array.from(u).filter(c=>{const h=c.getAttribute("data-container-item");return h==null?void 0:h.startsWith(`${t}[`)}).length;for(let c=0;c<p;c++){const h={},f=a.querySelector(`[data-container-item="${t}[${c}]"]`)||a;e.elements.forEach(m=>{var v;if(m.enableIf)try{const g=(v=n.instance)!=null&&v.getState().formRoot?Y(n.instance.getState().formRoot):{};if(!T(m.enableIf,g,h))return}catch(g){console.error(`Error evaluating enableIf for field "${m.key}" in container "${t}[${c}]":`,g)}if(m.hidden||m.type==="hidden")h[m.key]=m.default!==void 0?m.default:null;else{const g=`${t}[${c}].${m.key}`;h[m.key]=xe({...m,key:g},{path:r},f)}}),s.push(h)}return i(t,s,e),{value:s,errors:o}}else{const s={},u=a.querySelector(`[data-container="${t}"]`)||a;return e.elements.forEach(p=>{var c;if(p.enableIf)try{const h=(c=n.instance)!=null&&c.getState().formRoot?Y(n.instance.getState().formRoot):{};if(!T(p.enableIf,h,s))return}catch(h){console.error(`Error evaluating enableIf for field "${p.key}" in container "${t}":`,h)}if(p.hidden||p.type==="hidden")s[p.key]=p.default!==void 0?p.default:null;else{const h=`${t}.${p.key}`;s[p.key]=xe({...p,key:h},{path:r},u)}}),{value:s,errors:o}}}function Ee(e,t,n,o){const{instance:a,scopeRoot:l}=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)=>{B(i)&&e.elements.forEach(u=>{const p=u.key,c=`${t}[${s}].${p}`,h=i[p];h!==void 0&&a.updateField(c,h)})});const r=l.querySelectorAll(`[data-container-item^="${t}["]`);n.length!==r.length&&console.warn(`updateContainerField: Multiple container field "${t}" item count mismatch. Consider re-rendering for add/remove.`)}else{if(!B(n)){console.warn(`updateContainerField: Expected object for container field "${t}", got ${typeof n}`);return}e.elements.forEach(r=>{const i=r.key,s=`${t}.${i}`,u=n[i];u!==void 0&&a.updateField(s,u)})}}function yt(e,t,n,o){var a,l;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 r={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&&B(e.repeat)),minCount:(a=e.repeat)==null?void 0:a.min,maxCount:(l=e.repeat)==null?void 0:l.max};r.multiple?ye(r,t,n):be(r,t,n,o)}function $e(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&&B(o.repeat)),minCount:(t=o.repeat)==null?void 0:t.min,maxCount:(n=o.repeat)==null?void 0:n.max}}function xt(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=$e(e);return Ce(o,t,n)}function Ct(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=$e(e);return Ee(a,t,n,o)}function Et(e,t){const n=document.getElementById(e);if(!n)return;const o=!n.classList.contains("hidden");if(document.querySelectorAll('[id^="tooltip-"]').forEach(p=>{p.classList.add("hidden")}),o)return;const a=t.getBoundingClientRect(),l=window.innerWidth,r=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,u=a.bottom+5;s+i.width>l&&(s=a.right-i.width),u+i.height>r&&(u=a.top-i.height-5),s<10&&(s=10),u<10&&(u=a.bottom+5),n.style.left=`${s}px`,n.style.top=`${u}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 $t(e,t){var n,o;if(!e.enableIf)return!1;try{const a=(o=(n=t.formData)!=null?n:t.prefill)!=null?o:{},l=t.path?z(a,t.path):void 0;return!T(e.enableIf,a,l)}catch(a){console.error(`Error evaluating enableIf for field "${e.key}":`,a)}return!1}function wt(e,t){const n=t.querySelector(`[name="${e}"]`);if(n){if(n instanceof HTMLSelectElement)return n.value;if(n instanceof HTMLInputElement){if(n.type==="checkbox")return n.checked;if(n.type==="radio"){const o=t.querySelector(`[name="${e}"]:checked`);return o?o.value:void 0}else return n.value}else if(n instanceof HTMLTextAreaElement)return n.value}}function j(e,t,n){var o,a;if(!t.enableIf)return;const l=n.state.formRoot;if(!l){console.error("Cannot re-evaluate enableIf: formRoot is null");return}const r=t.enableIf,i=(o=r.scope)!=null?o:"relative";let s={};const u={};if((!n.path||n.path===""?"absolute":i)==="relative"&&n.path){const p=n.path.match(/^(.+)\[(\d+)\]$/);if(p){const c=p[1],h=parseInt(p[2],10),f=l.querySelector(`[data-container-item="${c}[${h}]"]`);f&&f.querySelectorAll("input, select, textarea").forEach(m=>{const v=m.getAttribute("name");if(v){const g=v.match(/\.([^.[\]]+)$/);if(g){const E=g[1];m instanceof HTMLSelectElement?u[E]=m.value:m instanceof HTMLInputElement?m.type==="checkbox"?u[E]=m.checked:m.type==="radio"?m.checked&&(u[E]=m.value):u[E]=m.value:m instanceof HTMLTextAreaElement&&(u[E]=m.value)}}})}}else{const p=r.key,c=wt(p,l);c!==void 0?s[p]=c:s=(a=n.formData)!=null?a:n.prefill}try{T(r,s,u)?(e.style.display="",e.classList.remove("fb-field-wrapper-disabled"),e.removeAttribute("data-conditionally-disabled")):(e.style.display="none",e.classList.add("fb-field-wrapper-disabled"),e.setAttribute("data-conditionally-disabled","true"))}catch(p){console.error(`Error re-evaluating enableIf for field "${t.key}":`,p)}}function kt(e,t,n){var o;if(!t.enableIf)return;const a=n.state.formRoot;if(!a){console.error("Cannot setup enableIf listeners: formRoot is null");return}const l=t.enableIf,r=(o=l.scope)!=null?o:"relative",i=l.key;let s;r==="relative"&&n.path?s=`${n.path}.${i}`:s=i;const u=a.querySelector(`[name="${s}"]`);if(!u){const p=new MutationObserver(()=>{const c=a.querySelector(`[name="${s}"]`);c&&(c.addEventListener("change",()=>{j(e,t,n)}),c.addEventListener("input",()=>{j(e,t,n)}),p.disconnect())});p.observe(a,{childList:!0,subtree:!0});return}u.addEventListener("change",()=>{j(e,t,n)}),u.addEventListener("input",()=>{j(e,t,n)})}function Lt(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 St(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(),Et(n,t)},t}function Ft(e){const t=document.createElement("div");t.className="flex items-center mb-2";const n=Lt(e);if(t.appendChild(n),e.description||e.hint){const o=St(e);t.appendChild(o)}return t}function Nt(e,t,n,o){const a="multiple"in e&&e.multiple;switch(e.type){case"text":a?He(e,t,n,o):Me(e,t,n,o);break;case"textarea":a?ze(e,t,n,o):Be(e,t,n,o);break;case"number":a?je(e,t,n,o):De(e,t,n,o);break;case"select":a?Ve(e,t,n,o):Pe(e,t,n,o);break;case"file":a?st(e,t,n,o):at(e,t,n,o);break;case"files":it(e,t,n,o);break;case"colour":a?ut(e,t,n,o):ct(e,t,n,o);break;case"slider":a?mt(e,t,n,o):ft(e,t,n,o);break;case"group":yt(e,t,n,o);break;case"container":a?ye(e,t,n):be(e,t,n,o);break;default:{const l=document.createElement("div");l.className="text-red-500 text-sm",l.textContent=$("unsupportedFieldType",t.state,{type:e.type}),n.appendChild(l)}}}function Z(e,t){const n=$t(e,t),o=document.createElement("div");o.className="mb-6 fb-field-wrapper",o.setAttribute("data-field-key",e.key);const a=Ft(e);o.appendChild(a);const l=A(t.path,e.key);return Nt(e,t,o,l),n&&(o.style.display="none",o.classList.add("fb-field-wrapper-disabled"),o.setAttribute("data-conditionally-disabled","true")),kt(o,e,t),o}gt(Z);const Q={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:{removeElement:"Remove",clickDragText:"Click or drag file",clickDragTextMultiple:"Click or drag files",noFileSelected:"No file selected",noFilesSelected:"No files selected",downloadButton:"Download",changeButton:"Change",placeholderText:"Enter text",previewAlt:"Preview",previewUnavailable:"Preview unavailable",previewError:"Preview error",videoNotSupported:"Your browser does not support the video tag.",hintLengthRange:"{min}-{max} chars",hintMaxLength:"\u2264{max} chars",hintMinLength:"\u2265{min} chars",hintValueRange:"{min}-{max}",hintMaxValue:"\u2264{max}",hintMinValue:"\u2265{min}",hintMaxSize:"\u2264{size}MB",hintFormats:"{formats}",hintRequired:"Required",hintOptional:"Optional",hintPattern:"Format: {pattern}",fileCountSingle:"{count} file",fileCountPlural:"{count} files",fileCountRange:"({min}-{max})",required:"Required",minItems:"Minimum {min} items required",maxItems:"Maximum {max} items allowed",minLength:"Minimum {min} characters",maxLength:"Maximum {max} characters",minValue:"Must be at least {min}",maxValue:"Must be at most {max}",patternMismatch:"Invalid format",invalidPattern:"Invalid pattern in schema",notANumber:"Must be a number",invalidHexColour:"Invalid hex color",minFiles:"Minimum {min} files required",maxFiles:"Maximum {max} files allowed",unsupportedFieldType:"Unsupported field type: {type}"},ru:{removeElement:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",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",clickDragTextMultiple:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B",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",changeButton:"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C",placeholderText:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",previewAlt:"\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440",previewUnavailable:"\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",previewError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430",videoNotSupported:"\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.",hintLengthRange:"{min}-{max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintMaxLength:"\u2264{max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintMinLength:"\u2265{min} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintValueRange:"{min}-{max}",hintMaxValue:"\u2264{max}",hintMinValue:"\u2265{min}",hintMaxSize:"\u2264{size}\u041C\u0411",hintFormats:"{formats}",hintRequired:"\u041E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435",hintOptional:"\u041D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435",hintPattern:"\u0424\u043E\u0440\u043C\u0430\u0442: {pattern}",fileCountSingle:"{count} \u0444\u0430\u0439\u043B",fileCountPlural:"{count} \u0444\u0430\u0439\u043B\u043E\u0432",fileCountRange:"({min}-{max})",required:"\u041E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u043B\u0435",minItems:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",maxItems:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",minLength:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",maxLength:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",minValue:"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u0435\u0435 {min}",maxValue:"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0431\u043E\u043B\u0435\u0435 {max}",patternMismatch:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442",invalidPattern:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0430\u0442\u0442\u0435\u0440\u043D \u0432 \u0441\u0445\u0435\u043C\u0435",notANumber:"\u0414\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u0447\u0438\u0441\u043B\u043E\u043C",invalidHexColour:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0446\u0432\u0435\u0442\u0430",minFiles:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u0444\u0430\u0439\u043B\u043E\u0432",maxFiles:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u0444\u0430\u0439\u043B\u043E\u0432",unsupportedFieldType:"\u041D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0442\u0438\u043F \u043F\u043E\u043B\u044F: {type}"}},theme:{}};function At(e){const t={...Q.translations};if(e!=null&&e.translations)for(const[n,o]of Object.entries(e.translations))t[n]={...Q.translations[n]||{},...o};return{schema:null,formRoot:null,resourceIndex:new Map,externalActions:null,version:"1.0.0",config:{...Q,...e,translations:t},debounceTimer:null}}function Tt(){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 qt(e){const t={...H,...e},n=[];return Object.entries(t).forEach(([o,a])=>{const l=o.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(` --fb-${l}: ${a};`)}),n.join(`
|
|
342
|
-
`)}function
|
|
341
|
+
`,L.textContent="\u2715",L.addEventListener("mouseenter",()=>{L.style.backgroundColor="var(--fb-background-hover-color)"}),L.addEventListener("mouseleave",()=>{L.style.backgroundColor="transparent"}),L.onclick=()=>{v()>h&&C(x)},x.style.position="relative",x.appendChild(L),c.appendChild(x)}if(u.appendChild(c),!s.config.readonly){const y=document.createElement("div");y.className="flex items-center gap-3 mt-2",y.appendChild(E()),y.appendChild(d),u.appendChild(y)}p(),n.appendChild(u)}let K=null;function $t(e){K=e}function ke(e,t,n){if(!K)throw new Error("validateElement not initialized. Should be set from FormBuilderInstance");return K(e,t,n)}function Le(e,t,n){const o=[],{scopeRoot:a,skipValidation:l,path:r}=n;if(!("elements"in e))return{value:null,errors:o};const i=(s,u,d)=>{var c,h;if(l)return;const{state:f}=n,m="minCount"in d&&(c=d.minCount)!=null?c:0,g="maxCount"in d&&(h=d.maxCount)!=null?h:1/0;d.required&&u.length===0&&o.push(`${s}: ${$("required",f)}`),u.length<m&&o.push(`${s}: ${$("minItems",f,{min:m})}`),u.length>g&&o.push(`${s}: ${$("maxItems",f,{max:g})}`)};if("multiple"in e&&e.multiple){const s=[],u=a.querySelectorAll("[data-container-item]");return Array.from(u).filter(d=>{const c=d.getAttribute("data-container-item")||"";if(!c.startsWith(`${t}[`))return!1;const h=c.slice(t.length);return/^\[\d+\]$/.test(h)}).forEach(d=>{const c={},h=(d.getAttribute("data-container-item")||"").match(/\[(\d+)\]$/),f=h?parseInt(h[1],10):0;e.elements.forEach(m=>{var g;if(m.enableIf)try{const v=(g=n.instance)!=null&&g.getState().formRoot?Z(n.instance.getState().formRoot):{};if(!H(m.enableIf,v,c))return}catch(v){console.error(`Error evaluating enableIf for field "${m.key}" in container "${t}[${f}]":`,v)}if(m.hidden||m.type==="hidden")c[m.key]=m.default!==void 0?m.default:null;else{const v=`${t}[${f}].${m.key}`;c[m.key]=ke({...m,key:v},{path:r},d)}}),s.push(c)}),i(t,s,e),{value:s,errors:o}}else{const s={},u=a.querySelector(`[data-container="${t}"]`)||a;return e.elements.forEach(d=>{var c;if(d.enableIf)try{const h=(c=n.instance)!=null&&c.getState().formRoot?Z(n.instance.getState().formRoot):{};if(!H(d.enableIf,h,s))return}catch(h){console.error(`Error evaluating enableIf for field "${d.key}" in container "${t}":`,h)}if(d.hidden||d.type==="hidden")s[d.key]=d.default!==void 0?d.default:null;else{const h=`${t}.${d.key}`;s[d.key]=ke({...d,key:h},{path:r},u)}}),{value:s,errors:o}}}function Se(e,t,n,o){const{instance:a,scopeRoot:l}=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)=>{R(i)&&e.elements.forEach(u=>{const d=u.key,c=`${t}[${s}].${d}`,h=i[d];h!==void 0&&a.updateField(c,h)})});const r=l.querySelectorAll(`[data-container-item^="${t}["]`);n.length!==r.length&&console.warn(`updateContainerField: Multiple container field "${t}" item count mismatch. Consider re-rendering for add/remove.`)}else{if(!R(n)){console.warn(`updateContainerField: Expected object for container field "${t}", got ${typeof n}`);return}e.elements.forEach(r=>{const i=r.key,s=`${t}.${i}`,u=n[i];u!==void 0&&a.updateField(s,u)})}}function wt(e,t,n,o){var a,l;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 r={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&&R(e.repeat)),minCount:(a=e.repeat)==null?void 0:a.min,maxCount:(l=e.repeat)==null?void 0:l.max};r.multiple?we(r,t,n):$e(r,t,n,o)}function Fe(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&&R(o.repeat)),minCount:(t=o.repeat)==null?void 0:t.min,maxCount:(n=o.repeat)==null?void 0:n.max}}function kt(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=Fe(e);return Le(o,t,n)}function Lt(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=Fe(e);return Se(a,t,n,o)}function St(e,t){const n=document.getElementById(e);if(!n)return;const o=!n.classList.contains("hidden");if(document.querySelectorAll('[id^="tooltip-"]').forEach(d=>{d.classList.add("hidden")}),o)return;const a=t.getBoundingClientRect(),l=window.innerWidth,r=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,u=a.bottom+5;s+i.width>l&&(s=a.right-i.width),u+i.height>r&&(u=a.top-i.height-5),s<10&&(s=10),u<10&&(u=a.bottom+5),n.style.left=`${s}px`,n.style.top=`${u}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 Ft(e,t){var n,o,a;if(!e.enableIf)return!1;try{const l=(o=(n=t.formData)!=null?n:t.prefill)!=null?o:{},r=((a=e.enableIf.scope)!=null?a:"relative")==="relative"&&t.path?t.prefill:void 0;return!H(e.enableIf,l,r)}catch(l){console.error(`Error evaluating enableIf for field "${e.key}":`,l)}return!1}function Nt(e,t){const n=t.querySelector(`[name="${e}"]`);if(n){if(n instanceof HTMLSelectElement)return n.value;if(n instanceof HTMLInputElement){if(n.type==="checkbox")return n.checked;if(n.type==="radio"){const o=t.querySelector(`[name="${e}"]:checked`);return o?o.value:void 0}else return n.value}else if(n instanceof HTMLTextAreaElement)return n.value}}function P(e,t,n){var o,a;if(!t.enableIf)return;const l=n.state.formRoot;if(!l){console.error("Cannot re-evaluate enableIf: formRoot is null");return}const r=t.enableIf,i=(o=r.scope)!=null?o:"relative";let s={};const u={};if((!n.path||n.path===""?"absolute":i)==="relative"&&n.path){const d=n.path.match(/^(.+)\[(\d+)\]$/);if(d){const c=d[1],h=parseInt(d[2],10),f=l.querySelector(`[data-container-item="${c}[${h}]"]`);f&&f.querySelectorAll("input, select, textarea").forEach(m=>{const g=m.getAttribute("name");if(g){const v=g.match(/\.([^.[\]]+)$/);if(v){const E=v[1];m instanceof HTMLSelectElement?u[E]=m.value:m instanceof HTMLInputElement?m.type==="checkbox"?u[E]=m.checked:m.type==="radio"?m.checked&&(u[E]=m.value):u[E]=m.value:m instanceof HTMLTextAreaElement&&(u[E]=m.value)}}})}}else{const d=r.key,c=Nt(d,l);c!==void 0?s[d]=c:s=(a=n.formData)!=null?a:n.prefill}try{H(r,s,u)?(e.style.display="",e.classList.remove("fb-field-wrapper-disabled"),e.removeAttribute("data-conditionally-disabled")):(e.style.display="none",e.classList.add("fb-field-wrapper-disabled"),e.setAttribute("data-conditionally-disabled","true"))}catch(d){console.error(`Error re-evaluating enableIf for field "${t.key}":`,d)}}function At(e,t,n){var o;if(!t.enableIf)return;const a=n.state.formRoot;if(!a){console.error("Cannot setup enableIf listeners: formRoot is null");return}const l=t.enableIf,r=(o=l.scope)!=null?o:"relative",i=l.key;let s;r==="relative"&&n.path?s=`${n.path}.${i}`:s=i;const u=a.querySelector(`[name="${s}"]`);if(!u){const d=new MutationObserver(()=>{const c=a.querySelector(`[name="${s}"]`);c&&(c.addEventListener("change",()=>{P(e,t,n)}),c.addEventListener("input",()=>{P(e,t,n)}),d.disconnect())});d.observe(a,{childList:!0,subtree:!0});return}u.addEventListener("change",()=>{P(e,t,n)}),u.addEventListener("input",()=>{P(e,t,n)})}function Tt(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 qt(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(),St(n,t)},t}function Mt(e){const t=document.createElement("div");t.className="flex items-center mb-2";const n=Tt(e);if(t.appendChild(n),e.description||e.hint){const o=qt(e);t.appendChild(o)}return t}function Ht(e,t,n,o){const a="multiple"in e&&e.multiple;switch(e.type){case"text":a?De(e,t,n,o):Re(e,t,n,o);break;case"textarea":a?Oe(e,t,n,o):je(e,t,n,o);break;case"number":a?We(e,t,n,o):Ve(e,t,n,o);break;case"select":a?Ge(e,t,n,o):Ye(e,t,n,o);break;case"file":a?pt(e,t,n,o):dt(e,t,n,o);break;case"files":ft(e,t,n,o);break;case"colour":a?ht(e,t,n,o):mt(e,t,n,o);break;case"slider":a?bt(e,t,n,o):yt(e,t,n,o);break;case"group":wt(e,t,n,o);break;case"container":a?we(e,t,n):$e(e,t,n,o);break;default:{const l=document.createElement("div");l.className="text-red-500 text-sm",l.textContent=$("unsupportedFieldType",t.state,{type:e.type}),n.appendChild(l)}}}function ee(e,t){const n=Ft(e,t),o=document.createElement("div");o.className="mb-6 fb-field-wrapper",o.setAttribute("data-field-key",e.key);const a=Mt(e);o.appendChild(a);const l=M(t.path,e.key);return Ht(e,t,o,l),n&&(o.style.display="none",o.classList.add("fb-field-wrapper-disabled"),o.setAttribute("data-conditionally-disabled","true")),At(o,e,t),o}Et(ee);const te={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:{removeElement:"Remove",clickDragText:"Click or drag file",clickDragTextMultiple:"Click or drag files",noFileSelected:"No file selected",noFilesSelected:"No files selected",downloadButton:"Download",changeButton:"Change",placeholderText:"Enter text",previewAlt:"Preview",previewUnavailable:"Preview unavailable",previewError:"Preview error",videoNotSupported:"Your browser does not support the video tag.",hintLengthRange:"{min}-{max} chars",hintMaxLength:"\u2264{max} chars",hintMinLength:"\u2265{min} chars",hintValueRange:"{min}-{max}",hintMaxValue:"\u2264{max}",hintMinValue:"\u2265{min}",hintMaxSize:"\u2264{size}MB",hintFormats:"{formats}",hintRequired:"Required",hintOptional:"Optional",hintPattern:"Format: {pattern}",fileCountSingle:"{count} file",fileCountPlural:"{count} files",fileCountRange:"({min}-{max})",required:"Required",minItems:"Minimum {min} items required",maxItems:"Maximum {max} items allowed",minLength:"Minimum {min} characters",maxLength:"Maximum {max} characters",minValue:"Must be at least {min}",maxValue:"Must be at most {max}",patternMismatch:"Invalid format",invalidPattern:"Invalid pattern in schema",notANumber:"Must be a number",invalidHexColour:"Invalid hex color",minFiles:"Minimum {min} files required",maxFiles:"Maximum {max} files allowed",unsupportedFieldType:"Unsupported field type: {type}"},ru:{removeElement:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",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",clickDragTextMultiple:"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B",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",changeButton:"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C",placeholderText:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442",previewAlt:"\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440",previewUnavailable:"\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",previewError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430",videoNotSupported:"\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.",hintLengthRange:"{min}-{max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintMaxLength:"\u2264{max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintMinLength:"\u2265{min} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",hintValueRange:"{min}-{max}",hintMaxValue:"\u2264{max}",hintMinValue:"\u2265{min}",hintMaxSize:"\u2264{size}\u041C\u0411",hintFormats:"{formats}",hintRequired:"\u041E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435",hintOptional:"\u041D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435",hintPattern:"\u0424\u043E\u0440\u043C\u0430\u0442: {pattern}",fileCountSingle:"{count} \u0444\u0430\u0439\u043B",fileCountPlural:"{count} \u0444\u0430\u0439\u043B\u043E\u0432",fileCountRange:"({min}-{max})",required:"\u041E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u043B\u0435",minItems:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",maxItems:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432",minLength:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",maxLength:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",minValue:"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u0435\u0435 {min}",maxValue:"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0431\u043E\u043B\u0435\u0435 {max}",patternMismatch:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442",invalidPattern:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0430\u0442\u0442\u0435\u0440\u043D \u0432 \u0441\u0445\u0435\u043C\u0435",notANumber:"\u0414\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u0447\u0438\u0441\u043B\u043E\u043C",invalidHexColour:"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0446\u0432\u0435\u0442\u0430",minFiles:"\u041C\u0438\u043D\u0438\u043C\u0443\u043C {min} \u0444\u0430\u0439\u043B\u043E\u0432",maxFiles:"\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {max} \u0444\u0430\u0439\u043B\u043E\u0432",unsupportedFieldType:"\u041D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0442\u0438\u043F \u043F\u043E\u043B\u044F: {type}"}},theme:{}};function Bt(e){const t={...te.translations};if(e!=null&&e.translations)for(const[n,o]of Object.entries(e.translations))t[n]={...te.translations[n]||{},...o};return{schema:null,formRoot:null,resourceIndex:new Map,externalActions:null,version:"1.0.0",config:{...te,...e,translations:t},debounceTimer:null}}function It(){const e=Date.now().toString(36),t=Math.random().toString(36).substring(2,9);return`inst-${e}-${t}`}const z={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 zt(e){const t={...z,...e},n=[];return Object.entries(t).forEach(([o,a])=>{const l=o.replace(/([A-Z])/g,"-$1").toLowerCase();n.push(` --fb-${l}: ${a};`)}),n.join(`
|
|
342
|
+
`)}function Rt(e,t){const n=zt(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=`
|
|
343
343
|
[data-fb-root="true"] {
|
|
344
344
|
${n}
|
|
345
345
|
}
|
|
346
|
-
`}const
|
|
346
|
+
`}const Dt={default:z,dark:{...z,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:{...z,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 Ne(e,t=!1){e.style.cssText=`
|
|
347
347
|
background-color: var(--fb-action-bg-color);
|
|
348
348
|
color: var(--fb-action-text-color);
|
|
349
349
|
border: var(--fb-border-width) solid var(--fb-action-border-color);
|
|
@@ -353,6 +353,6 @@ ${n}
|
|
|
353
353
|
border-radius: var(--fb-border-radius);
|
|
354
354
|
transition: all var(--fb-transition-duration);
|
|
355
355
|
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
356
|
-
`,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
|
|
356
|
+
`,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 jt={text:{validate:ne,update:re},textarea:{validate:Pe,update:Ue},number:{validate:_e,update:Je},select:{validate:Xe,update:Ze},file:{validate:pe,update:me},files:{validate:pe,update:me},colour:{validate:vt,update:gt},slider:{validate:xt,update:Ct},container:{validate:Le,update:Se},group:{validate:kt,update:Lt}};function Ae(e){return jt[e]||null}function Ot(e,t,n){const o=Ae(e.type);return o&&o.validate?o.validate(e,t,n):null}function Pt(e,t,n,o){const a=Ae(e.type);return a&&a.update?(a.update(e,t,n,o),!0):!1}class U{constructor(t){this.instanceId=It(),this.state=Bt(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 l=[t,t.replace(/\[(\d+)\]/g,"[$1]"),t.replace(/\./g,"[")+"]".repeat((t.match(/\./g)||[]).length)];for(const r of l)if(a=this.state.formRoot.querySelector(`[name="${r}"]`),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 l=n.label||n.key,r=a.querySelector("label");if(r&&(r.textContent===l||r.textContent===`${l}*`)){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 l of a){if(o=n.find(r=>r.key===l)||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 l=o.actions.find(r=>r.key===t);if(l&&l.label)return l.label}if(a&&this.state.schema&&"actions"in this.state.schema&&this.state.schema.actions){const l=this.state.schema.actions.find(r=>r.key===t);if(l&&l.label)return l.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=`
|
|
357
357
|
border-top: var(--fb-border-width) solid var(--fb-border-color);
|
|
358
|
-
`,t.forEach(l=>{const r=document.createElement("button");r.type="button",
|
|
358
|
+
`,t.forEach(l=>{const r=document.createElement("button");r.type="button",Ne(r,!0);const i=n.includes(l),s=this.resolveActionLabel(l.key,l.label,null,i);r.textContent=s,r.addEventListener("click",u=>{u.preventDefault(),u.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(l.value,l.key,null)}),a.appendChild(r)}),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(l=>{!l.key||!l.value||(l.related_field?(t.has(l.related_field)||t.set(l.related_field,[]),t.get(l.related_field).push(l)):n.push(l))}),t.forEach((l,r)=>{const i=this.findFormElementByFieldPath(r);if(!i){console.warn(`External action: Could not find form element for field "${r}", treating as form-level actions`),o.push(...l);return}let s=i.closest(".fb-field-wrapper");if(s||(s=i.parentElement),!s){console.warn(`External action: Could not find wrapper for field "${r}"`);return}const u=s.querySelector(".external-actions-container");u&&u.remove();const d=document.createElement("div");d.className="external-actions-container mt-3 flex flex-wrap gap-2";const c=this.findSchemaElement(r);l.forEach(h=>{const f=document.createElement("button");f.type="button",Ne(f,!1);const m=this.resolveActionLabel(h.key,h.label,c);f.textContent=m,f.addEventListener("click",g=>{g.preventDefault(),g.stopPropagation(),this.state.config.actionHandler&&typeof this.state.config.actionHandler=="function"&&this.state.config.actionHandler(h.value,h.key,h.related_field)}),d.appendChild(f)}),s.appendChild(d)});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-root-hint")==="true",l=n.getAttribute("data-container-key");if(!o||!a&&!l){console.warn("Prefill hint missing required data attributes");return}try{const r=JSON.parse(o);for(const i in r){const s=a?i:`${l}.${i}`,u=r[i];this.updateField(s,u)}}catch(r){console.error("Error parsing prefill hint values:",r)}}createRootPrefillHints(t){const n=document.createElement("div");return n.className="fb-prefill-hints flex flex-wrap gap-2 mb-4",t.forEach(o=>{const a=document.createElement("button");a.type="button",a.className="fb-prefill-hint",o.icon?a.textContent=`${o.icon} ${o.label}`:a.textContent=o.label,a.setAttribute("data-hint-values",JSON.stringify(o.values)),a.setAttribute("data-root-hint","true"),n.appendChild(a)}),n}renderForm(t,n,o,a){const l=V(n);if(l.length>0){console.error("Schema validation errors:",l);return}this.state.formRoot=t,this.state.schema=n,this.state.externalActions=a||null,I(t),t.setAttribute("data-fb-root","true"),Rt(t,this.state.config.theme);const r=document.createElement("div");if(r.className="space-y-6",n.prefillHints&&!this.state.config.readonly){const u=this.createRootPrefillHints(n.prefillHints);r.appendChild(u)}const i=document.createElement("div"),s=n.columns||1;s===1?i.className="space-y-4":i.className=`grid grid-cols-${s} gap-4`,n.elements.forEach(u=>{if(u.hidden)return;const d=ee(u,{path:"",prefill:o||{},formData:o||{},state:this.state,instance:this});i.appendChild(d)}),r.appendChild(i),t.appendChild(r),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=(l,r,i=null)=>{const s=l.key,u={scopeRoot:i||this.state.formRoot,state:this.state,instance:this,path:r.path,skipValidation:t},d=Ot(l,s,u);return d!==null?(n.push(...d.errors),d.value):(console.warn(`Unknown field type "${l.type}" for key "${s}"`),null)};return $t(a),this.state.schema.elements.forEach(l=>{if(l.enableIf)try{if(!H(l.enableIf,o))return}catch(r){console.error(`Error evaluating enableIf for field "${l.key}" during validation:`,r)}l.hidden?o[l.key]=l.default!==void 0?l.default:null:o[l.key]=a(l,{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 l=o,r=this.buildHiddenFieldsData(l.elements);Object.keys(r).length>0&&(a in n?typeof n[a]=="object"&&n[a]!==null&&!Array.isArray(n[a])&&(n[a]={...n[a],...r}):n[a]=r)}}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.reevaluateConditionalFields(),(this.state.config.onChange||this.state.config.onFieldChange)&&this.triggerOnChange(t,n)}updateFieldValue(t,n,o,a){const l={scopeRoot:this.state.formRoot,state:this.state,instance:this,path:""};Pt(n,o,a,l)||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(l=>{var r,i,s;const u=a?`${a}.${l.key}`:l.key;if(l.enableIf){let d=null;if(a){const c=a.match(/^(.+)\[(\d+)\]$/);if(c){const h=c[1],f=c[2],m=this.state.formRoot.querySelector(`[data-container-item="${h}[${f}]"]`);m&&(d=m.querySelector(`[data-field-key="${l.key}"]`))}else{const h=this.state.formRoot.querySelector(`[data-container="${a}"]`);h&&(d=h.querySelector(`[data-field-key="${l.key}"]`))}}else d=this.state.formRoot.querySelector(`[data-field-key="${l.key}"]`);if(d){const c=d;try{let h;((r=l.enableIf.scope)!=null?r:"relative")==="relative"&&a&&(h=W(t,a));const f=H(l.enableIf,t,h),m=c.getAttribute("data-conditionally-disabled")==="true";if(f&&m){const g=a?W(t,a):t,v=ee(l,{path:a,prefill:g&&typeof g=="object"?g:{},formData:t,state:this.state,instance:this});(i=c.parentNode)==null||i.replaceChild(v,c)}else if(!f&&!m){const g=document.createElement("div");g.className="fb-field-wrapper-disabled",g.style.display="none",g.setAttribute("data-field-key",l.key),g.setAttribute("data-conditionally-disabled","true"),(s=c.parentNode)==null||s.replaceChild(g,c)}}catch(h){console.error(`Error re-evaluating enableIf for field "${l.key}" at path "${u}":`,h)}}}if((l.type==="container"||l.type==="group")&&"elements"in l&&l.elements){const d=t==null?void 0:t[l.key];if(Array.isArray(d)){const c=this.state.formRoot.querySelectorAll("[data-container-item]");Array.from(c).filter(h=>{const f=h.getAttribute("data-container-item")||"";if(!f.startsWith(`${u}[`))return!1;const m=f.slice(u.length);return/^\[\d+\]$/.test(m)}).forEach(h=>{const f=h.getAttribute("data-container-item")||"";n(l.elements,f)})}else n(l.elements,u)}})};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&&I(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 Te(e){return new U(e)}return typeof window!="undefined"&&(window.FormBuilder=U,window.createFormBuilder=Te,window.validateSchema=V),q.FormBuilderInstance=U,q.createFormBuilder=Te,q.default=U,q.defaultTheme=z,q.exampleThemes=Dt,q.validateSchema=V,Object.defineProperty(q,"__esModule",{value:!0}),q})({});
|