voc-lib-js 1.0.64 → 1.0.65

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/main.d.mts CHANGED
@@ -24,6 +24,7 @@ type BaseField = {
24
24
  multiple?: boolean;
25
25
  description?: string;
26
26
  icon?: string;
27
+ option_label?: string;
27
28
  };
28
29
  type RowField = {
29
30
  label?: string;
package/dist/main.d.ts CHANGED
@@ -24,6 +24,7 @@ type BaseField = {
24
24
  multiple?: boolean;
25
25
  description?: string;
26
26
  icon?: string;
27
+ option_label?: string;
27
28
  };
28
29
  type RowField = {
29
30
  label?: string;
@@ -1,2 +1,2 @@
1
- "use strict";var VocLibJs=(()=>{var G=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var re=(r,x)=>{for(var f in x)G(r,f,{get:x[f],enumerable:!0})},se=(r,x,f,k)=>{if(x&&typeof x=="object"||typeof x=="function")for(let h of ae(x))!ne.call(r,h)&&h!==f&&G(r,h,{get:()=>x[h],enumerable:!(k=te(x,h))||k.enumerable});return r};var oe=r=>se(G({},"__esModule",{value:!0}),r);var ue={};re(ue,{FormsLib:()=>de,default:()=>me});function U(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",k&&h.classList.add("d-flex","align-items-center","gap-3");let v=document.createElement("img");v.className="voc-form-avatar-preview",v.alt=r.label||"avatar",k&&(v.classList.add("img-thumbnail","rounded-circle"),v.style.width=v.style.height="64px",v.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?v.src=u:(v.src="",v.style.display="none");let i=document.createElement("input");i.type="file",i.accept=r.accept||"image/*",i.className="voc-form-avatar-input",k&&i.classList.add("form-control"),(r.key||r.name)&&(i.name=r.name||r.key,r.key&&(i.id=`voc-form-${r.key}`));let d=document.createElement("input");if(d.type="hidden",(r.key||r.name)&&(d.name=(r.name||r.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{v.src=String(L.result),v.style.display="",d.value=""},L.readAsDataURL(T)}}),k){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(v),h.appendChild(p)}else h.appendChild(v),h.appendChild(i),h.appendChild(d);return h}function J(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let v=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(f)?u=f[0]:f!==void 0?u=f:r.default!==void 0&&(u=r.default),r.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",k&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=v,g.value=i.value,g.className="voc-form-audio-radio",r.key&&(g.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",k&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",k&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),o.appendChild(s),t.appendChild(o),l=document.createElement("audio"),l.src=i.audio_link,l.preload="none",l.style.display="none";let c=y=>{for(;y.firstChild;)y.removeChild(y.firstChild)},N=()=>{let y="http://www.w3.org/2000/svg",$=document.createElementNS(y,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),$.appendChild(q),$},S=()=>{let y="http://www.w3.org/2000/svg",$=document.createElementNS(y,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),$.appendChild(q),$};c(t),t.appendChild(N());let M=y=>{c(t),y?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(N()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let y=h.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}y.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),l.play()}catch(y){console.warn("audio play failed",y)}}),l.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let _=()=>{p.classList.remove("is-playing"),M(!1)};l.addEventListener("pause",_),l.addEventListener("ended",_),e.appendChild(t),e.appendChild(l)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function Y(r,x,f){let k=document.createElement("div");k.className="voc-form-table-wrapper";let h=x?.style==="bootstrap",v=document.createElement("input");v.type="hidden",v.name=r.name||r.key,r.key&&(v.id=`voc-form-${r.key}`),k.appendChild(v);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(r.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),k.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),m=document.createElement("td");m.colSpan=(r.fields?r.fields.length:0)+1,m.appendChild(L),l.appendChild(m),e.appendChild(l),u.appendChild(e),k.appendChild(u);let a=[];function E(){v.value=JSON.stringify(a)}function w(n){let o=[];return r.fields.forEach(s=>{let c=n[s.key];if(s.type==="checkbox"){let N=Array.isArray(c)?c:c?[c]:[];s.required&&N.length===0&&o.push(`${s.label||s.key} is required`);return}s.required&&(c==null||String(c).trim()==="")&&o.push(`${s.label||s.key} is required`),s.type==="email"&&c&&(/^\S+@\S+\.\S+$/.test(String(c))||o.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&c&&isNaN(Number(c))&&o.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&c&&(new RegExp(s.validation.regex).test(String(c))||o.push(`${s.label||s.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",c=>{let N=Number(o.dataset.rowIndex);c.dataTransfer.setData("text/plain",String(N)),o.classList.add("dragging");try{c.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{o.classList.remove("dragging"),s.style.cursor="grab"}),o.addEventListener("dragover",c=>{c.preventDefault();let N=c.currentTarget,S=N.getBoundingClientRect(),M=S.top+S.height/2,_=(c.clientY||c.y)>M;N.classList.remove("drag-over-top","drag-over-bottom"),_?(N.classList.add("drag-over-bottom"),N.dataset.dropPosition="after"):(N.classList.add("drag-over-top"),N.dataset.dropPosition="before")}),o.addEventListener("dragleave",c=>{let N=c.currentTarget;N.classList.remove("drag-over-top","drag-over-bottom"),delete N.dataset.dropPosition}),o.addEventListener("drop",c=>{c.preventDefault();let N=c.dataTransfer.getData("text/plain"),S=Number(c.currentTarget.dataset.rowIndex),M=Number(N),_=c.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[y]=a.splice(M,1),$=S;M<S&&($=S-1);let q=_==="after"?$+1:$;a.splice(q,0,y),c.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete c.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,s)=>{let c=document.createElement("tr");c.dataset.rowIndex=String(s),c.classList.add("voc-form-table-row");let N=document.createElement("td");N.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",N.appendChild(S),c.appendChild(N),n(c,S),r.fields.forEach(y=>{let $=document.createElement("td"),q,A=(y.type||"text").toLowerCase();if(A==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),y.placeholder){let C=document.createElement("option");C.value="",C.textContent=y.placeholder,C.disabled=!0,(o[y.key]===void 0||o[y.key]===null||o[y.key]==="")&&(C.selected=!0),b.appendChild(C)}(y.options||[]).forEach(C=>{let O=document.createElement("option");O.value=C.value,O.textContent=C.label,b.appendChild(O)}),b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.required&&(b.required=!0),b.addEventListener("change",C=>{a[s][y.key]=C.target.value,E()}),q=b}else if(A==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=y.options||[];Array.isArray(a[s][y.key])||(a[s][y.key]=a[s][y.key]?[a[s][y.key]]:[]),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=C.value,H.checked=Array.isArray(a[s][y.key])&&a[s][y.key].includes(C.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[s][y.key])||(a[s][y.key]=[]),I?a[s][y.key].includes(C.value)||a[s][y.key].push(C.value):a[s][y.key]=a[s][y.key].filter(R=>R!==C.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(A==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=y.options||[];a[s][y.key]===void 0&&(a[s][y.key]=""),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${r.key}-${y.key}-${s}`,H.value=C.value,H.checked=a[s][y.key]===C.value,H.addEventListener("change",z=>{z.target.checked&&(a[s][y.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");A==="number"?b.type="number":A==="email"?b.type="email":A==="tel"?b.type="tel":A==="url"?b.type="url":A==="date"?b.type="date":b.type="text",b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.placeholder&&(b.placeholder=y.placeholder),y.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[s][y.key]=F.target.value,E()}),q=b}$.appendChild(q),c.appendChild($)});let M=document.createElement("td"),_=document.createElement("button");_.type="button",_.className="voc-form-table-remove",h&&_.classList.add("btn","btn-danger"),_.textContent="Remove",_.addEventListener("click",()=>{a.splice(s,1),t(),E()}),M.appendChild(_),c.appendChild(M),T.appendChild(c)})}return L.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),E(),k.validate=function(){let n=[];return a.forEach((o,s)=>{let c=w(o);c.length&&n.push(`Row ${s+1}: ${c.join("; ")}`)}),r.validation?.min_rows!==void 0&&a.length<r.validation.min_rows&&n.push(`At least ${r.validation.min_rows} rows required`),r.validation?.max_rows!==void 0&&a.length>r.validation.max_rows&&n.push(`No more than ${r.validation.max_rows} rows allowed`),r.validation?.unique_fields&&r.validation.unique_fields.length&&r.validation.unique_fields.forEach(o=>{let s=new Set;a.forEach((c,N)=>{let S=c[o];S!=null&&(s.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${N+1})`),s.add(S))})}),n},k}async function ie(r){let f=new TextEncoder().encode(r),k=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(k)).map(v=>v.toString(16).padStart(2,"0")).join("")}async function ce(r){let x=String(r||"").trim().toLowerCase();return x?`https://gravatar.com/avatar/${await ie(x)}?d=mp`:""}function K(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let v=document.createElement("div");if(v.className="voc-form-users-header",k&&v.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",k&&e.classList.add("form-label"),e.textContent=r.label,r.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}v.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",k&&e.classList.add("form-text"),e.textContent=r.description,v.appendChild(e)}h.appendChild(v);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",k&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",k&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(f)?g=f:f!=null?g=[f]:Array.isArray(r.default)&&(g=r.default),r.options.forEach((e,l)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),k&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(s=>String(s));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&ce(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let s=o.target;s&&(s.closest("input")||s.closest("a")||s.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),r.required){let e=d.querySelectorAll('input[type="checkbox"]'),l=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",l)}),h._validateCheckboxGroup=l,l()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(l=>l.style.setProperty("display","flex","important"));return}T.forEach(l=>{let m=l.dataset.label||"",a=l.dataset.email||"",E=l.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);l.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function Q(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let v=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=v,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",k&&u.classList.add("form-control"),r.placeholder&&(u.placeholder=r.placeholder||""),r.required&&(u.required=!0),r.width&&(u.style.width=r.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),f!=null?u.value=String(f):r.default!==void 0&&r.default!==null&&(u.value=String(r.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=r.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let s=document.createElement("li");s.className="voc-form-timezone-item",s.setAttribute("role","option"),s.dataset.value=n,s.style.padding="6px 8px",s.style.cursor="pointer",s.textContent=n,s.addEventListener("mousedown",c=>{c.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(s)})}L(T);let e=-1;function l(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,l()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",k&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function X(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let v=r.name||r.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=r.placeholder||"",k&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,r.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${v}[]`,a.className="voc-form-tag-hidden",a.value=m,r.key&&(a.id=`voc-form-${r.key}`),h.appendChild(a)}),r.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(l){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=l,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(l);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(l){let m=l.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(l=>l.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",l=>{if(l.key==="Enter"||l.key===",")l.preventDefault(),L(i.value),i.value="";else if(l.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",l=>{let m=l.clipboardData?.getData("text");m&&(l.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(r,x=!0){let f=new FormData(r);if(x)return le(f);let k={};return f.forEach((h,v)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(k,v)?Array.isArray(k[v])?k[v].push(u):k[v]=[k[v],u]:k[v]=u}),k}function le(r){let x=new FormData;for(let[f,k]of r.entries()){if(k instanceof File){x.append(f,k);continue}let h;try{h=JSON.parse(k)}catch{h=null}Array.isArray(h)?h.length===0?x.append(f,"[]"):h.every(v=>typeof v=="object"&&v!==null)?h.forEach((v,u)=>{for(let[i,d]of Object.entries(v))x.append(`${f}[${u}][${i}]`,d)}):x.append(f,k):x.append(f,k)}return x}async function Z(r,x,f){let k=x.url,h={"Content-Type":"application/json"};x?.api_token&&(h.Authorization=`Bearer ${x.api_token}`);let v=j(r);if(x?.additional_data)for(let[d,p]of Object.entries(x.additional_data))v.append(d,p);let u,i=v instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${x.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?v:JSON.stringify(Object.fromEntries(v.entries()))};try{fetch(k,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{f&&f(d,null)}).catch(d=>{f&&f(null,d)})}catch(d){f&&f(null,d)}}function ee(r,x,f){let k=[];if(typeof r=="string"?k=Array.from(document.querySelectorAll(r)):k=[r],k.length===0)return null;function h(){let i=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=x.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=x.form_name,d.appendChild(p);function g(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function T(e){if(!e.key&&!e.label)return null;let l=x.default_values||{},m=e.name||e.key,a=m?l[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=X(e,f||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let c=document.createElement("input");c.type="checkbox",c.classList.add("voc-form-checkbox"),i&&c.classList.add("form-check-input"),c.name=`${e.name||e.key||""}[]`,c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),s.appendChild(c),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let s=Array.from(n).some(c=>c.checked);return n.forEach(c=>{s?c.setCustomValidity(""):c.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,s=80,c=n.split(`
2
- `).reduce((M,_)=>Math.max(M,_.length),0),N=Math.ceil(c/s)||1,S=Math.max(2,o+N);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let c=document.createElement("input");c.type="radio",c.classList.add("voc-form-radio"),i&&c.classList.add("form-check-input"),c.name=e.name||e.key||"",c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),s.appendChild(c),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=U(e,f||{},a);break}case"table":{w=Y(e,f||{},a);break}case"users":{w=K(e,f||{},a);break}case"timezone":{w=Q(e,f||{},a);break}case"audio_select":{w=J(e,f||{},a);break}case"field-select":{let t=f?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let A=document.createElement("div");if(A.className="voc-form-field-selects-label",t&&A.classList.add("form-label"),A.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",A.appendChild(b)}o.appendChild(A)}if(e.description){let A=document.createElement("div");A.className="voc-form-field-selects-description",t&&A.classList.add("form-text"),A.textContent=e.description,o.appendChild(A)}n.appendChild(o);let s=document.createElement("div");s.className="voc-form-field-selects-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search...",c.className="voc-form-field-selects-search",t&&c.classList.add("form-control","mb-2"),s.appendChild(c),n.appendChild(s),!e.options||e.options.length===0)return n;let N=document.createElement("div");N.className="voc-form-field-selects-list",t&&N.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},_=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,y=[];if(Array.isArray(a)?y=a:a!=null?y=[a]:Array.isArray(e.default)&&(y=e.default),e.options.forEach((A,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(A.label||"").toLowerCase(),F.dataset.email=String(A.email||"").toLowerCase(),F.dataset.value=String(A.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let C=document.createElement("input");if(C.type="checkbox",C.name=`${_}[]`,C.value=A.value??A.key,C.className="voc-form--checkbox",e.key&&(C.id=`voc-form-${e.key}-${b}`),C.style.position="absolute",C.style.width="1px",C.style.height="1px",C.style.margin="0",C.style.padding="0",C.style.clip="rect(0 0 0 0)",C.style.clipPath="inset(50%)",C.style.overflow="hidden",C.style.border="0",y&&Array.isArray(y)){let I=y.map(P=>String(P)),R=String(A.value??A.key);C.checked=I.includes(R)}let O=A.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=A.label||String(A.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=A.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(C.checked=!C.checked,C.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("change",()=>{if(C.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=A;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),C.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=A;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(C),F.appendChild(B),F.appendChild(H),N.appendChild(F)}),n.appendChild(N),n.appendChild(S),e.required){let A=N.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(A).some(C=>C.checked);return A.forEach(C=>{F?C.setCustomValidity(""):C.setCustomValidity("At least one option must be selected.")}),F};A.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let $=Array.from(N.querySelectorAll(".voc-form-field-select-item")),q=()=>{let A=String(c.value||"").trim().toLowerCase();if(!A){$.forEach(b=>b.style.setProperty("display","flex","important"));return}$.forEach(b=>{let F=b.dataset.label||"",C=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(A)||C.includes(A)||O.includes(A);b.style.setProperty("display",B?"flex":"none","important")})};return c.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}x.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let c=document.createElement("h6");c.className="voc-form-row-label",c.textContent=n.label,o.appendChild(c)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(c=>{let N=T(c);N&&s.appendChild(N)}),o.appendChild(s),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}l.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let s=document.createElement("h4");s.className="voc-form-row-label",s.textContent=t.label,n.appendChild(s)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let c=T(s);c&&o.appendChild(c)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",i&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(l)}else{let l=T(e);l&&d.appendChild(l)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let v=h();k[0].appendChild(v);let u=x?.submit_config??f?.submit_config??null;return u&&v.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(v.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!v.checkValidity()){v.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(v.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let L=j(v);f.onSubmit(L)}Z(v,u,(L,e)=>{f?.onSubmitResult&&f.onSubmitResult(L,e)})}),{element:v,validate:()=>{let i=[];return v.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(v),onSubmit:i=>{v.addEventListener("submit",d=>{d.preventDefault();let p=j(v);i(p,d)})}}}var V={renderForm:ee};var de=V,me={FormsLib:V};return oe(ue);})();
1
+ "use strict";var VocLibJs=(()=>{var G=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var re=(r,x)=>{for(var f in x)G(r,f,{get:x[f],enumerable:!0})},se=(r,x,f,k)=>{if(x&&typeof x=="object"||typeof x=="function")for(let h of ae(x))!ne.call(r,h)&&h!==f&&G(r,h,{get:()=>x[h],enumerable:!(k=te(x,h))||k.enumerable});return r};var oe=r=>se(G({},"__esModule",{value:!0}),r);var ue={};re(ue,{FormsLib:()=>de,default:()=>me});function U(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",k&&h.classList.add("d-flex","align-items-center","gap-3");let v=document.createElement("img");v.className="voc-form-avatar-preview",v.alt=r.label||"avatar",k&&(v.classList.add("img-thumbnail","rounded-circle"),v.style.width=v.style.height="64px",v.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?v.src=u:(v.src="",v.style.display="none");let i=document.createElement("input");i.type="file",i.accept=r.accept||"image/*",i.className="voc-form-avatar-input",k&&i.classList.add("form-control"),(r.key||r.name)&&(i.name=r.name||r.key,r.key&&(i.id=`voc-form-${r.key}`));let d=document.createElement("input");if(d.type="hidden",(r.key||r.name)&&(d.name=(r.name||r.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{v.src=String(L.result),v.style.display="",d.value=""},L.readAsDataURL(T)}}),k){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(v),h.appendChild(p)}else h.appendChild(v),h.appendChild(i),h.appendChild(d);return h}function J(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let v=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(f)?u=f[0]:f!==void 0?u=f:r.default!==void 0&&(u=r.default),r.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",k&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=v,g.value=i.value,g.className="voc-form-audio-radio",r.key&&(g.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",k&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",k&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),o.appendChild(s),t.appendChild(o),c=document.createElement("audio"),c.src=i.audio_link,c.preload="none",c.style.display="none";let l=y=>{for(;y.firstChild;)y.removeChild(y.firstChild)},N=()=>{let y="http://www.w3.org/2000/svg",_=document.createElementNS(y,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),_.appendChild(q),_},S=()=>{let y="http://www.w3.org/2000/svg",_=document.createElementNS(y,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),_.appendChild(q),_};l(t),t.appendChild(N());let M=y=>{l(t),y?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(N()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let y=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}y.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),c.play()}catch(y){console.warn("audio play failed",y)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let $=()=>{p.classList.remove("is-playing"),M(!1)};c.addEventListener("pause",$),c.addEventListener("ended",$),e.appendChild(t),e.appendChild(c)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function Y(r,x,f){let k=document.createElement("div");k.className="voc-form-table-wrapper";let h=x?.style==="bootstrap",v=document.createElement("input");v.type="hidden",v.name=r.name||r.key,r.key&&(v.id=`voc-form-${r.key}`),k.appendChild(v);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(r.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),k.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),c=document.createElement("tr"),m=document.createElement("td");m.colSpan=(r.fields?r.fields.length:0)+1,m.appendChild(L),c.appendChild(m),e.appendChild(c),u.appendChild(e),k.appendChild(u);let a=[];function E(){v.value=JSON.stringify(a)}function w(n){let o=[];return r.fields.forEach(s=>{let l=n[s.key];if(s.type==="checkbox"){let N=Array.isArray(l)?l:l?[l]:[];s.required&&N.length===0&&o.push(`${s.label||s.key} is required`);return}s.required&&(l==null||String(l).trim()==="")&&o.push(`${s.label||s.key} is required`),s.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||o.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&l&&isNaN(Number(l))&&o.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&l&&(new RegExp(s.validation.regex).test(String(l))||o.push(`${s.label||s.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",l=>{let N=Number(o.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(N)),o.classList.add("dragging");try{l.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{o.classList.remove("dragging"),s.style.cursor="grab"}),o.addEventListener("dragover",l=>{l.preventDefault();let N=l.currentTarget,S=N.getBoundingClientRect(),M=S.top+S.height/2,$=(l.clientY||l.y)>M;N.classList.remove("drag-over-top","drag-over-bottom"),$?(N.classList.add("drag-over-bottom"),N.dataset.dropPosition="after"):(N.classList.add("drag-over-top"),N.dataset.dropPosition="before")}),o.addEventListener("dragleave",l=>{let N=l.currentTarget;N.classList.remove("drag-over-top","drag-over-bottom"),delete N.dataset.dropPosition}),o.addEventListener("drop",l=>{l.preventDefault();let N=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),M=Number(N),$=l.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[y]=a.splice(M,1),_=S;M<S&&(_=S-1);let q=$==="after"?_+1:_;a.splice(q,0,y),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,s)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(s),l.classList.add("voc-form-table-row");let N=document.createElement("td");N.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",N.appendChild(S),l.appendChild(N),n(l,S),r.fields.forEach(y=>{let _=document.createElement("td"),q,A=(y.type||"text").toLowerCase();if(A==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),y.placeholder){let C=document.createElement("option");C.value="",C.textContent=y.placeholder,C.disabled=!0,(o[y.key]===void 0||o[y.key]===null||o[y.key]==="")&&(C.selected=!0),b.appendChild(C)}(y.options||[]).forEach(C=>{let O=document.createElement("option");O.value=C.value,O.textContent=C.label,b.appendChild(O)}),b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.required&&(b.required=!0),b.addEventListener("change",C=>{a[s][y.key]=C.target.value,E()}),q=b}else if(A==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=y.options||[];Array.isArray(a[s][y.key])||(a[s][y.key]=a[s][y.key]?[a[s][y.key]]:[]),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=C.value,H.checked=Array.isArray(a[s][y.key])&&a[s][y.key].includes(C.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[s][y.key])||(a[s][y.key]=[]),I?a[s][y.key].includes(C.value)||a[s][y.key].push(C.value):a[s][y.key]=a[s][y.key].filter(R=>R!==C.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(A==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=y.options||[];a[s][y.key]===void 0&&(a[s][y.key]=""),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${r.key}-${y.key}-${s}`,H.value=C.value,H.checked=a[s][y.key]===C.value,H.addEventListener("change",z=>{z.target.checked&&(a[s][y.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");A==="number"?b.type="number":A==="email"?b.type="email":A==="tel"?b.type="tel":A==="url"?b.type="url":A==="date"?b.type="date":b.type="text",b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.placeholder&&(b.placeholder=y.placeholder),y.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[s][y.key]=F.target.value,E()}),q=b}_.appendChild(q),l.appendChild(_)});let M=document.createElement("td"),$=document.createElement("button");$.type="button",$.className="voc-form-table-remove",h&&$.classList.add("btn","btn-danger"),$.textContent="Remove",$.addEventListener("click",()=>{a.splice(s,1),t(),E()}),M.appendChild($),l.appendChild(M),T.appendChild(l)})}return L.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),E(),k.validate=function(){let n=[];return a.forEach((o,s)=>{let l=w(o);l.length&&n.push(`Row ${s+1}: ${l.join("; ")}`)}),r.validation?.min_rows!==void 0&&a.length<r.validation.min_rows&&n.push(`At least ${r.validation.min_rows} rows required`),r.validation?.max_rows!==void 0&&a.length>r.validation.max_rows&&n.push(`No more than ${r.validation.max_rows} rows allowed`),r.validation?.unique_fields&&r.validation.unique_fields.length&&r.validation.unique_fields.forEach(o=>{let s=new Set;a.forEach((l,N)=>{let S=l[o];S!=null&&(s.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${N+1})`),s.add(S))})}),n},k}async function ie(r){let f=new TextEncoder().encode(r),k=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(k)).map(v=>v.toString(16).padStart(2,"0")).join("")}async function le(r){let x=String(r||"").trim().toLowerCase();return x?`https://gravatar.com/avatar/${await ie(x)}?d=mp`:""}function K(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let v=document.createElement("div");if(v.className="voc-form-users-header",k&&v.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",k&&e.classList.add("form-label"),e.textContent=r.label,r.required){let c=document.createElement("span");c.className="voc-form-required",c.textContent="*",e.appendChild(c)}v.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",k&&e.classList.add("form-text"),e.textContent=r.description,v.appendChild(e)}h.appendChild(v);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",k&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",k&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(f)?g=f:f!=null?g=[f]:Array.isArray(r.default)&&(g=r.default),r.options.forEach((e,c)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),k&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${c}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(s=>String(s));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&le(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let s=o.target;s&&(s.closest("input")||s.closest("a")||s.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),r.required){let e=d.querySelectorAll('input[type="checkbox"]'),c=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",c)}),h._validateCheckboxGroup=c,c()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(c=>c.style.setProperty("display","flex","important"));return}T.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",E=c.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);c.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function Q(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let v=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=v,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",k&&u.classList.add("form-control"),r.placeholder&&(u.placeholder=r.placeholder||""),r.required&&(u.required=!0),r.width&&(u.style.width=r.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),f!=null?u.value=String(f):r.default!==void 0&&r.default!==null&&(u.value=String(r.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=r.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let s=document.createElement("li");s.className="voc-form-timezone-item",s.setAttribute("role","option"),s.dataset.value=n,s.style.padding="6px 8px",s.style.cursor="pointer",s.textContent=n,s.addEventListener("mousedown",l=>{l.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(s)})}L(T);let e=-1;function c(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,c()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",k&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function X(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let v=r.name||r.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=r.placeholder||"",k&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,r.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${v}[]`,a.className="voc-form-tag-hidden",a.value=m,r.key&&(a.id=`voc-form-${r.key}`),h.appendChild(a)}),r.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(c){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=c,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(c);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),L(i.value),i.value="";else if(c.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(r,x=!0){let f=new FormData(r);if(x)return ce(f);let k={};return f.forEach((h,v)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(k,v)?Array.isArray(k[v])?k[v].push(u):k[v]=[k[v],u]:k[v]=u}),k}function ce(r){let x=new FormData;for(let[f,k]of r.entries()){if(k instanceof File){x.append(f,k);continue}let h;try{h=JSON.parse(k)}catch{h=null}Array.isArray(h)?h.length===0?x.append(f,"[]"):h.every(v=>typeof v=="object"&&v!==null)?h.forEach((v,u)=>{for(let[i,d]of Object.entries(v))x.append(`${f}[${u}][${i}]`,d)}):x.append(f,k):x.append(f,k)}return x}async function Z(r,x,f){let k=x.url,h={"Content-Type":"application/json"};x?.api_token&&(h.Authorization=`Bearer ${x.api_token}`);let v=j(r);if(x?.additional_data)for(let[d,p]of Object.entries(x.additional_data))v.append(d,p);let u,i=v instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${x.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?v:JSON.stringify(Object.fromEntries(v.entries()))};try{fetch(k,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{f&&f(d,null)}).catch(d=>{f&&f(null,d)})}catch(d){f&&f(null,d)}}function ee(r,x,f){let k=[];if(typeof r=="string"?k=Array.from(document.querySelectorAll(r)):k=[r],k.length===0)return null;function h(){let i=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=x.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=x.form_name,d.appendChild(p);function g(e,c){c&&(c.min_length!==void 0&&(e.minLength=c.min_length),c.max_length!==void 0&&(e.maxLength=c.max_length),c.regex&&(e instanceof HTMLInputElement?e.pattern=c.regex:e.dataset.pattern=c.regex))}function T(e){if(!e.key&&!e.label)return null;let c=x.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=X(e,f||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let l=document.createElement("input");l.type="checkbox",l.classList.add("voc-form-checkbox"),i&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),s.appendChild(l),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let s=Array.from(n).some(l=>l.checked);return n.forEach(l=>{s?l.setCustomValidity(""):l.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,s=80,l=n.split(`
2
+ `).reduce((M,$)=>Math.max(M,$.length),0),N=Math.ceil(l/s)||1,S=Math.max(2,o+N);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let l=document.createElement("input");l.type="radio",l.classList.add("voc-form-radio"),i&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),s.appendChild(l),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=U(e,f||{},a);break}case"table":{w=Y(e,f||{},a);break}case"users":{w=K(e,f||{},a);break}case"timezone":{w=Q(e,f||{},a);break}case"audio_select":{w=J(e,f||{},a);break}case"field-select":{let t=f?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let A=document.createElement("div");if(A.className="voc-form-field-selects-label",t&&A.classList.add("form-label"),A.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",A.appendChild(b)}o.appendChild(A)}if(e.description){let A=document.createElement("div");A.className="voc-form-field-selects-description",t&&A.classList.add("form-text"),A.textContent=e.description,o.appendChild(A)}n.appendChild(o);let s=document.createElement("div");s.className="voc-form-field-selects-search-wrapper";let l=document.createElement("input");if(l.type="search",l.placeholder="Search...",l.className="voc-form-field-selects-search",t&&l.classList.add("form-control","mb-2"),s.appendChild(l),n.appendChild(s),!e.options||e.options.length===0)return n;let N=document.createElement("div");N.className="voc-form-field-selects-list",t&&N.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},$=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,y=[];if(Array.isArray(a)?y=a:a!=null?y=[a]:Array.isArray(e.default)&&(y=e.default),e.options.forEach((A,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(A.option_label??A.label??"").toLowerCase(),F.dataset.email=String(A.email||"").toLowerCase(),F.dataset.value=String(A.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let C=document.createElement("input");if(C.type="checkbox",C.name=`${$}[]`,C.value=A.value??A.key,C.className="voc-form--checkbox",e.key&&(C.id=`voc-form-${e.key}-${b}`),C.style.position="absolute",C.style.width="1px",C.style.height="1px",C.style.margin="0",C.style.padding="0",C.style.clip="rect(0 0 0 0)",C.style.clipPath="inset(50%)",C.style.overflow="hidden",C.style.border="0",y&&Array.isArray(y)){let I=y.map(P=>String(P)),R=String(A.value??A.key);C.checked=I.includes(R)}let O=A.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=(A.option_label??A.label)||String(A.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=A.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(C.checked=!C.checked,C.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("change",()=>{if(C.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=A;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),C.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=A;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(C),F.appendChild(B),F.appendChild(H),N.appendChild(F)}),n.appendChild(N),n.appendChild(S),e.required){let A=N.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(A).some(C=>C.checked);return A.forEach(C=>{F?C.setCustomValidity(""):C.setCustomValidity("At least one option must be selected.")}),F};A.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let _=Array.from(N.querySelectorAll(".voc-form-field-select-item")),q=()=>{let A=String(l.value||"").trim().toLowerCase();if(!A){_.forEach(b=>b.style.setProperty("display","flex","important"));return}_.forEach(b=>{let F=b.dataset.label||"",C=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(A)||C.includes(A)||O.includes(A);b.style.setProperty("display",B?"flex":"none","important")})};return l.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}x.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let l=document.createElement("h6");l.className="voc-form-row-label",l.textContent=n.label,o.appendChild(l)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let N=T(l);N&&s.appendChild(N)}),o.appendChild(s),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}c.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let s=document.createElement("h4");s.className="voc-form-row-label",s.textContent=t.label,n.appendChild(s)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let l=T(s);l&&o.appendChild(l)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let c=document.createElement("div");if(c.className="voc-form-group voc-form-row",i&&c.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,c.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,c.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),c.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(c)}else{let c=T(e);c&&d.appendChild(c)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let v=h();k[0].appendChild(v);let u=x?.submit_config??f?.submit_config??null;return u&&v.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(v.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!v.checkValidity()){v.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(v.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let L=j(v);f.onSubmit(L)}Z(v,u,(L,e)=>{f?.onSubmitResult&&f.onSubmitResult(L,e)})}),{element:v,validate:()=>{let i=[];return v.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(v),onSubmit:i=>{v.addEventListener("submit",d=>{d.preventDefault();let p=j(v);i(p,d)})}}}var V={renderForm:ee};var de=V,me={FormsLib:V};return oe(ue);})();
package/dist/main.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var G=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var re=(r,x)=>{for(var f in x)G(r,f,{get:x[f],enumerable:!0})},se=(r,x,f,k)=>{if(x&&typeof x=="object"||typeof x=="function")for(let h of ae(x))!ne.call(r,h)&&h!==f&&G(r,h,{get:()=>x[h],enumerable:!(k=te(x,h))||k.enumerable});return r};var oe=r=>se(G({},"__esModule",{value:!0}),r);var ue={};re(ue,{FormsLib:()=>de,default:()=>me});module.exports=oe(ue);function U(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",k&&h.classList.add("d-flex","align-items-center","gap-3");let v=document.createElement("img");v.className="voc-form-avatar-preview",v.alt=r.label||"avatar",k&&(v.classList.add("img-thumbnail","rounded-circle"),v.style.width=v.style.height="64px",v.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?v.src=u:(v.src="",v.style.display="none");let i=document.createElement("input");i.type="file",i.accept=r.accept||"image/*",i.className="voc-form-avatar-input",k&&i.classList.add("form-control"),(r.key||r.name)&&(i.name=r.name||r.key,r.key&&(i.id=`voc-form-${r.key}`));let d=document.createElement("input");if(d.type="hidden",(r.key||r.name)&&(d.name=(r.name||r.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{v.src=String(L.result),v.style.display="",d.value=""},L.readAsDataURL(T)}}),k){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(v),h.appendChild(p)}else h.appendChild(v),h.appendChild(i),h.appendChild(d);return h}function J(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let v=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(f)?u=f[0]:f!==void 0?u=f:r.default!==void 0&&(u=r.default),r.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",k&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=v,g.value=i.value,g.className="voc-form-audio-radio",r.key&&(g.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",k&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",k&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),o.appendChild(s),t.appendChild(o),l=document.createElement("audio"),l.src=i.audio_link,l.preload="none",l.style.display="none";let c=y=>{for(;y.firstChild;)y.removeChild(y.firstChild)},N=()=>{let y="http://www.w3.org/2000/svg",$=document.createElementNS(y,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),$.appendChild(q),$},S=()=>{let y="http://www.w3.org/2000/svg",$=document.createElementNS(y,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),$.appendChild(q),$};c(t),t.appendChild(N());let M=y=>{c(t),y?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(N()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let y=h.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}y.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),l.play()}catch(y){console.warn("audio play failed",y)}}),l.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let _=()=>{p.classList.remove("is-playing"),M(!1)};l.addEventListener("pause",_),l.addEventListener("ended",_),e.appendChild(t),e.appendChild(l)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function Y(r,x,f){let k=document.createElement("div");k.className="voc-form-table-wrapper";let h=x?.style==="bootstrap",v=document.createElement("input");v.type="hidden",v.name=r.name||r.key,r.key&&(v.id=`voc-form-${r.key}`),k.appendChild(v);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(r.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),k.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),m=document.createElement("td");m.colSpan=(r.fields?r.fields.length:0)+1,m.appendChild(L),l.appendChild(m),e.appendChild(l),u.appendChild(e),k.appendChild(u);let a=[];function E(){v.value=JSON.stringify(a)}function w(n){let o=[];return r.fields.forEach(s=>{let c=n[s.key];if(s.type==="checkbox"){let N=Array.isArray(c)?c:c?[c]:[];s.required&&N.length===0&&o.push(`${s.label||s.key} is required`);return}s.required&&(c==null||String(c).trim()==="")&&o.push(`${s.label||s.key} is required`),s.type==="email"&&c&&(/^\S+@\S+\.\S+$/.test(String(c))||o.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&c&&isNaN(Number(c))&&o.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&c&&(new RegExp(s.validation.regex).test(String(c))||o.push(`${s.label||s.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",c=>{let N=Number(o.dataset.rowIndex);c.dataTransfer.setData("text/plain",String(N)),o.classList.add("dragging");try{c.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{o.classList.remove("dragging"),s.style.cursor="grab"}),o.addEventListener("dragover",c=>{c.preventDefault();let N=c.currentTarget,S=N.getBoundingClientRect(),M=S.top+S.height/2,_=(c.clientY||c.y)>M;N.classList.remove("drag-over-top","drag-over-bottom"),_?(N.classList.add("drag-over-bottom"),N.dataset.dropPosition="after"):(N.classList.add("drag-over-top"),N.dataset.dropPosition="before")}),o.addEventListener("dragleave",c=>{let N=c.currentTarget;N.classList.remove("drag-over-top","drag-over-bottom"),delete N.dataset.dropPosition}),o.addEventListener("drop",c=>{c.preventDefault();let N=c.dataTransfer.getData("text/plain"),S=Number(c.currentTarget.dataset.rowIndex),M=Number(N),_=c.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[y]=a.splice(M,1),$=S;M<S&&($=S-1);let q=_==="after"?$+1:$;a.splice(q,0,y),c.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete c.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,s)=>{let c=document.createElement("tr");c.dataset.rowIndex=String(s),c.classList.add("voc-form-table-row");let N=document.createElement("td");N.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",N.appendChild(S),c.appendChild(N),n(c,S),r.fields.forEach(y=>{let $=document.createElement("td"),q,A=(y.type||"text").toLowerCase();if(A==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),y.placeholder){let C=document.createElement("option");C.value="",C.textContent=y.placeholder,C.disabled=!0,(o[y.key]===void 0||o[y.key]===null||o[y.key]==="")&&(C.selected=!0),b.appendChild(C)}(y.options||[]).forEach(C=>{let O=document.createElement("option");O.value=C.value,O.textContent=C.label,b.appendChild(O)}),b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.required&&(b.required=!0),b.addEventListener("change",C=>{a[s][y.key]=C.target.value,E()}),q=b}else if(A==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=y.options||[];Array.isArray(a[s][y.key])||(a[s][y.key]=a[s][y.key]?[a[s][y.key]]:[]),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=C.value,H.checked=Array.isArray(a[s][y.key])&&a[s][y.key].includes(C.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[s][y.key])||(a[s][y.key]=[]),I?a[s][y.key].includes(C.value)||a[s][y.key].push(C.value):a[s][y.key]=a[s][y.key].filter(R=>R!==C.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(A==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=y.options||[];a[s][y.key]===void 0&&(a[s][y.key]=""),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${r.key}-${y.key}-${s}`,H.value=C.value,H.checked=a[s][y.key]===C.value,H.addEventListener("change",z=>{z.target.checked&&(a[s][y.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");A==="number"?b.type="number":A==="email"?b.type="email":A==="tel"?b.type="tel":A==="url"?b.type="url":A==="date"?b.type="date":b.type="text",b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.placeholder&&(b.placeholder=y.placeholder),y.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[s][y.key]=F.target.value,E()}),q=b}$.appendChild(q),c.appendChild($)});let M=document.createElement("td"),_=document.createElement("button");_.type="button",_.className="voc-form-table-remove",h&&_.classList.add("btn","btn-danger"),_.textContent="Remove",_.addEventListener("click",()=>{a.splice(s,1),t(),E()}),M.appendChild(_),c.appendChild(M),T.appendChild(c)})}return L.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),E(),k.validate=function(){let n=[];return a.forEach((o,s)=>{let c=w(o);c.length&&n.push(`Row ${s+1}: ${c.join("; ")}`)}),r.validation?.min_rows!==void 0&&a.length<r.validation.min_rows&&n.push(`At least ${r.validation.min_rows} rows required`),r.validation?.max_rows!==void 0&&a.length>r.validation.max_rows&&n.push(`No more than ${r.validation.max_rows} rows allowed`),r.validation?.unique_fields&&r.validation.unique_fields.length&&r.validation.unique_fields.forEach(o=>{let s=new Set;a.forEach((c,N)=>{let S=c[o];S!=null&&(s.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${N+1})`),s.add(S))})}),n},k}async function ie(r){let f=new TextEncoder().encode(r),k=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(k)).map(v=>v.toString(16).padStart(2,"0")).join("")}async function ce(r){let x=String(r||"").trim().toLowerCase();return x?`https://gravatar.com/avatar/${await ie(x)}?d=mp`:""}function K(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let v=document.createElement("div");if(v.className="voc-form-users-header",k&&v.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",k&&e.classList.add("form-label"),e.textContent=r.label,r.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}v.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",k&&e.classList.add("form-text"),e.textContent=r.description,v.appendChild(e)}h.appendChild(v);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",k&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",k&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(f)?g=f:f!=null?g=[f]:Array.isArray(r.default)&&(g=r.default),r.options.forEach((e,l)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),k&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(s=>String(s));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&ce(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let s=o.target;s&&(s.closest("input")||s.closest("a")||s.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),r.required){let e=d.querySelectorAll('input[type="checkbox"]'),l=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",l)}),h._validateCheckboxGroup=l,l()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(l=>l.style.setProperty("display","flex","important"));return}T.forEach(l=>{let m=l.dataset.label||"",a=l.dataset.email||"",E=l.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);l.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function Q(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let v=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=v,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",k&&u.classList.add("form-control"),r.placeholder&&(u.placeholder=r.placeholder||""),r.required&&(u.required=!0),r.width&&(u.style.width=r.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),f!=null?u.value=String(f):r.default!==void 0&&r.default!==null&&(u.value=String(r.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=r.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let s=document.createElement("li");s.className="voc-form-timezone-item",s.setAttribute("role","option"),s.dataset.value=n,s.style.padding="6px 8px",s.style.cursor="pointer",s.textContent=n,s.addEventListener("mousedown",c=>{c.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(s)})}L(T);let e=-1;function l(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,l()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",k&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function X(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let v=r.name||r.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=r.placeholder||"",k&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,r.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${v}[]`,a.className="voc-form-tag-hidden",a.value=m,r.key&&(a.id=`voc-form-${r.key}`),h.appendChild(a)}),r.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(l){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=l,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(l);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(l){let m=l.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(l=>l.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",l=>{if(l.key==="Enter"||l.key===",")l.preventDefault(),L(i.value),i.value="";else if(l.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",l=>{let m=l.clipboardData?.getData("text");m&&(l.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(r,x=!0){let f=new FormData(r);if(x)return le(f);let k={};return f.forEach((h,v)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(k,v)?Array.isArray(k[v])?k[v].push(u):k[v]=[k[v],u]:k[v]=u}),k}function le(r){let x=new FormData;for(let[f,k]of r.entries()){if(k instanceof File){x.append(f,k);continue}let h;try{h=JSON.parse(k)}catch{h=null}Array.isArray(h)?h.length===0?x.append(f,"[]"):h.every(v=>typeof v=="object"&&v!==null)?h.forEach((v,u)=>{for(let[i,d]of Object.entries(v))x.append(`${f}[${u}][${i}]`,d)}):x.append(f,k):x.append(f,k)}return x}async function Z(r,x,f){let k=x.url,h={"Content-Type":"application/json"};x?.api_token&&(h.Authorization=`Bearer ${x.api_token}`);let v=j(r);if(x?.additional_data)for(let[d,p]of Object.entries(x.additional_data))v.append(d,p);let u,i=v instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${x.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?v:JSON.stringify(Object.fromEntries(v.entries()))};try{fetch(k,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{f&&f(d,null)}).catch(d=>{f&&f(null,d)})}catch(d){f&&f(null,d)}}function ee(r,x,f){let k=[];if(typeof r=="string"?k=Array.from(document.querySelectorAll(r)):k=[r],k.length===0)return null;function h(){let i=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=x.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=x.form_name,d.appendChild(p);function g(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function T(e){if(!e.key&&!e.label)return null;let l=x.default_values||{},m=e.name||e.key,a=m?l[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=X(e,f||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let c=document.createElement("input");c.type="checkbox",c.classList.add("voc-form-checkbox"),i&&c.classList.add("form-check-input"),c.name=`${e.name||e.key||""}[]`,c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),s.appendChild(c),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let s=Array.from(n).some(c=>c.checked);return n.forEach(c=>{s?c.setCustomValidity(""):c.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,s=80,c=n.split(`
2
- `).reduce((M,_)=>Math.max(M,_.length),0),N=Math.ceil(c/s)||1,S=Math.max(2,o+N);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let c=document.createElement("input");c.type="radio",c.classList.add("voc-form-radio"),i&&c.classList.add("form-check-input"),c.name=e.name||e.key||"",c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),s.appendChild(c),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=U(e,f||{},a);break}case"table":{w=Y(e,f||{},a);break}case"users":{w=K(e,f||{},a);break}case"timezone":{w=Q(e,f||{},a);break}case"audio_select":{w=J(e,f||{},a);break}case"field-select":{let t=f?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let A=document.createElement("div");if(A.className="voc-form-field-selects-label",t&&A.classList.add("form-label"),A.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",A.appendChild(b)}o.appendChild(A)}if(e.description){let A=document.createElement("div");A.className="voc-form-field-selects-description",t&&A.classList.add("form-text"),A.textContent=e.description,o.appendChild(A)}n.appendChild(o);let s=document.createElement("div");s.className="voc-form-field-selects-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search...",c.className="voc-form-field-selects-search",t&&c.classList.add("form-control","mb-2"),s.appendChild(c),n.appendChild(s),!e.options||e.options.length===0)return n;let N=document.createElement("div");N.className="voc-form-field-selects-list",t&&N.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},_=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,y=[];if(Array.isArray(a)?y=a:a!=null?y=[a]:Array.isArray(e.default)&&(y=e.default),e.options.forEach((A,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(A.label||"").toLowerCase(),F.dataset.email=String(A.email||"").toLowerCase(),F.dataset.value=String(A.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let C=document.createElement("input");if(C.type="checkbox",C.name=`${_}[]`,C.value=A.value??A.key,C.className="voc-form--checkbox",e.key&&(C.id=`voc-form-${e.key}-${b}`),C.style.position="absolute",C.style.width="1px",C.style.height="1px",C.style.margin="0",C.style.padding="0",C.style.clip="rect(0 0 0 0)",C.style.clipPath="inset(50%)",C.style.overflow="hidden",C.style.border="0",y&&Array.isArray(y)){let I=y.map(P=>String(P)),R=String(A.value??A.key);C.checked=I.includes(R)}let O=A.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=A.label||String(A.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=A.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(C.checked=!C.checked,C.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("change",()=>{if(C.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=A;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),C.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=A;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(C),F.appendChild(B),F.appendChild(H),N.appendChild(F)}),n.appendChild(N),n.appendChild(S),e.required){let A=N.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(A).some(C=>C.checked);return A.forEach(C=>{F?C.setCustomValidity(""):C.setCustomValidity("At least one option must be selected.")}),F};A.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let $=Array.from(N.querySelectorAll(".voc-form-field-select-item")),q=()=>{let A=String(c.value||"").trim().toLowerCase();if(!A){$.forEach(b=>b.style.setProperty("display","flex","important"));return}$.forEach(b=>{let F=b.dataset.label||"",C=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(A)||C.includes(A)||O.includes(A);b.style.setProperty("display",B?"flex":"none","important")})};return c.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}x.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let c=document.createElement("h6");c.className="voc-form-row-label",c.textContent=n.label,o.appendChild(c)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(c=>{let N=T(c);N&&s.appendChild(N)}),o.appendChild(s),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}l.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let s=document.createElement("h4");s.className="voc-form-row-label",s.textContent=t.label,n.appendChild(s)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let c=T(s);c&&o.appendChild(c)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",i&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(l)}else{let l=T(e);l&&d.appendChild(l)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let v=h();k[0].appendChild(v);let u=x?.submit_config??f?.submit_config??null;return u&&v.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(v.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!v.checkValidity()){v.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(v.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let L=j(v);f.onSubmit(L)}Z(v,u,(L,e)=>{f?.onSubmitResult&&f.onSubmitResult(L,e)})}),{element:v,validate:()=>{let i=[];return v.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(v),onSubmit:i=>{v.addEventListener("submit",d=>{d.preventDefault();let p=j(v);i(p,d)})}}}var V={renderForm:ee};var de=V,me={FormsLib:V};0&&(module.exports={FormsLib});
1
+ "use strict";var G=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var re=(r,x)=>{for(var f in x)G(r,f,{get:x[f],enumerable:!0})},se=(r,x,f,k)=>{if(x&&typeof x=="object"||typeof x=="function")for(let h of ae(x))!ne.call(r,h)&&h!==f&&G(r,h,{get:()=>x[h],enumerable:!(k=te(x,h))||k.enumerable});return r};var oe=r=>se(G({},"__esModule",{value:!0}),r);var ue={};re(ue,{FormsLib:()=>de,default:()=>me});module.exports=oe(ue);function U(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",k&&h.classList.add("d-flex","align-items-center","gap-3");let v=document.createElement("img");v.className="voc-form-avatar-preview",v.alt=r.label||"avatar",k&&(v.classList.add("img-thumbnail","rounded-circle"),v.style.width=v.style.height="64px",v.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?v.src=u:(v.src="",v.style.display="none");let i=document.createElement("input");i.type="file",i.accept=r.accept||"image/*",i.className="voc-form-avatar-input",k&&i.classList.add("form-control"),(r.key||r.name)&&(i.name=r.name||r.key,r.key&&(i.id=`voc-form-${r.key}`));let d=document.createElement("input");if(d.type="hidden",(r.key||r.name)&&(d.name=(r.name||r.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{v.src=String(L.result),v.style.display="",d.value=""},L.readAsDataURL(T)}}),k){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(v),h.appendChild(p)}else h.appendChild(v),h.appendChild(i),h.appendChild(d);return h}function J(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let v=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(f)?u=f[0]:f!==void 0?u=f:r.default!==void 0&&(u=r.default),r.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",k&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=v,g.value=i.value,g.className="voc-form-audio-radio",r.key&&(g.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",k&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",k&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),o.appendChild(s),t.appendChild(o),c=document.createElement("audio"),c.src=i.audio_link,c.preload="none",c.style.display="none";let l=y=>{for(;y.firstChild;)y.removeChild(y.firstChild)},N=()=>{let y="http://www.w3.org/2000/svg",_=document.createElementNS(y,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),_.appendChild(q),_},S=()=>{let y="http://www.w3.org/2000/svg",_=document.createElementNS(y,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(y,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),_.appendChild(q),_};l(t),t.appendChild(N());let M=y=>{l(t),y?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(N()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let y=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}y.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),c.play()}catch(y){console.warn("audio play failed",y)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let $=()=>{p.classList.remove("is-playing"),M(!1)};c.addEventListener("pause",$),c.addEventListener("ended",$),e.appendChild(t),e.appendChild(c)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function Y(r,x,f){let k=document.createElement("div");k.className="voc-form-table-wrapper";let h=x?.style==="bootstrap",v=document.createElement("input");v.type="hidden",v.name=r.name||r.key,r.key&&(v.id=`voc-form-${r.key}`),k.appendChild(v);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(r.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),k.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),c=document.createElement("tr"),m=document.createElement("td");m.colSpan=(r.fields?r.fields.length:0)+1,m.appendChild(L),c.appendChild(m),e.appendChild(c),u.appendChild(e),k.appendChild(u);let a=[];function E(){v.value=JSON.stringify(a)}function w(n){let o=[];return r.fields.forEach(s=>{let l=n[s.key];if(s.type==="checkbox"){let N=Array.isArray(l)?l:l?[l]:[];s.required&&N.length===0&&o.push(`${s.label||s.key} is required`);return}s.required&&(l==null||String(l).trim()==="")&&o.push(`${s.label||s.key} is required`),s.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||o.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&l&&isNaN(Number(l))&&o.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&l&&(new RegExp(s.validation.regex).test(String(l))||o.push(`${s.label||s.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",l=>{let N=Number(o.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(N)),o.classList.add("dragging");try{l.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{o.classList.remove("dragging"),s.style.cursor="grab"}),o.addEventListener("dragover",l=>{l.preventDefault();let N=l.currentTarget,S=N.getBoundingClientRect(),M=S.top+S.height/2,$=(l.clientY||l.y)>M;N.classList.remove("drag-over-top","drag-over-bottom"),$?(N.classList.add("drag-over-bottom"),N.dataset.dropPosition="after"):(N.classList.add("drag-over-top"),N.dataset.dropPosition="before")}),o.addEventListener("dragleave",l=>{let N=l.currentTarget;N.classList.remove("drag-over-top","drag-over-bottom"),delete N.dataset.dropPosition}),o.addEventListener("drop",l=>{l.preventDefault();let N=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),M=Number(N),$=l.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[y]=a.splice(M,1),_=S;M<S&&(_=S-1);let q=$==="after"?_+1:_;a.splice(q,0,y),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,s)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(s),l.classList.add("voc-form-table-row");let N=document.createElement("td");N.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",N.appendChild(S),l.appendChild(N),n(l,S),r.fields.forEach(y=>{let _=document.createElement("td"),q,A=(y.type||"text").toLowerCase();if(A==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),y.placeholder){let C=document.createElement("option");C.value="",C.textContent=y.placeholder,C.disabled=!0,(o[y.key]===void 0||o[y.key]===null||o[y.key]==="")&&(C.selected=!0),b.appendChild(C)}(y.options||[]).forEach(C=>{let O=document.createElement("option");O.value=C.value,O.textContent=C.label,b.appendChild(O)}),b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.required&&(b.required=!0),b.addEventListener("change",C=>{a[s][y.key]=C.target.value,E()}),q=b}else if(A==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=y.options||[];Array.isArray(a[s][y.key])||(a[s][y.key]=a[s][y.key]?[a[s][y.key]]:[]),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=C.value,H.checked=Array.isArray(a[s][y.key])&&a[s][y.key].includes(C.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[s][y.key])||(a[s][y.key]=[]),I?a[s][y.key].includes(C.value)||a[s][y.key].push(C.value):a[s][y.key]=a[s][y.key].filter(R=>R!==C.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(A==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=y.options||[];a[s][y.key]===void 0&&(a[s][y.key]=""),F.forEach(C=>{let O=`voc-form-${r.key}-${y.key}-${s}-${C.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${r.key}-${y.key}-${s}`,H.value=C.value,H.checked=a[s][y.key]===C.value,H.addEventListener("change",z=>{z.target.checked&&(a[s][y.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=C.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");A==="number"?b.type="number":A==="email"?b.type="email":A==="tel"?b.type="tel":A==="url"?b.type="url":A==="date"?b.type="date":b.type="text",b.value=o[y.key]!==void 0&&o[y.key]!==null?String(o[y.key]):"",y.placeholder&&(b.placeholder=y.placeholder),y.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[s][y.key]=F.target.value,E()}),q=b}_.appendChild(q),l.appendChild(_)});let M=document.createElement("td"),$=document.createElement("button");$.type="button",$.className="voc-form-table-remove",h&&$.classList.add("btn","btn-danger"),$.textContent="Remove",$.addEventListener("click",()=>{a.splice(s,1),t(),E()}),M.appendChild($),l.appendChild(M),T.appendChild(l)})}return L.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),E(),k.validate=function(){let n=[];return a.forEach((o,s)=>{let l=w(o);l.length&&n.push(`Row ${s+1}: ${l.join("; ")}`)}),r.validation?.min_rows!==void 0&&a.length<r.validation.min_rows&&n.push(`At least ${r.validation.min_rows} rows required`),r.validation?.max_rows!==void 0&&a.length>r.validation.max_rows&&n.push(`No more than ${r.validation.max_rows} rows allowed`),r.validation?.unique_fields&&r.validation.unique_fields.length&&r.validation.unique_fields.forEach(o=>{let s=new Set;a.forEach((l,N)=>{let S=l[o];S!=null&&(s.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${N+1})`),s.add(S))})}),n},k}async function ie(r){let f=new TextEncoder().encode(r),k=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(k)).map(v=>v.toString(16).padStart(2,"0")).join("")}async function le(r){let x=String(r||"").trim().toLowerCase();return x?`https://gravatar.com/avatar/${await ie(x)}?d=mp`:""}function K(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let v=document.createElement("div");if(v.className="voc-form-users-header",k&&v.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",k&&e.classList.add("form-label"),e.textContent=r.label,r.required){let c=document.createElement("span");c.className="voc-form-required",c.textContent="*",e.appendChild(c)}v.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",k&&e.classList.add("form-text"),e.textContent=r.description,v.appendChild(e)}h.appendChild(v);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",k&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",k&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(f)?g=f:f!=null?g=[f]:Array.isArray(r.default)&&(g=r.default),r.options.forEach((e,c)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),k&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${c}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(s=>String(s));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&le(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let s=o.target;s&&(s.closest("input")||s.closest("a")||s.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),r.required){let e=d.querySelectorAll('input[type="checkbox"]'),c=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",c)}),h._validateCheckboxGroup=c,c()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(c=>c.style.setProperty("display","flex","important"));return}T.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",E=c.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);c.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function Q(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let v=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=v,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",k&&u.classList.add("form-control"),r.placeholder&&(u.placeholder=r.placeholder||""),r.required&&(u.required=!0),r.width&&(u.style.width=r.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),f!=null?u.value=String(f):r.default!==void 0&&r.default!==null&&(u.value=String(r.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=r.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let s=document.createElement("li");s.className="voc-form-timezone-item",s.setAttribute("role","option"),s.dataset.value=n,s.style.padding="6px 8px",s.style.cursor="pointer",s.textContent=n,s.addEventListener("mousedown",l=>{l.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(s)})}L(T);let e=-1;function c(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,c()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",k&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function X(r,x,f){let k=x?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let v=r.name||r.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=r.placeholder||"",k&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,r.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${v}[]`,a.className="voc-form-tag-hidden",a.value=m,r.key&&(a.id=`voc-form-${r.key}`),h.appendChild(a)}),r.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(c){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=c,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(c);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),L(i.value),i.value="";else if(c.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(r,x=!0){let f=new FormData(r);if(x)return ce(f);let k={};return f.forEach((h,v)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(k,v)?Array.isArray(k[v])?k[v].push(u):k[v]=[k[v],u]:k[v]=u}),k}function ce(r){let x=new FormData;for(let[f,k]of r.entries()){if(k instanceof File){x.append(f,k);continue}let h;try{h=JSON.parse(k)}catch{h=null}Array.isArray(h)?h.length===0?x.append(f,"[]"):h.every(v=>typeof v=="object"&&v!==null)?h.forEach((v,u)=>{for(let[i,d]of Object.entries(v))x.append(`${f}[${u}][${i}]`,d)}):x.append(f,k):x.append(f,k)}return x}async function Z(r,x,f){let k=x.url,h={"Content-Type":"application/json"};x?.api_token&&(h.Authorization=`Bearer ${x.api_token}`);let v=j(r);if(x?.additional_data)for(let[d,p]of Object.entries(x.additional_data))v.append(d,p);let u,i=v instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${x.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?v:JSON.stringify(Object.fromEntries(v.entries()))};try{fetch(k,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{f&&f(d,null)}).catch(d=>{f&&f(null,d)})}catch(d){f&&f(null,d)}}function ee(r,x,f){let k=[];if(typeof r=="string"?k=Array.from(document.querySelectorAll(r)):k=[r],k.length===0)return null;function h(){let i=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=x.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=x.form_name,d.appendChild(p);function g(e,c){c&&(c.min_length!==void 0&&(e.minLength=c.min_length),c.max_length!==void 0&&(e.maxLength=c.max_length),c.regex&&(e instanceof HTMLInputElement?e.pattern=c.regex:e.dataset.pattern=c.regex))}function T(e){if(!e.key&&!e.label)return null;let c=x.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=X(e,f||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let l=document.createElement("input");l.type="checkbox",l.classList.add("voc-form-checkbox"),i&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),s.appendChild(l),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let s=Array.from(n).some(l=>l.checked);return n.forEach(l=>{s?l.setCustomValidity(""):l.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,s=80,l=n.split(`
2
+ `).reduce((M,$)=>Math.max(M,$.length),0),N=Math.ceil(l/s)||1,S=Math.max(2,o+N);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),i&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let l=document.createElement("input");l.type="radio",l.classList.add("voc-form-radio"),i&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),s.appendChild(l),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=U(e,f||{},a);break}case"table":{w=Y(e,f||{},a);break}case"users":{w=K(e,f||{},a);break}case"timezone":{w=Q(e,f||{},a);break}case"audio_select":{w=J(e,f||{},a);break}case"field-select":{let t=f?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let A=document.createElement("div");if(A.className="voc-form-field-selects-label",t&&A.classList.add("form-label"),A.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",A.appendChild(b)}o.appendChild(A)}if(e.description){let A=document.createElement("div");A.className="voc-form-field-selects-description",t&&A.classList.add("form-text"),A.textContent=e.description,o.appendChild(A)}n.appendChild(o);let s=document.createElement("div");s.className="voc-form-field-selects-search-wrapper";let l=document.createElement("input");if(l.type="search",l.placeholder="Search...",l.className="voc-form-field-selects-search",t&&l.classList.add("form-control","mb-2"),s.appendChild(l),n.appendChild(s),!e.options||e.options.length===0)return n;let N=document.createElement("div");N.className="voc-form-field-selects-list",t&&N.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},$=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,y=[];if(Array.isArray(a)?y=a:a!=null?y=[a]:Array.isArray(e.default)&&(y=e.default),e.options.forEach((A,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(A.option_label??A.label??"").toLowerCase(),F.dataset.email=String(A.email||"").toLowerCase(),F.dataset.value=String(A.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let C=document.createElement("input");if(C.type="checkbox",C.name=`${$}[]`,C.value=A.value??A.key,C.className="voc-form--checkbox",e.key&&(C.id=`voc-form-${e.key}-${b}`),C.style.position="absolute",C.style.width="1px",C.style.height="1px",C.style.margin="0",C.style.padding="0",C.style.clip="rect(0 0 0 0)",C.style.clipPath="inset(50%)",C.style.overflow="hidden",C.style.border="0",y&&Array.isArray(y)){let I=y.map(P=>String(P)),R=String(A.value??A.key);C.checked=I.includes(R)}let O=A.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=(A.option_label??A.label)||String(A.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=A.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(C.checked=!C.checked,C.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("change",()=>{if(C.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=A;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),C.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=A;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(C),F.appendChild(B),F.appendChild(H),N.appendChild(F)}),n.appendChild(N),n.appendChild(S),e.required){let A=N.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(A).some(C=>C.checked);return A.forEach(C=>{F?C.setCustomValidity(""):C.setCustomValidity("At least one option must be selected.")}),F};A.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let _=Array.from(N.querySelectorAll(".voc-form-field-select-item")),q=()=>{let A=String(l.value||"").trim().toLowerCase();if(!A){_.forEach(b=>b.style.setProperty("display","flex","important"));return}_.forEach(b=>{let F=b.dataset.label||"",C=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(A)||C.includes(A)||O.includes(A);b.style.setProperty("display",B?"flex":"none","important")})};return l.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}x.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let l=document.createElement("h6");l.className="voc-form-row-label",l.textContent=n.label,o.appendChild(l)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let N=T(l);N&&s.appendChild(N)}),o.appendChild(s),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}c.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let s=document.createElement("h4");s.className="voc-form-row-label",s.textContent=t.label,n.appendChild(s)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let l=T(s);l&&o.appendChild(l)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let c=document.createElement("div");if(c.className="voc-form-group voc-form-row",i&&c.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,c.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,c.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),c.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(c)}else{let c=T(e);c&&d.appendChild(c)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let v=h();k[0].appendChild(v);let u=x?.submit_config??f?.submit_config??null;return u&&v.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(v.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!v.checkValidity()){v.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(v.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let L=j(v);f.onSubmit(L)}Z(v,u,(L,e)=>{f?.onSubmitResult&&f.onSubmitResult(L,e)})}),{element:v,validate:()=>{let i=[];return v.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(v),onSubmit:i=>{v.addEventListener("submit",d=>{d.preventDefault();let p=j(v);i(p,d)})}}}var V={renderForm:ee};var de=V,me={FormsLib:V};0&&(module.exports={FormsLib});
package/dist/main.mjs CHANGED
@@ -1,2 +1,2 @@
1
- function V(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",C&&h.classList.add("d-flex","align-items-center","gap-3");let y=document.createElement("img");y.className="voc-form-avatar-preview",y.alt=s.label||"avatar",C&&(y.classList.add("img-thumbnail","rounded-circle"),y.style.width=y.style.height="64px",y.style.objectFit="cover");let u=v!=null?String(v):s.default!==void 0&&s.default!==null?String(s.default):"";u?y.src=u:(y.src="",y.style.display="none");let i=document.createElement("input");i.type="file",i.accept=s.accept||"image/*",i.className="voc-form-avatar-input",C&&i.classList.add("form-control"),(s.key||s.name)&&(i.name=s.name||s.key,s.key&&(i.id=`voc-form-${s.key}`));let d=document.createElement("input");if(d.type="hidden",(s.key||s.name)&&(d.name=(s.name||s.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{y.src=String(L.result),y.style.display="",d.value=""},L.readAsDataURL(T)}}),C){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(y),h.appendChild(p)}else h.appendChild(y),h.appendChild(i),h.appendChild(d);return h}function U(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!s.options||s.options.length===0)return h;let y=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(v)?u=v[0]:v!==void 0?u=v:s.default!==void 0&&(u=s.default),s.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",C&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=y,g.value=i.value,g.className="voc-form-audio-radio",s.key&&(g.id=`voc-form-${s.key}-${d}`),s.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",C&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",C&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),o.appendChild(r),t.appendChild(o),l=document.createElement("audio"),l.src=i.audio_link,l.preload="none",l.style.display="none";let c=f=>{for(;f.firstChild;)f.removeChild(f.firstChild)},A=()=>{let f="http://www.w3.org/2000/svg",$=document.createElementNS(f,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(f,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),$.appendChild(q),$},S=()=>{let f="http://www.w3.org/2000/svg",$=document.createElementNS(f,"svg");$.setAttribute("viewBox","0 0 24 24"),$.setAttribute("width","16"),$.setAttribute("height","16"),$.setAttribute("aria-hidden","true");let q=document.createElementNS(f,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),$.appendChild(q),$};c(t),t.appendChild(A());let M=f=>{c(t),f?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(A()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let f=h.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}f.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),l.play()}catch(f){console.warn("audio play failed",f)}}),l.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let _=()=>{p.classList.remove("is-playing"),M(!1)};l.addEventListener("pause",_),l.addEventListener("ended",_),e.appendChild(t),e.appendChild(l)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function J(s,N,v){let C=document.createElement("div");C.className="voc-form-table-wrapper";let h=N?.style==="bootstrap",y=document.createElement("input");y.type="hidden",y.name=s.name||s.key,s.key&&(y.id=`voc-form-${s.key}`),C.appendChild(y);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(s.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),C.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),m=document.createElement("td");m.colSpan=(s.fields?s.fields.length:0)+1,m.appendChild(L),l.appendChild(m),e.appendChild(l),u.appendChild(e),C.appendChild(u);let a=[];function E(){y.value=JSON.stringify(a)}function w(n){let o=[];return s.fields.forEach(r=>{let c=n[r.key];if(r.type==="checkbox"){let A=Array.isArray(c)?c:c?[c]:[];r.required&&A.length===0&&o.push(`${r.label||r.key} is required`);return}r.required&&(c==null||String(c).trim()==="")&&o.push(`${r.label||r.key} is required`),r.type==="email"&&c&&(/^\S+@\S+\.\S+$/.test(String(c))||o.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&c&&isNaN(Number(c))&&o.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&c&&(new RegExp(r.validation.regex).test(String(c))||o.push(`${r.label||r.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",c=>{let A=Number(o.dataset.rowIndex);c.dataTransfer.setData("text/plain",String(A)),o.classList.add("dragging");try{c.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{o.classList.remove("dragging"),r.style.cursor="grab"}),o.addEventListener("dragover",c=>{c.preventDefault();let A=c.currentTarget,S=A.getBoundingClientRect(),M=S.top+S.height/2,_=(c.clientY||c.y)>M;A.classList.remove("drag-over-top","drag-over-bottom"),_?(A.classList.add("drag-over-bottom"),A.dataset.dropPosition="after"):(A.classList.add("drag-over-top"),A.dataset.dropPosition="before")}),o.addEventListener("dragleave",c=>{let A=c.currentTarget;A.classList.remove("drag-over-top","drag-over-bottom"),delete A.dataset.dropPosition}),o.addEventListener("drop",c=>{c.preventDefault();let A=c.dataTransfer.getData("text/plain"),S=Number(c.currentTarget.dataset.rowIndex),M=Number(A),_=c.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[f]=a.splice(M,1),$=S;M<S&&($=S-1);let q=_==="after"?$+1:$;a.splice(q,0,f),c.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete c.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,r)=>{let c=document.createElement("tr");c.dataset.rowIndex=String(r),c.classList.add("voc-form-table-row");let A=document.createElement("td");A.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",A.appendChild(S),c.appendChild(A),n(c,S),s.fields.forEach(f=>{let $=document.createElement("td"),q,x=(f.type||"text").toLowerCase();if(x==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),f.placeholder){let k=document.createElement("option");k.value="",k.textContent=f.placeholder,k.disabled=!0,(o[f.key]===void 0||o[f.key]===null||o[f.key]==="")&&(k.selected=!0),b.appendChild(k)}(f.options||[]).forEach(k=>{let O=document.createElement("option");O.value=k.value,O.textContent=k.label,b.appendChild(O)}),b.value=o[f.key]!==void 0&&o[f.key]!==null?String(o[f.key]):"",f.required&&(b.required=!0),b.addEventListener("change",k=>{a[r][f.key]=k.target.value,E()}),q=b}else if(x==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=f.options||[];Array.isArray(a[r][f.key])||(a[r][f.key]=a[r][f.key]?[a[r][f.key]]:[]),F.forEach(k=>{let O=`voc-form-${s.key}-${f.key}-${r}-${k.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=k.value,H.checked=Array.isArray(a[r][f.key])&&a[r][f.key].includes(k.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[r][f.key])||(a[r][f.key]=[]),I?a[r][f.key].includes(k.value)||a[r][f.key].push(k.value):a[r][f.key]=a[r][f.key].filter(R=>R!==k.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=k.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(x==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=f.options||[];a[r][f.key]===void 0&&(a[r][f.key]=""),F.forEach(k=>{let O=`voc-form-${s.key}-${f.key}-${r}-${k.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${s.key}-${f.key}-${r}`,H.value=k.value,H.checked=a[r][f.key]===k.value,H.addEventListener("change",z=>{z.target.checked&&(a[r][f.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=k.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");x==="number"?b.type="number":x==="email"?b.type="email":x==="tel"?b.type="tel":x==="url"?b.type="url":x==="date"?b.type="date":b.type="text",b.value=o[f.key]!==void 0&&o[f.key]!==null?String(o[f.key]):"",f.placeholder&&(b.placeholder=f.placeholder),f.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[r][f.key]=F.target.value,E()}),q=b}$.appendChild(q),c.appendChild($)});let M=document.createElement("td"),_=document.createElement("button");_.type="button",_.className="voc-form-table-remove",h&&_.classList.add("btn","btn-danger"),_.textContent="Remove",_.addEventListener("click",()=>{a.splice(r,1),t(),E()}),M.appendChild(_),c.appendChild(M),T.appendChild(c)})}return L.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(v)&&v.length?a=v.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),E(),C.validate=function(){let n=[];return a.forEach((o,r)=>{let c=w(o);c.length&&n.push(`Row ${r+1}: ${c.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(o=>{let r=new Set;a.forEach((c,A)=>{let S=c[o];S!=null&&(r.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${A+1})`),r.add(S))})}),n},C}async function ee(s){let v=new TextEncoder().encode(s),C=await crypto.subtle.digest("SHA-256",v);return Array.from(new Uint8Array(C)).map(y=>y.toString(16).padStart(2,"0")).join("")}async function te(s){let N=String(s||"").trim().toLowerCase();return N?`https://gravatar.com/avatar/${await ee(N)}?d=mp`:""}function Y(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let y=document.createElement("div");if(y.className="voc-form-users-header",C&&y.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",C&&e.classList.add("form-label"),e.textContent=s.label,s.required){let l=document.createElement("span");l.className="voc-form-required",l.textContent="*",e.appendChild(l)}y.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",C&&e.classList.add("form-text"),e.textContent=s.description,y.appendChild(e)}h.appendChild(y);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",C&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!s.options||s.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",C&&d.classList.add("list-group");let p=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(v)?g=v:v!=null?g=[v]:Array.isArray(s.default)&&(g=s.default),s.options.forEach((e,l)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),C&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${l}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(r=>String(r));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&te(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let r=o.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),s.required){let e=d.querySelectorAll('input[type="checkbox"]'),l=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",l)}),h._validateCheckboxGroup=l,l()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(l=>l.style.setProperty("display","flex","important"));return}T.forEach(l=>{let m=l.dataset.label||"",a=l.dataset.email||"",E=l.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);l.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function K(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let y=s.name||s.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=y,s.key&&(u.id=`voc-form-${s.key}`),u.className="voc-form-timezone-input",C&&u.classList.add("form-control"),s.placeholder&&(u.placeholder=s.placeholder||""),s.required&&(u.required=!0),s.width&&(u.style.width=s.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),v!=null?u.value=String(v):s.default!==void 0&&s.default!==null&&(u.value=String(s.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=s.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let r=document.createElement("li");r.className="voc-form-timezone-item",r.setAttribute("role","option"),r.dataset.value=n,r.style.padding="6px 8px",r.style.cursor="pointer",r.textContent=n,r.addEventListener("mousedown",c=>{c.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(r)})}L(T);let e=-1;function l(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,l()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),l(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),s.description){let t=document.createElement("div");t.className="voc-form-timezone-description",C&&t.classList.add("form-text"),t.textContent=s.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function Q(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let y=s.name||s.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=s.placeholder||"",C&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,s.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${y}[]`,a.className="voc-form-tag-hidden",a.value=m,s.key&&(a.id=`voc-form-${s.key}`),h.appendChild(a)}),s.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(l){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=l,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(l);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(l){let m=l.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=v!=null?String(v):s.default||"";return e&&e.split(",").map(l=>l.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",l=>{if(l.key==="Enter"||l.key===",")l.preventDefault(),L(i.value),i.value="";else if(l.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",l=>{let m=l.clipboardData?.getData("text");m&&(l.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(s,N=!0){let v=new FormData(s);if(N)return ae(v);let C={};return v.forEach((h,y)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(C,y)?Array.isArray(C[y])?C[y].push(u):C[y]=[C[y],u]:C[y]=u}),C}function ae(s){let N=new FormData;for(let[v,C]of s.entries()){if(C instanceof File){N.append(v,C);continue}let h;try{h=JSON.parse(C)}catch{h=null}Array.isArray(h)?h.length===0?N.append(v,"[]"):h.every(y=>typeof y=="object"&&y!==null)?h.forEach((y,u)=>{for(let[i,d]of Object.entries(y))N.append(`${v}[${u}][${i}]`,d)}):N.append(v,C):N.append(v,C)}return N}async function X(s,N,v){let C=N.url,h={"Content-Type":"application/json"};N?.api_token&&(h.Authorization=`Bearer ${N.api_token}`);let y=j(s);if(N?.additional_data)for(let[d,p]of Object.entries(N.additional_data))y.append(d,p);let u,i=y instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${N.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?y:JSON.stringify(Object.fromEntries(y.entries()))};try{fetch(C,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{v&&v(d,null)}).catch(d=>{v&&v(null,d)})}catch(d){v&&v(null,d)}}function Z(s,N,v){let C=[];if(typeof s=="string"?C=Array.from(document.querySelectorAll(s)):C=[s],C.length===0)return null;function h(){let i=v?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=N.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=N.form_name,d.appendChild(p);function g(e,l){l&&(l.min_length!==void 0&&(e.minLength=l.min_length),l.max_length!==void 0&&(e.maxLength=l.max_length),l.regex&&(e instanceof HTMLInputElement?e.pattern=l.regex:e.dataset.pattern=l.regex))}function T(e){if(!e.key&&!e.label)return null;let l=N.default_values||{},m=e.name||e.key,a=m?l[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=Q(e,v||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),i&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let c=document.createElement("input");c.type="checkbox",c.classList.add("voc-form-checkbox"),i&&c.classList.add("form-check-input"),c.name=`${e.name||e.key||""}[]`,c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),r.appendChild(c),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let r=Array.from(n).some(c=>c.checked);return n.forEach(c=>{r?c.setCustomValidity(""):c.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,r=80,c=n.split(`
2
- `).reduce((M,_)=>Math.max(M,_.length),0),A=Math.ceil(c/r)||1,S=Math.max(2,o+A);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),i&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let c=document.createElement("input");c.type="radio",c.classList.add("voc-form-radio"),i&&c.classList.add("form-check-input"),c.name=e.name||e.key||"",c.value=n.value,e.key&&(c.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(c.checked=!0):a!==void 0?a===n.value&&(c.checked=!0):e.default===n.value&&(c.checked=!0),r.appendChild(c),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=V(e,v||{},a);break}case"table":{w=J(e,v||{},a);break}case"users":{w=Y(e,v||{},a);break}case"timezone":{w=K(e,v||{},a);break}case"audio_select":{w=U(e,v||{},a);break}case"field-select":{let t=v?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let x=document.createElement("div");if(x.className="voc-form-field-selects-label",t&&x.classList.add("form-label"),x.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",x.appendChild(b)}o.appendChild(x)}if(e.description){let x=document.createElement("div");x.className="voc-form-field-selects-description",t&&x.classList.add("form-text"),x.textContent=e.description,o.appendChild(x)}n.appendChild(o);let r=document.createElement("div");r.className="voc-form-field-selects-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search...",c.className="voc-form-field-selects-search",t&&c.classList.add("form-control","mb-2"),r.appendChild(c),n.appendChild(r),!e.options||e.options.length===0)return n;let A=document.createElement("div");A.className="voc-form-field-selects-list",t&&A.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},_=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(a)?f=a:a!=null?f=[a]:Array.isArray(e.default)&&(f=e.default),e.options.forEach((x,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(x.label||"").toLowerCase(),F.dataset.email=String(x.email||"").toLowerCase(),F.dataset.value=String(x.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let k=document.createElement("input");if(k.type="checkbox",k.name=`${_}[]`,k.value=x.value??x.key,k.className="voc-form--checkbox",e.key&&(k.id=`voc-form-${e.key}-${b}`),k.style.position="absolute",k.style.width="1px",k.style.height="1px",k.style.margin="0",k.style.padding="0",k.style.clip="rect(0 0 0 0)",k.style.clipPath="inset(50%)",k.style.overflow="hidden",k.style.border="0",f&&Array.isArray(f)){let I=f.map(P=>String(P)),R=String(x.value??x.key);k.checked=I.includes(R)}let O=x.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=x.label||String(x.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=x.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(k.checked=!k.checked,k.dispatchEvent(new Event("change",{bubbles:!0})))}),k.addEventListener("change",()=>{if(k.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=x;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),k.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=x;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(k),F.appendChild(B),F.appendChild(H),A.appendChild(F)}),n.appendChild(A),n.appendChild(S),e.required){let x=A.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(x).some(k=>k.checked);return x.forEach(k=>{F?k.setCustomValidity(""):k.setCustomValidity("At least one option must be selected.")}),F};x.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let $=Array.from(A.querySelectorAll(".voc-form-field-select-item")),q=()=>{let x=String(c.value||"").trim().toLowerCase();if(!x){$.forEach(b=>b.style.setProperty("display","flex","important"));return}$.forEach(b=>{let F=b.dataset.label||"",k=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(x)||k.includes(x)||O.includes(x);b.style.setProperty("display",B?"flex":"none","important")})};return c.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}N.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let l=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",l.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let c=document.createElement("h6");c.className="voc-form-row-label",c.textContent=n.label,o.appendChild(c)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(c=>{let A=T(c);A&&r.appendChild(A)}),o.appendChild(r),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=l.label||l.header?.title,E=l.description||l.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}l.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let r=document.createElement("h4");r.className="voc-form-row-label",r.textContent=t.label,n.appendChild(r)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let c=T(r);c&&o.appendChild(c)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let l=document.createElement("div");if(l.className="voc-form-group voc-form-row",i&&l.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,l.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,l.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),l.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(l)}else{let l=T(e);l&&d.appendChild(l)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let y=h();C[0].appendChild(y);let u=N?.submit_config??v?.submit_config??null;return u&&y.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(y.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!y.checkValidity()){y.reportValidity(),v?.onSubmitResult&&v.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(y.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){v?.onSubmitResult&&v.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(v?.onSubmit){let L=j(y);v.onSubmit(L)}X(y,u,(L,e)=>{v?.onSubmitResult&&v.onSubmitResult(L,e)})}),{element:y,validate:()=>{let i=[];return y.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(y),onSubmit:i=>{y.addEventListener("submit",d=>{d.preventDefault();let p=j(y);i(p,d)})}}}var G={renderForm:Z};var we=G,xe={FormsLib:G};export{we as FormsLib,xe as default};
1
+ function V(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",C&&h.classList.add("d-flex","align-items-center","gap-3");let y=document.createElement("img");y.className="voc-form-avatar-preview",y.alt=s.label||"avatar",C&&(y.classList.add("img-thumbnail","rounded-circle"),y.style.width=y.style.height="64px",y.style.objectFit="cover");let u=v!=null?String(v):s.default!==void 0&&s.default!==null?String(s.default):"";u?y.src=u:(y.src="",y.style.display="none");let i=document.createElement("input");i.type="file",i.accept=s.accept||"image/*",i.className="voc-form-avatar-input",C&&i.classList.add("form-control"),(s.key||s.name)&&(i.name=s.name||s.key,s.key&&(i.id=`voc-form-${s.key}`));let d=document.createElement("input");if(d.type="hidden",(s.key||s.name)&&(d.name=(s.name||s.key)+"_url"),d.value=u||"",i.addEventListener("change",p=>{let g=p.target;if(g.files&&g.files.length>0){let T=g.files[0],L=new FileReader;L.onload=()=>{y.src=String(L.result),y.style.display="",d.value=""},L.readAsDataURL(T)}}),C){let p=document.createElement("div");p.style.flex="1",p.appendChild(i),p.appendChild(d),h.appendChild(y),h.appendChild(p)}else h.appendChild(y),h.appendChild(i),h.appendChild(d);return h}function U(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!s.options||s.options.length===0)return h;let y=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(v)?u=v[0]:v!==void 0?u=v:s.default!==void 0&&(u=s.default),s.options.forEach((i,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",C&&p.classList.add("form-check");let g=document.createElement("input");g.type="radio",g.name=y,g.value=i.value,g.className="voc-form-audio-radio",s.key&&(g.id=`voc-form-${s.key}-${d}`),s.required&&d===0&&(g.required=!0),g.style.position="absolute",g.style.width="1px",g.style.height="1px",g.style.margin="0",g.style.padding="0",g.style.clip="rect(0 0 0 0)",g.style.clipPath="inset(50%)",g.style.overflow="hidden",g.style.border="0",u!==void 0&&(Array.isArray(u)?g.checked=u.includes(i.value):g.checked=String(u)===String(i.value));let T=()=>{g.checked?p.classList.add("selected"):p.classList.remove("selected")};g.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),T()}),g.checked&&p.classList.add("selected");let L=document.createElement("label");L.className="voc-form-audio-label",C&&L.classList.add("form-check-label"),L.htmlFor=g.id||"",L.textContent=i.label||i.value,L.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(i.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",C&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${i.label||i.value}`);let n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("width","16"),o.setAttribute("height","16"),o.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),o.appendChild(r),t.appendChild(o),c=document.createElement("audio"),c.src=i.audio_link,c.preload="none",c.style.display="none";let l=f=>{for(;f.firstChild;)f.removeChild(f.firstChild)},A=()=>{let f="http://www.w3.org/2000/svg",_=document.createElementNS(f,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(f,"path");return q.setAttribute("d","M8 5v14l11-7z"),q.setAttribute("fill","currentColor"),_.appendChild(q),_},S=()=>{let f="http://www.w3.org/2000/svg",_=document.createElementNS(f,"svg");_.setAttribute("viewBox","0 0 24 24"),_.setAttribute("width","16"),_.setAttribute("height","16"),_.setAttribute("aria-hidden","true");let q=document.createElementNS(f,"rect");return q.setAttribute("x","6"),q.setAttribute("y","6"),q.setAttribute("width","12"),q.setAttribute("height","12"),q.setAttribute("fill","currentColor"),_.appendChild(q),_};l(t),t.appendChild(A());let M=f=>{l(t),f?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${i.label||i.value}`)):(t.appendChild(A()),t.setAttribute("aria-label",`Play ${i.label||i.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let f=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}f.forEach(q=>{try{q.pause(),q.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(q=>q.classList.remove("is-playing")),c.play()}catch(f){console.warn("audio play failed",f)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),M(!0)});let $=()=>{p.classList.remove("is-playing"),M(!1)};c.addEventListener("pause",$),c.addEventListener("ended",$),e.appendChild(t),e.appendChild(c)}let m=document.createElement("div");m.className="voc-form-item-detail",m.style.display="flex",m.style.flexDirection="column",m.style.gap="4px";let a=document.createElement("div");a.className="voc-form-item-top",a.style.display="flex",a.style.alignItems="center",a.style.gap="8px",a.appendChild(g),a.appendChild(L);let E=document.createElement("div");E.className="voc-form-item-description";let w=i.description||i.hint_text||"";w&&(E.textContent=w),m.appendChild(a),m.appendChild(E),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(g.checked=!0,g.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function J(s,N,v){let C=document.createElement("div");C.className="voc-form-table-wrapper";let h=N?.style==="bootstrap",y=document.createElement("input");y.type="hidden",y.name=s.name||s.key,s.key&&(y.id=`voc-form-${s.key}`),C.appendChild(y);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let i=document.createElement("thead"),d=document.createElement("tr"),p=document.createElement("th");p.className="voc-form-table-drag-col",p.textContent="",d.appendChild(p),(s.fields||[]).forEach(n=>{let o=document.createElement("th");o.textContent=n.label||n.key,d.appendChild(o)});let g=document.createElement("th");g.textContent="Actions",d.appendChild(g),i.appendChild(d),u.appendChild(i);let T=document.createElement("tbody");u.appendChild(T),C.appendChild(u);let L=document.createElement("button");L.type="button",L.className="voc-form-table-add",h&&L.classList.add("btn","btn-secondary"),L.textContent="+Add";let e=document.createElement("tfoot"),c=document.createElement("tr"),m=document.createElement("td");m.colSpan=(s.fields?s.fields.length:0)+1,m.appendChild(L),c.appendChild(m),e.appendChild(c),u.appendChild(e),C.appendChild(u);let a=[];function E(){y.value=JSON.stringify(a)}function w(n){let o=[];return s.fields.forEach(r=>{let l=n[r.key];if(r.type==="checkbox"){let A=Array.isArray(l)?l:l?[l]:[];r.required&&A.length===0&&o.push(`${r.label||r.key} is required`);return}r.required&&(l==null||String(l).trim()==="")&&o.push(`${r.label||r.key} is required`),r.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||o.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&l&&isNaN(Number(l))&&o.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&l&&(new RegExp(r.validation.regex).test(String(l))||o.push(`${r.label||r.key} invalid format`))}),o}function t(){T.innerHTML="";let n=(o,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",l=>{let A=Number(o.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(A)),o.classList.add("dragging");try{l.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{o.classList.remove("dragging"),r.style.cursor="grab"}),o.addEventListener("dragover",l=>{l.preventDefault();let A=l.currentTarget,S=A.getBoundingClientRect(),M=S.top+S.height/2,$=(l.clientY||l.y)>M;A.classList.remove("drag-over-top","drag-over-bottom"),$?(A.classList.add("drag-over-bottom"),A.dataset.dropPosition="after"):(A.classList.add("drag-over-top"),A.dataset.dropPosition="before")}),o.addEventListener("dragleave",l=>{let A=l.currentTarget;A.classList.remove("drag-over-top","drag-over-bottom"),delete A.dataset.dropPosition}),o.addEventListener("drop",l=>{l.preventDefault();let A=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),M=Number(A),$=l.currentTarget.dataset.dropPosition||"before";if(isNaN(M)||isNaN(S))return;let[f]=a.splice(M,1),_=S;M<S&&(_=S-1);let q=$==="after"?_+1:_;a.splice(q,0,f),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),E()})};a.forEach((o,r)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(r),l.classList.add("voc-form-table-row");let A=document.createElement("td");A.className="voc-form-table-drag-handle";let S=document.createElement("span");S.className="voc-form-drag-handle-icon",S.textContent="\u2630",S.style.cursor="grab",A.appendChild(S),l.appendChild(A),n(l,S),s.fields.forEach(f=>{let _=document.createElement("td"),q,x=(f.type||"text").toLowerCase();if(x==="select"){let b=document.createElement("select");if(b.className="voc-form-table-cell",h&&b.classList.add("form-control"),f.placeholder){let k=document.createElement("option");k.value="",k.textContent=f.placeholder,k.disabled=!0,(o[f.key]===void 0||o[f.key]===null||o[f.key]==="")&&(k.selected=!0),b.appendChild(k)}(f.options||[]).forEach(k=>{let O=document.createElement("option");O.value=k.value,O.textContent=k.label,b.appendChild(O)}),b.value=o[f.key]!==void 0&&o[f.key]!==null?String(o[f.key]):"",f.required&&(b.required=!0),b.addEventListener("change",k=>{a[r][f.key]=k.target.value,E()}),q=b}else if(x==="checkbox"){let b=document.createElement("div");b.className="voc-form-table-checkboxes",h&&b.classList.add("form-check");let F=f.options||[];Array.isArray(a[r][f.key])||(a[r][f.key]=a[r][f.key]?[a[r][f.key]]:[]),F.forEach(k=>{let O=`voc-form-${s.key}-${f.key}-${r}-${k.value}`,B=document.createElement("div");B.className="voc-form-table-checkbox-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="checkbox",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.value=k.value,H.checked=Array.isArray(a[r][f.key])&&a[r][f.key].includes(k.value),H.addEventListener("change",z=>{let I=z.target.checked;Array.isArray(a[r][f.key])||(a[r][f.key]=[]),I?a[r][f.key].includes(k.value)||a[r][f.key].push(k.value):a[r][f.key]=a[r][f.key].filter(R=>R!==k.value),E()});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-checkbox-label",h&&D.classList.add("form-check-label"),D.textContent=k.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else if(x==="radio"){let b=document.createElement("div");b.className="voc-form-table-radios",h&&b.classList.add("form-check");let F=f.options||[];a[r][f.key]===void 0&&(a[r][f.key]=""),F.forEach(k=>{let O=`voc-form-${s.key}-${f.key}-${r}-${k.value}`,B=document.createElement("div");B.className="voc-form-table-radio-item",h&&B.classList.add("form-check");let H=document.createElement("input");H.type="radio",H.className="voc-form-table-cell",h&&H.classList.add("form-check-input"),H.id=O,H.name=`voc-form-${s.key}-${f.key}-${r}`,H.value=k.value,H.checked=a[r][f.key]===k.value,H.addEventListener("change",z=>{z.target.checked&&(a[r][f.key]=z.target.value,E())});let D=document.createElement("label");D.htmlFor=O,D.className="voc-form-table-radio-label",h&&D.classList.add("form-check-label"),D.textContent=k.label,B.appendChild(H),B.appendChild(D),b.appendChild(B)}),q=b}else{let b=document.createElement("input");x==="number"?b.type="number":x==="email"?b.type="email":x==="tel"?b.type="tel":x==="url"?b.type="url":x==="date"?b.type="date":b.type="text",b.value=o[f.key]!==void 0&&o[f.key]!==null?String(o[f.key]):"",f.placeholder&&(b.placeholder=f.placeholder),f.required&&(b.required=!0),b.className="voc-form-table-cell",h&&b.classList.add("form-control"),b.addEventListener("input",F=>{a[r][f.key]=F.target.value,E()}),q=b}_.appendChild(q),l.appendChild(_)});let M=document.createElement("td"),$=document.createElement("button");$.type="button",$.className="voc-form-table-remove",h&&$.classList.add("btn","btn-danger"),$.textContent="Remove",$.addEventListener("click",()=>{a.splice(r,1),t(),E()}),M.appendChild($),l.appendChild(M),T.appendChild(l)})}return L.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(o=>n[o.key]=""),a.push(n),t(),E()}),Array.isArray(v)&&v.length?a=v.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),E(),C.validate=function(){let n=[];return a.forEach((o,r)=>{let l=w(o);l.length&&n.push(`Row ${r+1}: ${l.join("; ")}`)}),s.validation?.min_rows!==void 0&&a.length<s.validation.min_rows&&n.push(`At least ${s.validation.min_rows} rows required`),s.validation?.max_rows!==void 0&&a.length>s.validation.max_rows&&n.push(`No more than ${s.validation.max_rows} rows allowed`),s.validation?.unique_fields&&s.validation.unique_fields.length&&s.validation.unique_fields.forEach(o=>{let r=new Set;a.forEach((l,A)=>{let S=l[o];S!=null&&(r.has(S)&&n.push(`Field ${o} must be unique (duplicate at row ${A+1})`),r.add(S))})}),n},C}async function ee(s){let v=new TextEncoder().encode(s),C=await crypto.subtle.digest("SHA-256",v);return Array.from(new Uint8Array(C)).map(y=>y.toString(16).padStart(2,"0")).join("")}async function te(s){let N=String(s||"").trim().toLowerCase();return N?`https://gravatar.com/avatar/${await ee(N)}?d=mp`:""}function Y(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let y=document.createElement("div");if(y.className="voc-form-users-header",C&&y.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",C&&e.classList.add("form-label"),e.textContent=s.label,s.required){let c=document.createElement("span");c.className="voc-form-required",c.textContent="*",e.appendChild(c)}y.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",C&&e.classList.add("form-text"),e.textContent=s.description,y.appendChild(e)}h.appendChild(y);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let i=document.createElement("input");if(i.type="search",i.placeholder="Search users...",i.className="voc-form-users-search",C&&i.classList.add("form-control","mb-2"),u.appendChild(i),h.appendChild(u),!s.options||s.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",C&&d.classList.add("list-group");let p=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,g=[];if(Array.isArray(v)?g=v:v!=null?g=[v]:Array.isArray(s.default)&&(g=s.default),s.options.forEach((e,c)=>{let m=document.createElement("div");m.className="voc-form-user-item",m.dataset.label=String(e.label||"").toLowerCase(),m.dataset.email=String(e.email||"").toLowerCase(),m.dataset.value=String(e.value||"").toLowerCase(),C&&m.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${p}[]`,a.value=e.value,a.className="voc-form-user-checkbox",s.key&&(a.id=`voc-form-${s.key}-${c}`),a.style.position="absolute",a.style.width="1px",a.style.height="1px",a.style.margin="0",a.style.padding="0",a.style.clip="rect(0 0 0 0)",a.style.clipPath="inset(50%)",a.style.overflow="hidden",a.style.border="0",g&&Array.isArray(g)){let o=g.map(r=>String(r));a.checked=o.includes(String(e.value))}let E=document.createElement("img");E.className="voc-form-user-avatar",E.alt=e.label||String(e.value||"user"),E.style.width=E.style.height="40px",E.style.objectFit="cover",E.style.borderRadius="50%",E.src="",e.email&&te(e.email).then(o=>{o&&(E.src=o)}).catch(()=>{});let w=document.createElement("div");w.className="voc-form-user-info",w.style.display="flex",w.style.flexDirection="column",w.style.gap="2px";let t=document.createElement("div");t.className="voc-form-user-label",t.textContent=e.label||String(e.value);let n=document.createElement("small");n.className="voc-form-user-email",n.textContent=e.email||"",w.appendChild(t),w.appendChild(n),m.addEventListener("click",o=>{let r=o.target;r&&(r.closest("input")||r.closest("a")||r.closest("button"))||(a.checked=!a.checked,a.dispatchEvent(new Event("change",{bubbles:!0})))}),a.addEventListener("change",()=>{a.checked?m.classList.add("selected"):m.classList.remove("selected")}),a.checked&&m.classList.add("selected"),m.appendChild(a),m.appendChild(E),m.appendChild(w),d.appendChild(m)}),h.appendChild(d),s.required){let e=d.querySelectorAll('input[type="checkbox"]'),c=()=>{let m=Array.from(e).some(a=>a.checked);return e.forEach(a=>{m?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),m};e.forEach(m=>{m.addEventListener("change",c)}),h._validateCheckboxGroup=c,c()}let T=Array.from(d.querySelectorAll(".voc-form-user-item")),L=()=>{let e=String(i.value||"").trim().toLowerCase();if(!e){T.forEach(c=>c.style.setProperty("display","flex","important"));return}T.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",E=c.dataset.value||"",w=m.includes(e)||a.includes(e)||E.includes(e);c.style.setProperty("display",w?"flex":"none","important")})};return i.addEventListener("input",L),h}function K(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let y=s.name||s.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=y,s.key&&(u.id=`voc-form-${s.key}`),u.className="voc-form-timezone-input",C&&u.classList.add("form-control"),s.placeholder&&(u.placeholder=s.placeholder||""),s.required&&(u.required=!0),s.width&&(u.style.width=s.width);try{u.autocomplete="off"}catch{}try{u.autocorrect="off"}catch{}try{u.autocapitalize="off"}catch{}try{u.spellcheck=!1}catch{}u.setAttribute("data-lpignore","true"),v!=null?u.value=String(v):s.default!==void 0&&s.default!==null&&(u.value=String(s.default));let i=document.createElement("div");i.className="voc-form-timezone-control",i.style.position="relative",i.style.display="inline-block",i.style.width=s.width||"100%";let d=document.createElement("button");d.type="button",d.className="voc-form-timezone-toggle",d.setAttribute("aria-haspopup","listbox"),d.setAttribute("aria-expanded","false"),d.style.position="absolute",d.style.right="4px",d.style.top="50%",d.style.transform="translateY(-50%)",d.style.height="28px",d.style.width="28px",d.style.padding="0",d.style.border="none",d.style.background="transparent",d.style.cursor="pointer",d.innerHTML="\u25BC";let p=document.createElement("ul");p.className="voc-form-timezone-list",p.setAttribute("role","listbox"),p.style.position="absolute",p.style.left="0",p.style.right="0",p.style.zIndex="1000",p.style.maxHeight="200px",p.style.overflow="auto",p.style.margin="4px 0 0 0",p.style.padding="0",p.style.listStyle="none",p.style.background="white",p.style.border="1px solid rgba(0,0,0,0.15)",p.style.display="none",p.tabIndex=-1,u.style.paddingRight="36px";let T=["UTC","ETC","AEST","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Toronto","America/Vancouver","Europe/London","Europe/Paris","Europe/Berlin","Europe/Rome","Europe/Madrid","Europe/Amsterdam","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Asia/Kolkata","Asia/Dubai","Australia/Lindeman","Australia/Brisbane","Australia/Sydney","Australia/Melbourne","Australia/Hobart","Australia/Currie","Australia/Broken_Hill","Australia/Lord_Howe","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla","Australia/ACT","ACT","Pacific/Auckland","America/Sao_Paulo","America/Mexico_City","Africa/Cairo","Africa/Johannesburg"];function L(t){p.innerHTML="",t.forEach((n,o)=>{let r=document.createElement("li");r.className="voc-form-timezone-item",r.setAttribute("role","option"),r.dataset.value=n,r.style.padding="6px 8px",r.style.cursor="pointer",r.textContent=n,r.addEventListener("mousedown",l=>{l.preventDefault(),u.value=n,a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}),p.appendChild(r)})}L(T);let e=-1;function c(){Array.from(p.children).forEach((n,o)=>{o===e?(n.style.background="rgba(0,123,255,0.1)",n.setAttribute("aria-selected","true")):(n.style.background="",n.removeAttribute("aria-selected"))})}function m(){p.style.display="block",d.setAttribute("aria-expanded","true")}function a(){p.style.display="none",d.setAttribute("aria-expanded","false"),e=-1,c()}function E(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?T.filter(o=>o.toLowerCase().includes(t)):T;L(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(L(T),m(),u.focus()):a()}),u.addEventListener("keydown",t=>{let n=Array.from(p.children);if(t.key==="ArrowDown"){if(t.preventDefault(),n.length===0)return;e=Math.min(e+1,n.length-1),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){if(t.preventDefault(),n.length===0)return;e=Math.max(e-1,0),c(),n[e].scrollIntoView({block:"nearest"})}else if(t.key==="Enter"){if(p.style.display!=="none"&&e>=0){t.preventDefault();let o=n[e];u.value=o.dataset.value||o.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{i.contains(t.target)||a()});let w={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(u.addEventListener("blur",()=>{let t=(u.value||"").trim();if(!t)return;let n=Object.keys(w).find(o=>o.toLowerCase()===t.toLowerCase());n&&(u.value=w[n])}),s.description){let t=document.createElement("div");t.className="voc-form-timezone-description",C&&t.classList.add("form-text"),t.textContent=s.description,h.appendChild(t)}return i.appendChild(u),i.appendChild(d),i.appendChild(p),h.appendChild(i),h}function Q(s,N,v){let C=N?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let y=s.name||s.key||`tags_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("div");u.className="voc-form-tags-container",u.style.display="flex",u.style.flexWrap="wrap",u.style.gap="6px",u.style.alignItems="center",u.style.padding="6px",u.style.border="1px solid rgba(0,0,0,0.12)",u.style.borderRadius="4px";let i=document.createElement("input");i.type="text",i.className="voc-form-tags-input",i.style.border="none",i.style.flex="1 0 120px",i.style.minWidth="80px",i.style.outline="none",i.placeholder=s.placeholder||"",C&&i.classList.add("form-control"),u.appendChild(i);let d=[],p=document.createElement("input");p.type="text",p.style.position="absolute",p.style.left="-9999px",p.style.width="1px",p.style.height="1px",p.tabIndex=-1,s.required&&(p.required=!0),h.appendChild(p);function g(){Array.from(h.querySelectorAll("input.voc-form-tag-hidden")).forEach(m=>m.parentElement?.removeChild(m)),d.forEach(m=>{let a=document.createElement("input");a.type="hidden",a.name=`${y}[]`,a.className="voc-form-tag-hidden",a.value=m,s.key&&(a.id=`voc-form-${s.key}`),h.appendChild(a)}),s.required&&(d.length===0?(p.value="",p.setCustomValidity("Please enter at least one tag")):(p.value="1",p.setCustomValidity("")))}function T(c){let m=document.createElement("span");m.className="voc-form-tag",m.style.display="inline-flex",m.style.alignItems="center",m.style.padding="4px 8px",m.style.background="rgba(0,0,0,0.05)",m.style.borderRadius="16px";let a=document.createElement("span");a.textContent=c,a.style.marginRight="8px",m.appendChild(a);let E=document.createElement("button");return E.type="button",E.textContent="\xD7",E.style.border="none",E.style.background="transparent",E.style.cursor="pointer",E.addEventListener("click",()=>{let w=d.indexOf(c);w>=0&&(d.splice(w,1),u.removeChild(m),g())}),m.appendChild(E),m}function L(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=T(m);u.insertBefore(a,i),g()}let e=v!=null?String(v):s.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(L),i.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),L(i.value),i.value="";else if(c.key==="Backspace"&&i.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),E=a[a.length-1];E&&u.removeChild(E),g()}}),i.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(L),i.value="")}),h.getTags=()=>d.slice(),h.addTag=L,h.appendChild(u),g(),h}function j(s,N=!0){let v=new FormData(s);if(N)return ae(v);let C={};return v.forEach((h,y)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(C,y)?Array.isArray(C[y])?C[y].push(u):C[y]=[C[y],u]:C[y]=u}),C}function ae(s){let N=new FormData;for(let[v,C]of s.entries()){if(C instanceof File){N.append(v,C);continue}let h;try{h=JSON.parse(C)}catch{h=null}Array.isArray(h)?h.length===0?N.append(v,"[]"):h.every(y=>typeof y=="object"&&y!==null)?h.forEach((y,u)=>{for(let[i,d]of Object.entries(y))N.append(`${v}[${u}][${i}]`,d)}):N.append(v,C):N.append(v,C)}return N}async function X(s,N,v){let C=N.url,h={"Content-Type":"application/json"};N?.api_token&&(h.Authorization=`Bearer ${N.api_token}`);let y=j(s);if(N?.additional_data)for(let[d,p]of Object.entries(N.additional_data))y.append(d,p);let u,i=y instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${N.api_token}`,...i?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:i?y:JSON.stringify(Object.fromEntries(y.entries()))};try{fetch(C,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let T=(await d.json())?.message;throw new Error(T??"Their was an error submitting the form. Check your form and try again.")}catch(g){throw new Error(g.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{v&&v(d,null)}).catch(d=>{v&&v(null,d)})}catch(d){v&&v(null,d)}}function Z(s,N,v){let C=[];if(typeof s=="string"?C=Array.from(document.querySelectorAll(s)):C=[s],C.length===0)return null;function h(){let i=v?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),i&&d.classList.add("needs-validation"),d.id=N.id;let p=document.createElement("h2");p.className="voc-form-title",i&&p.classList.add("mb-3"),p.textContent=N.form_name,d.appendChild(p);function g(e,c){c&&(c.min_length!==void 0&&(e.minLength=c.min_length),c.max_length!==void 0&&(e.maxLength=c.max_length),c.regex&&(e instanceof HTMLInputElement?e.pattern=c.regex:e.dataset.pattern=c.regex))}function T(e){if(!e.key&&!e.label)return null;let c=N.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,E=document.createElement("div");if(E.className="voc-form-group",i&&E.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),i&&t.classList.add("form-label"),e.key?e.type==="radio"?t.htmlFor="":t.htmlFor=`voc-form-${e.key}`:t.htmlFor="",t.textContent=e.label,e.required){let n=document.createElement("span");n.className="voc-form-required",n.textContent="*",t.appendChild(n)}E.appendChild(t)}let w=null;switch(e.type){case"tags":{w=Q(e,v||{},a);break}case"checkbox":{let t=document.createElement("div");if(t.className="voc-form-checkbox-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options){if(e.options.forEach((n,o)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),i&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let l=document.createElement("input");l.type="checkbox",l.classList.add("voc-form-checkbox"),i&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),r.appendChild(l),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),o=()=>{let r=Array.from(n).some(l=>l.checked);return n.forEach(l=>{r?l.setCustomValidity(""):l.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",o)}),t._validateCheckboxGroup=o,o()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),i&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),(e.key||e.name)&&(o.name=e.name||e.key,e.key&&(o.id=`voc-form-${e.key}`)),i&&o.classList.add("form-check-input"),e.required&&(o.required=!0),a!==void 0?o.checked=!!a:e.default&&(o.checked=!!e.default),n.appendChild(o),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}w=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default));let n=e.default||a||"";if(n){let o=(n.match(/\n/g)||[]).length,r=80,l=n.split(`
2
+ `).reduce((M,$)=>Math.max(M,$.length),0),A=Math.ceil(l/r)||1,S=Math.max(2,o+A);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),i&&t.classList.add("form-select"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder){let n=document.createElement("option");n.value="",n.textContent=e.placeholder,n.disabled=!0,n.selected=!0,t.appendChild(n)}e.required&&(t.required=!0),e.options&&e.options.forEach(n=>{let o=document.createElement("option");o.value=n.value,o.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(o.selected=!0):a!==void 0?a===n.value&&(o.selected=!0):e.default===n.value&&(o.selected=!0),t.appendChild(o)}),e.width&&(t.style.width=e.width),w=t;break}case"radio":{let t=document.createElement("div");t.className="voc-form-radio-group "+(e.direction||"vertical"),e.width&&(t.style.width=e.width),e.options&&e.options.forEach((n,o)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),i&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let l=document.createElement("input");l.type="radio",l.classList.add("voc-form-radio"),i&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${o}`),Array.isArray(a)?a.includes(n.value)&&(l.checked=!0):a!==void 0?a===n.value&&(l.checked=!0):e.default===n.value&&(l.checked=!0),r.appendChild(l),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),w=t;break}case"file":{let t=document.createElement("div");t.className="voc-form-file-wrapper",e.width&&(t.style.width=e.width);let n=document.createElement("input");n.type="file",n.classList.add("voc-form-file"),i&&n.classList.add("form-control"),(e.key||e.name)&&(n.name=e.name||e.key,e.key&&(n.id=`voc-form-${e.key}`)),e.width&&(n.style.width=e.width),e.required&&(n.required=!0),e.accept&&(n.accept=e.accept),e.multiple&&(n.multiple=!0),t.appendChild(n),w=t;break}case"avatar":{w=V(e,v||{},a);break}case"table":{w=J(e,v||{},a);break}case"users":{w=Y(e,v||{},a);break}case"timezone":{w=K(e,v||{},a);break}case"audio_select":{w=U(e,v||{},a);break}case"field-select":{let t=v?.style==="bootstrap",n=document.createElement("div");n.className="voc-form-field-selects";let o=document.createElement("div");if(o.className="voc-form-field-selects-header",t&&o.classList.add("mb-2"),e.label){let x=document.createElement("div");if(x.className="voc-form-field-selects-label",t&&x.classList.add("form-label"),x.textContent=e.label,e.required){let b=document.createElement("span");b.className="voc-form-required",b.textContent="*",x.appendChild(b)}o.appendChild(x)}if(e.description){let x=document.createElement("div");x.className="voc-form-field-selects-description",t&&x.classList.add("form-text"),x.textContent=e.description,o.appendChild(x)}n.appendChild(o);let r=document.createElement("div");r.className="voc-form-field-selects-search-wrapper";let l=document.createElement("input");if(l.type="search",l.placeholder="Search...",l.className="voc-form-field-selects-search",t&&l.classList.add("form-control","mb-2"),r.appendChild(l),n.appendChild(r),!e.options||e.options.length===0)return n;let A=document.createElement("div");A.className="voc-form-field-selects-list",t&&A.classList.add("list-group");let S=document.createElement("div");S.className="voc-form-field-selects-selected",S.style.marginTop="12px";let M={},$=e.name||e.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(a)?f=a:a!=null?f=[a]:Array.isArray(e.default)&&(f=e.default),e.options.forEach((x,b)=>{let F=document.createElement("div");F.className="voc-form-field-selects-item",F.dataset.label=String(x.option_label??x.label??"").toLowerCase(),F.dataset.email=String(x.email||"").toLowerCase(),F.dataset.value=String(x.value||"").toLowerCase(),t&&F.classList.add("d-flex","align-items-center","gap-2");let k=document.createElement("input");if(k.type="checkbox",k.name=`${$}[]`,k.value=x.value??x.key,k.className="voc-form--checkbox",e.key&&(k.id=`voc-form-${e.key}-${b}`),k.style.position="absolute",k.style.width="1px",k.style.height="1px",k.style.margin="0",k.style.padding="0",k.style.clip="rect(0 0 0 0)",k.style.clipPath="inset(50%)",k.style.overflow="hidden",k.style.border="0",f&&Array.isArray(f)){let I=f.map(P=>String(P)),R=String(x.value??x.key);k.checked=I.includes(R)}let O=x.icon||'<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z"/></svg>',B=document.createElement("div");B.className="voc-form-fields-select-avatar",B.innerHTML=O;let H=document.createElement("div");H.className="voc-form-field-select-info",H.style.display="flex",H.style.flexDirection="column",H.style.gap="2px";let D=document.createElement("div");D.className="voc-form-field-select-label",D.textContent=(x.option_label??x.label)||String(x.value);let z=document.createElement("small");z.className="voc-form-field-select-email",z.textContent=x.email||"",H.appendChild(D),H.appendChild(z),F.addEventListener("click",I=>{let R=I.target;R&&(R.closest("input")||R.closest("a")||R.closest("button"))||(k.checked=!k.checked,k.dispatchEvent(new Event("change",{bubbles:!0})))}),k.addEventListener("change",()=>{if(k.checked){F.classList.add("selected"),(M[b]||[]).forEach(P=>P.parentElement?.removeChild(P)),M[b]=[];let R=x;if(R&&Array.isArray(R.items))R.items.forEach(P=>{let W=T(P);W&&(S.appendChild(W),M[b].push(W))});else if(R&&(R.type||R.key)){let P=T(R);P&&(S.appendChild(P),M[b].push(P))}}else F.classList.remove("selected"),(M[b]||[]).forEach(R=>R.parentElement?.removeChild(R)),M[b]=[]}),k.checked&&(F.classList.add("selected"),setTimeout(()=>{let I=x;if(I&&Array.isArray(I.items))I.items.forEach(R=>{let P=T(R);P&&(S.appendChild(P),M[b]=M[b]||[],M[b].push(P))});else if(I&&(I.type||I.key)){let R=T(I);R&&(S.appendChild(R),M[b]=M[b]||[],M[b].push(R))}},0)),F.appendChild(k),F.appendChild(B),F.appendChild(H),A.appendChild(F)}),n.appendChild(A),n.appendChild(S),e.required){let x=A.querySelectorAll('input[type="checkbox"]'),b=()=>{let F=Array.from(x).some(k=>k.checked);return x.forEach(k=>{F?k.setCustomValidity(""):k.setCustomValidity("At least one option must be selected.")}),F};x.forEach(F=>{F.addEventListener("change",b)}),n._validateCheckboxGroup=b,b()}let _=Array.from(A.querySelectorAll(".voc-form-field-select-item")),q=()=>{let x=String(l.value||"").trim().toLowerCase();if(!x){_.forEach(b=>b.style.setProperty("display","flex","important"));return}_.forEach(b=>{let F=b.dataset.label||"",k=b.dataset.email||"",O=b.dataset.value||"",B=F.includes(x)||k.includes(x)||O.includes(x);b.style.setProperty("display",B?"flex":"none","important")})};return l.addEventListener("input",q),n}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),i&&t.classList.add("form-control"),(e.key||e.name)&&(t.name=e.name||e.key,e.key&&(t.id=`voc-form-${e.key}`)),e.placeholder&&(t.placeholder=e.placeholder),a!=null?t.value=String(a):e.default!==void 0&&e.default!==null&&(t.value=String(e.default)),e.width&&(t.style.width=e.width),e.required&&(t.required=!0),g(t,e.validation),w=t;break}}if(w&&E.appendChild(w),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,E.appendChild(t)}return E}N.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(i){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let t=document.createElement("div");if(t.className="card-header voc-form-group-head",a){let n=document.createElement("h5");n.className="mb-0 voc-form-group-label",n.textContent=a,t.appendChild(n)}if(E){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=E,t.appendChild(n)}m.appendChild(t)}let w=document.createElement("div");w.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,o=document.createElement("div");if(o.className="voc-form-group voc-form-row mb-3",n.label){let l=document.createElement("h6");l.className="voc-form-row-label",l.textContent=n.label,o.appendChild(l)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let A=T(l);A&&r.appendChild(A)}),o.appendChild(r),w.appendChild(o)}else{let n=T(t);n&&w.appendChild(n)}}),m.appendChild(w),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",i&&m.classList.add("mb-3");let a=c.label||c.header?.title,E=c.description||c.header?.description;if(a||E){let w=document.createElement("div");if(w.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,w.appendChild(t)}if(E){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=E,w.appendChild(t)}m.appendChild(w)}c.items.forEach(w=>{if(w.type==="row"&&"items"in w){let t=w,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",i&&n.classList.add("mb-3"),t.label){let r=document.createElement("h4");r.className="voc-form-row-label",r.textContent=t.label,n.appendChild(r)}let o=document.createElement("div");o.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let l=T(r);l&&o.appendChild(l)}),n.appendChild(o),m.appendChild(n)}else{let t=T(w);t&&m.appendChild(t)}}),d.appendChild(m)}return}if(e.type==="row"&&"items"in e){let c=document.createElement("div");if(c.className="voc-form-group voc-form-row",i&&c.classList.add("mb-3"),e.label){let a=document.createElement("h3");a.className="voc-form-row-label",a.textContent=e.label,c.appendChild(a)}if(e.description){let a=document.createElement("p");a.className="voc-form-row-description",a.textContent=e.description,c.appendChild(a)}let m=document.createElement("div");m.className="voc-form-row-items "+(e.direction||"horizontal"),c.appendChild(m),e.items.forEach(a=>{let E=T(a);E&&m.appendChild(E)}),d.appendChild(c)}else{let c=T(e);c&&d.appendChild(c)}});let L=document.createElement("button");return L.type="submit",L.className="voc-form-submit",L.textContent="Submit",i&&L.classList.add("btn","btn-primary"),d.appendChild(L),d}let y=h();C[0].appendChild(y);let u=N?.submit_config??v?.submit_config??null;return u&&y.addEventListener("submit",i=>{i.preventDefault();let d=Array.from(y.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(L=>{L&&typeof L._validateCheckboxGroup=="function"&&(L._validateCheckboxGroup()||L.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!y.checkValidity()){y.reportValidity(),v?.onSubmitResult&&v.onSubmitResult(null,new Error("Form validation failed"));return}let g=Array.from(y.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),T=[];if(g.forEach(L=>{if(L&&typeof L.validate=="function"){let e=L.validate();e&&e.length&&T.push(...e)}}),T.length){v?.onSubmitResult&&v.onSubmitResult(null,new Error(T.join("; ")));let L=g[0];L&&L.scrollIntoView({behavior:"smooth",block:"center"});return}if(v?.onSubmit){let L=j(y);v.onSubmit(L)}X(y,u,(L,e)=>{v?.onSubmitResult&&v.onSubmitResult(L,e)})}),{element:y,validate:()=>{let i=[];return y.querySelectorAll(":invalid").forEach(p=>{let g=p.validationMessage;i.push({element:p,message:g})}),i},getValues:()=>j(y),onSubmit:i=>{y.addEventListener("submit",d=>{d.preventDefault();let p=j(y);i(p,d)})}}}var G={renderForm:Z};var we=G,xe={FormsLib:G};export{we as FormsLib,xe as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "voc-lib-js",
3
- "version": "1.0.64",
3
+ "version": "1.0.65",
4
4
  "description": "A JavaScript library for VocPhone",
5
5
  "main": "./dist/main.cjs",
6
6
  "module": "./dist/main.mjs",