voc-lib-js 1.0.60 → 1.0.62
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.global.js +2 -2
- package/dist/main.js +2 -2
- package/dist/main.mjs +2 -2
- package/package.json +1 -1
package/dist/main.global.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var VocLibJs=(()=>{var P=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var te=(r,E)=>{for(var m in E)P(r,m,{get:E[m],enumerable:!0})},ae=(r,E,m,y)=>{if(E&&typeof E=="object"||typeof E=="function")for(let l of Z(E))!ee.call(r,l)&&l!==m&&P(r,l,{get:()=>E[l],enumerable:!(y=X(E,l))||y.enumerable});return r};var ne=r=>ae(P({},"__esModule",{value:!0}),r);var le={};te(le,{FormsLib:()=>ie,default:()=>ce});function j(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-avatar-wrapper",y&&l.classList.add("d-flex","align-items-center","gap-3");let u=document.createElement("img");u.className="voc-form-avatar-preview",u.alt=r.label||"avatar",y&&(u.classList.add("img-thumbnail","rounded-circle"),u.style.width=u.style.height="64px",u.style.objectFit="cover");let v=m!=null?String(m):r.default!==void 0&&r.default!==null?String(r.default):"";v?u.src=v:(u.src="",u.style.display="none");let c=document.createElement("input");c.type="file",c.accept=r.accept||"image/*",c.className="voc-form-avatar-input",y&&c.classList.add("form-control"),(r.key||r.name)&&(c.name=r.name||r.key,r.key&&(c.id=`voc-form-${r.key}`));let h=document.createElement("input");if(h.type="hidden",(r.key||r.name)&&(h.name=(r.name||r.key)+"_url"),h.value=v||"",c.addEventListener("change",L=>{let f=L.target;if(f.files&&f.files.length>0){let w=f.files[0],g=new FileReader;g.onload=()=>{u.src=String(g.result),u.style.display="",h.value=""},g.readAsDataURL(w)}}),y){let L=document.createElement("div");L.style.flex="1",L.appendChild(c),L.appendChild(h),l.appendChild(u),l.appendChild(L)}else l.appendChild(u),l.appendChild(c),l.appendChild(h);return l}function W(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");if(l.className="voc-form-audio-select",!r.options||r.options.length===0)return l;let u=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,v;return Array.isArray(m)?v=m[0]:m!==void 0?v=m:r.default!==void 0&&(v=r.default),r.options.forEach((c,h)=>{let L=document.createElement("div");L.className="voc-form-audio-item",y&&L.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=u,f.value=c.value,f.className="voc-form-audio-radio",r.key&&(f.id=`voc-form-${r.key}-${h}`),r.required&&h===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",v!==void 0&&(Array.isArray(v)?f.checked=v.includes(c.value):f.checked=String(v)===String(c.value));let w=()=>{f.checked?L.classList.add("selected"):L.classList.remove("selected")};f.addEventListener("change",()=>{l.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),w()}),f.checked&&L.classList.add("selected");let g=document.createElement("label");g.className="voc-form-audio-label",y&&g.classList.add("form-check-label"),g.htmlFor=f.id||"",g.textContent=c.label||c.value,g.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let d=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",y&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),i.appendChild(s),t.appendChild(i),d=document.createElement("audio"),d.src=c.audio_link,d.preload="none",d.style.display="none";let o=p=>{for(;p.firstChild;)p.removeChild(p.firstChild)},A=()=>{let p="http://www.w3.org/2000/svg",F=document.createElementNS(p,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(p,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},N=()=>{let p="http://www.w3.org/2000/svg",F=document.createElementNS(p,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(p,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};o(t),t.appendChild(A());let _=p=>{o(t),p?(t.appendChild(N()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(A()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!d)return;let p=l.querySelectorAll("audio");if(!d.paused&&!d.ended){d.pause(),d.currentTime=0;return}p.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),l.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),d.play()}catch(p){console.warn("audio play failed",p)}}),d.addEventListener("playing",()=>{L.classList.add("is-playing"),_(!0)});let H=()=>{L.classList.remove("is-playing"),_(!1)};d.addEventListener("pause",H),d.addEventListener("ended",H),e.appendChild(t),e.appendChild(d)}let b=document.createElement("div");b.className="voc-form-item-detail",b.style.display="flex",b.style.flexDirection="column",b.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(f),a.appendChild(g);let C=document.createElement("div");C.className="voc-form-item-description";let k=c.description||c.hint_text||"";k&&(C.textContent=k),b.appendChild(a),b.appendChild(C),e.appendChild(b),L.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),L.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),l.appendChild(L)}),l}function G(r,E,m){let y=document.createElement("div");y.className="voc-form-table-wrapper";let l=E?.style==="bootstrap",u=document.createElement("input");u.type="hidden",u.name=r.name||r.key,r.key&&(u.id=`voc-form-${r.key}`),y.appendChild(u);let v=document.createElement("table");v.className="voc-form-table",l&&v.classList.add("table","table-bordered");let c=document.createElement("thead"),h=document.createElement("tr"),L=document.createElement("th");L.className="voc-form-table-drag-col",L.textContent="",h.appendChild(L),(r.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,h.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",h.appendChild(f),c.appendChild(h),v.appendChild(c);let w=document.createElement("tbody");v.appendChild(w),y.appendChild(v);let g=document.createElement("button");g.type="button",g.className="voc-form-table-add",l&&g.classList.add("btn","btn-secondary"),g.textContent="+Add";let e=document.createElement("tfoot"),d=document.createElement("tr"),b=document.createElement("td");b.colSpan=(r.fields?r.fields.length:0)+1,b.appendChild(g),d.appendChild(b),e.appendChild(d),v.appendChild(e),y.appendChild(v);let a=[];function C(){u.value=JSON.stringify(a)}function k(n){let i=[];return r.fields.forEach(s=>{let o=n[s.key];if(s.type==="checkbox"){let A=Array.isArray(o)?o:o?[o]:[];s.required&&A.length===0&&i.push(`${s.label||s.key} is required`);return}s.required&&(o==null||String(o).trim()==="")&&i.push(`${s.label||s.key} is required`),s.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&o&&isNaN(Number(o))&&i.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&o&&(new RegExp(s.validation.regex).test(String(o))||i.push(`${s.label||s.key} invalid format`))}),i}function t(){w.innerHTML="";let n=(i,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",o=>{let A=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(A)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{i.classList.remove("dragging"),s.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let A=o.currentTarget,N=A.getBoundingClientRect(),_=N.top+N.height/2,H=(o.clientY||o.y)>_;A.classList.remove("drag-over-top","drag-over-bottom"),H?(A.classList.add("drag-over-bottom"),A.dataset.dropPosition="after"):(A.classList.add("drag-over-top"),A.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let A=o.currentTarget;A.classList.remove("drag-over-top","drag-over-bottom"),delete A.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let A=o.dataTransfer.getData("text/plain"),N=Number(o.currentTarget.dataset.rowIndex),_=Number(A),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(_)||isNaN(N))return;let[p]=a.splice(_,1),F=N;_<N&&(F=N-1);let T=H==="after"?F+1:F;a.splice(T,0,p),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),C()})};a.forEach((i,s)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(s),o.classList.add("voc-form-table-row");let A=document.createElement("td");A.className="voc-form-table-drag-handle";let N=document.createElement("span");N.className="voc-form-drag-handle-icon",N.textContent="\u2630",N.style.cursor="grab",A.appendChild(N),o.appendChild(A),n(o,N),r.fields.forEach(p=>{let F=document.createElement("td"),T,q=(p.type||"text").toLowerCase();if(q==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",l&&x.classList.add("form-control"),p.placeholder){let S=document.createElement("option");S.value="",S.textContent=p.placeholder,S.disabled=!0,(i[p.key]===void 0||i[p.key]===null||i[p.key]==="")&&(S.selected=!0),x.appendChild(S)}(p.options||[]).forEach(S=>{let B=document.createElement("option");B.value=S.value,B.textContent=S.label,x.appendChild(B)}),x.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.required&&(x.required=!0),x.addEventListener("change",S=>{a[s][p.key]=S.target.value,C()}),T=x}else if(q==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",l&&x.classList.add("form-check");let D=p.options||[];Array.isArray(a[s][p.key])||(a[s][p.key]=a[s][p.key]?[a[s][p.key]]:[]),D.forEach(S=>{let B=`voc-form-${r.key}-${p.key}-${s}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-checkbox-item",l&&R.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",l&&M.classList.add("form-check-input"),M.id=B,M.value=S.value,M.checked=Array.isArray(a[s][p.key])&&a[s][p.key].includes(S.value),M.addEventListener("change",O=>{let Y=O.target.checked;Array.isArray(a[s][p.key])||(a[s][p.key]=[]),Y?a[s][p.key].includes(S.value)||a[s][p.key].push(S.value):a[s][p.key]=a[s][p.key].filter(Q=>Q!==S.value),C()});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-checkbox-label",l&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else if(q==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",l&&x.classList.add("form-check");let D=p.options||[];a[s][p.key]===void 0&&(a[s][p.key]=""),D.forEach(S=>{let B=`voc-form-${r.key}-${p.key}-${s}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-radio-item",l&&R.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",l&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${r.key}-${p.key}-${s}`,M.value=S.value,M.checked=a[s][p.key]===S.value,M.addEventListener("change",O=>{O.target.checked&&(a[s][p.key]=O.target.value,C())});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-radio-label",l&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else{let x=document.createElement("input");q==="number"?x.type="number":q==="email"?x.type="email":q==="tel"?x.type="tel":q==="url"?x.type="url":q==="date"?x.type="date":x.type="text",x.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.placeholder&&(x.placeholder=p.placeholder),p.required&&(x.required=!0),x.className="voc-form-table-cell",l&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[s][p.key]=D.target.value,C()}),T=x}F.appendChild(T),o.appendChild(F)});let _=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",l&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(s,1),t(),C()}),_.appendChild(H),o.appendChild(_),w.appendChild(o)})}return g.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(i=>n[i.key]=""),a.push(n),t(),C()}),Array.isArray(m)&&m.length?a=m.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),C(),y.validate=function(){let n=[];return a.forEach((i,s)=>{let o=k(i);o.length&&n.push(`Row ${s+1}: ${o.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(i=>{let s=new Set;a.forEach((o,A)=>{let N=o[i];N!=null&&(s.has(N)&&n.push(`Field ${i} must be unique (duplicate at row ${A+1})`),s.add(N))})}),n},y}async function re(r){let m=new TextEncoder().encode(r),y=await crypto.subtle.digest("SHA-256",m);return Array.from(new Uint8Array(y)).map(u=>u.toString(16).padStart(2,"0")).join("")}async function se(r){let E=String(r||"").trim().toLowerCase();return E?`https://gravatar.com/avatar/${await re(E)}?d=mp`:""}function U(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-users";let u=document.createElement("div");if(u.className="voc-form-users-header",y&&u.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",y&&e.classList.add("form-label"),e.textContent=r.label,r.required){let d=document.createElement("span");d.className="voc-form-required",d.textContent="*",e.appendChild(d)}u.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",y&&e.classList.add("form-text"),e.textContent=r.description,u.appendChild(e)}l.appendChild(u);let v=document.createElement("div");v.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",y&&c.classList.add("form-control","mb-2"),v.appendChild(c),l.appendChild(v),!r.options||r.options.length===0)return l;let h=document.createElement("div");h.className="voc-form-users-list",y&&h.classList.add("list-group");let L=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(m)?f=m:m!=null?f=[m]:Array.isArray(r.default)&&(f=r.default),r.options.forEach((e,d)=>{let b=document.createElement("div");b.className="voc-form-user-item",b.dataset.label=String(e.label||"").toLowerCase(),b.dataset.email=String(e.email||"").toLowerCase(),b.dataset.value=String(e.value||"").toLowerCase(),y&&b.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${L}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${d}`),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",f&&Array.isArray(f)){let i=f.map(s=>String(s));a.checked=i.includes(String(e.value))}let C=document.createElement("img");C.className="voc-form-user-avatar",C.alt=e.label||String(e.value||"user"),C.style.width=C.style.height="40px",C.style.objectFit="cover",C.style.borderRadius="50%",C.src="",e.email&&se(e.email).then(i=>{i&&(C.src=i)}).catch(()=>{});let k=document.createElement("div");k.className="voc-form-user-info",k.style.display="flex",k.style.flexDirection="column",k.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||"",k.appendChild(t),k.appendChild(n),b.addEventListener("click",i=>{let s=i.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?b.classList.add("selected"):b.classList.remove("selected")}),a.checked&&b.classList.add("selected"),b.appendChild(a),b.appendChild(C),b.appendChild(k),h.appendChild(b)}),l.appendChild(h),r.required){let e=h.querySelectorAll('input[type="checkbox"]'),d=()=>{let b=Array.from(e).some(a=>a.checked);return e.forEach(a=>{b?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),b};e.forEach(b=>{b.addEventListener("change",d)}),l._validateCheckboxGroup=d,d()}let w=Array.from(h.querySelectorAll(".voc-form-user-item")),g=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){w.forEach(d=>d.style.setProperty("display","flex","important"));return}w.forEach(d=>{let b=d.dataset.label||"",a=d.dataset.email||"",C=d.dataset.value||"",k=b.includes(e)||a.includes(e)||C.includes(e);d.style.setProperty("display",k?"flex":"none","important")})};return c.addEventListener("input",g),l}function V(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-timezone";let u=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,v=document.createElement("input");v.type="text",v.name=u,r.key&&(v.id=`voc-form-${r.key}`),v.className="voc-form-timezone-input",y&&v.classList.add("form-control"),r.placeholder&&(v.placeholder=r.placeholder||""),r.required&&(v.required=!0),r.width&&(v.style.width=r.width),m!=null?v.value=String(m):r.default!==void 0&&r.default!==null&&(v.value=String(r.default));let c=document.createElement("datalist");c.id=`voc-form-timezone-list-${r.key||Math.random().toString(36).substr(2,6)}`,v.setAttribute("list",c.id),["UTC","Etc/UTC","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"].forEach(w=>{let g=document.createElement("option");g.value=w,c.appendChild(g)});let f={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(v.addEventListener("blur",()=>{let w=(v.value||"").trim();if(!w)return;let g=Object.keys(f).find(e=>e.toLowerCase()===w.toLowerCase());g&&(v.value=f[g])}),r.description){let w=document.createElement("div");w.className="voc-form-timezone-description",y&&w.classList.add("form-text"),w.textContent=r.description,l.appendChild(w)}return l.appendChild(v),l.appendChild(c),l}function I(r,E=!0){let m=new FormData(r);if(E)return oe(m);let y={};return m.forEach((l,u)=>{let v=(l instanceof File,l);Object.prototype.hasOwnProperty.call(y,u)?Array.isArray(y[u])?y[u].push(v):y[u]=[y[u],v]:y[u]=v}),y}function oe(r){let E=new FormData;for(let[m,y]of r.entries()){if(y instanceof File){E.append(m,y);continue}let l;try{l=JSON.parse(y)}catch{l=null}Array.isArray(l)?l.length===0?E.append(m,"[]"):l.every(u=>typeof u=="object"&&u!==null)?l.forEach((u,v)=>{for(let[c,h]of Object.entries(u))E.append(`${m}[${v}][${c}]`,h)}):E.append(m,y):E.append(m,y)}return E}async function J(r,E,m){let y=E.url,l={"Content-Type":"application/json"};E?.api_token&&(l.Authorization=`Bearer ${E.api_token}`);let u=I(r);if(E?.additional_data)for(let[h,L]of Object.entries(E.additional_data))u.append(h,L);let v,c=u instanceof FormData;v={method:"POST",headers:{Authorization:`Bearer ${E.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?u:JSON.stringify(Object.fromEntries(u.entries()))};try{fetch(y,v).then(async h=>{let L=h.headers.get("content-type");if(!h.ok)try{let w=(await h.json())?.message;throw new Error(w??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return L&&L.includes("application/json")?h.json():h.text()}).then(h=>{m&&m(h,null)}).catch(h=>{m&&m(null,h)})}catch(h){m&&m(null,h)}}function K(r,E,m){let y=[];if(typeof r=="string"?y=Array.from(document.querySelectorAll(r)):y=[r],y.length===0)return null;function l(){let c=m?.style==="bootstrap",h=document.createElement("form");h.classList.add("voc-form"),c&&h.classList.add("needs-validation"),h.id=E.id;let L=document.createElement("h2");L.className="voc-form-title",c&&L.classList.add("mb-3"),L.textContent=E.form_name,h.appendChild(L);function f(e,d){d&&(d.min_length!==void 0&&(e.minLength=d.min_length),d.max_length!==void 0&&(e.maxLength=d.max_length),d.regex&&(e instanceof HTMLInputElement?e.pattern=d.regex:e.dataset.pattern=d.regex))}function w(e){if(!e.key&&!e.label)return null;let d=E.default_values||{},b=e.name||e.key,a=b?d[b]:void 0,C=document.createElement("div");if(C.className="voc-form-group",c&&C.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&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)}C.appendChild(t)}let k=null;switch(e.type){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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),c&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),s.appendChild(o),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let s=Array.from(n).some(o=>o.checked);return n.forEach(o=>{s?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}k=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&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 i=(n.match(/\n/g)||[]).length,s=80,o=n.split(`
|
|
2
|
-
`).reduce((
|
|
1
|
+
"use strict";var VocLibJs=(()=>{var P=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var ae=(r,L)=>{for(var f in L)P(r,f,{get:L[f],enumerable:!0})},ne=(r,L,f,E)=>{if(L&&typeof L=="object"||typeof L=="function")for(let h of ee(L))!te.call(r,h)&&h!==f&&P(r,h,{get:()=>L[h],enumerable:!(E=Z(L,h))||E.enumerable});return r};var re=r=>ne(P({},"__esModule",{value:!0}),r);var de={};ae(de,{FormsLib:()=>ce,default:()=>le});function j(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",E&&h.classList.add("d-flex","align-items-center","gap-3");let y=document.createElement("img");y.className="voc-form-avatar-preview",y.alt=r.label||"avatar",E&&(y.classList.add("img-thumbnail","rounded-circle"),y.style.width=y.style.height="64px",y.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?y.src=u:(y.src="",y.style.display="none");let o=document.createElement("input");o.type="file",o.accept=r.accept||"image/*",o.className="voc-form-avatar-input",E&&o.classList.add("form-control"),(r.key||r.name)&&(o.name=r.name||r.key,r.key&&(o.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||"",o.addEventListener("change",p=>{let b=p.target;if(b.files&&b.files.length>0){let A=b.files[0],k=new FileReader;k.onload=()=>{y.src=String(k.result),y.style.display="",d.value=""},k.readAsDataURL(A)}}),E){let p=document.createElement("div");p.style.flex="1",p.appendChild(o),p.appendChild(d),h.appendChild(y),h.appendChild(p)}else h.appendChild(y),h.appendChild(o),h.appendChild(d);return h}function W(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let y=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((o,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",E&&p.classList.add("form-check");let b=document.createElement("input");b.type="radio",b.name=y,b.value=o.value,b.className="voc-form-audio-radio",r.key&&(b.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(b.required=!0),b.style.position="absolute",b.style.width="1px",b.style.height="1px",b.style.margin="0",b.style.padding="0",b.style.clip="rect(0 0 0 0)",b.style.clipPath="inset(50%)",b.style.overflow="hidden",b.style.border="0",u!==void 0&&(Array.isArray(u)?b.checked=u.includes(o.value):b.checked=String(u)===String(o.value));let A=()=>{b.checked?p.classList.add("selected"):p.classList.remove("selected")};b.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),b.checked&&p.classList.add("selected");let k=document.createElement("label");k.className="voc-form-audio-label",E&&k.classList.add("form-check-label"),k.htmlFor=b.id||"",k.textContent=o.label||o.value,k.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(o.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",E&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${o.label||o.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),i.appendChild(s),t.appendChild(i),c=document.createElement("audio"),c.src=o.audio_link,c.preload="none",c.style.display="none";let l=v=>{for(;v.firstChild;)v.removeChild(v.firstChild)},w=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},S=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};l(t),t.appendChild(w());let R=v=>{l(t),v?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${o.label||o.value}`)):(t.appendChild(w()),t.setAttribute("aria-label",`Play ${o.label||o.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let v=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}v.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),c.play()}catch(v){console.warn("audio play failed",v)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),R(!0)});let H=()=>{p.classList.remove("is-playing"),R(!1)};c.addEventListener("pause",H),c.addEventListener("ended",H),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(b),a.appendChild(k);let g=document.createElement("div");g.className="voc-form-item-description";let C=o.description||o.hint_text||"";C&&(g.textContent=C),m.appendChild(a),m.appendChild(g),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function G(r,L,f){let E=document.createElement("div");E.className="voc-form-table-wrapper";let h=L?.style==="bootstrap",y=document.createElement("input");y.type="hidden",y.name=r.name||r.key,r.key&&(y.id=`voc-form-${r.key}`),E.appendChild(y);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let o=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 i=document.createElement("th");i.textContent=n.label||n.key,d.appendChild(i)});let b=document.createElement("th");b.textContent="Actions",d.appendChild(b),o.appendChild(d),u.appendChild(o);let A=document.createElement("tbody");u.appendChild(A),E.appendChild(u);let k=document.createElement("button");k.type="button",k.className="voc-form-table-add",h&&k.classList.add("btn","btn-secondary"),k.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(k),c.appendChild(m),e.appendChild(c),u.appendChild(e),E.appendChild(u);let a=[];function g(){y.value=JSON.stringify(a)}function C(n){let i=[];return r.fields.forEach(s=>{let l=n[s.key];if(s.type==="checkbox"){let w=Array.isArray(l)?l:l?[l]:[];s.required&&w.length===0&&i.push(`${s.label||s.key} is required`);return}s.required&&(l==null||String(l).trim()==="")&&i.push(`${s.label||s.key} is required`),s.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||i.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&l&&isNaN(Number(l))&&i.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&l&&(new RegExp(s.validation.regex).test(String(l))||i.push(`${s.label||s.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",l=>{let w=Number(i.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(w)),i.classList.add("dragging");try{l.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{i.classList.remove("dragging"),s.style.cursor="grab"}),i.addEventListener("dragover",l=>{l.preventDefault();let w=l.currentTarget,S=w.getBoundingClientRect(),R=S.top+S.height/2,H=(l.clientY||l.y)>R;w.classList.remove("drag-over-top","drag-over-bottom"),H?(w.classList.add("drag-over-bottom"),w.dataset.dropPosition="after"):(w.classList.add("drag-over-top"),w.dataset.dropPosition="before")}),i.addEventListener("dragleave",l=>{let w=l.currentTarget;w.classList.remove("drag-over-top","drag-over-bottom"),delete w.dataset.dropPosition}),i.addEventListener("drop",l=>{l.preventDefault();let w=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),R=Number(w),H=l.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[v]=a.splice(R,1),F=S;R<S&&(F=S-1);let T=H==="after"?F+1:F;a.splice(T,0,v),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,s)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(s),l.classList.add("voc-form-table-row");let w=document.createElement("td");w.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",w.appendChild(S),l.appendChild(w),n(l,S),r.fields.forEach(v=>{let F=document.createElement("td"),T,$=(v.type||"text").toLowerCase();if($==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",h&&x.classList.add("form-control"),v.placeholder){let N=document.createElement("option");N.value="",N.textContent=v.placeholder,N.disabled=!0,(i[v.key]===void 0||i[v.key]===null||i[v.key]==="")&&(N.selected=!0),x.appendChild(N)}(v.options||[]).forEach(N=>{let B=document.createElement("option");B.value=N.value,B.textContent=N.label,x.appendChild(B)}),x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.required&&(x.required=!0),x.addEventListener("change",N=>{a[s][v.key]=N.target.value,g()}),T=x}else if($==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",h&&x.classList.add("form-check");let D=v.options||[];Array.isArray(a[s][v.key])||(a[s][v.key]=a[s][v.key]?[a[s][v.key]]:[]),D.forEach(N=>{let B=`voc-form-${r.key}-${v.key}-${s}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-checkbox-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.value=N.value,M.checked=Array.isArray(a[s][v.key])&&a[s][v.key].includes(N.value),M.addEventListener("change",O=>{let Q=O.target.checked;Array.isArray(a[s][v.key])||(a[s][v.key]=[]),Q?a[s][v.key].includes(N.value)||a[s][v.key].push(N.value):a[s][v.key]=a[s][v.key].filter(X=>X!==N.value),g()});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-checkbox-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else if($==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",h&&x.classList.add("form-check");let D=v.options||[];a[s][v.key]===void 0&&(a[s][v.key]=""),D.forEach(N=>{let B=`voc-form-${r.key}-${v.key}-${s}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-radio-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${r.key}-${v.key}-${s}`,M.value=N.value,M.checked=a[s][v.key]===N.value,M.addEventListener("change",O=>{O.target.checked&&(a[s][v.key]=O.target.value,g())});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-radio-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else{let x=document.createElement("input");$==="number"?x.type="number":$==="email"?x.type="email":$==="tel"?x.type="tel":$==="url"?x.type="url":$==="date"?x.type="date":x.type="text",x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.placeholder&&(x.placeholder=v.placeholder),v.required&&(x.required=!0),x.className="voc-form-table-cell",h&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[s][v.key]=D.target.value,g()}),T=x}F.appendChild(T),l.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",h&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(s,1),t(),g()}),R.appendChild(H),l.appendChild(R),A.appendChild(l)})}return k.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),g(),E.validate=function(){let n=[];return a.forEach((i,s)=>{let l=C(i);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(i=>{let s=new Set;a.forEach((l,w)=>{let S=l[i];S!=null&&(s.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${w+1})`),s.add(S))})}),n},E}async function se(r){let f=new TextEncoder().encode(r),E=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(E)).map(y=>y.toString(16).padStart(2,"0")).join("")}async function oe(r){let L=String(r||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await se(L)}?d=mp`:""}function V(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let y=document.createElement("div");if(y.className="voc-form-users-header",E&&y.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",E&&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)}y.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",E&&e.classList.add("form-text"),e.textContent=r.description,y.appendChild(e)}h.appendChild(y);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let o=document.createElement("input");if(o.type="search",o.placeholder="Search users...",o.className="voc-form-users-search",E&&o.classList.add("form-control","mb-2"),u.appendChild(o),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",E&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,b=[];if(Array.isArray(f)?b=f:f!=null?b=[f]:Array.isArray(r.default)&&(b=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(),E&&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",b&&Array.isArray(b)){let i=b.map(s=>String(s));a.checked=i.includes(String(e.value))}let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&oe(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let C=document.createElement("div");C.className="voc-form-user-info",C.style.display="flex",C.style.flexDirection="column",C.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||"",C.appendChild(t),C.appendChild(n),m.addEventListener("click",i=>{let s=i.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(g),m.appendChild(C),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 A=Array.from(d.querySelectorAll(".voc-form-user-item")),k=()=>{let e=String(o.value||"").trim().toLowerCase();if(!e){A.forEach(c=>c.style.setProperty("display","flex","important"));return}A.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",g=c.dataset.value||"",C=m.includes(e)||a.includes(e)||g.includes(e);c.style.setProperty("display",C?"flex":"none","important")})};return o.addEventListener("input",k),h}function U(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let y=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=y,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",E&&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 o=document.createElement("div");o.className="voc-form-timezone-control",o.style.position="relative",o.style.display="inline-block",o.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 A=["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 k(t){p.innerHTML="",t.forEach((n,i)=>{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)})}k(A);let e=-1;function c(){Array.from(p.children).forEach((n,i)=>{i===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 g(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?A.filter(i=>i.toLowerCase().includes(t)):A;k(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(k(A),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 i=n[e];u.value=i.dataset.value||i.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{o.contains(t.target)||a()});let C={"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(C).find(i=>i.toLowerCase()===t.toLowerCase());n&&(u.value=C[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",E&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return o.appendChild(u),o.appendChild(d),o.appendChild(p),h.appendChild(o),h}function J(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let y=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 o=document.createElement("input");o.type="text",o.className="voc-form-tags-input",o.style.border="none",o.style.flex="1 0 120px",o.style.minWidth="80px",o.style.outline="none",o.placeholder=r.placeholder||"",E&&o.classList.add("form-control");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 b(){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,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 A(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 g=document.createElement("button");return g.type="button",g.textContent="\xD7",g.style.border="none",g.style.background="transparent",g.style.cursor="pointer",g.addEventListener("click",()=>{let C=d.indexOf(c);C>=0&&(d.splice(C,1),u.removeChild(m),b())}),m.appendChild(g),m}function k(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=A(m);u.insertBefore(a,o),b()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(k),o.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),k(o.value),o.value="";else if(c.key==="Backspace"&&o.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),g=a[a.length-1];g&&u.removeChild(g),b()}}),o.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(k),o.value="")}),h.getTags=()=>d.slice(),h.addTag=k,u.appendChild(o),h.appendChild(u),b(),h}function I(r,L=!0){let f=new FormData(r);if(L)return ie(f);let E={};return f.forEach((h,y)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(E,y)?Array.isArray(E[y])?E[y].push(u):E[y]=[E[y],u]:E[y]=u}),E}function ie(r){let L=new FormData;for(let[f,E]of r.entries()){if(E instanceof File){L.append(f,E);continue}let h;try{h=JSON.parse(E)}catch{h=null}Array.isArray(h)?h.length===0?L.append(f,"[]"):h.every(y=>typeof y=="object"&&y!==null)?h.forEach((y,u)=>{for(let[o,d]of Object.entries(y))L.append(`${f}[${u}][${o}]`,d)}):L.append(f,E):L.append(f,E)}return L}async function Y(r,L,f){let E=L.url,h={"Content-Type":"application/json"};L?.api_token&&(h.Authorization=`Bearer ${L.api_token}`);let y=I(r);if(L?.additional_data)for(let[d,p]of Object.entries(L.additional_data))y.append(d,p);let u,o=y instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...o?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:o?y:JSON.stringify(Object.fromEntries(y.entries()))};try{fetch(E,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let A=(await d.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(b){throw new Error(b.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 K(r,L,f){let E=[];if(typeof r=="string"?E=Array.from(document.querySelectorAll(r)):E=[r],E.length===0)return null;function h(){let o=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),o&&d.classList.add("needs-validation"),d.id=L.id;let p=document.createElement("h2");p.className="voc-form-title",o&&p.classList.add("mb-3"),p.textContent=L.form_name,d.appendChild(p);function b(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 A(e){if(!e.key&&!e.label)return null;let c=L.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,g=document.createElement("div");if(g.className="voc-form-group",o&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),o&&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)}g.appendChild(t)}let C=null;switch(e.type){case"tags":{C=J(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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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"]'),i=()=>{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",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),o&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),o&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}C=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),o&&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 i=(n.match(/\n/g)||[]).length,s=80,l=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),w=Math.ceil(l/s)||1,S=Math.max(2,i+w);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),b(t,e.validation),C=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),o&&t.classList.add("form-select"),o&&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 i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),C=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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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)}),C=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"),o&&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),C=t;break}case"avatar":{C=j(e,f||{},a);break}case"table":{C=G(e,f||{},a);break}case"users":{C=V(e,f||{},a);break}case"timezone":{C=U(e,f||{},a);break}case"audio_select":{C=W(e,f||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),o&&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),b(t,e.validation),C=t;break}}if(C&&g.appendChild(C),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,g.appendChild(t)}return g}L.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(o){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){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(g){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=g,t.appendChild(n)}m.appendChild(t)}let C=document.createElement("div");C.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.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,i.appendChild(l)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let w=A(l);w&&s.appendChild(w)}),i.appendChild(s),C.appendChild(i)}else{let n=A(t);n&&C.appendChild(n)}}),m.appendChild(C),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",o&&m.classList.add("mb-3");let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){let C=document.createElement("div");if(C.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,C.appendChild(t)}if(g){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=g,C.appendChild(t)}m.appendChild(C)}c.items.forEach(C=>{if(C.type==="row"&&"items"in C){let t=C,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",o&&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 i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let l=A(s);l&&i.appendChild(l)}),n.appendChild(i),m.appendChild(n)}else{let t=A(C);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",o&&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 g=A(a);g&&m.appendChild(g)}),d.appendChild(c)}else{let c=A(e);c&&d.appendChild(c)}});let k=document.createElement("button");return k.type="submit",k.className="voc-form-submit",k.textContent="Submit",o&&k.classList.add("btn","btn-primary"),d.appendChild(k),d}let y=h();E[0].appendChild(y);let u=L?.submit_config??f?.submit_config??null;return u&&y.addEventListener("submit",o=>{o.preventDefault();let d=Array.from(y.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(k=>{k&&typeof k._validateCheckboxGroup=="function"&&(k._validateCheckboxGroup()||k.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!y.checkValidity()){y.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let b=Array.from(y.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(b.forEach(k=>{if(k&&typeof k.validate=="function"){let e=k.validate();e&&e.length&&A.push(...e)}}),A.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(A.join("; ")));let k=b[0];k&&k.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let k=I(y);f.onSubmit(k)}Y(y,u,(k,e)=>{f?.onSubmitResult&&f.onSubmitResult(k,e)})}),{element:y,validate:()=>{let o=[];return y.querySelectorAll(":invalid").forEach(p=>{let b=p.validationMessage;o.push({element:p,message:b})}),o},getValues:()=>I(y),onSubmit:o=>{y.addEventListener("submit",d=>{d.preventDefault();let p=I(y);o(p,d)})}}}var z={renderForm:K};var ce=z,le={FormsLib:z};return re(de);})();
|
package/dist/main.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var P=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var te=(r,E)=>{for(var m in E)P(r,m,{get:E[m],enumerable:!0})},ae=(r,E,m,y)=>{if(E&&typeof E=="object"||typeof E=="function")for(let l of Z(E))!ee.call(r,l)&&l!==m&&P(r,l,{get:()=>E[l],enumerable:!(y=X(E,l))||y.enumerable});return r};var ne=r=>ae(P({},"__esModule",{value:!0}),r);var le={};te(le,{FormsLib:()=>ie,default:()=>ce});module.exports=ne(le);function j(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-avatar-wrapper",y&&l.classList.add("d-flex","align-items-center","gap-3");let u=document.createElement("img");u.className="voc-form-avatar-preview",u.alt=r.label||"avatar",y&&(u.classList.add("img-thumbnail","rounded-circle"),u.style.width=u.style.height="64px",u.style.objectFit="cover");let v=m!=null?String(m):r.default!==void 0&&r.default!==null?String(r.default):"";v?u.src=v:(u.src="",u.style.display="none");let c=document.createElement("input");c.type="file",c.accept=r.accept||"image/*",c.className="voc-form-avatar-input",y&&c.classList.add("form-control"),(r.key||r.name)&&(c.name=r.name||r.key,r.key&&(c.id=`voc-form-${r.key}`));let h=document.createElement("input");if(h.type="hidden",(r.key||r.name)&&(h.name=(r.name||r.key)+"_url"),h.value=v||"",c.addEventListener("change",L=>{let f=L.target;if(f.files&&f.files.length>0){let w=f.files[0],g=new FileReader;g.onload=()=>{u.src=String(g.result),u.style.display="",h.value=""},g.readAsDataURL(w)}}),y){let L=document.createElement("div");L.style.flex="1",L.appendChild(c),L.appendChild(h),l.appendChild(u),l.appendChild(L)}else l.appendChild(u),l.appendChild(c),l.appendChild(h);return l}function W(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");if(l.className="voc-form-audio-select",!r.options||r.options.length===0)return l;let u=r.name||r.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,v;return Array.isArray(m)?v=m[0]:m!==void 0?v=m:r.default!==void 0&&(v=r.default),r.options.forEach((c,h)=>{let L=document.createElement("div");L.className="voc-form-audio-item",y&&L.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=u,f.value=c.value,f.className="voc-form-audio-radio",r.key&&(f.id=`voc-form-${r.key}-${h}`),r.required&&h===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",v!==void 0&&(Array.isArray(v)?f.checked=v.includes(c.value):f.checked=String(v)===String(c.value));let w=()=>{f.checked?L.classList.add("selected"):L.classList.remove("selected")};f.addEventListener("change",()=>{l.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),w()}),f.checked&&L.classList.add("selected");let g=document.createElement("label");g.className="voc-form-audio-label",y&&g.classList.add("form-check-label"),g.htmlFor=f.id||"",g.textContent=c.label||c.value,g.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let d=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",y&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),i.appendChild(s),t.appendChild(i),d=document.createElement("audio"),d.src=c.audio_link,d.preload="none",d.style.display="none";let o=p=>{for(;p.firstChild;)p.removeChild(p.firstChild)},A=()=>{let p="http://www.w3.org/2000/svg",F=document.createElementNS(p,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(p,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},N=()=>{let p="http://www.w3.org/2000/svg",F=document.createElementNS(p,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(p,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};o(t),t.appendChild(A());let _=p=>{o(t),p?(t.appendChild(N()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(A()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!d)return;let p=l.querySelectorAll("audio");if(!d.paused&&!d.ended){d.pause(),d.currentTime=0;return}p.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),l.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),d.play()}catch(p){console.warn("audio play failed",p)}}),d.addEventListener("playing",()=>{L.classList.add("is-playing"),_(!0)});let H=()=>{L.classList.remove("is-playing"),_(!1)};d.addEventListener("pause",H),d.addEventListener("ended",H),e.appendChild(t),e.appendChild(d)}let b=document.createElement("div");b.className="voc-form-item-detail",b.style.display="flex",b.style.flexDirection="column",b.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(f),a.appendChild(g);let C=document.createElement("div");C.className="voc-form-item-description";let k=c.description||c.hint_text||"";k&&(C.textContent=k),b.appendChild(a),b.appendChild(C),e.appendChild(b),L.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),L.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),l.appendChild(L)}),l}function G(r,E,m){let y=document.createElement("div");y.className="voc-form-table-wrapper";let l=E?.style==="bootstrap",u=document.createElement("input");u.type="hidden",u.name=r.name||r.key,r.key&&(u.id=`voc-form-${r.key}`),y.appendChild(u);let v=document.createElement("table");v.className="voc-form-table",l&&v.classList.add("table","table-bordered");let c=document.createElement("thead"),h=document.createElement("tr"),L=document.createElement("th");L.className="voc-form-table-drag-col",L.textContent="",h.appendChild(L),(r.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,h.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",h.appendChild(f),c.appendChild(h),v.appendChild(c);let w=document.createElement("tbody");v.appendChild(w),y.appendChild(v);let g=document.createElement("button");g.type="button",g.className="voc-form-table-add",l&&g.classList.add("btn","btn-secondary"),g.textContent="+Add";let e=document.createElement("tfoot"),d=document.createElement("tr"),b=document.createElement("td");b.colSpan=(r.fields?r.fields.length:0)+1,b.appendChild(g),d.appendChild(b),e.appendChild(d),v.appendChild(e),y.appendChild(v);let a=[];function C(){u.value=JSON.stringify(a)}function k(n){let i=[];return r.fields.forEach(s=>{let o=n[s.key];if(s.type==="checkbox"){let A=Array.isArray(o)?o:o?[o]:[];s.required&&A.length===0&&i.push(`${s.label||s.key} is required`);return}s.required&&(o==null||String(o).trim()==="")&&i.push(`${s.label||s.key} is required`),s.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&o&&isNaN(Number(o))&&i.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&o&&(new RegExp(s.validation.regex).test(String(o))||i.push(`${s.label||s.key} invalid format`))}),i}function t(){w.innerHTML="";let n=(i,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",o=>{let A=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(A)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{i.classList.remove("dragging"),s.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let A=o.currentTarget,N=A.getBoundingClientRect(),_=N.top+N.height/2,H=(o.clientY||o.y)>_;A.classList.remove("drag-over-top","drag-over-bottom"),H?(A.classList.add("drag-over-bottom"),A.dataset.dropPosition="after"):(A.classList.add("drag-over-top"),A.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let A=o.currentTarget;A.classList.remove("drag-over-top","drag-over-bottom"),delete A.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let A=o.dataTransfer.getData("text/plain"),N=Number(o.currentTarget.dataset.rowIndex),_=Number(A),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(_)||isNaN(N))return;let[p]=a.splice(_,1),F=N;_<N&&(F=N-1);let T=H==="after"?F+1:F;a.splice(T,0,p),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),C()})};a.forEach((i,s)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(s),o.classList.add("voc-form-table-row");let A=document.createElement("td");A.className="voc-form-table-drag-handle";let N=document.createElement("span");N.className="voc-form-drag-handle-icon",N.textContent="\u2630",N.style.cursor="grab",A.appendChild(N),o.appendChild(A),n(o,N),r.fields.forEach(p=>{let F=document.createElement("td"),T,q=(p.type||"text").toLowerCase();if(q==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",l&&x.classList.add("form-control"),p.placeholder){let S=document.createElement("option");S.value="",S.textContent=p.placeholder,S.disabled=!0,(i[p.key]===void 0||i[p.key]===null||i[p.key]==="")&&(S.selected=!0),x.appendChild(S)}(p.options||[]).forEach(S=>{let B=document.createElement("option");B.value=S.value,B.textContent=S.label,x.appendChild(B)}),x.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.required&&(x.required=!0),x.addEventListener("change",S=>{a[s][p.key]=S.target.value,C()}),T=x}else if(q==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",l&&x.classList.add("form-check");let D=p.options||[];Array.isArray(a[s][p.key])||(a[s][p.key]=a[s][p.key]?[a[s][p.key]]:[]),D.forEach(S=>{let B=`voc-form-${r.key}-${p.key}-${s}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-checkbox-item",l&&R.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",l&&M.classList.add("form-check-input"),M.id=B,M.value=S.value,M.checked=Array.isArray(a[s][p.key])&&a[s][p.key].includes(S.value),M.addEventListener("change",O=>{let Y=O.target.checked;Array.isArray(a[s][p.key])||(a[s][p.key]=[]),Y?a[s][p.key].includes(S.value)||a[s][p.key].push(S.value):a[s][p.key]=a[s][p.key].filter(Q=>Q!==S.value),C()});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-checkbox-label",l&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else if(q==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",l&&x.classList.add("form-check");let D=p.options||[];a[s][p.key]===void 0&&(a[s][p.key]=""),D.forEach(S=>{let B=`voc-form-${r.key}-${p.key}-${s}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-radio-item",l&&R.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",l&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${r.key}-${p.key}-${s}`,M.value=S.value,M.checked=a[s][p.key]===S.value,M.addEventListener("change",O=>{O.target.checked&&(a[s][p.key]=O.target.value,C())});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-radio-label",l&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else{let x=document.createElement("input");q==="number"?x.type="number":q==="email"?x.type="email":q==="tel"?x.type="tel":q==="url"?x.type="url":q==="date"?x.type="date":x.type="text",x.value=i[p.key]!==void 0&&i[p.key]!==null?String(i[p.key]):"",p.placeholder&&(x.placeholder=p.placeholder),p.required&&(x.required=!0),x.className="voc-form-table-cell",l&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[s][p.key]=D.target.value,C()}),T=x}F.appendChild(T),o.appendChild(F)});let _=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",l&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(s,1),t(),C()}),_.appendChild(H),o.appendChild(_),w.appendChild(o)})}return g.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(i=>n[i.key]=""),a.push(n),t(),C()}),Array.isArray(m)&&m.length?a=m.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),C(),y.validate=function(){let n=[];return a.forEach((i,s)=>{let o=k(i);o.length&&n.push(`Row ${s+1}: ${o.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(i=>{let s=new Set;a.forEach((o,A)=>{let N=o[i];N!=null&&(s.has(N)&&n.push(`Field ${i} must be unique (duplicate at row ${A+1})`),s.add(N))})}),n},y}async function re(r){let m=new TextEncoder().encode(r),y=await crypto.subtle.digest("SHA-256",m);return Array.from(new Uint8Array(y)).map(u=>u.toString(16).padStart(2,"0")).join("")}async function se(r){let E=String(r||"").trim().toLowerCase();return E?`https://gravatar.com/avatar/${await re(E)}?d=mp`:""}function U(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-users";let u=document.createElement("div");if(u.className="voc-form-users-header",y&&u.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",y&&e.classList.add("form-label"),e.textContent=r.label,r.required){let d=document.createElement("span");d.className="voc-form-required",d.textContent="*",e.appendChild(d)}u.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",y&&e.classList.add("form-text"),e.textContent=r.description,u.appendChild(e)}l.appendChild(u);let v=document.createElement("div");v.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",y&&c.classList.add("form-control","mb-2"),v.appendChild(c),l.appendChild(v),!r.options||r.options.length===0)return l;let h=document.createElement("div");h.className="voc-form-users-list",y&&h.classList.add("list-group");let L=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(m)?f=m:m!=null?f=[m]:Array.isArray(r.default)&&(f=r.default),r.options.forEach((e,d)=>{let b=document.createElement("div");b.className="voc-form-user-item",b.dataset.label=String(e.label||"").toLowerCase(),b.dataset.email=String(e.email||"").toLowerCase(),b.dataset.value=String(e.value||"").toLowerCase(),y&&b.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${L}[]`,a.value=e.value,a.className="voc-form-user-checkbox",r.key&&(a.id=`voc-form-${r.key}-${d}`),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",f&&Array.isArray(f)){let i=f.map(s=>String(s));a.checked=i.includes(String(e.value))}let C=document.createElement("img");C.className="voc-form-user-avatar",C.alt=e.label||String(e.value||"user"),C.style.width=C.style.height="40px",C.style.objectFit="cover",C.style.borderRadius="50%",C.src="",e.email&&se(e.email).then(i=>{i&&(C.src=i)}).catch(()=>{});let k=document.createElement("div");k.className="voc-form-user-info",k.style.display="flex",k.style.flexDirection="column",k.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||"",k.appendChild(t),k.appendChild(n),b.addEventListener("click",i=>{let s=i.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?b.classList.add("selected"):b.classList.remove("selected")}),a.checked&&b.classList.add("selected"),b.appendChild(a),b.appendChild(C),b.appendChild(k),h.appendChild(b)}),l.appendChild(h),r.required){let e=h.querySelectorAll('input[type="checkbox"]'),d=()=>{let b=Array.from(e).some(a=>a.checked);return e.forEach(a=>{b?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),b};e.forEach(b=>{b.addEventListener("change",d)}),l._validateCheckboxGroup=d,d()}let w=Array.from(h.querySelectorAll(".voc-form-user-item")),g=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){w.forEach(d=>d.style.setProperty("display","flex","important"));return}w.forEach(d=>{let b=d.dataset.label||"",a=d.dataset.email||"",C=d.dataset.value||"",k=b.includes(e)||a.includes(e)||C.includes(e);d.style.setProperty("display",k?"flex":"none","important")})};return c.addEventListener("input",g),l}function V(r,E,m){let y=E?.style==="bootstrap",l=document.createElement("div");l.className="voc-form-timezone";let u=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,v=document.createElement("input");v.type="text",v.name=u,r.key&&(v.id=`voc-form-${r.key}`),v.className="voc-form-timezone-input",y&&v.classList.add("form-control"),r.placeholder&&(v.placeholder=r.placeholder||""),r.required&&(v.required=!0),r.width&&(v.style.width=r.width),m!=null?v.value=String(m):r.default!==void 0&&r.default!==null&&(v.value=String(r.default));let c=document.createElement("datalist");c.id=`voc-form-timezone-list-${r.key||Math.random().toString(36).substr(2,6)}`,v.setAttribute("list",c.id),["UTC","Etc/UTC","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"].forEach(w=>{let g=document.createElement("option");g.value=w,c.appendChild(g)});let f={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(v.addEventListener("blur",()=>{let w=(v.value||"").trim();if(!w)return;let g=Object.keys(f).find(e=>e.toLowerCase()===w.toLowerCase());g&&(v.value=f[g])}),r.description){let w=document.createElement("div");w.className="voc-form-timezone-description",y&&w.classList.add("form-text"),w.textContent=r.description,l.appendChild(w)}return l.appendChild(v),l.appendChild(c),l}function I(r,E=!0){let m=new FormData(r);if(E)return oe(m);let y={};return m.forEach((l,u)=>{let v=(l instanceof File,l);Object.prototype.hasOwnProperty.call(y,u)?Array.isArray(y[u])?y[u].push(v):y[u]=[y[u],v]:y[u]=v}),y}function oe(r){let E=new FormData;for(let[m,y]of r.entries()){if(y instanceof File){E.append(m,y);continue}let l;try{l=JSON.parse(y)}catch{l=null}Array.isArray(l)?l.length===0?E.append(m,"[]"):l.every(u=>typeof u=="object"&&u!==null)?l.forEach((u,v)=>{for(let[c,h]of Object.entries(u))E.append(`${m}[${v}][${c}]`,h)}):E.append(m,y):E.append(m,y)}return E}async function J(r,E,m){let y=E.url,l={"Content-Type":"application/json"};E?.api_token&&(l.Authorization=`Bearer ${E.api_token}`);let u=I(r);if(E?.additional_data)for(let[h,L]of Object.entries(E.additional_data))u.append(h,L);let v,c=u instanceof FormData;v={method:"POST",headers:{Authorization:`Bearer ${E.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?u:JSON.stringify(Object.fromEntries(u.entries()))};try{fetch(y,v).then(async h=>{let L=h.headers.get("content-type");if(!h.ok)try{let w=(await h.json())?.message;throw new Error(w??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return L&&L.includes("application/json")?h.json():h.text()}).then(h=>{m&&m(h,null)}).catch(h=>{m&&m(null,h)})}catch(h){m&&m(null,h)}}function K(r,E,m){let y=[];if(typeof r=="string"?y=Array.from(document.querySelectorAll(r)):y=[r],y.length===0)return null;function l(){let c=m?.style==="bootstrap",h=document.createElement("form");h.classList.add("voc-form"),c&&h.classList.add("needs-validation"),h.id=E.id;let L=document.createElement("h2");L.className="voc-form-title",c&&L.classList.add("mb-3"),L.textContent=E.form_name,h.appendChild(L);function f(e,d){d&&(d.min_length!==void 0&&(e.minLength=d.min_length),d.max_length!==void 0&&(e.maxLength=d.max_length),d.regex&&(e instanceof HTMLInputElement?e.pattern=d.regex:e.dataset.pattern=d.regex))}function w(e){if(!e.key&&!e.label)return null;let d=E.default_values||{},b=e.name||e.key,a=b?d[b]:void 0,C=document.createElement("div");if(C.className="voc-form-group",c&&C.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&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)}C.appendChild(t)}let k=null;switch(e.type){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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),c&&s.classList.add("form-check"),s.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(s.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),s.appendChild(o),s.appendChild(document.createTextNode(n.label)),t.appendChild(s)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let s=Array.from(n).some(o=>o.checked);return n.forEach(o=>{s?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),s};n.forEach(s=>{s.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}k=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&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 i=(n.match(/\n/g)||[]).length,s=80,o=n.split(`
|
|
2
|
-
`).reduce((
|
|
1
|
+
"use strict";var P=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var ae=(r,L)=>{for(var f in L)P(r,f,{get:L[f],enumerable:!0})},ne=(r,L,f,E)=>{if(L&&typeof L=="object"||typeof L=="function")for(let h of ee(L))!te.call(r,h)&&h!==f&&P(r,h,{get:()=>L[h],enumerable:!(E=Z(L,h))||E.enumerable});return r};var re=r=>ne(P({},"__esModule",{value:!0}),r);var de={};ae(de,{FormsLib:()=>ce,default:()=>le});module.exports=re(de);function j(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",E&&h.classList.add("d-flex","align-items-center","gap-3");let y=document.createElement("img");y.className="voc-form-avatar-preview",y.alt=r.label||"avatar",E&&(y.classList.add("img-thumbnail","rounded-circle"),y.style.width=y.style.height="64px",y.style.objectFit="cover");let u=f!=null?String(f):r.default!==void 0&&r.default!==null?String(r.default):"";u?y.src=u:(y.src="",y.style.display="none");let o=document.createElement("input");o.type="file",o.accept=r.accept||"image/*",o.className="voc-form-avatar-input",E&&o.classList.add("form-control"),(r.key||r.name)&&(o.name=r.name||r.key,r.key&&(o.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||"",o.addEventListener("change",p=>{let b=p.target;if(b.files&&b.files.length>0){let A=b.files[0],k=new FileReader;k.onload=()=>{y.src=String(k.result),y.style.display="",d.value=""},k.readAsDataURL(A)}}),E){let p=document.createElement("div");p.style.flex="1",p.appendChild(o),p.appendChild(d),h.appendChild(y),h.appendChild(p)}else h.appendChild(y),h.appendChild(o),h.appendChild(d);return h}function W(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!r.options||r.options.length===0)return h;let y=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((o,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",E&&p.classList.add("form-check");let b=document.createElement("input");b.type="radio",b.name=y,b.value=o.value,b.className="voc-form-audio-radio",r.key&&(b.id=`voc-form-${r.key}-${d}`),r.required&&d===0&&(b.required=!0),b.style.position="absolute",b.style.width="1px",b.style.height="1px",b.style.margin="0",b.style.padding="0",b.style.clip="rect(0 0 0 0)",b.style.clipPath="inset(50%)",b.style.overflow="hidden",b.style.border="0",u!==void 0&&(Array.isArray(u)?b.checked=u.includes(o.value):b.checked=String(u)===String(o.value));let A=()=>{b.checked?p.classList.add("selected"):p.classList.remove("selected")};b.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),b.checked&&p.classList.add("selected");let k=document.createElement("label");k.className="voc-form-audio-label",E&&k.classList.add("form-check-label"),k.htmlFor=b.id||"",k.textContent=o.label||o.value,k.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(o.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",E&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${o.label||o.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let s=document.createElementNS(n,"path");s.setAttribute("d","M8 5v14l11-7z"),s.setAttribute("fill","currentColor"),i.appendChild(s),t.appendChild(i),c=document.createElement("audio"),c.src=o.audio_link,c.preload="none",c.style.display="none";let l=v=>{for(;v.firstChild;)v.removeChild(v.firstChild)},w=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},S=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};l(t),t.appendChild(w());let R=v=>{l(t),v?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${o.label||o.value}`)):(t.appendChild(w()),t.setAttribute("aria-label",`Play ${o.label||o.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let v=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}v.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),c.play()}catch(v){console.warn("audio play failed",v)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),R(!0)});let H=()=>{p.classList.remove("is-playing"),R(!1)};c.addEventListener("pause",H),c.addEventListener("ended",H),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(b),a.appendChild(k);let g=document.createElement("div");g.className="voc-form-item-description";let C=o.description||o.hint_text||"";C&&(g.textContent=C),m.appendChild(a),m.appendChild(g),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function G(r,L,f){let E=document.createElement("div");E.className="voc-form-table-wrapper";let h=L?.style==="bootstrap",y=document.createElement("input");y.type="hidden",y.name=r.name||r.key,r.key&&(y.id=`voc-form-${r.key}`),E.appendChild(y);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let o=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 i=document.createElement("th");i.textContent=n.label||n.key,d.appendChild(i)});let b=document.createElement("th");b.textContent="Actions",d.appendChild(b),o.appendChild(d),u.appendChild(o);let A=document.createElement("tbody");u.appendChild(A),E.appendChild(u);let k=document.createElement("button");k.type="button",k.className="voc-form-table-add",h&&k.classList.add("btn","btn-secondary"),k.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(k),c.appendChild(m),e.appendChild(c),u.appendChild(e),E.appendChild(u);let a=[];function g(){y.value=JSON.stringify(a)}function C(n){let i=[];return r.fields.forEach(s=>{let l=n[s.key];if(s.type==="checkbox"){let w=Array.isArray(l)?l:l?[l]:[];s.required&&w.length===0&&i.push(`${s.label||s.key} is required`);return}s.required&&(l==null||String(l).trim()==="")&&i.push(`${s.label||s.key} is required`),s.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||i.push(`${s.label||s.key} must be a valid email`)),s.type==="number"&&l&&isNaN(Number(l))&&i.push(`${s.label||s.key} must be a number`),s.validation&&s.validation.regex&&l&&(new RegExp(s.validation.regex).test(String(l))||i.push(`${s.label||s.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,s)=>{s.draggable=!0,s.addEventListener("mousedown",()=>{s.style.cursor="grabbing"}),s.addEventListener("mouseup",()=>{s.style.cursor="grab"}),s.addEventListener("dragstart",l=>{let w=Number(i.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(w)),i.classList.add("dragging");try{l.dataTransfer?.setDragImage(s,10,10)}catch{}}),s.addEventListener("dragend",()=>{i.classList.remove("dragging"),s.style.cursor="grab"}),i.addEventListener("dragover",l=>{l.preventDefault();let w=l.currentTarget,S=w.getBoundingClientRect(),R=S.top+S.height/2,H=(l.clientY||l.y)>R;w.classList.remove("drag-over-top","drag-over-bottom"),H?(w.classList.add("drag-over-bottom"),w.dataset.dropPosition="after"):(w.classList.add("drag-over-top"),w.dataset.dropPosition="before")}),i.addEventListener("dragleave",l=>{let w=l.currentTarget;w.classList.remove("drag-over-top","drag-over-bottom"),delete w.dataset.dropPosition}),i.addEventListener("drop",l=>{l.preventDefault();let w=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),R=Number(w),H=l.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[v]=a.splice(R,1),F=S;R<S&&(F=S-1);let T=H==="after"?F+1:F;a.splice(T,0,v),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,s)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(s),l.classList.add("voc-form-table-row");let w=document.createElement("td");w.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",w.appendChild(S),l.appendChild(w),n(l,S),r.fields.forEach(v=>{let F=document.createElement("td"),T,$=(v.type||"text").toLowerCase();if($==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",h&&x.classList.add("form-control"),v.placeholder){let N=document.createElement("option");N.value="",N.textContent=v.placeholder,N.disabled=!0,(i[v.key]===void 0||i[v.key]===null||i[v.key]==="")&&(N.selected=!0),x.appendChild(N)}(v.options||[]).forEach(N=>{let B=document.createElement("option");B.value=N.value,B.textContent=N.label,x.appendChild(B)}),x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.required&&(x.required=!0),x.addEventListener("change",N=>{a[s][v.key]=N.target.value,g()}),T=x}else if($==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",h&&x.classList.add("form-check");let D=v.options||[];Array.isArray(a[s][v.key])||(a[s][v.key]=a[s][v.key]?[a[s][v.key]]:[]),D.forEach(N=>{let B=`voc-form-${r.key}-${v.key}-${s}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-checkbox-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.value=N.value,M.checked=Array.isArray(a[s][v.key])&&a[s][v.key].includes(N.value),M.addEventListener("change",O=>{let Q=O.target.checked;Array.isArray(a[s][v.key])||(a[s][v.key]=[]),Q?a[s][v.key].includes(N.value)||a[s][v.key].push(N.value):a[s][v.key]=a[s][v.key].filter(X=>X!==N.value),g()});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-checkbox-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else if($==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",h&&x.classList.add("form-check");let D=v.options||[];a[s][v.key]===void 0&&(a[s][v.key]=""),D.forEach(N=>{let B=`voc-form-${r.key}-${v.key}-${s}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-radio-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${r.key}-${v.key}-${s}`,M.value=N.value,M.checked=a[s][v.key]===N.value,M.addEventListener("change",O=>{O.target.checked&&(a[s][v.key]=O.target.value,g())});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-radio-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else{let x=document.createElement("input");$==="number"?x.type="number":$==="email"?x.type="email":$==="tel"?x.type="tel":$==="url"?x.type="url":$==="date"?x.type="date":x.type="text",x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.placeholder&&(x.placeholder=v.placeholder),v.required&&(x.required=!0),x.className="voc-form-table-cell",h&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[s][v.key]=D.target.value,g()}),T=x}F.appendChild(T),l.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",h&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(s,1),t(),g()}),R.appendChild(H),l.appendChild(R),A.appendChild(l)})}return k.addEventListener("click",()=>{if(r.validation?.max_rows!==void 0&&a.length>=r.validation.max_rows)return;let n={};r.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(f)&&f.length?a=f.map(n=>({...n})):r.default&&Array.isArray(r.default)&&(a=r.default.map(n=>({...n}))),t(),g(),E.validate=function(){let n=[];return a.forEach((i,s)=>{let l=C(i);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(i=>{let s=new Set;a.forEach((l,w)=>{let S=l[i];S!=null&&(s.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${w+1})`),s.add(S))})}),n},E}async function se(r){let f=new TextEncoder().encode(r),E=await crypto.subtle.digest("SHA-256",f);return Array.from(new Uint8Array(E)).map(y=>y.toString(16).padStart(2,"0")).join("")}async function oe(r){let L=String(r||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await se(L)}?d=mp`:""}function V(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let y=document.createElement("div");if(y.className="voc-form-users-header",E&&y.classList.add("mb-2"),r.label){let e=document.createElement("div");if(e.className="voc-form-users-label",E&&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)}y.appendChild(e)}if(r.description){let e=document.createElement("div");e.className="voc-form-users-description",E&&e.classList.add("form-text"),e.textContent=r.description,y.appendChild(e)}h.appendChild(y);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let o=document.createElement("input");if(o.type="search",o.placeholder="Search users...",o.className="voc-form-users-search",E&&o.classList.add("form-control","mb-2"),u.appendChild(o),h.appendChild(u),!r.options||r.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",E&&d.classList.add("list-group");let p=r.name||r.key||`users_${Math.random().toString(36).substr(2,6)}`,b=[];if(Array.isArray(f)?b=f:f!=null?b=[f]:Array.isArray(r.default)&&(b=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(),E&&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",b&&Array.isArray(b)){let i=b.map(s=>String(s));a.checked=i.includes(String(e.value))}let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&oe(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let C=document.createElement("div");C.className="voc-form-user-info",C.style.display="flex",C.style.flexDirection="column",C.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||"",C.appendChild(t),C.appendChild(n),m.addEventListener("click",i=>{let s=i.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(g),m.appendChild(C),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 A=Array.from(d.querySelectorAll(".voc-form-user-item")),k=()=>{let e=String(o.value||"").trim().toLowerCase();if(!e){A.forEach(c=>c.style.setProperty("display","flex","important"));return}A.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",g=c.dataset.value||"",C=m.includes(e)||a.includes(e)||g.includes(e);c.style.setProperty("display",C?"flex":"none","important")})};return o.addEventListener("input",k),h}function U(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let y=r.name||r.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=y,r.key&&(u.id=`voc-form-${r.key}`),u.className="voc-form-timezone-input",E&&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 o=document.createElement("div");o.className="voc-form-timezone-control",o.style.position="relative",o.style.display="inline-block",o.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 A=["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 k(t){p.innerHTML="",t.forEach((n,i)=>{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)})}k(A);let e=-1;function c(){Array.from(p.children).forEach((n,i)=>{i===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 g(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?A.filter(i=>i.toLowerCase().includes(t)):A;k(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(k(A),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 i=n[e];u.value=i.dataset.value||i.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{o.contains(t.target)||a()});let C={"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(C).find(i=>i.toLowerCase()===t.toLowerCase());n&&(u.value=C[n])}),r.description){let t=document.createElement("div");t.className="voc-form-timezone-description",E&&t.classList.add("form-text"),t.textContent=r.description,h.appendChild(t)}return o.appendChild(u),o.appendChild(d),o.appendChild(p),h.appendChild(o),h}function J(r,L,f){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let y=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 o=document.createElement("input");o.type="text",o.className="voc-form-tags-input",o.style.border="none",o.style.flex="1 0 120px",o.style.minWidth="80px",o.style.outline="none",o.placeholder=r.placeholder||"",E&&o.classList.add("form-control");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 b(){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,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 A(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 g=document.createElement("button");return g.type="button",g.textContent="\xD7",g.style.border="none",g.style.background="transparent",g.style.cursor="pointer",g.addEventListener("click",()=>{let C=d.indexOf(c);C>=0&&(d.splice(C,1),u.removeChild(m),b())}),m.appendChild(g),m}function k(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=A(m);u.insertBefore(a,o),b()}let e=f!=null?String(f):r.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(k),o.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),k(o.value),o.value="";else if(c.key==="Backspace"&&o.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),g=a[a.length-1];g&&u.removeChild(g),b()}}),o.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(k),o.value="")}),h.getTags=()=>d.slice(),h.addTag=k,u.appendChild(o),h.appendChild(u),b(),h}function I(r,L=!0){let f=new FormData(r);if(L)return ie(f);let E={};return f.forEach((h,y)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(E,y)?Array.isArray(E[y])?E[y].push(u):E[y]=[E[y],u]:E[y]=u}),E}function ie(r){let L=new FormData;for(let[f,E]of r.entries()){if(E instanceof File){L.append(f,E);continue}let h;try{h=JSON.parse(E)}catch{h=null}Array.isArray(h)?h.length===0?L.append(f,"[]"):h.every(y=>typeof y=="object"&&y!==null)?h.forEach((y,u)=>{for(let[o,d]of Object.entries(y))L.append(`${f}[${u}][${o}]`,d)}):L.append(f,E):L.append(f,E)}return L}async function Y(r,L,f){let E=L.url,h={"Content-Type":"application/json"};L?.api_token&&(h.Authorization=`Bearer ${L.api_token}`);let y=I(r);if(L?.additional_data)for(let[d,p]of Object.entries(L.additional_data))y.append(d,p);let u,o=y instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...o?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:o?y:JSON.stringify(Object.fromEntries(y.entries()))};try{fetch(E,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let A=(await d.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(b){throw new Error(b.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 K(r,L,f){let E=[];if(typeof r=="string"?E=Array.from(document.querySelectorAll(r)):E=[r],E.length===0)return null;function h(){let o=f?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),o&&d.classList.add("needs-validation"),d.id=L.id;let p=document.createElement("h2");p.className="voc-form-title",o&&p.classList.add("mb-3"),p.textContent=L.form_name,d.appendChild(p);function b(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 A(e){if(!e.key&&!e.label)return null;let c=L.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,g=document.createElement("div");if(g.className="voc-form-group",o&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),o&&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)}g.appendChild(t)}let C=null;switch(e.type){case"tags":{C=J(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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-checkbox-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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"]'),i=()=>{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",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),o&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),o&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}C=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),o&&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 i=(n.match(/\n/g)||[]).length,s=80,l=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),w=Math.ceil(l/s)||1,S=Math.max(2,i+w);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),b(t,e.validation),C=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),o&&t.classList.add("form-select"),o&&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 i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),C=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,i)=>{let s=document.createElement("label");s.classList.add("voc-form-radio-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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)}),C=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"),o&&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),C=t;break}case"avatar":{C=j(e,f||{},a);break}case"table":{C=G(e,f||{},a);break}case"users":{C=V(e,f||{},a);break}case"timezone":{C=U(e,f||{},a);break}case"audio_select":{C=W(e,f||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),o&&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),b(t,e.validation),C=t;break}}if(C&&g.appendChild(C),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,g.appendChild(t)}return g}L.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(o){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){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(g){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=g,t.appendChild(n)}m.appendChild(t)}let C=document.createElement("div");C.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.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,i.appendChild(l)}let s=document.createElement("div");s.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let w=A(l);w&&s.appendChild(w)}),i.appendChild(s),C.appendChild(i)}else{let n=A(t);n&&C.appendChild(n)}}),m.appendChild(C),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",o&&m.classList.add("mb-3");let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){let C=document.createElement("div");if(C.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,C.appendChild(t)}if(g){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=g,C.appendChild(t)}m.appendChild(C)}c.items.forEach(C=>{if(C.type==="row"&&"items"in C){let t=C,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",o&&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 i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(s=>{let l=A(s);l&&i.appendChild(l)}),n.appendChild(i),m.appendChild(n)}else{let t=A(C);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",o&&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 g=A(a);g&&m.appendChild(g)}),d.appendChild(c)}else{let c=A(e);c&&d.appendChild(c)}});let k=document.createElement("button");return k.type="submit",k.className="voc-form-submit",k.textContent="Submit",o&&k.classList.add("btn","btn-primary"),d.appendChild(k),d}let y=h();E[0].appendChild(y);let u=L?.submit_config??f?.submit_config??null;return u&&y.addEventListener("submit",o=>{o.preventDefault();let d=Array.from(y.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(k=>{k&&typeof k._validateCheckboxGroup=="function"&&(k._validateCheckboxGroup()||k.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!y.checkValidity()){y.reportValidity(),f?.onSubmitResult&&f.onSubmitResult(null,new Error("Form validation failed"));return}let b=Array.from(y.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(b.forEach(k=>{if(k&&typeof k.validate=="function"){let e=k.validate();e&&e.length&&A.push(...e)}}),A.length){f?.onSubmitResult&&f.onSubmitResult(null,new Error(A.join("; ")));let k=b[0];k&&k.scrollIntoView({behavior:"smooth",block:"center"});return}if(f?.onSubmit){let k=I(y);f.onSubmit(k)}Y(y,u,(k,e)=>{f?.onSubmitResult&&f.onSubmitResult(k,e)})}),{element:y,validate:()=>{let o=[];return y.querySelectorAll(":invalid").forEach(p=>{let b=p.validationMessage;o.push({element:p,message:b})}),o},getValues:()=>I(y),onSubmit:o=>{y.addEventListener("submit",d=>{d.preventDefault();let p=I(y);o(p,d)})}}}var z={renderForm:K};var ce=z,le={FormsLib:z};0&&(module.exports={FormsLib});
|
package/dist/main.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function z(s,L,p){let b=L?.style==="bootstrap",m=document.createElement("div");m.className="voc-form-avatar-wrapper",b&&m.classList.add("d-flex","align-items-center","gap-3");let d=document.createElement("img");d.className="voc-form-avatar-preview",d.alt=s.label||"avatar",b&&(d.classList.add("img-thumbnail","rounded-circle"),d.style.width=d.style.height="64px",d.style.objectFit="cover");let y=p!=null?String(p):s.default!==void 0&&s.default!==null?String(s.default):"";y?d.src=y:(d.src="",d.style.display="none");let c=document.createElement("input");c.type="file",c.accept=s.accept||"image/*",c.className="voc-form-avatar-input",b&&c.classList.add("form-control"),(s.key||s.name)&&(c.name=s.name||s.key,s.key&&(c.id=`voc-form-${s.key}`));let h=document.createElement("input");if(h.type="hidden",(s.key||s.name)&&(h.name=(s.name||s.key)+"_url"),h.value=y||"",c.addEventListener("change",C=>{let f=C.target;if(f.files&&f.files.length>0){let w=f.files[0],g=new FileReader;g.onload=()=>{d.src=String(g.result),d.style.display="",h.value=""},g.readAsDataURL(w)}}),b){let C=document.createElement("div");C.style.flex="1",C.appendChild(c),C.appendChild(h),m.appendChild(d),m.appendChild(C)}else m.appendChild(d),m.appendChild(c),m.appendChild(h);return m}function j(s,L,p){let b=L?.style==="bootstrap",m=document.createElement("div");if(m.className="voc-form-audio-select",!s.options||s.options.length===0)return m;let d=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,y;return Array.isArray(p)?y=p[0]:p!==void 0?y=p:s.default!==void 0&&(y=s.default),s.options.forEach((c,h)=>{let C=document.createElement("div");C.className="voc-form-audio-item",b&&C.classList.add("form-check");let f=document.createElement("input");f.type="radio",f.name=d,f.value=c.value,f.className="voc-form-audio-radio",s.key&&(f.id=`voc-form-${s.key}-${h}`),s.required&&h===0&&(f.required=!0),f.style.position="absolute",f.style.width="1px",f.style.height="1px",f.style.margin="0",f.style.padding="0",f.style.clip="rect(0 0 0 0)",f.style.clipPath="inset(50%)",f.style.overflow="hidden",f.style.border="0",y!==void 0&&(Array.isArray(y)?f.checked=y.includes(c.value):f.checked=String(y)===String(c.value));let w=()=>{f.checked?C.classList.add("selected"):C.classList.remove("selected")};f.addEventListener("change",()=>{m.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),w()}),f.checked&&C.classList.add("selected");let g=document.createElement("label");g.className="voc-form-audio-label",b&&g.classList.add("form-check-label"),g.htmlFor=f.id||"",g.textContent=c.label||c.value,g.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let l=null;if(c.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",b&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${c.label||c.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),l=document.createElement("audio"),l.src=c.audio_link,l.preload="none",l.style.display="none";let o=u=>{for(;u.firstChild;)u.removeChild(u.firstChild)},A=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(u,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},N=()=>{let u="http://www.w3.org/2000/svg",F=document.createElementNS(u,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(u,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};o(t),t.appendChild(A());let _=u=>{o(t),u?(t.appendChild(N()),t.setAttribute("aria-label",`Stop ${c.label||c.value}`)):(t.appendChild(A()),t.setAttribute("aria-label",`Play ${c.label||c.value}`))};t.addEventListener("click",()=>{try{if(!l)return;let u=m.querySelectorAll("audio");if(!l.paused&&!l.ended){l.pause(),l.currentTime=0;return}u.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),m.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),l.play()}catch(u){console.warn("audio play failed",u)}}),l.addEventListener("playing",()=>{C.classList.add("is-playing"),_(!0)});let H=()=>{C.classList.remove("is-playing"),_(!1)};l.addEventListener("pause",H),l.addEventListener("ended",H),e.appendChild(t),e.appendChild(l)}let v=document.createElement("div");v.className="voc-form-item-detail",v.style.display="flex",v.style.flexDirection="column",v.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(f),a.appendChild(g);let k=document.createElement("div");k.className="voc-form-item-description";let E=c.description||c.hint_text||"";E&&(k.textContent=E),v.appendChild(a),v.appendChild(k),e.appendChild(v),C.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),C.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(f.checked=!0,f.dispatchEvent(new Event("change",{bubbles:!0})))}),m.appendChild(C)}),m}function W(s,L,p){let b=document.createElement("div");b.className="voc-form-table-wrapper";let m=L?.style==="bootstrap",d=document.createElement("input");d.type="hidden",d.name=s.name||s.key,s.key&&(d.id=`voc-form-${s.key}`),b.appendChild(d);let y=document.createElement("table");y.className="voc-form-table",m&&y.classList.add("table","table-bordered");let c=document.createElement("thead"),h=document.createElement("tr"),C=document.createElement("th");C.className="voc-form-table-drag-col",C.textContent="",h.appendChild(C),(s.fields||[]).forEach(n=>{let i=document.createElement("th");i.textContent=n.label||n.key,h.appendChild(i)});let f=document.createElement("th");f.textContent="Actions",h.appendChild(f),c.appendChild(h),y.appendChild(c);let w=document.createElement("tbody");y.appendChild(w),b.appendChild(y);let g=document.createElement("button");g.type="button",g.className="voc-form-table-add",m&&g.classList.add("btn","btn-secondary"),g.textContent="+Add";let e=document.createElement("tfoot"),l=document.createElement("tr"),v=document.createElement("td");v.colSpan=(s.fields?s.fields.length:0)+1,v.appendChild(g),l.appendChild(v),e.appendChild(l),y.appendChild(e),b.appendChild(y);let a=[];function k(){d.value=JSON.stringify(a)}function E(n){let i=[];return s.fields.forEach(r=>{let o=n[r.key];if(r.type==="checkbox"){let A=Array.isArray(o)?o:o?[o]:[];r.required&&A.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(o==null||String(o).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&o&&(/^\S+@\S+\.\S+$/.test(String(o))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&o&&isNaN(Number(o))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&o&&(new RegExp(r.validation.regex).test(String(o))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){w.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",o=>{let A=Number(i.dataset.rowIndex);o.dataTransfer.setData("text/plain",String(A)),i.classList.add("dragging");try{o.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",o=>{o.preventDefault();let A=o.currentTarget,N=A.getBoundingClientRect(),_=N.top+N.height/2,H=(o.clientY||o.y)>_;A.classList.remove("drag-over-top","drag-over-bottom"),H?(A.classList.add("drag-over-bottom"),A.dataset.dropPosition="after"):(A.classList.add("drag-over-top"),A.dataset.dropPosition="before")}),i.addEventListener("dragleave",o=>{let A=o.currentTarget;A.classList.remove("drag-over-top","drag-over-bottom"),delete A.dataset.dropPosition}),i.addEventListener("drop",o=>{o.preventDefault();let A=o.dataTransfer.getData("text/plain"),N=Number(o.currentTarget.dataset.rowIndex),_=Number(A),H=o.currentTarget.dataset.dropPosition||"before";if(isNaN(_)||isNaN(N))return;let[u]=a.splice(_,1),F=N;_<N&&(F=N-1);let T=H==="after"?F+1:F;a.splice(T,0,u),o.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete o.currentTarget.dataset.dropPosition,t(),k()})};a.forEach((i,r)=>{let o=document.createElement("tr");o.dataset.rowIndex=String(r),o.classList.add("voc-form-table-row");let A=document.createElement("td");A.className="voc-form-table-drag-handle";let N=document.createElement("span");N.className="voc-form-drag-handle-icon",N.textContent="\u2630",N.style.cursor="grab",A.appendChild(N),o.appendChild(A),n(o,N),s.fields.forEach(u=>{let F=document.createElement("td"),T,q=(u.type||"text").toLowerCase();if(q==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",m&&x.classList.add("form-control"),u.placeholder){let S=document.createElement("option");S.value="",S.textContent=u.placeholder,S.disabled=!0,(i[u.key]===void 0||i[u.key]===null||i[u.key]==="")&&(S.selected=!0),x.appendChild(S)}(u.options||[]).forEach(S=>{let B=document.createElement("option");B.value=S.value,B.textContent=S.label,x.appendChild(B)}),x.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.required&&(x.required=!0),x.addEventListener("change",S=>{a[r][u.key]=S.target.value,k()}),T=x}else if(q==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",m&&x.classList.add("form-check");let D=u.options||[];Array.isArray(a[r][u.key])||(a[r][u.key]=a[r][u.key]?[a[r][u.key]]:[]),D.forEach(S=>{let B=`voc-form-${s.key}-${u.key}-${r}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-checkbox-item",m&&R.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",m&&M.classList.add("form-check-input"),M.id=B,M.value=S.value,M.checked=Array.isArray(a[r][u.key])&&a[r][u.key].includes(S.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][u.key])||(a[r][u.key]=[]),K?a[r][u.key].includes(S.value)||a[r][u.key].push(S.value):a[r][u.key]=a[r][u.key].filter(Y=>Y!==S.value),k()});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-checkbox-label",m&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else if(q==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",m&&x.classList.add("form-check");let D=u.options||[];a[r][u.key]===void 0&&(a[r][u.key]=""),D.forEach(S=>{let B=`voc-form-${s.key}-${u.key}-${r}-${S.value}`,R=document.createElement("div");R.className="voc-form-table-radio-item",m&&R.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",m&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${s.key}-${u.key}-${r}`,M.value=S.value,M.checked=a[r][u.key]===S.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][u.key]=O.target.value,k())});let $=document.createElement("label");$.htmlFor=B,$.className="voc-form-table-radio-label",m&&$.classList.add("form-check-label"),$.textContent=S.label,R.appendChild(M),R.appendChild($),x.appendChild(R)}),T=x}else{let x=document.createElement("input");q==="number"?x.type="number":q==="email"?x.type="email":q==="tel"?x.type="tel":q==="url"?x.type="url":q==="date"?x.type="date":x.type="text",x.value=i[u.key]!==void 0&&i[u.key]!==null?String(i[u.key]):"",u.placeholder&&(x.placeholder=u.placeholder),u.required&&(x.required=!0),x.className="voc-form-table-cell",m&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[r][u.key]=D.target.value,k()}),T=x}F.appendChild(T),o.appendChild(F)});let _=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",m&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),k()}),_.appendChild(H),o.appendChild(_),w.appendChild(o)})}return g.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),k()}),Array.isArray(p)&&p.length?a=p.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),k(),b.validate=function(){let n=[];return a.forEach((i,r)=>{let o=E(i);o.length&&n.push(`Row ${r+1}: ${o.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(i=>{let r=new Set;a.forEach((o,A)=>{let N=o[i];N!=null&&(r.has(N)&&n.push(`Field ${i} must be unique (duplicate at row ${A+1})`),r.add(N))})}),n},b}async function Q(s){let p=new TextEncoder().encode(s),b=await crypto.subtle.digest("SHA-256",p);return Array.from(new Uint8Array(b)).map(d=>d.toString(16).padStart(2,"0")).join("")}async function X(s){let L=String(s||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await Q(L)}?d=mp`:""}function G(s,L,p){let b=L?.style==="bootstrap",m=document.createElement("div");m.className="voc-form-users";let d=document.createElement("div");if(d.className="voc-form-users-header",b&&d.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",b&&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)}d.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",b&&e.classList.add("form-text"),e.textContent=s.description,d.appendChild(e)}m.appendChild(d);let y=document.createElement("div");y.className="voc-form-users-search-wrapper";let c=document.createElement("input");if(c.type="search",c.placeholder="Search users...",c.className="voc-form-users-search",b&&c.classList.add("form-control","mb-2"),y.appendChild(c),m.appendChild(y),!s.options||s.options.length===0)return m;let h=document.createElement("div");h.className="voc-form-users-list",b&&h.classList.add("list-group");let C=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,f=[];if(Array.isArray(p)?f=p:p!=null?f=[p]:Array.isArray(s.default)&&(f=s.default),s.options.forEach((e,l)=>{let v=document.createElement("div");v.className="voc-form-user-item",v.dataset.label=String(e.label||"").toLowerCase(),v.dataset.email=String(e.email||"").toLowerCase(),v.dataset.value=String(e.value||"").toLowerCase(),b&&v.classList.add("d-flex","align-items-center","gap-2");let a=document.createElement("input");if(a.type="checkbox",a.name=`${C}[]`,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",f&&Array.isArray(f)){let i=f.map(r=>String(r));a.checked=i.includes(String(e.value))}let k=document.createElement("img");k.className="voc-form-user-avatar",k.alt=e.label||String(e.value||"user"),k.style.width=k.style.height="40px",k.style.objectFit="cover",k.style.borderRadius="50%",k.src="",e.email&&X(e.email).then(i=>{i&&(k.src=i)}).catch(()=>{});let E=document.createElement("div");E.className="voc-form-user-info",E.style.display="flex",E.style.flexDirection="column",E.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||"",E.appendChild(t),E.appendChild(n),v.addEventListener("click",i=>{let r=i.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?v.classList.add("selected"):v.classList.remove("selected")}),a.checked&&v.classList.add("selected"),v.appendChild(a),v.appendChild(k),v.appendChild(E),h.appendChild(v)}),m.appendChild(h),s.required){let e=h.querySelectorAll('input[type="checkbox"]'),l=()=>{let v=Array.from(e).some(a=>a.checked);return e.forEach(a=>{v?a.setCustomValidity(""):a.setCustomValidity("At least one option must be selected.")}),v};e.forEach(v=>{v.addEventListener("change",l)}),m._validateCheckboxGroup=l,l()}let w=Array.from(h.querySelectorAll(".voc-form-user-item")),g=()=>{let e=String(c.value||"").trim().toLowerCase();if(!e){w.forEach(l=>l.style.setProperty("display","flex","important"));return}w.forEach(l=>{let v=l.dataset.label||"",a=l.dataset.email||"",k=l.dataset.value||"",E=v.includes(e)||a.includes(e)||k.includes(e);l.style.setProperty("display",E?"flex":"none","important")})};return c.addEventListener("input",g),m}function U(s,L,p){let b=L?.style==="bootstrap",m=document.createElement("div");m.className="voc-form-timezone";let d=s.name||s.key||`timezone_${Math.random().toString(36).substr(2,6)}`,y=document.createElement("input");y.type="text",y.name=d,s.key&&(y.id=`voc-form-${s.key}`),y.className="voc-form-timezone-input",b&&y.classList.add("form-control"),s.placeholder&&(y.placeholder=s.placeholder||""),s.required&&(y.required=!0),s.width&&(y.style.width=s.width),p!=null?y.value=String(p):s.default!==void 0&&s.default!==null&&(y.value=String(s.default));let c=document.createElement("datalist");c.id=`voc-form-timezone-list-${s.key||Math.random().toString(36).substr(2,6)}`,y.setAttribute("list",c.id),["UTC","Etc/UTC","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"].forEach(w=>{let g=document.createElement("option");g.value=w,c.appendChild(g)});let f={"Australia/ACT":"Australia/Sydney",ACT:"Australia/Sydney",Canberra:"Australia/Sydney"};if(y.addEventListener("blur",()=>{let w=(y.value||"").trim();if(!w)return;let g=Object.keys(f).find(e=>e.toLowerCase()===w.toLowerCase());g&&(y.value=f[g])}),s.description){let w=document.createElement("div");w.className="voc-form-timezone-description",b&&w.classList.add("form-text"),w.textContent=s.description,m.appendChild(w)}return m.appendChild(y),m.appendChild(c),m}function I(s,L=!0){let p=new FormData(s);if(L)return Z(p);let b={};return p.forEach((m,d)=>{let y=(m instanceof File,m);Object.prototype.hasOwnProperty.call(b,d)?Array.isArray(b[d])?b[d].push(y):b[d]=[b[d],y]:b[d]=y}),b}function Z(s){let L=new FormData;for(let[p,b]of s.entries()){if(b instanceof File){L.append(p,b);continue}let m;try{m=JSON.parse(b)}catch{m=null}Array.isArray(m)?m.length===0?L.append(p,"[]"):m.every(d=>typeof d=="object"&&d!==null)?m.forEach((d,y)=>{for(let[c,h]of Object.entries(d))L.append(`${p}[${y}][${c}]`,h)}):L.append(p,b):L.append(p,b)}return L}async function V(s,L,p){let b=L.url,m={"Content-Type":"application/json"};L?.api_token&&(m.Authorization=`Bearer ${L.api_token}`);let d=I(s);if(L?.additional_data)for(let[h,C]of Object.entries(L.additional_data))d.append(h,C);let y,c=d instanceof FormData;y={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...c?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:c?d:JSON.stringify(Object.fromEntries(d.entries()))};try{fetch(b,y).then(async h=>{let C=h.headers.get("content-type");if(!h.ok)try{let w=(await h.json())?.message;throw new Error(w??"Their was an error submitting the form. Check your form and try again.")}catch(f){throw new Error(f.message)}return C&&C.includes("application/json")?h.json():h.text()}).then(h=>{p&&p(h,null)}).catch(h=>{p&&p(null,h)})}catch(h){p&&p(null,h)}}function J(s,L,p){let b=[];if(typeof s=="string"?b=Array.from(document.querySelectorAll(s)):b=[s],b.length===0)return null;function m(){let c=p?.style==="bootstrap",h=document.createElement("form");h.classList.add("voc-form"),c&&h.classList.add("needs-validation"),h.id=L.id;let C=document.createElement("h2");C.className="voc-form-title",c&&C.classList.add("mb-3"),C.textContent=L.form_name,h.appendChild(C);function f(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 w(e){if(!e.key&&!e.label)return null;let l=L.default_values||{},v=e.name||e.key,a=v?l[v]:void 0,k=document.createElement("div");if(k.className="voc-form-group",c&&k.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),c&&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)}k.appendChild(t)}let E=null;switch(e.type){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,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),c&&r.classList.add("form-check"),r.style.display=e.direction==="horizontal"?"inline-block":"block",e.width&&(r.style.width=e.width);let o=document.createElement("input");o.type="checkbox",o.classList.add("voc-form-checkbox"),c&&o.classList.add("form-check-input"),o.name=`${e.name||e.key||""}[]`,o.value=n.value,e.key&&(o.id=`voc-form-${e.key}-${i}`),Array.isArray(a)?a.includes(n.value)&&(o.checked=!0):a!==void 0?a===n.value&&(o.checked=!0):e.default===n.value&&(o.checked=!0),r.appendChild(o),r.appendChild(document.createTextNode(n.label)),t.appendChild(r)}),e.required){let n=t.querySelectorAll('input[type="checkbox"]'),i=()=>{let r=Array.from(n).some(o=>o.checked);return n.forEach(o=>{r?o.setCustomValidity(""):o.setCustomValidity("At least one option must be selected.")}),r};n.forEach(r=>{r.addEventListener("change",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),c&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),c&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}E=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),c&&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 i=(n.match(/\n/g)||[]).length,r=80,o=n.split(`
|
|
2
|
-
`).reduce((
|
|
1
|
+
function z(s,L,y){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-avatar-wrapper",E&&h.classList.add("d-flex","align-items-center","gap-3");let f=document.createElement("img");f.className="voc-form-avatar-preview",f.alt=s.label||"avatar",E&&(f.classList.add("img-thumbnail","rounded-circle"),f.style.width=f.style.height="64px",f.style.objectFit="cover");let u=y!=null?String(y):s.default!==void 0&&s.default!==null?String(s.default):"";u?f.src=u:(f.src="",f.style.display="none");let o=document.createElement("input");o.type="file",o.accept=s.accept||"image/*",o.className="voc-form-avatar-input",E&&o.classList.add("form-control"),(s.key||s.name)&&(o.name=s.name||s.key,s.key&&(o.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||"",o.addEventListener("change",p=>{let b=p.target;if(b.files&&b.files.length>0){let A=b.files[0],k=new FileReader;k.onload=()=>{f.src=String(k.result),f.style.display="",d.value=""},k.readAsDataURL(A)}}),E){let p=document.createElement("div");p.style.flex="1",p.appendChild(o),p.appendChild(d),h.appendChild(f),h.appendChild(p)}else h.appendChild(f),h.appendChild(o),h.appendChild(d);return h}function j(s,L,y){let E=L?.style==="bootstrap",h=document.createElement("div");if(h.className="voc-form-audio-select",!s.options||s.options.length===0)return h;let f=s.name||s.key||`audio_select_${Math.random().toString(36).substr(2,6)}`,u;return Array.isArray(y)?u=y[0]:y!==void 0?u=y:s.default!==void 0&&(u=s.default),s.options.forEach((o,d)=>{let p=document.createElement("div");p.className="voc-form-audio-item",E&&p.classList.add("form-check");let b=document.createElement("input");b.type="radio",b.name=f,b.value=o.value,b.className="voc-form-audio-radio",s.key&&(b.id=`voc-form-${s.key}-${d}`),s.required&&d===0&&(b.required=!0),b.style.position="absolute",b.style.width="1px",b.style.height="1px",b.style.margin="0",b.style.padding="0",b.style.clip="rect(0 0 0 0)",b.style.clipPath="inset(50%)",b.style.overflow="hidden",b.style.border="0",u!==void 0&&(Array.isArray(u)?b.checked=u.includes(o.value):b.checked=String(u)===String(o.value));let A=()=>{b.checked?p.classList.add("selected"):p.classList.remove("selected")};b.addEventListener("change",()=>{h.querySelectorAll(".voc-form-audio-item").forEach(n=>n.classList.remove("selected")),A()}),b.checked&&p.classList.add("selected");let k=document.createElement("label");k.className="voc-form-audio-label",E&&k.classList.add("form-check-label"),k.htmlFor=b.id||"",k.textContent=o.label||o.value,k.tabIndex=0;let e=document.createElement("div");e.className="voc-form-audio-control";let c=null;if(o.audio_link){let t=document.createElement("button");t.type="button",t.className="voc-form-audio-play",E&&t.classList.add("btn","btn-sm","btn-outline-secondary"),t.setAttribute("aria-label",`Play ${o.label||o.value}`);let n="http://www.w3.org/2000/svg",i=document.createElementNS(n,"svg");i.setAttribute("viewBox","0 0 24 24"),i.setAttribute("width","16"),i.setAttribute("height","16"),i.setAttribute("aria-hidden","true");let r=document.createElementNS(n,"path");r.setAttribute("d","M8 5v14l11-7z"),r.setAttribute("fill","currentColor"),i.appendChild(r),t.appendChild(i),c=document.createElement("audio"),c.src=o.audio_link,c.preload="none",c.style.display="none";let l=v=>{for(;v.firstChild;)v.removeChild(v.firstChild)},w=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"path");return T.setAttribute("d","M8 5v14l11-7z"),T.setAttribute("fill","currentColor"),F.appendChild(T),F},S=()=>{let v="http://www.w3.org/2000/svg",F=document.createElementNS(v,"svg");F.setAttribute("viewBox","0 0 24 24"),F.setAttribute("width","16"),F.setAttribute("height","16"),F.setAttribute("aria-hidden","true");let T=document.createElementNS(v,"rect");return T.setAttribute("x","6"),T.setAttribute("y","6"),T.setAttribute("width","12"),T.setAttribute("height","12"),T.setAttribute("fill","currentColor"),F.appendChild(T),F};l(t),t.appendChild(w());let R=v=>{l(t),v?(t.appendChild(S()),t.setAttribute("aria-label",`Stop ${o.label||o.value}`)):(t.appendChild(w()),t.setAttribute("aria-label",`Play ${o.label||o.value}`))};t.addEventListener("click",()=>{try{if(!c)return;let v=h.querySelectorAll("audio");if(!c.paused&&!c.ended){c.pause(),c.currentTime=0;return}v.forEach(T=>{try{T.pause(),T.currentTime=0}catch{}}),h.querySelectorAll(".voc-form-audio-item").forEach(T=>T.classList.remove("is-playing")),c.play()}catch(v){console.warn("audio play failed",v)}}),c.addEventListener("playing",()=>{p.classList.add("is-playing"),R(!0)});let H=()=>{p.classList.remove("is-playing"),R(!1)};c.addEventListener("pause",H),c.addEventListener("ended",H),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(b),a.appendChild(k);let g=document.createElement("div");g.className="voc-form-item-description";let C=o.description||o.hint_text||"";C&&(g.textContent=C),m.appendChild(a),m.appendChild(g),e.appendChild(m),p.appendChild(e),a.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),p.addEventListener("click",t=>{let n=t.target;n&&n.closest(".voc-form-audio-play")||(b.checked=!0,b.dispatchEvent(new Event("change",{bubbles:!0})))}),h.appendChild(p)}),h}function W(s,L,y){let E=document.createElement("div");E.className="voc-form-table-wrapper";let h=L?.style==="bootstrap",f=document.createElement("input");f.type="hidden",f.name=s.name||s.key,s.key&&(f.id=`voc-form-${s.key}`),E.appendChild(f);let u=document.createElement("table");u.className="voc-form-table",h&&u.classList.add("table","table-bordered");let o=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 i=document.createElement("th");i.textContent=n.label||n.key,d.appendChild(i)});let b=document.createElement("th");b.textContent="Actions",d.appendChild(b),o.appendChild(d),u.appendChild(o);let A=document.createElement("tbody");u.appendChild(A),E.appendChild(u);let k=document.createElement("button");k.type="button",k.className="voc-form-table-add",h&&k.classList.add("btn","btn-secondary"),k.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(k),c.appendChild(m),e.appendChild(c),u.appendChild(e),E.appendChild(u);let a=[];function g(){f.value=JSON.stringify(a)}function C(n){let i=[];return s.fields.forEach(r=>{let l=n[r.key];if(r.type==="checkbox"){let w=Array.isArray(l)?l:l?[l]:[];r.required&&w.length===0&&i.push(`${r.label||r.key} is required`);return}r.required&&(l==null||String(l).trim()==="")&&i.push(`${r.label||r.key} is required`),r.type==="email"&&l&&(/^\S+@\S+\.\S+$/.test(String(l))||i.push(`${r.label||r.key} must be a valid email`)),r.type==="number"&&l&&isNaN(Number(l))&&i.push(`${r.label||r.key} must be a number`),r.validation&&r.validation.regex&&l&&(new RegExp(r.validation.regex).test(String(l))||i.push(`${r.label||r.key} invalid format`))}),i}function t(){A.innerHTML="";let n=(i,r)=>{r.draggable=!0,r.addEventListener("mousedown",()=>{r.style.cursor="grabbing"}),r.addEventListener("mouseup",()=>{r.style.cursor="grab"}),r.addEventListener("dragstart",l=>{let w=Number(i.dataset.rowIndex);l.dataTransfer.setData("text/plain",String(w)),i.classList.add("dragging");try{l.dataTransfer?.setDragImage(r,10,10)}catch{}}),r.addEventListener("dragend",()=>{i.classList.remove("dragging"),r.style.cursor="grab"}),i.addEventListener("dragover",l=>{l.preventDefault();let w=l.currentTarget,S=w.getBoundingClientRect(),R=S.top+S.height/2,H=(l.clientY||l.y)>R;w.classList.remove("drag-over-top","drag-over-bottom"),H?(w.classList.add("drag-over-bottom"),w.dataset.dropPosition="after"):(w.classList.add("drag-over-top"),w.dataset.dropPosition="before")}),i.addEventListener("dragleave",l=>{let w=l.currentTarget;w.classList.remove("drag-over-top","drag-over-bottom"),delete w.dataset.dropPosition}),i.addEventListener("drop",l=>{l.preventDefault();let w=l.dataTransfer.getData("text/plain"),S=Number(l.currentTarget.dataset.rowIndex),R=Number(w),H=l.currentTarget.dataset.dropPosition||"before";if(isNaN(R)||isNaN(S))return;let[v]=a.splice(R,1),F=S;R<S&&(F=S-1);let T=H==="after"?F+1:F;a.splice(T,0,v),l.currentTarget.classList.remove("drag-over-top","drag-over-bottom"),delete l.currentTarget.dataset.dropPosition,t(),g()})};a.forEach((i,r)=>{let l=document.createElement("tr");l.dataset.rowIndex=String(r),l.classList.add("voc-form-table-row");let w=document.createElement("td");w.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",w.appendChild(S),l.appendChild(w),n(l,S),s.fields.forEach(v=>{let F=document.createElement("td"),T,$=(v.type||"text").toLowerCase();if($==="select"){let x=document.createElement("select");if(x.className="voc-form-table-cell",h&&x.classList.add("form-control"),v.placeholder){let N=document.createElement("option");N.value="",N.textContent=v.placeholder,N.disabled=!0,(i[v.key]===void 0||i[v.key]===null||i[v.key]==="")&&(N.selected=!0),x.appendChild(N)}(v.options||[]).forEach(N=>{let B=document.createElement("option");B.value=N.value,B.textContent=N.label,x.appendChild(B)}),x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.required&&(x.required=!0),x.addEventListener("change",N=>{a[r][v.key]=N.target.value,g()}),T=x}else if($==="checkbox"){let x=document.createElement("div");x.className="voc-form-table-checkboxes",h&&x.classList.add("form-check");let D=v.options||[];Array.isArray(a[r][v.key])||(a[r][v.key]=a[r][v.key]?[a[r][v.key]]:[]),D.forEach(N=>{let B=`voc-form-${s.key}-${v.key}-${r}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-checkbox-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="checkbox",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.value=N.value,M.checked=Array.isArray(a[r][v.key])&&a[r][v.key].includes(N.value),M.addEventListener("change",O=>{let K=O.target.checked;Array.isArray(a[r][v.key])||(a[r][v.key]=[]),K?a[r][v.key].includes(N.value)||a[r][v.key].push(N.value):a[r][v.key]=a[r][v.key].filter(Q=>Q!==N.value),g()});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-checkbox-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else if($==="radio"){let x=document.createElement("div");x.className="voc-form-table-radios",h&&x.classList.add("form-check");let D=v.options||[];a[r][v.key]===void 0&&(a[r][v.key]=""),D.forEach(N=>{let B=`voc-form-${s.key}-${v.key}-${r}-${N.value}`,_=document.createElement("div");_.className="voc-form-table-radio-item",h&&_.classList.add("form-check");let M=document.createElement("input");M.type="radio",M.className="voc-form-table-cell",h&&M.classList.add("form-check-input"),M.id=B,M.name=`voc-form-${s.key}-${v.key}-${r}`,M.value=N.value,M.checked=a[r][v.key]===N.value,M.addEventListener("change",O=>{O.target.checked&&(a[r][v.key]=O.target.value,g())});let q=document.createElement("label");q.htmlFor=B,q.className="voc-form-table-radio-label",h&&q.classList.add("form-check-label"),q.textContent=N.label,_.appendChild(M),_.appendChild(q),x.appendChild(_)}),T=x}else{let x=document.createElement("input");$==="number"?x.type="number":$==="email"?x.type="email":$==="tel"?x.type="tel":$==="url"?x.type="url":$==="date"?x.type="date":x.type="text",x.value=i[v.key]!==void 0&&i[v.key]!==null?String(i[v.key]):"",v.placeholder&&(x.placeholder=v.placeholder),v.required&&(x.required=!0),x.className="voc-form-table-cell",h&&x.classList.add("form-control"),x.addEventListener("input",D=>{a[r][v.key]=D.target.value,g()}),T=x}F.appendChild(T),l.appendChild(F)});let R=document.createElement("td"),H=document.createElement("button");H.type="button",H.className="voc-form-table-remove",h&&H.classList.add("btn","btn-danger"),H.textContent="Remove",H.addEventListener("click",()=>{a.splice(r,1),t(),g()}),R.appendChild(H),l.appendChild(R),A.appendChild(l)})}return k.addEventListener("click",()=>{if(s.validation?.max_rows!==void 0&&a.length>=s.validation.max_rows)return;let n={};s.fields.forEach(i=>n[i.key]=""),a.push(n),t(),g()}),Array.isArray(y)&&y.length?a=y.map(n=>({...n})):s.default&&Array.isArray(s.default)&&(a=s.default.map(n=>({...n}))),t(),g(),E.validate=function(){let n=[];return a.forEach((i,r)=>{let l=C(i);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(i=>{let r=new Set;a.forEach((l,w)=>{let S=l[i];S!=null&&(r.has(S)&&n.push(`Field ${i} must be unique (duplicate at row ${w+1})`),r.add(S))})}),n},E}async function X(s){let y=new TextEncoder().encode(s),E=await crypto.subtle.digest("SHA-256",y);return Array.from(new Uint8Array(E)).map(f=>f.toString(16).padStart(2,"0")).join("")}async function Z(s){let L=String(s||"").trim().toLowerCase();return L?`https://gravatar.com/avatar/${await X(L)}?d=mp`:""}function G(s,L,y){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-users";let f=document.createElement("div");if(f.className="voc-form-users-header",E&&f.classList.add("mb-2"),s.label){let e=document.createElement("div");if(e.className="voc-form-users-label",E&&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)}f.appendChild(e)}if(s.description){let e=document.createElement("div");e.className="voc-form-users-description",E&&e.classList.add("form-text"),e.textContent=s.description,f.appendChild(e)}h.appendChild(f);let u=document.createElement("div");u.className="voc-form-users-search-wrapper";let o=document.createElement("input");if(o.type="search",o.placeholder="Search users...",o.className="voc-form-users-search",E&&o.classList.add("form-control","mb-2"),u.appendChild(o),h.appendChild(u),!s.options||s.options.length===0)return h;let d=document.createElement("div");d.className="voc-form-users-list",E&&d.classList.add("list-group");let p=s.name||s.key||`users_${Math.random().toString(36).substr(2,6)}`,b=[];if(Array.isArray(y)?b=y:y!=null?b=[y]:Array.isArray(s.default)&&(b=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(),E&&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",b&&Array.isArray(b)){let i=b.map(r=>String(r));a.checked=i.includes(String(e.value))}let g=document.createElement("img");g.className="voc-form-user-avatar",g.alt=e.label||String(e.value||"user"),g.style.width=g.style.height="40px",g.style.objectFit="cover",g.style.borderRadius="50%",g.src="",e.email&&Z(e.email).then(i=>{i&&(g.src=i)}).catch(()=>{});let C=document.createElement("div");C.className="voc-form-user-info",C.style.display="flex",C.style.flexDirection="column",C.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||"",C.appendChild(t),C.appendChild(n),m.addEventListener("click",i=>{let r=i.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(g),m.appendChild(C),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 A=Array.from(d.querySelectorAll(".voc-form-user-item")),k=()=>{let e=String(o.value||"").trim().toLowerCase();if(!e){A.forEach(c=>c.style.setProperty("display","flex","important"));return}A.forEach(c=>{let m=c.dataset.label||"",a=c.dataset.email||"",g=c.dataset.value||"",C=m.includes(e)||a.includes(e)||g.includes(e);c.style.setProperty("display",C?"flex":"none","important")})};return o.addEventListener("input",k),h}function V(s,L,y){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-timezone";let f=s.name||s.key||`timezone_${Math.random().toString(36).substr(2,6)}`,u=document.createElement("input");u.type="text",u.name=f,s.key&&(u.id=`voc-form-${s.key}`),u.className="voc-form-timezone-input",E&&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"),y!=null?u.value=String(y):s.default!==void 0&&s.default!==null&&(u.value=String(s.default));let o=document.createElement("div");o.className="voc-form-timezone-control",o.style.position="relative",o.style.display="inline-block",o.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 A=["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 k(t){p.innerHTML="",t.forEach((n,i)=>{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)})}k(A);let e=-1;function c(){Array.from(p.children).forEach((n,i)=>{i===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 g(){p.style.display==="none"?m():a()}u.addEventListener("input",()=>{let t=(u.value||"").trim().toLowerCase(),n=t?A.filter(i=>i.toLowerCase().includes(t)):A;k(n),m()}),d.addEventListener("click",t=>{t.preventDefault(),p.style.display==="none"?(k(A),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 i=n[e];u.value=i.dataset.value||i.textContent||"",a(),u.dispatchEvent(new Event("change",{bubbles:!0}))}}else t.key==="Escape"&&a()}),document.addEventListener("click",t=>{o.contains(t.target)||a()});let C={"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(C).find(i=>i.toLowerCase()===t.toLowerCase());n&&(u.value=C[n])}),s.description){let t=document.createElement("div");t.className="voc-form-timezone-description",E&&t.classList.add("form-text"),t.textContent=s.description,h.appendChild(t)}return o.appendChild(u),o.appendChild(d),o.appendChild(p),h.appendChild(o),h}function U(s,L,y){let E=L?.style==="bootstrap",h=document.createElement("div");h.className="voc-form-tags";let f=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 o=document.createElement("input");o.type="text",o.className="voc-form-tags-input",o.style.border="none",o.style.flex="1 0 120px",o.style.minWidth="80px",o.style.outline="none",o.placeholder=s.placeholder||"",E&&o.classList.add("form-control");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 b(){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=`${f}[]`,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 A(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 g=document.createElement("button");return g.type="button",g.textContent="\xD7",g.style.border="none",g.style.background="transparent",g.style.cursor="pointer",g.addEventListener("click",()=>{let C=d.indexOf(c);C>=0&&(d.splice(C,1),u.removeChild(m),b())}),m.appendChild(g),m}function k(c){let m=c.trim();if(!m||d.includes(m))return;d.push(m);let a=A(m);u.insertBefore(a,o),b()}let e=y!=null?String(y):s.default||"";return e&&e.split(",").map(c=>c.trim()).filter(Boolean).forEach(k),o.addEventListener("keydown",c=>{if(c.key==="Enter"||c.key===",")c.preventDefault(),k(o.value),o.value="";else if(c.key==="Backspace"&&o.value===""&&d.pop()){let a=Array.from(u.querySelectorAll(".voc-form-tag")),g=a[a.length-1];g&&u.removeChild(g),b()}}),o.addEventListener("paste",c=>{let m=c.clipboardData?.getData("text");m&&(c.preventDefault(),m.split(/[,\n\r]+/).map(a=>a.trim()).filter(Boolean).forEach(k),o.value="")}),h.getTags=()=>d.slice(),h.addTag=k,u.appendChild(o),h.appendChild(u),b(),h}function I(s,L=!0){let y=new FormData(s);if(L)return ee(y);let E={};return y.forEach((h,f)=>{let u=(h instanceof File,h);Object.prototype.hasOwnProperty.call(E,f)?Array.isArray(E[f])?E[f].push(u):E[f]=[E[f],u]:E[f]=u}),E}function ee(s){let L=new FormData;for(let[y,E]of s.entries()){if(E instanceof File){L.append(y,E);continue}let h;try{h=JSON.parse(E)}catch{h=null}Array.isArray(h)?h.length===0?L.append(y,"[]"):h.every(f=>typeof f=="object"&&f!==null)?h.forEach((f,u)=>{for(let[o,d]of Object.entries(f))L.append(`${y}[${u}][${o}]`,d)}):L.append(y,E):L.append(y,E)}return L}async function J(s,L,y){let E=L.url,h={"Content-Type":"application/json"};L?.api_token&&(h.Authorization=`Bearer ${L.api_token}`);let f=I(s);if(L?.additional_data)for(let[d,p]of Object.entries(L.additional_data))f.append(d,p);let u,o=f instanceof FormData;u={method:"POST",headers:{Authorization:`Bearer ${L.api_token}`,...o?{}:{"Content-Type":"application/json"},Accept:"application/json"},body:o?f:JSON.stringify(Object.fromEntries(f.entries()))};try{fetch(E,u).then(async d=>{let p=d.headers.get("content-type");if(!d.ok)try{let A=(await d.json())?.message;throw new Error(A??"Their was an error submitting the form. Check your form and try again.")}catch(b){throw new Error(b.message)}return p&&p.includes("application/json")?d.json():d.text()}).then(d=>{y&&y(d,null)}).catch(d=>{y&&y(null,d)})}catch(d){y&&y(null,d)}}function Y(s,L,y){let E=[];if(typeof s=="string"?E=Array.from(document.querySelectorAll(s)):E=[s],E.length===0)return null;function h(){let o=y?.style==="bootstrap",d=document.createElement("form");d.classList.add("voc-form"),o&&d.classList.add("needs-validation"),d.id=L.id;let p=document.createElement("h2");p.className="voc-form-title",o&&p.classList.add("mb-3"),p.textContent=L.form_name,d.appendChild(p);function b(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 A(e){if(!e.key&&!e.label)return null;let c=L.default_values||{},m=e.name||e.key,a=m?c[m]:void 0,g=document.createElement("div");if(g.className="voc-form-group",o&&g.classList.add("mb-3"),e.label&&e.type!=="users"){let t=document.createElement("label");if(t.classList.add("voc-form-label"),o&&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)}g.appendChild(t)}let C=null;switch(e.type){case"tags":{C=U(e,y||{},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,i)=>{let r=document.createElement("label");r.classList.add("voc-form-checkbox-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=`${e.name||e.key||""}[]`,l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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"]'),i=()=>{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",i)}),t._validateCheckboxGroup=i,i()}}else{let n=document.createElement("label");n.classList.add("voc-form-checkbox-label"),o&&n.classList.add("form-check"),e.width&&(n.style.width=e.width);let i=document.createElement("input");i.type="checkbox",i.classList.add("voc-form-checkbox"),(e.key||e.name)&&(i.name=e.name||e.key,e.key&&(i.id=`voc-form-${e.key}`)),o&&i.classList.add("form-check-input"),e.required&&(i.required=!0),a!==void 0?i.checked=!!a:e.default&&(i.checked=!!e.default),n.appendChild(i),n.appendChild(document.createTextNode(e.label||"")),t.appendChild(n)}C=t;break}case"textarea":{let t=document.createElement("textarea");t.classList.add("voc-form-textarea"),o&&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 i=(n.match(/\n/g)||[]).length,r=80,l=n.split(`
|
|
2
|
+
`).reduce((R,H)=>Math.max(R,H.length),0),w=Math.ceil(l/r)||1,S=Math.max(2,i+w);t.rows=S,t.style.resize="vertical"}e.width&&(t.style.width=e.width),e.required&&(t.required=!0),b(t,e.validation),C=t;break}case"select":{let t=document.createElement("select");if(t.classList.add("voc-form-select"),o&&t.classList.add("form-select"),o&&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 i=document.createElement("option");i.value=n.value,i.textContent=n.label,Array.isArray(a)?a.includes(n.value)&&(i.selected=!0):a!==void 0?a===n.value&&(i.selected=!0):e.default===n.value&&(i.selected=!0),t.appendChild(i)}),e.width&&(t.style.width=e.width),C=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,i)=>{let r=document.createElement("label");r.classList.add("voc-form-radio-label"),o&&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"),o&&l.classList.add("form-check-input"),l.name=e.name||e.key||"",l.value=n.value,e.key&&(l.id=`voc-form-${e.key}-${i}`),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)}),C=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"),o&&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),C=t;break}case"avatar":{C=z(e,y||{},a);break}case"table":{C=W(e,y||{},a);break}case"users":{C=G(e,y||{},a);break}case"timezone":{C=V(e,y||{},a);break}case"audio_select":{C=j(e,y||{},a);break}default:{let t=document.createElement("input");t.type=e.type||"text",t.classList.add("voc-form-input"),o&&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),b(t,e.validation),C=t;break}}if(C&&g.appendChild(C),e.hint_text){let t=document.createElement("small");t.className="voc-form-hint",t.textContent=e.hint_text,g.appendChild(t)}return g}L.fields.forEach(e=>{if(e.type==="group"&&"items"in e){let c=e;if(o){let m=document.createElement("div");m.className="card voc-form-group-card mb-3";let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){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(g){let n=document.createElement("p");n.className="mb-0 voc-form-group-description",n.textContent=g,t.appendChild(n)}m.appendChild(t)}let C=document.createElement("div");C.className="card-body voc-form-group-body",c.items.forEach(t=>{if(t.type==="row"&&"items"in t){let n=t,i=document.createElement("div");if(i.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,i.appendChild(l)}let r=document.createElement("div");r.className="voc-form-row-items "+(n.direction||"horizontal"),n.items.forEach(l=>{let w=A(l);w&&r.appendChild(w)}),i.appendChild(r),C.appendChild(i)}else{let n=A(t);n&&C.appendChild(n)}}),m.appendChild(C),d.appendChild(m)}else{let m=document.createElement("div");m.className="voc-form-group voc-form-group-wrapper",o&&m.classList.add("mb-3");let a=c.label||c.header?.title,g=c.description||c.header?.description;if(a||g){let C=document.createElement("div");if(C.className="voc-form-group-head",a){let t=document.createElement("h3");t.className="voc-form-group-label",t.textContent=a,C.appendChild(t)}if(g){let t=document.createElement("p");t.className="voc-form-group-description",t.textContent=g,C.appendChild(t)}m.appendChild(C)}c.items.forEach(C=>{if(C.type==="row"&&"items"in C){let t=C,n=document.createElement("div");if(n.className="voc-form-group voc-form-row",o&&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 i=document.createElement("div");i.className="voc-form-row-items "+(t.direction||"horizontal"),t.items.forEach(r=>{let l=A(r);l&&i.appendChild(l)}),n.appendChild(i),m.appendChild(n)}else{let t=A(C);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",o&&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 g=A(a);g&&m.appendChild(g)}),d.appendChild(c)}else{let c=A(e);c&&d.appendChild(c)}});let k=document.createElement("button");return k.type="submit",k.className="voc-form-submit",k.textContent="Submit",o&&k.classList.add("btn","btn-primary"),d.appendChild(k),d}let f=h();E[0].appendChild(f);let u=L?.submit_config??y?.submit_config??null;return u&&f.addEventListener("submit",o=>{o.preventDefault();let d=Array.from(f.querySelectorAll(".voc-form-checkbox-group, .voc-form-users")),p=[];if(d.forEach(k=>{k&&typeof k._validateCheckboxGroup=="function"&&(k._validateCheckboxGroup()||k.querySelector('input[type="checkbox"]')&&p.push("Please select at least one option"))}),!f.checkValidity()){f.reportValidity(),y?.onSubmitResult&&y.onSubmitResult(null,new Error("Form validation failed"));return}let b=Array.from(f.querySelectorAll(" .voc-form-table-wrapper, .voc-form-table-wrapper")),A=[];if(b.forEach(k=>{if(k&&typeof k.validate=="function"){let e=k.validate();e&&e.length&&A.push(...e)}}),A.length){y?.onSubmitResult&&y.onSubmitResult(null,new Error(A.join("; ")));let k=b[0];k&&k.scrollIntoView({behavior:"smooth",block:"center"});return}if(y?.onSubmit){let k=I(f);y.onSubmit(k)}J(f,u,(k,e)=>{y?.onSubmitResult&&y.onSubmitResult(k,e)})}),{element:f,validate:()=>{let o=[];return f.querySelectorAll(":invalid").forEach(p=>{let b=p.validationMessage;o.push({element:p,message:b})}),o},getValues:()=>I(f),onSubmit:o=>{f.addEventListener("submit",d=>{d.preventDefault();let p=I(f);o(p,d)})}}}var P={renderForm:Y};var Ce=P,Le={FormsLib:P};export{Ce as FormsLib,Le as default};
|