formique 1.0.12 → 1.0.13

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/formique.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";class e{renderField(e,n,t,i,s,r){throw new Error("Method renderField must be implemented")}}module.exports=class extends e{constructor(e,n={},t={}){super(),this.formSchema=e,this.formParams=t,this.formSettings={requiredFieldIndicator:!0,placeholders:!0,asteriskHtml:'<span aria-hidden="true" style="color: red;">*</span>',...n},this.themeColor=n.themeColor||null,this.themeColorMap={primary:{"--formique-base-bg":"#ffffff","--formique-base-text":"#333333","--formique-base-shadow":"0 10px 30px rgba(0, 0, 0, 0.1)","--formique-base-label":"#555555","--formique-input-border":"#dddddd","--formique-focus-color":null,"--formique-btn-bg":null,"--formique-btn-text":"#ffffff","--formique-btn-shadow":null}},this.divClass="input-block",this.inputClass="form-input",this.radioGroupClass="radio-group",this.checkboxGroupClass="checkbox-group",this.selectGroupClass="form-select",this.submitButtonClass="form-submit-btn",this.formContainerId=n?.formContainerId||"formique",this.formId=this.formParams?.id||this.generateFormId(),this.formAction=t?.action||"https://httpbin.org/post",this.method="POST",this.formMarkUp="",this.dependencyGraph={},this.redirect=n?.redirect||"",this.redirectURL=n?.redirectURL||"",this.themes=["dark","light","pink","indigo","dark-blue","light-blue","dark-orange","bright-yellow","green","purple","midnight-blush","deep-blue","blue","brown","orange"],this.formiqueEndpoint="https://formiqueapi.onrender.com/api/send-email",document.addEventListener("DOMContentLoaded",(()=>{this.formMarkUp+=this.renderFormElement();const e=this.formSchema.filter((e=>"submit"!==e[0])).map((e=>{const[n,t,i,s,r={},l]=e;return this.renderField(n,t,i,s,r,l)})).join("");this.formMarkUp+=e;const n=this.formSchema.find((e=>"submit"===e[0]));if(n){const[e,t,i,s,r={}]=n,l=r.id||t;let a=this.submitButtonClass;"class"in r&&(a=r.class);let o="";for(const[e,n]of Object.entries(r))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){o+=` ${e}="${n.endsWith("()")?n:`${n}()`}"`}else!0===n?o+=` ${e.replace(/_/g,"-")}`:!1!==n&&(o+=` ${e.replace(/_/g,"-")}="${n}"`);this.formMarkUp+=`\n <div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n </div>\n <input type="submit" id="${l}" class="${a}" value="${i}"${o}>\n `}this.renderFormHTML();const t=document.getElementById(`${this.formId}`);if(t?t.addEventListener("submit",function(e){"email"===this.formSettings.submitMode&&(e.preventDefault(),document.getElementById("formiqueSpinner").style.display="block",this.handleEmailSubmission(this.formId)),this.formSettings.submitOnPage&&(e.preventDefault(),document.getElementById("formiqueSpinner").style.display="block",this.handleOnPageFormSubmission(this.formId))}.bind(this)):console.error(`Form with ID ${this.formId} not found after rendering. Event listener could not be attached.`),this.initDependencyGraph(),this.registerObservers(),this.attachDynamicSelectListeners(),this.themeColor)this.applyCustomTheme(this.themeColor,this.formContainerId);else if(this.formSettings.theme&&this.themes.includes(this.formSettings.theme)){let e=this.formSettings.theme;this.applyTheme(e,this.formContainerId)}else this.applyTheme("dark",this.formContainerId)}))}generateFormId(){return`fmq-${Math.random().toString(36).substr(2,10)}`}initDependencyGraph(){this.dependencyGraph={},this.formSchema.forEach((e=>{const[n,t,i,s,r={}]=e,l=r.id||t;r.dependents&&(this.dependencyGraph[l]=r.dependents.map((e=>{const n=this.formSchema.find((([,n])=>n===e));if(n){const t=n[4]||{};return{dependent:t.id||e,condition:t.condition||null}}console.warn(`Dependent field "${e}" not found in schema.`)})),this.dependencyGraph[l].push({state:null}),this.attachInputChangeListener(l)),r.dependents&&r.dependents.forEach((e=>{const n=this.formSchema.find((([,n])=>n===e)),t=(n&&n[4]||{}).id||e,i=document.querySelector(`#${t}-block`);if(i){i.style.display="none";i.querySelectorAll("input, select, textarea").forEach((e=>{e.hasAttribute("required")&&!0===e.required?(e.setAttribute("data-original-required","true"),e.required=!1):e.setAttribute("data-original-required","false")}))}}))}))}attachInputChangeListener(e){const n=document.getElementById(e);n&&n.addEventListener("input",(n=>{const t=n.target.value;this.handleParentFieldChange(e,t)}))}handleParentFieldChange(e,n){const t=this.dependencyGraph[e];t&&(this.dependencyGraph[e].forEach((e=>{void 0!==e.state&&(e.state=n)})),t.forEach((e=>{if(e.dependent){const t=e.dependent+"-block",i=document.getElementById(t);if(i){const t="function"==typeof e.condition?e.condition(n):n===e.condition;i.style.display=t?"block":"none";i.querySelectorAll("input, select, textarea").forEach((e=>{t?e.required="true"===e.getAttribute("data-original-required"):(e.setAttribute("data-original-required",e.required),e.required=!1)}))}else console.warn(`Wrapper block with ID ${t} not found.`)}})))}registerObservers(){this.formSchema.forEach((e=>{const[n,t,i,s,r={}]=e,l=r.id||t;r.dependents&&r.dependents.forEach((e=>{if(this.dependencyGraph[l]){const n=this.formSchema.find((([,n])=>n===e));if(n){const t=n[4]?.id||e;this.dependencyGraph[l].forEach((n=>{n.dependent===e&&(n.observers||(n.observers=[]),n.observers.push(t))}))}}}))}))}attachDynamicSelectListeners(){this.formSchema.forEach((e=>{const[n,t,i,s,r={}]=e;if("dynamicSingleSelect"===n){const e=r.id||t,n=document.getElementById(e);if(n){if(n.addEventListener("change",(n=>{const t=n.target.value;document.querySelectorAll(`.${e}-subcategory-group`).forEach((e=>{const n=e.querySelector("select");n&&(n.setAttribute("data-original-required",n.required.toString()),n.required=!1),e.style.display="none"}));const i=t+"-options",s=document.getElementById(i);if(s){s.style.display="block";const e=s.querySelector("select");e&&(e.required="true"===e.getAttribute("data-original-required"))}})),n.value){const e=new Event("change");n.dispatchEvent(e)}}else console.warn(`Main dynamic select element with ID ${e} not found.`)}}))}applyTheme(e,n){const t=document.querySelector('link[href*="formique-css"]');t?fetch(t.href).then((e=>e.text())).then((t=>{const i=t.match(new RegExp(`\\.${e}-theme\\s*{([^}]*)}`,"i"));if(!i)return void console.error(`Theme rules for ${e} not found in the stylesheet.`);const s=i[1].trim(),r=document.getElementById(n);if(r){r.classList.add(`${e}-theme`,"formique");const t=document.createElement("style");t.textContent=`\n #${n} {\n ${s}\n }\n `,r.parentNode.insertBefore(t,r)}else console.error(`Form container with ID ${n} not found.`)})).catch((e=>{console.error("Error loading the stylesheet:",e)})):console.error("Stylesheet with 'formique-css' in the name not found!")}applyCustomTheme(e,n){const t=document.getElementById(n);if(!t)return void console.error(`Form container with ID "${n}" not found. Cannot apply custom theme.`);t.classList.add("formique");const i={"--formique-base-bg":"#ffffff","--formique-base-text":"#333333","--formique-base-shadow":"0 10px 30px rgba(0, 0, 0, 0.1)","--formique-base-label":"#555555","--formique-input-border":"#dddddd","--formique-focus-color":e,"--formique-btn-bg":e,"--formique-btn-text":"#ffffff","--formique-btn-shadow":`0 2px 10px ${((e,n)=>{const t=parseInt(e.slice(1),16),i=n,s=t>>16,r=t>>8&255,l=255&t;return"#"+(16777216+65536*(Math.round((255-s)*i)+s)+256*(Math.round((255-r)*i)+r)+(Math.round((255-l)*i)+l)).toString(16).slice(1)})(e,.2)||"rgba(0, 0, 0, 0.1)"}`};let s="";for(const[e,n]of Object.entries(i))s+=` ${e}: ${n};\n`;const r=document.createElement("style");r.textContent=`\n #${n}.formique {\n ${s}\n }\n `,t.parentNode.insertBefore(r,t),console.log(`Applied custom theme with color: ${e} to form container: ${n}`)}renderFormElement(){let e="<form";const n=this.formParams||{};if(n.id||(n.id=this.formId),Object.keys(n).forEach((t=>{const i=n[t];if(null!=i)if("boolean"==typeof i)i&&(e+=` ${t}`);else{const n="accept_charset"===t?"accept-charset":t.replace(/_/g,"-");e+=` ${n}="${i}"`}})),n.laravel){const n=document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");n&&(e+=`<input type="hidden" name="_token" value="${n}">`)}return e+=">\n",e}renderForm(){const e=this.formSchema.filter((e=>"submit"!==e[0])).map((e=>{const[n,t,i,s,r={},l]=e;return this.renderField(n,t,i,s,r,l)})).join("");this.formMarkUp+=e}renderSubmitButtonElement(){const e=this.formSchema.find((e=>"submit"===e[0]));if(e){const[n,t,i,s,r={}]=e,l=r.id||t;let a=this.submitButtonClass;"class"in r&&(a=r.class);let o="";for(const[e,n]of Object.entries(r))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){o+=` ${e}="${n.endsWith("()")?n:`${n}()`}"`}else!0===n?o+=` ${e.replace(/_/g,"-")}`:!1!==n&&(o+=` ${e.replace(/_/g,"-")}="${n}"`);return`\n<div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n</div>\n<input type="submit" id="${l}" class="${a}" value="${i}"${o}>\n `.trim()}return""}renderField(e,n,t,i,s,r){const l={text:this.renderTextField,email:this.renderEmailField,number:this.renderNumberField,password:this.renderPasswordField,textarea:this.renderTextAreaField,tel:this.renderTelField,date:this.renderDateField,time:this.renderTimeField,"datetime-local":this.renderDateTimeField,month:this.renderMonthField,week:this.renderWeekField,url:this.renderUrlField,search:this.renderSearchField,color:this.renderColorField,checkbox:this.renderCheckboxField,radio:this.renderRadioField,file:this.renderFileField,hidden:this.renderHiddenField,image:this.renderImageField,singleSelect:this.renderSingleSelectField,multipleSelect:this.renderMultipleSelectField,dynamicSingleSelect:this.renderDynamicSingleSelectField,range:this.renderRangeField,submit:this.renderSubmitButton}[e];return l?l.call(this,e,n,t,i,s,r):(console.warn(`Unsupported field type '${e}' encountered.`),"")}renderSubmitButton(e,n,t,i,s){const r=s.id||n;let l=this.submitButtonClass;"class"in s&&(l=s.class);let a="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){a+=` ${e}="${n.endsWith("()")?n:`${n}()`}"`}else!0===n?a+=` ${e.replace(/_/g,"-")}`:!1!==n&&(a+=` ${e.replace(/_/g,"-")}="${n}"`);return`<input type="${e}" id="${r}" class="${l}" value="${t}"${a}>`}showSuccessMessage(e){document.getElementById(this.formContainerId).innerHTML=`\n <div class="formique-success"> ${e}</div>\n ${this.formSettings.redirectURL?`<meta http-equiv="refresh" content="2;url=${this.formSettings.redirectURL}">`:""}\n `}showErrorMessage(e){const n=document.getElementById(this.formContainerId),t=document.createElement("div");t.className="formique-error",t.textContent=`${e}`,n.prepend(t)}hasFileInputs(e){return Boolean(e.querySelector('input[type="file"]'))}async handleEmailSubmission(e){console.log(`Starting email submission for form ID: ${e}`);const n=document.getElementById(e);if(!n)throw console.error(`Form with ID ${e} not found`),new Error(`Form with ID ${e} not found`);if(!Array.isArray(this.formSettings?.sendTo)||0===this.formSettings.sendTo.length)throw console.error("formSettings.sendTo must be an array with at least one recipient email"),new Error("formSettings.sendTo must be an array with at least one recipient email");const t={formData:{},metadata:{recipients:this.formSettings.sendTo,timestamp:(new Date).toISOString()}};let i="",s="",r="";console.log("Initial payload structure:",JSON.parse(JSON.stringify(t))),new FormData(n).forEach(((e,n)=>{console.log(`Processing form field - Key: ${n}, Value: ${e}`),t.formData[n]=e;const l=n.toLowerCase();("email"===l||l.includes("email"))&&(s=e),("name"===l||l.includes("name"))&&(i=e),("subject"===l||l.includes("subject"))&&(r=e)})),t.metadata.subject=r||this.formSettings.subject||"Message From Contact Form",console.log("Determined email subject:",t.metadata.subject),s&&(t.metadata.sender=s,t.metadata.replyTo=i?`${i} <${s}>`:s),console.log("Payload after form processing:",JSON.parse(JSON.stringify(t)));try{const e=this.formiqueEndpoint||this.formAction,n=this.method||"POST";console.log(`Preparing to send request to: ${e}`),console.log(`Request method: ${n}`),console.log("Final payload being sent:",t);const i=await fetch(e,{method:n,headers:{"Content-Type":"application/json","X-Formique-Version":"1.0"},body:JSON.stringify(t)});if(console.log(`Received response with status: ${i.status}`),!i.ok){const e=await i.json().catch((()=>({})));throw console.error("API Error Response:",e),new Error(e.error||`HTTP error! status: ${i.status}`)}const s=await i.json();console.log("API Success Response:",s);const r=this.formSettings.successMessage||s.message||"Your message has been sent successfully!";console.log(`Showing success message: ${r}`),this.showSuccessMessage(r)}catch(e){console.error("Email submission failed:",e);const n=this.formSettings.errorMessage||e.message||"Failed to send message. Please try again later.";console.log(`Showing error message: ${n}`),this.showErrorMessage(n),document.getElementById("formiqueSpinner").style.display="none"}}validateEmail(e){const n=/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);return console.log(`Validating email ${e}: ${n?"valid":"invalid"}`),n}handleOnPageFormSubmission(e){const n=document.getElementById(e);if(n){const e=new FormData(n);fetch(this.formAction,{method:this.method,body:e}).then((e=>e.json())).then((e=>{console.log("Success:",e);const n=document.getElementById(this.formContainerId);if(this.redirect&&this.redirectURL&&(window.location.href=this.redirectURL),n){const e=document.createElement("div");e.classList.add("success-message","message-container"),e.innerHTML=this.formSettings.successMessage||"Your details have been successfully submitted!",n.innerHTML="",n.appendChild(e)}})).catch((e=>{console.error("Error:",e);const n=document.getElementById(this.formContainerId);if(n){let t=n.querySelector(".error-message");t&&t.remove();const i=document.createElement("div");i.classList.add("error-message","message-container");let s=this.formSettings.errorMessage||"An error occurred while submitting the form. Please try again.";s=`${s}<br/>Details: ${e.message}`,i.innerHTML=s,n.appendChild(i)}}))}}renderTextField(e,n,t,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'text'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o=s.id||n;const d=this.formSettings?.framework||!1;let c,$="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on"))if("semantq"===d){const t=n.endsWith("()")?n.slice(0,-2):n;$+=` @${e.replace(/^on/,"")}={${t}}\n`}else{$+=` ${e}="${n.endsWith("()")?n:`${n}()`}"\n`}else!0===n?$+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&($+=` ${e.replace(/_/g,"-")}="${n}"\n`);c="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${o+"-block"}">\n <label for="${o}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${o}"\n class="${c}"\n ${$}\n ${l}\n ${$.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${t}"`:""} />\n </div>\n`.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),this.formMarkUp+=p}renderEmailField(e,n,t,i,s){const r=["required","pattern","minlength","maxlength","multiple"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'email'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n ${c.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${t}"`:""}\n\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderNumberField(e,n,t,i,s){const r=["required","min","max","step"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"min":case"max":case"step":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'number'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderPasswordField(e,n,t,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"minlength":case"maxlength":case"pattern":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'password'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'password'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderTextAreaField(e,n,t,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'text'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o=s.id||n;const d=this.formSettings?.framework||!1;let c,$="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on"))if("semantq"===d){const t=n.endsWith("()")?n.slice(0,-2):n;$+=` @${e.replace(/^on/,"")}={${t}}\n`}else{$+=` ${e}="${n.endsWith("()")?n:`${n}()`}"\n`}else!0===n?$+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&($+=` ${e.replace(/_/g,"-")}="${n}"\n`);c="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${o+"-block"}">\n <label for="${o}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <textarea \n name="${n}"\n ${a}\n id="${o}"\n class="${c}"\n ${$}\n ${l}\n ${$.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${t}"`:""}>\n </textarea>\n </div>\n`.replace(/^\s*\n/gm,"").trim();p=p.replace(/<textarea\s+([^>]*)>\s*<\/textarea>/,((e,n)=>`<textarea\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n></textarea>`)),this.formMarkUp+=p}renderTelField(e,n,t,i,s){const r=["required","pattern","minlength","maxlength"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'tel'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'tel'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();return $=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),$}renderDateField(e,n,t,i,s){const r=["required","min","max","step","placeholder","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"min":case"max":case"step":l+=` ${e}="${t}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'date'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'date'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderTimeField(e,n,t,i,s){const r=["required","min","max","step","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{if(r.includes(t))if("boolean"==typeof i&&i)l+=` ${t}\n`;else switch(t){case"min":case"max":case"step":l+=` ${t}="${i}"\n`;break;default:r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}else console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderDateTimeField(e,n,t,i,s){const r=["required","min","max","step","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{if(r.includes(t))if("boolean"==typeof i&&i)l+=` ${t}\n`;else switch(t){case"min":case"max":case"step":l+=` ${t}="${i}"\n`;break;default:r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}else console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderMonthField(e,n,t,i,s){const r=["required","min","max","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"min":case"max":case"pattern":l+=` ${e}="${t}"\n`;break;default:r.includes(e)&&console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'month'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'month'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderWeekField(e,n,t,i,s){const r=["required","min","max","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,t])=>{if(r.includes(e))if("boolean"==typeof t&&t)l+=` ${e}\n`;else switch(e){case"min":case"max":case"pattern":l+=` ${e}="${t}"\n`;break;default:r.includes(e)&&console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'week'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'week'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderUrlField(e,n,t,i,s){const r=["required","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{if(r.includes(t))if("boolean"==typeof i&&i)l+=` ${t}\n`;else if("pattern"===t)l+=` ${t}="${i}"\n`;else r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`);else console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderSearchField(e,n,t,i,s){const r=["required","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{if(r.includes(t))if("boolean"==typeof i&&i)l+=` ${t}\n`;else if("pattern"===t)l+=` ${t}="${i}"\n`;else r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`);else console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderColorField(e,n,t,i,s){const r=["required","readonly","disabled","autocomplete","inputmode","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{r.includes(t)?"boolean"==typeof i&&i?l+=` ${t}\n`:r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`):console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);"class"in s&&(o=s.class),"color"===e&&(o+=" form-color-input");let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderFileField(e,n,t,i,s){const r=["required","accept","multiple","disabled","title"];let l="";i&&Object.entries(i).forEach((([t,i])=>{r.includes(t)?"boolean"==typeof i&&i?l+=` ${t}\n`:r.includes(t)||console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`):console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderHiddenField(e,n,t,i,s){const r=["type","name","value","id","class","style","required","readonly","disabled","tabindex"];let l="";i&&Object.entries(i).forEach((([t,i])=>{r.includes(t)&&"boolean"==typeof i&&i?l+=` ${t}\n`:console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if("bind:value"===s?.binding&&n&&(a=`bind:value="${n}"\n`),s?.binding?.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s?.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o,d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);o="class"in s?s.class:this.inputClass;let $=`\n <div class="${this.divClass}" id="${d+"-block"}">\n \x3c!--<label for="${d}">${t} \n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label> --\x3e\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${d}"\n class="${o}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),$=$.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=$}renderImageField(e,n,t,i,s){const r=["accept","required","minwidth","maxwidth","minheight","maxheight","src","alt","width","height"];let l="";i&&Object.entries(i).forEach((([t,i])=>{r.includes(t)?l+="boolean"==typeof i&&i?` ${t}\n`:` ${t}="${i}"\n`:console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";const o=s?.binding;if("bind:value"===o&&n&&(a=`bind:value="${n}"\n`),"string"==typeof o&&o.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),o&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let d,c=s.id||n,$="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;$+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?$+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&($+=` ${e.replace(/_/g,"-")}="${n}"\n`);d="image"===e&&"submit"===n?`\n <input \n type="image"\n name="${n}"\n ${a}\n id="${c}"\n class="${s.class||this.inputClass}"\n src="${s.src||"img_submit.gif"}"\n alt="${s.alt||"Submit"}"\n width="${s.width||"48"}"\n height="${s.height||"48"}"\n ${$}\n ${l}\n />`:`\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${c}"\n class="${s.class||this.inputClass}"\n ${$}\n ${l}\n />`;let p=`\n <div class="${this.divClass}" id="${c+"-block"}">\n ${"image"===e&&"submit"===n?"":`<label for="${c}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>`}\n ${d}\n </div>\n `.replace(/^\s*\n/gm,"").trim().replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`));return p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),p}renderTextAreaField(e,n,t,i,s){const r=["required","minlength","maxlength"];let l="";i&&Object.entries(i).forEach((([t,i])=>{r.includes(t)?l+="boolean"==typeof i&&i?` ${t}\n`:` ${t}="${i}"\n`:console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let a="";if(s.binding&&("bind:value"===s.binding&&n&&(a=`bind:value="${n}"\n`),s.binding.startsWith("::")&&n&&(a=`bind:value="${n}"\n`),s.binding&&!n))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o=s.id||n,d="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){d+=` ${e}="${n.endsWith("()")?n:`${n}()`}"\n`}else!0===n?d+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(d+=` ${e.replace(/_/g,"-")}="${n}"\n`);let c=s.class||this.inputClass,$=`\n <div class="${this.divClass}" id="${o+"-block"}">\n <label for="${o}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <textarea \n name="${n}"\n ${a}\n id="${o}"\n class="${c}"\n ${d}\n ${l}\n ${d.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${t}"`:""}>\n </textarea>\n </div>\n`.replace(/^\s*\n/gm,"").trim();$=$.replace(/<textarea\s+([^>]*)>\s*<\/textarea>/,((e,n)=>`<textarea\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n></textarea>`)),this.formMarkUp+=$}renderRadioField(e,n,t,i,s,r){const l=["required"];let a="";i&&Object.entries(i).forEach((([e,t])=>{if(l.includes(e))if("boolean"==typeof t&&t)a+=` ${e}\n`;else if("required"===e)a+=` ${e}\n`;else l.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'radio'.`);else console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'radio'.`)}));let o="";if(s.binding)if("bind:value"===s.binding&&n)o=` bind:value="${n}"\n`;else if(s.binding.startsWith("::")&&n)o=` bind:value="${n}"\n`;else if(s.binding&&!n)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);let $=s.class||this.inputClass,p="";r&&r.length&&(p=r.map((t=>`\n <div>\n <input \n type="${e}" \n name="${n}" \n value="${t.value}"\n ${o} \n ${c}\n ${s.id,`id="${d}-${t.value}"`}\n class="${$}"\n ${a}\n />\n <label \n for="${s.id,`${d}-${t.value}`}">\n ${t.label}\n </label>\n </div>\n `)).join(""));let m=`\n <fieldset class="${this.radioGroupClass}" id="${d+"-block"}">\n <legend>\n ${t} \n ${a.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n ${p}\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim().replace(/<input\s+([^>]*)\/>/g,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`));m=m.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=m}renderCheckboxField(e,n,t,i,s,r){const l=["required"];let a="";i&&Object.entries(i).forEach((([t,i])=>{l.includes(t)?"required"===t&&(a+=`${t}\n`):console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let o="";s.binding&&("bind:checked"===s.binding||s.binding.startsWith("::"))&&(o=` bind:checked="${n}"\n`);let d,c=s.id||n,$="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;$+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?$+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&($+=` ${e.replace(/_/g,"-")}="${n}"\n`);d="class"in s?s.class:this.inputClass;let p="";Array.isArray(r)&&(p=r.map((e=>{const t=`${c}-${e.value}`;return`\n <div>\n <input \n type="checkbox" \n name="${n}" \n value="${e.value}"${o} ${$}\n ${s.id,`id="${t}"`}\n class="${d}"\n />\n <label \n for="${t}">\n ${e.label}\n </label>\n </div>\n `})).join(""));let m=`\n <fieldset class="${this.checkboxGroupClass}" id="${c+"-block"}">\n <legend>\n ${t} ${a.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n ${p}\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();m=m.replace(/<input\s+([^>]*)\/>/g,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),m=m.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=m}renderDynamicSingleSelectField(e,n,t,i,s,r){const l=r.flat().map((e=>{const n=e.options.some((e=>!0===e.selected));return{value:e.id,label:e.label,...n&&{selected:!0}}})),a=r;this.renderSingleSelectField(e,n,t,i,s,l,a,"dynamicSingleSelect")}renderSingleSelectField(e,n,t,i,s,r,l,a){console.log("Within renderSingleSelectField");const o=["required"];let d="",c=!1;i&&Object.entries(i).forEach((([t,i])=>{o.includes(t)?"required"===t&&(d+=`${t} `,c=!0):console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let $="";s.binding&&"string"==typeof s.binding&&s.binding.startsWith("::")&&($=` bind:value="${n}" `);let p=s.id||n,m="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;m+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?m+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(m+=` ${e.replace(/_/g,"-")}="${n}"\n`);let u="";Array.isArray(r)&&(u+='\n <option value="">Choose an option</option>\n ',u+=r.map((e=>{const n=e.selected?" selected":"";return`\n <option value="${e.value}"${n}>${e.label}</option>\n `})).join(""));let f,h,g=s.class||this.inputClass;if("dynamicSingleSelect"===a&&l)if(t.includes("-")){const[e]=t.split("-");f=e,h=t}else f=t,h=t;else f=t;let b=`\n <fieldset class="${this.selectGroupClass}" id="${p+"-block"}">\n <legend>${f}\n ${d.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n <label for="${p}"> Select ${f}\n <select name="${n}"\n ${$}\n \n id="${p}"\n class="${g}"\n ${m}\n ${d}\n data-original-required="${c}" >\n ${u}\n </select>\n </fieldset>\n`.replace(/^\s*\n/gm,"").trim().replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,n,t)=>`<select\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n>\n${t.trim()}\n</select>`));if(b=b.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=b,a&&"dynamicSingleSelect"===a&&l){const e=s.id||n;l.forEach((n=>{const{id:t,label:i,options:s}=n;const r=s.map((e=>{const n=e.selected?" selected":"";return`\n <option value="${e.value}"${n}>${e.label}</option>\n `})).join("");let l,a;console.log("Label (rawLabel for sub-category):",h),l=h.includes("-")?h.split("-")?.[1]+" Options":"options",a="options"!==l?h.split("-")?.[1]+" Option":l;let o=`\n <fieldset class="${this.selectGroupClass} ${e}-subcategory-group" id="${t}-options" style="display: none;"> <legend>${i} ${l} \n </legend>\n <label for="${t}"> Select ${i} ${a}\n </label>\n <select name="${t}"\n ${$}\n \n id="${t}"\n class="${g}"\n ${m}\n \n data-original-required="false" >\n <option value="">Choose an option</option>\n ${r}\n </select>\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();o=o.replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,n,t)=>`<select\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n>\n${t.trim()}\n</select>`)),o=o.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=o}))}}renderMultipleSelectField(e,n,t,i,s,r){const l=["required","minlength","maxlength"];let a="";i&&Object.entries(i).forEach((([t,i])=>{l.includes(t)?"required"===t?a+=`${t} `:"minlength"===t?a+=`minlength="${i}" `:"maxlength"===t&&(a+=`maxlength="${i}" `):console.warn(`Unsupported validation attribute '${t}' for field '${n}' of type '${e}'.`)}));let o="";s.binding&&"string"==typeof s.binding&&s.binding.startsWith("::")&&(o=` bind:value="${n}" `);let d=s.id||n,c="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;c+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?c+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(c+=` ${e.replace(/_/g,"-")}="${n}"\n`);let $="";Array.isArray(r)&&($=r.map((e=>{const n=e.selected?" selected":"";return`\n <option value="${e.value}"${n}>${e.label}</option>\n `})).join(""));let p;p="class"in s?s.class:this.inputClass;let m=`\n <fieldset class="${this.selectGroupClass}" id="${d+"-block"}">\n <label for="${d}">${t}\n ${a.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <select name="${n}"\n ${o}\n \n id="${d}"\n class="${p}"\n ${c}\n ${a}\n multiple\n >\n ${$}\n </select>\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();m=m.replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,n,t)=>`<select\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n>\n${t.trim()}\n</select>`)),m=m.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=m}renderRangeField(e,n,t,i,s){const r=["required","min","max","step"];let l="";i&&Object.entries(i).forEach((([e,t])=>{r.includes(e)?l+="boolean"==typeof t&&t?` ${e}\n`:` ${e}="${t}"\n`:console.warn(`Unsupported validation attribute '${e}' for field '${n}' of type 'range'.`)}));let a="";if(s.binding)if("bind:value"===s.binding&&n)a=`bind:value="${n}"\n`;else if(s.binding.startsWith("::")&&n)a=`bind:value="${n}"\n`;else if(s.binding&&!n)return void console.log(`You cannot set binding value when there is no name attribute defined in ${n} ${e} field.`);let o=s.id||n,d="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&void 0!==n)if(e.startsWith("on")){const t=n.endsWith("()")?n.slice(0,-2):n;d+=` @${e.replace(/^on/,"")}={${t}}\n`}else!0===n?d+=` ${e.replace(/_/g,"-")}\n`:!1!==n&&(d+=` ${e.replace(/_/g,"-")}="${n}"\n`);let c=s.class||this.inputClass,$=`\n <div class="${this.divClass}" id="${o}-block">\n <label for="${o}">${t}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${n}"\n ${a}\n id="${o}"\n class="${c}"\n ${d}\n ${l}\n ${d.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${t}"`:""}\n />\n <span id="${o}-value">50</span> \x3c!-- Displays the range value dynamically --\x3e\n </div>\n `.replace(/^\s*\n/gm,"").trim();$=$.replace(/<input\s+([^>]*)\/>/,((e,n)=>`<input\n${n.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),this.formMarkUp+=$}renderSubmitButton(e,n,t,i,s){const r=s.id||n;let l,a="";for(const[e,n]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==n)if(e.startsWith("on")){a+=` ${e}="${n.endsWith("()")?n.slice(0,-2):n}"`}else!0===n?a+=` ${e.replace(/_/g,"-")}`:!1!==n&&(a+=` ${e.replace(/_/g,"-")}="${n}"`);l="class"in s?s.class:this.submitButtonClass;let o=`\n <div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n</div>\n\n <input type="${e}"\n id="${r+"-block"}"\n class="${l}"\n value="${t}"\n ${a}\n />\n `.replace(/^\s*\n/gm,"").trim();this.formMarkUp+=o}renderFormHTML(){this.formMarkUp+="</form>";const e=document.getElementById(this.formContainerId);e?e.innerHTML=this.formMarkUp:console.error(`Error: form container with ID ${this.formContainerId} not found. Please ensure an element with id ${this.formContainerId} exists in the HTML.`)}};
1
+ "use strict";class e extends SyntaxError{constructor(e,t,n,i){super(e),this.expected=t,this.found=n,this.location=i,this.name="SyntaxError"}format(e){let t="Error: "+this.message;if(this.location){let n=null;const i=e.find((e=>e.source===this.location.source));i&&(n=i.text.split(/\r\n|\n|\r/g));const s=this.location.start,r=this.location.source&&"function"==typeof this.location.source.offset?this.location.source.offset(s):s,l=this.location.source+":"+r.line+":"+r.column;if(n){const e=this.location.end,i="".padEnd(r.line.toString().length," "),o=n[s.line-1],a=(s.line===e.line?e.column:o.length+1)-s.column||1;t+="\n --\x3e "+l+"\n"+i+" |\n"+r.line+" | "+o+"\n"+i+" | "+"".padEnd(s.column-1," ")+"".padEnd(a,"^")}else t+="\n at "+l}return t}static buildMessage(e,t){function n(e){return e.codePointAt(0).toString(16).toUpperCase()}const i=Object.prototype.hasOwnProperty.call(RegExp.prototype,"unicode")?new RegExp("[\\p{C}\\p{Mn}\\p{Mc}]","gu"):null;function s(e){return i?e.replace(i,(e=>"\\u{"+n(e)+"}")):e}function r(e){return s(e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(e=>"\\x0"+n(e))).replace(/[\x10-\x1F\x7F-\x9F]/g,(e=>"\\x"+n(e))))}function l(e){return s(e.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(e=>"\\x0"+n(e))).replace(/[\x10-\x1F\x7F-\x9F]/g,(e=>"\\x"+n(e))))}const o={literal:e=>'"'+r(e.text)+'"',class(e){const t=e.parts.map((e=>Array.isArray(e)?l(e[0])+"-"+l(e[1]):l(e)));return"["+(e.inverted?"^":"")+t.join("")+"]"+(e.unicode?"u":"")},any:()=>"any character",end:()=>"end of input",other:e=>e.description};function a(e){return o[e.type](e)}return"Expected "+function(e){const t=e.map(a);if(t.sort(),t.length>0){let e=1;for(let n=1;n<t.length;n++)t[n-1]!==t[n]&&(t[e]=t[n],e++);t.length=e}switch(t.length){case 1:return t[0];case 2:return t[0]+" or "+t[1];default:return t.slice(0,-1).join(", ")+", or "+t[t.length-1]}}(e)+" but "+function(e){return e?'"'+r(e)+'"':"end of input"}(t)+" found."}}var t={StartRules:["start"],SyntaxError:e,parse:function(t,n){const i={},s=(n=void 0!==n?n:{}).grammarSource,r={start:ne};let l=ne;const o="@form:",a=":",d='"',c="true",p="false",u="-",m=",",f=/^[^,\r\n]/,h=/^[^"]/,$=/^[0-9]/,b=/^[a-zA-Z0-9_\-]/,g=/^[!*]/,y=/^[a-zA-Z]/,v=/^[a-zA-Z0-9_ \-]/,S=/^[ \t\n\r]/,w=/^[a-zA-Z_]/,x=/^[a-zA-Z0-9_.\/:\-?&=()@#%+![\] ]/,k={type:"other",description:"form directive must be in this format: @form: form-name"},q=J("@form:",!1),F=J(":",!1),A=X([",","\r","\n"],!0,!1,!1),C=J('"',!1),E=X(['"'],!0,!1,!1),O=J("true",!1),j=J("false",!1),I=X([["0","9"]],!1,!1,!1),U=J("-",!1),W=X([["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1,!1),M=X(["!","*"],!1,!1,!1),_=J(",",!1),T=X([["a","z"],["A","Z"]],!1,!1,!1),P=X([["a","z"],["A","Z"],["0","9"],"_"," ","-"],!1,!1,!1),D=X([" ","\t","\n","\r"],!1,!1,!1),B=X([["a","z"],["A","Z"],"_"],!1,!1,!1),L=X([["a","z"],["A","Z"],["0","9"],"_",".","/",":","-","?","&","=","(",")","@","#","%","+","!","[","]"," "],!1,!1,!1);let R=0|n.peg$currPos,H=R;const G=[{line:1,column:1}];let z,Y=R,V=n.peg$maxFailExpected||[],N=0|n.peg$silentFails;if(n.startRule){if(!(n.startRule in r))throw new Error("Can't start parsing from rule \""+n.startRule+'".');l=r[n.startRule]}function K(){return t.substring(H,R)}function Z(){return ee(H,R)}function J(e,t){return{type:"literal",text:e,ignoreCase:t}}function X(e,t,n,i){return{type:"class",parts:e,inverted:t,ignoreCase:n,unicode:i}}function Q(e){let n,i=G[e];if(i)return i;if(e>=G.length)n=G.length-1;else for(n=e;!G[--n];);for(i=G[n],i={line:i.line,column:i.column};n<e;)10===t.charCodeAt(n)?(i.line++,i.column=1):i.column++,n++;return G[e]=i,i}function ee(e,t,n){const i=Q(e),r=Q(t);return{source:s,start:{offset:e,line:i.line,column:i.column},end:{offset:t,line:r.line,column:r.column}}}function te(e){R<Y||(R>Y&&(Y=R,V=[]),V.push(e))}function ne(){let e,n;return e=R,ue(),n=function(){let e,n,s;e=R,n=function(){let e,n,s,r;N++,e=R,t.substr(R,6)===o?(n=o,R+=6):(n=i,0===N&&te(q));n!==i?(ue(),s=me(),s!==i?(ue(),r=function(){let e,t,n,s,r;e=R,t=[],n=R,s=ie(),s!==i?(r=ue(),s=[s,r],n=s):(R=n,n=i);for(;n!==i;)t.push(n),n=R,s=ie(),s!==i?(r=ue(),s=[s,r],n=s):(R=n,n=i);return H=e,t=function(e){const t=[];for(const n of e)n[0]&&n[0].type&&t.push(n[0]);return fe("FormProperties",Z().start,Z().end,{properties:t})}(t),e=t,e}(),H=e,l=s,a=r,e=fe("FormDirective",Z().start,Z().end,{name:l,properties:a})):(R=e,e=i)):(R=e,e=i);var l,a;N--,e===i&&(n=i,0===N&&te(k));return e}(),n!==i?(ue(),s=function(){let e,t,n;if(e=R,ue(),t=[],n=le(),n!==i)for(;n!==i;)t.push(n),n=le();else t=i;t!==i?(H=e,s=t,e=fe("FormFields",Z().start,Z().end,{fields:s})):(R=e,e=i);var s;return e}(),s===i&&(s=null),H=e,e=function(e,t){const n=[e];return t&&n.push(t),n}(n,s)):(R=e,e=i);return e}(),n!==i?(H=e,e=n):(R=e,e=i),e}function ie(){let e,n,s,r;var l,o;return e=R,n=me(),n!==i?(58===t.charCodeAt(R)?(s=a,R++):(s=i,0===N&&te(F)),s!==i?(ue(),r=function(){let e;e=se(),e===i&&(e=re(),e===i&&(e=function(){let e,n;e=R,t.substr(R,4)===c?(n=c,R+=4):(n=i,0===N&&te(O));n===i&&(t.substr(R,5)===p?(n=p,R+=5):(n=i,0===N&&te(j)));n!==i&&(H=e,n=fe("BooleanLiteral",Z().start,Z().end,{value:"true"===K()}));return e=n,e}(),e===i&&(e=function(){let e,n,s;e=R,n=[],s=t.charAt(R),$.test(s)?R++:(s=i,0===N&&te(I));if(s!==i)for(;s!==i;)n.push(s),s=t.charAt(R),$.test(s)?R++:(s=i,0===N&&te(I));else n=i;n!==i&&(H=e,n=fe("NumberLiteral",Z().start,Z().end,{value:parseInt(K(),10)}));return e=n,e}(),e===i&&(e=me()))));return e}(),r!==i?(H=e,l=n,o=r,e=fe("FormProperty",Z().start,Z().end,{key:l,value:o})):(R=e,e=i)):(R=e,e=i)):(R=e,e=i),e}function se(){let e,n,s;if(e=R,n=[],s=t.charAt(R),f.test(s)?R++:(s=i,0===N&&te(A)),s!==i)for(;s!==i;)n.push(s),s=t.charAt(R),f.test(s)?R++:(s=i,0===N&&te(A));else n=i;return n!==i&&(H=e,n=fe("StringLiteral",Z().start,Z().end,{value:K().trim()})),e=n,e}function re(){let e,n,s,r;if(e=R,34===t.charCodeAt(R)?(n=d,R++):(n=i,0===N&&te(C)),n!==i){for(s=[],r=t.charAt(R),h.test(r)?R++:(r=i,0===N&&te(E));r!==i;)s.push(r),r=t.charAt(R),h.test(r)?R++:(r=i,0===N&&te(E));34===t.charCodeAt(R)?(r=d,R++):(r=i,0===N&&te(C)),r!==i?(H=e,e=fe("StringLiteral",Z().start,Z().end,{value:K().slice(1,-1)})):(R=e,e=i)}else R=e,e=i;return e}function le(){let e,n,s,r;var l,o;return e=R,45===t.charCodeAt(R)?(n=u,R++):(n=i,0===N&&te(U)),n!==i?(ue(),s=function(){let e,n,s,r;e=R,ue(),n=oe(),n===i&&(n=null);ue(),s=function(){let e;e=function(){let e,n,s,r,l,o,d;e=R,n=oe(),n===i&&(n=null);s=[],r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));if(r!==i)for(;r!==i;)s.push(r),r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));else s=i;if(s!==i)if(r=oe(),r===i&&(r=null),58===t.charCodeAt(R)?(l=a,R++):(l=i,0===N&&te(F)),l!==i){if(o=[],d=t.charAt(R),b.test(d)?R++:(d=i,0===N&&te(W)),d!==i)for(;d!==i;)o.push(d),d=t.charAt(R),b.test(d)?R++:(d=i,0===N&&te(W));else o=i;o!==i?(H=e,c=o,e=(n||"")+s.join("")+":"+c.join("")):(R=e,e=i)}else R=e,e=i;else R=e,e=i;var c;return e}(),e===i&&(e=function(){let e,n,s;e=R,n=[],s=t.charAt(R),b.test(s)?R++:(s=i,0===N&&te(W));if(s!==i)for(;s!==i;)n.push(s),s=t.charAt(R),b.test(s)?R++:(s=i,0===N&&te(W));else n=i;n!==i&&(H=e,n=K());return e=n,e}());return e}(),s!==i?(ue(),r=oe(),r===i&&(r=null),ue(),H=e,e=(n||"")+s+(r||"")):(R=e,e=i);return e}(),s!==i?(r=function(){let e,t,n,s,r;e=R,t=[],n=R,s=ue(),r=ae(),r!==i?(s=[s,r],n=s):(R=n,n=i);for(;n!==i;)t.push(n),n=R,s=ue(),r=ae(),r!==i?(s=[s,r],n=s):(R=n,n=i);return H=e,t=function(e){return e.map((e=>e[1]))}(t),e=t,e}(),ue(),H=e,l=s,o=r,e=fe("FormField",Z().start,Z().end,{name:l,attributes:o||[]})):(R=e,e=i)):(R=e,e=i),e}function oe(){let e,n,s;if(e=R,n=[],s=t.charAt(R),g.test(s)?R++:(s=i,0===N&&te(M)),s!==i)for(;s!==i;)n.push(s),s=t.charAt(R),g.test(s)?R++:(s=i,0===N&&te(M));else n=i;return n!==i&&(H=e,n=K()),e=n,e}function ae(){let e;return e=function(){let e,n,s,r;e=R,n=pe(),n!==i?(58===t.charCodeAt(R)?(s=a,R++):(s=i,0===N&&te(F)),s!==i?(ue(),r=function(){let e,n,s,r,l,o,a,d;if(e=R,n=ce(),n!==i){if(s=[],r=R,l=ue(),44===t.charCodeAt(R)?(o=m,R++):(o=i,0===N&&te(_)),o!==i?(a=ue(),d=ce(),d!==i?(l=[l,o,a,d],r=l):(R=r,r=i)):(R=r,r=i),r!==i)for(;r!==i;)s.push(r),r=R,l=ue(),44===t.charCodeAt(R)?(o=m,R++):(o=i,0===N&&te(_)),o!==i?(a=ue(),d=ce(),d!==i?(l=[l,o,a,d],r=l):(R=r,r=i)):(R=r,r=i);else s=i;s!==i?(H=e,e=function(e,t){const n=[e];for(const e of t)n.push(e[3]);return n}(n,s)):(R=e,e=i)}else R=e,e=i;return e}(),r!==i?(H=e,l=n,o=r,e=fe("OptionsAttribute",Z().start,Z().end,{key:l,values:o})):(R=e,e=i)):(R=e,e=i)):(R=e,e=i);var l,o;return e}(),e===i&&(e=function(){let e,n,s,r;e=R,n=pe(),n!==i?(58===t.charCodeAt(R)?(s=a,R++):(s=i,0===N&&te(F)),s!==i?(ue(),r=de(),r!==i?(ue(),H=e,l=n,o=r,e=fe("FieldAttribute",Z().start,Z().end,{key:l,value:o})):(R=e,e=i)):(R=e,e=i)):(R=e,e=i);var l,o;e===i&&(e=R,n=function(){let e,n,s,r;e=R,n=t.charAt(R),y.test(n)?R++:(n=i,0===N&&te(T));if(n!==i){for(s=[],r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));r!==i;)s.push(r),r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));H=e,e=K()}else R=e,e=i;return e}(),n!==i?(s=ue(),H=e,d=n,e=fe("FieldAttribute",Z().start,Z().end,{key:d,value:fe("BooleanLiteral",Z().start,Z().end,{value:!0})})):(R=e,e=i));var d;return e}()),e}function de(){let e;return e=function(){let e,n,s,r;e=R,n=t.charAt(R),w.test(n)?R++:(n=i,0===N&&te(B));if(n!==i){for(s=[],r=t.charAt(R),x.test(r)?R++:(r=i,0===N&&te(L));r!==i;)s.push(r),r=t.charAt(R),x.test(r)?R++:(r=i,0===N&&te(L));H=e,e=fe("StringLiteral",Z().start,Z().end,{value:K()})}else R=e,e=i;return e}(),e===i&&(e=re(),e===i&&(e=se())),e}function ce(){let e,t;var n;return e=R,t=de(),t!==i&&(H=e,n=t,t=fe("Option",Z().start,Z().end,{value:n.value,quoted:"StringLiteral"===n.type})),e=t,e}function pe(){let e,n,s,r;if(e=R,n=t.charAt(R),y.test(n)?R++:(n=i,0===N&&te(T)),n!==i){for(s=[],r=t.charAt(R),v.test(r)?R++:(r=i,0===N&&te(P));r!==i;)s.push(r),r=t.charAt(R),v.test(r)?R++:(r=i,0===N&&te(P));H=e,e=K()}else R=e,e=i;return e}function ue(){let e,n;for(e=[],n=t.charAt(R),S.test(n)?R++:(n=i,0===N&&te(D));n!==i;)e.push(n),n=t.charAt(R),S.test(n)?R++:(n=i,0===N&&te(D));return e}function me(){let e,n,s,r;if(e=R,n=t.charAt(R),w.test(n)?R++:(n=i,0===N&&te(B)),n!==i){for(s=[],r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));r!==i;)s.push(r),r=t.charAt(R),b.test(r)?R++:(r=i,0===N&&te(W));H=e,e=fe("Identifier",Z().start,Z().end,{value:K()})}else R=e,e=i;return e}function fe(e,t,n,i){const s={type:e,start:t,end:n,...i};return i.expression&&(s.expression=fe("Identifier",i.expression.start,i.expression.end,{name:i.expression.value,loc:{start:{line:1,column:i.expression.start+1},end:{line:1,column:i.expression.start+2}}})),s}z=l();const he=z!==i&&R===t.length;function $e(){throw z!==i&&R<t.length&&te({type:"end"}),function(t,n,i){return new e(e.buildMessage(t,n),t,n,i)}(V,Y<t.length?function(e=R){const n=t.codePointAt(e);return void 0===n?"":String.fromCodePoint(n)}(Y):null,Y<t.length?ee(Y,Y+1):ee(Y,Y))}return n.peg$library?{peg$result:z,peg$currPos:R,peg$FAILED:i,peg$maxFailExpected:V,peg$maxFailPos:Y,peg$success:he,peg$throw:he?void 0:$e}:he?z:void $e()}};class n{constructor(e){return this.ast=e,this.formSchema=[],this.formSettings={},this.formParams={},this.formAttributes=["action","method","enctype","name","target","autocomplete","novalidate","rel","accept-charset","id","class","style","title","lang","dir","hidden","tabindex","accesskey","draggable","contenteditable","spellcheck","onsubmit","onreset","onchange","oninput","onfocus","onblur","onkeydown","onkeyup","onclick","ondblclick","onmouseover","onmouseout","aria-label","aria-labelledby","aria-describedby","role"],this.inputAttributes=["id","class","type","value","name","placeholder","autofocus","size","accept","form","list"],this.validationAttributes=["required","disabled","readonly","minlength","maxlength","pattern","min","max","step","min","max","accept","multiple","filesize","checked","selected","placeholder","data-validate","data-required","data-min","data-max","data-minlength","data-maxlength","data-pattern","data-error","data-validate-on","data-equal-to","aria-required","aria-invalid","novalidate","formnovalidate"],this.ignoreAttributes=["oneof","oneOf","one","manyof","manyOf","many","radio","select","mutli-select","multiselect","multipleselect","multipleSelect","multiple-select","multiple","checkbox","selected","default"],this.inputTypeMaps={oneof:"radio",one:"radio",radio:"radio",select:"singleSelect",singleSelect:"singleSelect",manyof:"checkbox",many:"checkbox",checkbox:"checkbox","multi-select":"multipleSelect",multiselect:"multipleSelect",multipleselect:"multipleSelect","multiple-select":"multipleSelect",multiple:"multipleSelect",selectMany:"multipleSelect",selectOne:"singleSelect",manyselect:"multipleSelect",oneselect:"singleSelect",selectmany:"multipleSelect",selectone:"singleSelect"},this.regularInputTypes=["text","password","email","number","range","date","datetime-local","time","month","week","search","tel","url","color","select","checkbox","radio","file","hidden","submit","reset","button","image"],this.specialInputTypes=["singleSelect","dynamicSingleSelect","multipleSelect"],this.typeInferenceRules={email:{type:"email",priority:10},"e-mail":{type:"email",priority:9},mail:{type:"email",priority:8},name:{type:"text",subtype:"name",priority:10},"first-name":{type:"text",subtype:"given-name",priority:10},firstname:{type:"text",subtype:"given-name",priority:9},"given-name":{type:"text",subtype:"given-name",priority:10},"last-name":{type:"text",subtype:"family-name",priority:10},lastname:{type:"text",subtype:"family-name",priority:9},surname:{type:"text",subtype:"family-name",priority:10},"family-name":{type:"text",subtype:"family-name",priority:10},"full-name":{type:"text",subtype:"full-name",priority:10},"middle-name":{type:"text",subtype:"additional-name",priority:9},"middle-initial":{type:"text",subtype:"additional-name",priority:8},nickname:{type:"text",subtype:"nickname",priority:9},username:{type:"text",subtype:"username",priority:9},displayname:{type:"text",subtype:"display-name",priority:8},title:{type:"text",subtype:"title",priority:9},subject:{type:"text",subtype:"subject",priority:8},description:{type:"text",subtype:"description",priority:9},note:{type:"text",subtype:"note",priority:8},bio:{type:"text",subtype:"bio",priority:8},address:{type:"text",subtype:"address",priority:9},city:{type:"text",subtype:"city",priority:9},state:{type:"text",subtype:"state",priority:9},province:{type:"text",subtype:"province",priority:9},country:{type:"text",subtype:"country",priority:9},zipcode:{type:"text",subtype:"postal-code",priority:9},"postal-code":{type:"text",subtype:"postal-code",priority:9},company:{type:"text",subtype:"organization",priority:9},organization:{type:"text",subtype:"organization",priority:9},job:{type:"text",subtype:"job-title",priority:8},"job-title":{type:"text",subtype:"job-title",priority:9},occupation:{type:"text",subtype:"job-title",priority:8},message:{type:"textarea",subtype:"message",priority:9},comment:{type:"textarea",subtype:"comment",priority:8},tel:{type:"tel",priority:10},phone:{type:"tel",priority:10},mobile:{type:"tel",priority:10},telephone:{type:"tel",priority:10},cell:{type:"tel",priority:9},"cell-phone":{type:"tel",priority:9},count:{type:"number",priority:9},price:{type:"number",priority:9},total:{type:"number",priority:8},amount:{type:"number",priority:9},quantity:{type:"number",priority:9},qty:{type:"number",priority:8},age:{type:"number",priority:8},sum:{type:"number",priority:7},value:{type:"number",priority:7},percent:{type:"number",priority:8},percentage:{type:"number",priority:8},discount:{type:"number",priority:7},cost:{type:"number",priority:9},payment:{type:"number",priority:8},salary:{type:"number",priority:8},fee:{type:"number",priority:8},date:{type:"date",priority:10},dob:{type:"date",priority:9},"birth-date":{type:"date",priority:8},"start-date":{type:"date",priority:7},"end-date":{type:"date",priority:7},password:{type:"password",priority:10},pwd:{type:"password",priority:8},secret:{type:"password",priority:6},url:{type:"url",priority:10},website:{type:"url",priority:8},link:{type:"url",priority:7},color:{type:"color",priority:10},search:{type:"search",priority:10},range:{type:"range",priority:10},file:{type:"file",priority:10},upload:{type:"file",priority:9},document:{type:"file",priority:8},attachment:{type:"file",priority:8},resume:{type:"file",priority:7},cv:{type:"file",priority:7},portfolio:{type:"file",priority:7},image:{type:"file",accept:"image/*",priority:10},photo:{type:"file",accept:"image/*",priority:9},avatar:{type:"file",accept:"image/*",priority:9},picture:{type:"file",accept:"image/*",priority:8},logo:{type:"file",accept:"image/*",priority:8},banner:{type:"file",accept:"image/*",priority:7},thumbnail:{type:"file",accept:"image/*",priority:7},video:{type:"file",accept:"video/*",priority:9},audio:{type:"file",accept:"audio/*",priority:9},recording:{type:"file",accept:"audio/*",priority:7},pdf:{type:"file",accept:".pdf",priority:8},spreadsheet:{type:"file",accept:".csv,.xls,.xlsx",priority:7},excel:{type:"file",accept:".xls,.xlsx",priority:8},word:{type:"file",accept:".doc,.docx",priority:8},presentation:{type:"file",accept:".ppt,.pptx",priority:7},files:{type:"file",multiple:!0,priority:8},images:{type:"file",accept:"image/*",multiple:!0,priority:8},gallery:{type:"file",accept:"image/*",multiple:!0,priority:7},gender:{type:"radio",priority:10},sex:{type:"radio",priority:9},title:{type:"select",priority:8},pronoun:{type:"select",priority:8},salutation:{type:"select",priority:7},newsletter:{type:"radio",priority:7},agree:{type:"radio",priority:6},smoker:{type:"radio",priority:5},terms:{type:"radio",priority:6},maritalstatus:{type:"select",priority:7},employment:{type:"select",priority:7},education:{type:"select",priority:6},status:{type:"select",priority:5},country:{type:"select",priority:9},language:{type:"select",priority:6},region:{type:"select",priority:5},state:{type:"select",priority:5},rating:{type:"radio",priority:5},satisfaction:{type:"radio",priority:5},feedback:{type:"radio",priority:4},reset:{type:"reset",priority:10}},this.defaultType="text",this.traverse(),this.addSubmit(),{formSchema:this.formSchema,formSettings:this.formSettings,formParams:this.formParams}}inferInputType(e){if(!e)return this.defaultType;const t=e.toLowerCase().trim(),n=[];if(this.typeInferenceRules[t])return this.typeInferenceRules[t].type;for(const[e,i]of Object.entries(this.typeInferenceRules))t.includes(e)&&n.push({...i,key:e});return n.length>0?(n.sort(((e,t)=>t.priority-e.priority)),n[0].type):/.*password.*/i.test(e)?"password":/.*(mail|email).*/i.test(e)?"email":/.*(tel|phone|mobile).*/i.test(e)?"tel":/.*(date|dob|birth).*/i.test(e)?"date":this.defaultType}cleanFieldName(e){const[t="",n=""]=e.split(":");return{input_name:t.trim().replace(/[^\w-]/g,""),input_type:n.trim()}}cleanToInputType(e){if(this.specialInputTypes.includes(e))return e;const t=e.trim().toLowerCase();return t.includes("datetime-local")?t.replace(/[^a-z-]/g,""):t.replace(/[^a-z]/g,"")}toTitleCase(e){return e.toLowerCase().split(/[\s_-]+/).map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join(" ")}isRequired(e){return e.replace(/\s+/g,"").includes("*")}traverse(){const e={FormDirective:this.buildDirective.bind(this),FormProperties:this.buildProperties.bind(this),FormProperty:this.buildProperty.bind(this),FormFields:this.buildFields.bind(this),FormField:this.buildField.bind(this),OptionsAttribute:this.buildOptionsAttribute.bind(this)},t=n=>{if(!n||"object"!=typeof n)return;const i=e[n.type];i&&i(n),n.properties&&n.properties.properties&&Array.isArray(n.properties.properties)&&n.properties.properties.forEach(t),n.fields&&Array.isArray(n.fields)&&n.fields.forEach(t),n.attributes&&Array.isArray(n.attributes)&&n.attributes.forEach(t),n.values&&Array.isArray(n.values)&&n.values.forEach(t)};Array.isArray(this.ast)&&this.ast.forEach(t)}extractAttributeKeys(e){if(!Array.isArray(e))throw new Error("Input must be an array of nodes");return e.filter((e=>"FieldAttribute"===e?.type)).map((e=>e?.key)).filter(Boolean).filter(((e,t,n)=>n.indexOf(e)===t))}extractOptionValues(e){if(!Array.isArray(e))throw new Error("Input must be an array of attributes");const t=e.filter((e=>"OptionsAttribute"===e?.type&&"options"===e.key)).flatMap((e=>e.values||[])).map((e=>e?.value)).filter(Boolean);return[...new Set(t)]}extractDependentValues(e){if(!Array.isArray(e))throw new Error("Input must be an array of attributes");return e.filter((e=>"OptionsAttribute"===e?.type&&"dependents"===e?.key)).flatMap((e=>e.values||[])).map((e=>e?.value)).filter(Boolean)}inputTypeResolver(e,t){if(e.includes("-"))return"dynamicSingleSelect";if(e.includes(":")){return e.split(":")[1]}const n=t.find((e=>e in this.inputTypeMaps));return n?this.inputTypeMaps[n]:this.inferInputType(e)}getOptionValuesByKey(e,t){if(!Array.isArray(e))throw new Error("Input must be an array of attributes");if(!t)throw new Error("Target key is required");const n=e.find((e=>"OptionsAttribute"===e?.type&&e?.key===t));return n?.values?n.values.map((e=>e?.value)).filter(Boolean).map((e=>e.toLowerCase())):[]}buildDynamicSingleSelect(e,t){const n=this.cleanFieldName(t).input_name;let i,s,r=[];r.push("dynamicSingleSelect",n,this.toTitleCase(n));let l,o=[];l=e.attributes.length>0?this.handleAttributes(e.attributes):{validations:{},attributes:{}},i=l.validations,s=l.attributes,this.isRequired(t)&&(i.required=!0),s.options&&(o=s.options,delete s.options),r.push(i),r.push(s);const a=this.extractOptionValues(e.attributes);let d=[];a.length>0&&a.forEach((t=>{let n={};t.toLowerCase(),n.id=t,n.label=t;const i=t,s=this.getOptionValuesByKey(e.attributes,i);let r=[];s.length>0&&(s.forEach((e=>{r.push({value:e.toLowerCase(),label:this.toTitleCase(e)})})),n.options=r,d.push(n))})),r.push(o),r.push(d),this.formSchema.push(r)}buildDirective(e){this.formParams.id=e.name.value}buildProperties(e){}buildProperty(e){const t=e.key.value;let n;if(n=e.value&&e.value.type?e.value.value:void 0===e.value||e.value,this.formAttributes.includes(t))this.formParams[t]=n;else if("sendTo"===t){let i;i=e.value&&Array.isArray(e.value.values)?e.value.values.map((e=>e.value)):n?[n]:[],this.formSettings[t]=i}else this.formSettings[t]=n}buildFields(e){}buildField(e){const t=e.name,n=this.cleanFieldName(t),i=n.input_name;let s;if(n.input_type)s=this.cleanToInputType(n.input_type);else{let t;e.attributes.length>0?(t=this.extractAttributeKeys(e.attributes),s=t.includes("manyof")?"checkbox":this.inputTypeResolver(i,t)):s=this.inferInputType(i)}if("dynamicSingleSelect"===s)return void this.buildDynamicSingleSelect(e,t);const r=[],l=this.toTitleCase(i);r.push(s,i,l);let o,a={},d={};if(o=e.attributes.length>0?this.handleAttributes(e.attributes,t):{validations:{},attributes:{}},a=o.validations,d=o.attributes,delete d.options,delete d.selected,delete d.default,delete d.manyof,this.isRequired(t)&&(a.required=!0),r.push(a),r.push(d),e.attributes.length>0&&("checkbox"===s||"radio"===s||"select"===s||"multipleSelect"===s||"singleSelect"===s)){const t="checkbox"===s||"multipleSelect"===s,n=(()=>{const t="checkbox"===s||"multipleSelect"===s,n=e.attributes.find((e=>"OptionsAttribute"===e?.type&&("selected"===e?.key||"default"===e?.key)));if(n&&n.values&&n.values.length>0){const e=n.values.map((e=>e.value.toLowerCase()));return t?e:e[0]}const i=e.attributes.find((e=>"FieldAttribute"===e?.type&&("selected"===e?.key||"default"===e?.key)));if(i){const e=i.value?.value||i.value,n="string"==typeof e?e.toLowerCase():e;return t?[n].filter(Boolean):n}return t?[]:null})(e.attributes),i=this.extractOptionValues(e.attributes);let l=[];i.length>0&&(i.forEach((e=>{const i=e;let s=!1;s=t?Array.isArray(n)&&n.includes(i):i===n,s?l.push({value:i,label:this.toTitleCase(e),selected:!0}):l.push({value:i,label:this.toTitleCase(e)})})),r.push(l))}this.formSchema.push(r)}handleAttributes(e,t){let n={},i={};const s=e=>{let t;return t=e&&"object"==typeof e&&void 0!==e.value?e.value:e,"string"==typeof t&&(t=t.trim(),t.length>=2&&t.startsWith("'")&&t.endsWith("'")&&(t=t.slice(1,-1))),t};e.forEach((e=>{const r=e.key;if("FieldAttribute"===e.type){let t=s(e.value);if(this.ignoreAttributes&&this.ignoreAttributes.includes(r))return;if(["selected","default","options"].includes(r))return;this.inputAttributes&&this.inputAttributes.includes(r)?i[r]=t:this.validationAttributes&&this.validationAttributes.includes(r)?n[r]=t:i[r]="dependents"===r?Array.isArray(t)?t:[t]:t}else if("OptionsAttribute"===e.type){if("dependents"===r){const t=e.values.map((e=>s(e))).filter(Boolean);t.length>0&&(i[r]=t)}if("accept"===r&&t.includes(":file")){const t=e.values.map((e=>s(e))).filter(Boolean);t.length>0&&(i[r]=t.join(","))}if("dependsOn"===r&&e.values&&e.values.length>=2){const t=s(e.values[0]),n=s(e.values[1]);t&&n&&(i.dependsOn=t,i.condition=n.toLowerCase())}}}));const r=e.find((e=>"OptionsAttribute"===e.type&&"options"===e.key));if(r?.values){const e=r.values.map((e=>({value:s(e),label:s(e)})));e.length>0&&(i.options=e)}const l=e.find((e=>"OptionsAttribute"===e.type&&"selected"===e.key));if(l&&l.values){const e=l.values.map((e=>s(e))).filter(Boolean);e.length>0&&(i.selected=e)}else{const t=e.find((e=>"FieldAttribute"===e.type&&"selected"===e.key));t&&(i.selected=s(t.value))}const o=e.find((e=>"FieldAttribute"===e.type&&"default"===e.key));return o&&(i.default=s(o.value)),{validations:n,attributes:i}}buildOptionsAttribute(e){}buildFieldAttribute(e){}buildOption(e){}buildIdentifier(e){}buildStringLiteral(e){}addSubmit(){this.formSchema.push(["submit","submit","Submit"])}}class i{renderField(e,t,n,i,s,r){throw new Error("Method renderField must be implemented")}}module.exports=class extends i{constructor(e,i={},s={}){let r;super();let l=i,o=s;if("string"==typeof e){const a=t.parse(e.trim()),d=new n(a);r=d.formSchema,l={...i,...d.formSettings},o={...s,...d.formParams}}else r=e;this.formSchema=r,this.formParams=o,this.formSettings={requiredFieldIndicator:!0,placeholders:!0,asteriskHtml:'<span aria-hidden="true" style="color: red;">*</span>',...l},this.themeColor=this.formSettings.themeColor||null,this.themeColorMap={primary:{"--formique-base-bg":"#ffffff","--formique-base-text":"#333333","--formique-base-shadow":"0 10px 30px rgba(0, 0, 0, 0.1)","--formique-base-label":"#555555","--formique-input-border":"#dddddd","--formique-focus-color":null,"--formique-btn-bg":null,"--formique-btn-text":"#ffffff","--formique-btn-shadow":null}},this.divClass="input-block",this.inputClass="form-input",this.radioGroupClass="radio-group",this.checkboxGroupClass="checkbox-group",this.selectGroupClass="form-select",this.submitButtonClass="form-submit-btn",this.formContainerId=i?.formContainerId||"formique",this.formId=this.formParams?.id||this.generateFormId(),this.formAction=s?.action||"https://httpbin.org/post",this.method="POST",this.formMarkUp="",this.dependencyGraph={},this.redirect=i?.redirect||"",this.redirectURL=i?.redirectURL||"",this.themes=["dark","light","pink","indigo","dark-blue","light-blue","dark-orange","bright-yellow","green","purple","midnight-blush","deep-blue","blue","brown","orange"],this.formiqueEndpoint="https://formiqueapi.onrender.com/api/send-email",document.addEventListener("DOMContentLoaded",(()=>{this.formMarkUp+=this.renderFormElement();const e=this.formSchema.filter((e=>"submit"!==e[0])).map((e=>{const[t,n,i,s,r={},l,o]=e;return this.renderField(t,n,i,s,r,l,o)})).join("");this.formMarkUp+=e;const t=this.formSchema.find((e=>"submit"===e[0]));if(t){const[e,n,i,s,r={}]=t,l=r.id||n;let o=this.submitButtonClass;"class"in r&&(o=r.class);let a="";for(const[e,t]of Object.entries(r))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){a+=` ${e}="${t.endsWith("()")?t:`${t}()`}"`}else!0===t?a+=` ${e.replace(/_/g,"-")}`:!1!==t&&(a+=` ${e.replace(/_/g,"-")}="${t}"`);this.formMarkUp+=`\n <div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n </div>\n <input type="submit" id="${l}" class="${o}" value="${i}"${a}>\n `}this.renderFormHTML();const n=document.getElementById(`${this.formId}`);if(n?n.addEventListener("submit",(e=>{e.preventDefault();if(this.formSchema.find((e=>"recaptcha"===e[0]))){if(!grecaptcha.getResponse())return document.getElementById("formiqueSpinner").style.display="none",void alert("Please verify that you are not a robot.")}document.getElementById("formiqueSpinner").style.display="block","email"!==this.formSettings.submitMode&&"rsvp"!==this.formSettings.submitMode||this.handleEmailSubmission(this.formId),this.formSettings.submitOnPage&&this.handleOnPageFormSubmission(this.formId)})):console.error(`Form with ID ${this.formId} not found after rendering. Event listener could not be attached.`),this.initDependencyGraph(),this.registerObservers(),this.attachDynamicSelectListeners(),this.themeColor)this.applyCustomTheme(this.themeColor,this.formContainerId);else if(this.formSettings.theme&&this.themes.includes(this.formSettings.theme)){let e=this.formSettings.theme;this.applyTheme(e,this.formContainerId)}else this.applyTheme("dark",this.formContainerId)}))}generateFormId(){return`fmq-${Math.random().toString(36).substr(2,10)}`}initDependencyGraph(){this.dependencyGraph={},this.formSchema.forEach((e=>{const[t,n,i,s,r={}]=e,l=r.id||n;r.dependents&&(this.dependencyGraph[l]=r.dependents.map((e=>{const t=this.formSchema.find((([,t])=>t===e));if(t){const n=t[4]||{};return{dependent:n.id||e,condition:n.condition||null}}console.warn(`Dependent field "${e}" not found in schema.`)})),this.dependencyGraph[l].push({state:null}),this.attachInputChangeListener(l)),r.dependents&&r.dependents.forEach((e=>{const t=this.formSchema.find((([,t])=>t===e)),n=(t&&t[4]||{}).id||e,i=document.querySelector(`#${n}-block`);if(i){i.style.display="none";i.querySelectorAll("input, select, textarea").forEach((e=>{e.hasAttribute("required")&&!0===e.required?(e.setAttribute("data-original-required","true"),e.required=!1):e.setAttribute("data-original-required","false")}))}}))}))}attachInputChangeListener(e){const t=document.querySelectorAll(`[name="${e}"]`);if(0===t.length){const n=document.getElementById(e);if(!n)return void console.warn(`Parent field element(s) not found for field: ${e}`);t=[n]}t.forEach((t=>{const n="radio"===t.type||"checkbox"===t.type?"change":"input";t.addEventListener(n,(n=>{let i;("radio"!==t.type||n.target.checked)&&(i="checkbox"===t.type?n.target.checked?n.target.value:"":n.target.value,this.handleParentFieldChange(e,i.toLowerCase()))}))}))}handleParentFieldChange(e,t){const n=this.dependencyGraph[e];n&&(this.dependencyGraph[e].forEach((e=>{void 0!==e.state&&(e.state=t)})),n.forEach((e=>{if(e.dependent){const n=e.dependent+"-block",i=document.getElementById(n);if(i){const n="function"==typeof e.condition?e.condition(t):t===e.condition;i.style.display=n?"block":"none";i.querySelectorAll("input, select, textarea").forEach((e=>{n?e.required="true"===e.getAttribute("data-original-required"):(e.setAttribute("data-original-required",e.required),e.required=!1)}))}else console.warn(`Wrapper block with ID ${n} not found.`)}})))}registerObservers(){this.formSchema.forEach((e=>{const[t,n,i,s,r={}]=e,l=r.id||n;r.dependents&&r.dependents.forEach((e=>{if(this.dependencyGraph[l]){const t=this.formSchema.find((([,t])=>t===e));if(t){const n=t[4]?.id||e;this.dependencyGraph[l].forEach((t=>{t.dependent===e&&(t.observers||(t.observers=[]),t.observers.push(n))}))}}}))}))}attachDynamicSelectListeners(){this.formSchema.forEach((e=>{const[t,n,i,s,r={}]=e;if("dynamicSingleSelect"===t){const e=r.id||n,t=document.getElementById(e);if(t){if(t.addEventListener("change",(t=>{const n=t.target.value;document.querySelectorAll(`.${e}`).forEach((e=>{const t=e.querySelector("select");t&&(t.setAttribute("data-original-required",t.required.toString()),t.required=!1),e.style.display="none"}));const i=n,s=document.getElementById(i);if(s){s.style.display="block";const e=s.querySelector("select");e&&(e.required="true"===e.getAttribute("data-original-required"))}})),t.value){const e=new Event("change");t.dispatchEvent(e)}}else console.warn(`Main dynamic select element with ID ${e} not found.`)}}))}applyTheme(e,t){const n=document.querySelector('link[href*="formique-css"]');n?fetch(n.href).then((e=>e.text())).then((n=>{const i=n.match(new RegExp(`\\.${e}-theme\\s*{([^}]*)}`,"i"));if(!i)return void console.error(`Theme rules for ${e} not found in the stylesheet.`);const s=i[1].trim(),r=document.getElementById(t);if(r){r.classList.add(`${e}-theme`,"formique");const n=document.createElement("style");n.textContent=`\n #${t} {\n ${s}\n }\n `,r.parentNode.insertBefore(n,r)}else console.error(`Form container with ID ${t} not found.`)})).catch((e=>{console.error("Error loading the stylesheet:",e)})):console.error("Stylesheet with 'formique-css' in the name not found!")}applyCustomTheme(e,t){const n=document.getElementById(t);if(!n)return void console.error(`Form container with ID "${t}" not found. Cannot apply custom theme.`);n.classList.add("formique");const i={"--formique-base-bg":"#ffffff","--formique-base-text":"#333333","--formique-base-shadow":"0 10px 30px rgba(0, 0, 0, 0.1)","--formique-base-label":"#555555","--formique-input-border":"#dddddd","--formique-focus-color":e,"--formique-btn-bg":e,"--formique-btn-text":"#ffffff","--formique-btn-shadow":`0 2px 10px ${((e,t)=>{const n=parseInt(e.slice(1),16),i=t,s=n>>16,r=n>>8&255,l=255&n;return"#"+(16777216+65536*(Math.round((255-s)*i)+s)+256*(Math.round((255-r)*i)+r)+(Math.round((255-l)*i)+l)).toString(16).slice(1)})(e,.2)||"rgba(0, 0, 0, 0.1)"}`};let s="";for(const[e,t]of Object.entries(i))s+=` ${e}: ${t};\n`;const r=document.createElement("style");r.textContent=`\n #${t}.formique {\n ${s}\n }\n `,n.parentNode.insertBefore(r,n),console.log(`Applied custom theme with color: ${e} to form container: ${t}`)}renderFormElement(){let e="<form";const t=this.formParams||{};if(t.id||(t.id=this.formId),Object.keys(t).forEach((n=>{const i=t[n];if(null!=i)if("boolean"==typeof i)i&&(e+=` ${n}`);else{const t="accept_charset"===n?"accept-charset":n.replace(/_/g,"-");e+=` ${t}="${i}"`}})),t.laravel){const t=document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");t&&(e+=`<input type="hidden" name="_token" value="${t}">`)}return e+=">\n",e}renderForm(){const e=this.formSchema.filter((e=>"submit"!==e[0])).map((e=>{const[t,n,i,s,r={},l]=e;return this.renderField(t,n,i,s,r,l)})).join("");this.formMarkUp+=e}renderSubmitButtonElement(){const e=this.formSchema.find((e=>"submit"===e[0]));if(e){const[t,n,i,s,r={}]=e,l=r.id||n;let o=this.submitButtonClass;"class"in r&&(o=r.class);let a="";for(const[e,t]of Object.entries(r))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){a+=` ${e}="${t.endsWith("()")?t:`${t}()`}"`}else!0===t?a+=` ${e.replace(/_/g,"-")}`:!1!==t&&(a+=` ${e.replace(/_/g,"-")}="${t}"`);return`\n<div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n</div>\n<input type="submit" id="${l}" class="${o}" value="${i}"${a}>\n `.trim()}return""}renderField(e,t,n,i,s,r,l=void 0){const o={text:this.renderTextField,email:this.renderEmailField,number:this.renderNumberField,password:this.renderPasswordField,textarea:this.renderTextAreaField,tel:this.renderTelField,date:this.renderDateField,time:this.renderTimeField,"datetime-local":this.renderDateTimeField,month:this.renderMonthField,week:this.renderWeekField,url:this.renderUrlField,search:this.renderSearchField,color:this.renderColorField,checkbox:this.renderCheckboxField,radio:this.renderRadioField,file:this.renderFileField,hidden:this.renderHiddenField,image:this.renderImageField,singleSelect:this.renderSingleSelectField,multipleSelect:this.renderMultipleSelectField,dynamicSingleSelect:this.renderDynamicSingleSelectField,range:this.renderRangeField,recaptcha:this.renderRecaptchaField,submit:this.renderSubmitButton}[e];return o?o.call(this,e,t,n,i,s,r,l):(console.warn(`Unsupported field type '${e}' encountered.`),"")}renderSubmitButton(e,t,n,i,s){const r=s.id||t;let l=this.submitButtonClass;"class"in s&&(l=s.class);let o="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){o+=` ${e}="${t.endsWith("()")?t:`${t}()`}"`}else!0===t?o+=` ${e.replace(/_/g,"-")}`:!1!==t&&(o+=` ${e.replace(/_/g,"-")}="${t}"`);return`<input type="${e}" id="${r}" class="${l}" value="${n}"${o}>`}showSuccessMessage(e){document.getElementById(this.formContainerId).innerHTML=`\n <div class="formique-success"> ${e}</div>\n ${this.formSettings.redirectURL?`<meta http-equiv="refresh" content="2;url=${this.formSettings.redirectURL}">`:""}\n `}showErrorMessage(e){const t=document.getElementById(this.formContainerId),n=document.createElement("div");n.className="formique-error",n.textContent=`${e}`,t.prepend(n)}hasFileInputs(e){return Boolean(e.querySelector('input[type="file"]'))}async handleEmailSubmission(e){console.log(`Starting email submission for form ID: ${e}`);const t=document.getElementById(e);if(!t)throw console.error(`Form with ID ${e} not found`),new Error(`Form with ID ${e} not found`);if(!Array.isArray(this.formSettings?.sendTo)||0===this.formSettings.sendTo.length)throw console.error("formSettings.sendTo must be an array with at least one recipient email"),new Error("formSettings.sendTo must be an array with at least one recipient email");const n={formData:{},metadata:{recipients:this.formSettings.sendTo,timestamp:(new Date).toISOString()}};let i="",s="",r="",l="";console.log("Initial payload structure:",JSON.parse(JSON.stringify(n)));new FormData(t).forEach(((e,t)=>{console.log(`Processing form field - Key: ${t}, Value: ${e}`),n.formData[t]=e;const o=t.toLowerCase();o.includes("email")&&(s=e),o.includes("name")&&(i=e),o.includes("subject")&&(r=e),this.formSettings.emailField&&t===this.formSettings.emailField&&(l=e)})),n.metadata.subject=r||this.formSettings.subject||"Message From Contact Form",console.log("Determined email subject:",n.metadata.subject),s&&(n.metadata.sender=s,n.metadata.replyTo=i?`${i} <${s}>`:s),this.formSettings.recaptchaSecretKey&&(n.metadata.recaptchaSecretKey=this.formSettings.recaptchaSecretKey),console.log("Payload after form processing:",JSON.parse(JSON.stringify(n)));try{const e=this.formiqueEndpoint||this.formAction,t=this.method||"POST";console.log(`Preparing to send primary request to: ${e}`),console.log(`Request method: ${t}`),console.log("Final payload being sent to recipients:",n);const i=await fetch(e,{method:t,headers:{"Content-Type":"application/json","X-Formique-Version":"1.0"},body:JSON.stringify(n)});if(console.log(`Received response for primary email with status: ${i.status}`),!i.ok){const e=await i.json().catch((()=>({})));throw console.error("API Error Response:",e),new Error(e.error||`HTTP error! status: ${i.status}`)}const s=await i.json();if(console.log("Primary API Success Response:",s),"rsvp"===this.formSettings.submitMode&&l&&this.formSettings.registrantMessage){console.log("RSVP mode detected. Sending confirmation email to registrant.");const i={formData:n.formData,metadata:{recipients:[l],timestamp:(new Date).toISOString(),subject:this.formSettings.registrantSubject||"RSVP Confirmation",body:this.processDynamicMessage(this.formSettings.registrantMessage,n.formData),sender:this.formSettings.sendFrom||"noreply@yourdomain.com",replyTo:this.formSettings.sendFrom||"noreply@yourdomain.com"}};try{console.log("Preparing to send RSVP email. Final payload:",i);const n=await fetch(e,{method:t,headers:{"Content-Type":"application/json","X-Formique-Version":"1.0"},body:JSON.stringify(i)});if(n.ok)console.log("RSVP email sent successfully to registrant.");else{const e=await n.json().catch((()=>({})));console.error("RSVP API Error Response:",e),console.warn("Failed to send RSVP email to registrant, but primary submission was successful.")}}catch(e){console.error("RSVP email submission failed:",e),console.warn("Failed to send RSVP email to registrant, but primary submission was successful.")}}const r=this.formSettings.successMessage||s.message||"Your message has been sent successfully!";console.log(`Showing success message: ${r}`),this.showSuccessMessage(r)}catch(e){console.error("Email submission failed:",e);const t=this.formSettings.errorMessage||e.message||"Failed to send message. Please try again later.";console.log(`Showing error message: ${t}`),this.showErrorMessage(t)}finally{document.getElementById("formiqueSpinner").style.display="none"}}processDynamicMessage(e,t){let n=e;for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e)){const i=`{${e}}`;n=n.split(i).join(t[e])}return n}validateEmail(e){const t=/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);return console.log(`Validating email ${e}: ${t?"valid":"invalid"}`),t}attachSubmitListener(){this.formElement.addEventListener("submit",(e=>{if(this.formSchema.find((e=>"recaptcha"===e[0]))){if(!grecaptcha.getResponse())return e.preventDefault(),alert("Please verify that you are not a robot."),void(document.getElementById("formiqueSpinner").style.display="none")}this.handleOnPageFormSubmission(e)}))}handleOnPageFormSubmission(e){const t=document.getElementById(e);t&&t.addEventListener("submit",(e=>{if(this.formSchema.find((e=>"recaptcha"===e[0]))){if(!grecaptcha.getResponse())return e.preventDefault(),document.getElementById("formiqueSpinner").style.display="none",void alert("Please verify that you are not a robot.")}document.getElementById("formiqueSpinner").style.display="block";const n={};new FormData(t).forEach(((e,t)=>{n[t]=e})),console.log("Setting Object",this.formSettings);const i={formData:n,metadata:{...this.formSettings}};return fetch(this.formAction,{method:this.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error||`HTTP error! Status: ${e.status}`)})))).then((e=>{console.log("Success:",e),document.getElementById("formiqueSpinner").style.display="none";const t=document.getElementById(this.formContainerId);if(this.redirect&&this.redirectURL&&(window.location.href=this.redirectURL),t){const e=document.createElement("div");e.classList.add("success-message","message-container"),e.innerHTML=this.formSettings.successMessage||"Your details have been successfully submitted!",t.innerHTML="",t.appendChild(e)}})).catch((e=>{console.error("Error:",e),document.getElementById("formiqueSpinner").style.display="none";const t=document.getElementById(this.formContainerId);if(t){let n=t.querySelector(".error-message");n&&n.remove();const i=document.createElement("div");i.classList.add("error-message","message-container");let s=this.formSettings.errorMessage||"An error occurred while submitting the form. Please try again.";s=`${s}<br/>Details: ${e.message}`,i.innerHTML=s,t.appendChild(i)}})),!1}))}renderTextField(e,t,n,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'text'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a=s.id||t;const d=this.formSettings?.framework||!1;let c,p="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on"))if("semantq"===d){const n=t.endsWith("()")?t.slice(0,-2):t;p+=` @${e.replace(/^on/,"")}={${n}}\n`}else{p+=` ${e}="${t.endsWith("()")?t:`${t}()`}"\n`}else!0===t?p+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(p+=` ${e.replace(/_/g,"-")}="${t}"\n`);c="class"in s?s.class:this.inputClass;let u=`\n <div class="${this.divClass}" id="${a+"-block"}">\n <label for="${a}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${a}"\n class="${c}"\n ${p}\n ${l}\n ${p.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${n}"`:""} />\n </div>\n`.replace(/^\s*\n/gm,"").trim();u=u.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),this.formMarkUp+=u}renderEmailField(e,t,n,i,s){const r=["required","pattern","minlength","maxlength","multiple"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'email'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n ${c.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${n}"`:""}\n\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderNumberField(e,t,n,i,s){const r=["required","min","max","step"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"min":case"max":case"step":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'number'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderPasswordField(e,t,n,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"minlength":case"maxlength":case"pattern":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'password'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'password'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderTextAreaField(e,t,n,i,s){const r=["required","minlength","maxlength","pattern"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'number'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'text'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a=s.id||t;const d=this.formSettings?.framework||!1;let c,p="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on"))if("semantq"===d){const n=t.endsWith("()")?t.slice(0,-2):t;p+=` @${e.replace(/^on/,"")}={${n}}\n`}else{p+=` ${e}="${t.endsWith("()")?t:`${t}()`}"\n`}else!0===t?p+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(p+=` ${e.replace(/_/g,"-")}="${t}"\n`);c="class"in s?s.class:this.inputClass;let u=`\n <div class="${this.divClass}" id="${a+"-block"}">\n <label for="${a}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <textarea \n name="${t}"\n ${o}\n id="${a}"\n class="${c}"\n ${p}\n ${l}\n ${p.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${n}"`:""}>\n </textarea>\n </div>\n`.replace(/^\s*\n/gm,"").trim();u=u.replace(/<textarea\s+([^>]*)>\s*<\/textarea>/,((e,t)=>`<textarea\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n></textarea>`)),this.formMarkUp+=u}renderTelField(e,t,n,i,s){const r=["required","pattern","minlength","maxlength"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"pattern":case"minlength":case"maxlength":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'tel'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'tel'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();return p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),p}renderDateField(e,t,n,i,s){const r=["required","min","max","step","placeholder","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"min":case"max":case"step":l+=` ${e}="${n}"\n`;break;default:r.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'date'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'date'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderTimeField(e,t,n,i,s){const r=["required","min","max","step","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{if(r.includes(n))if("boolean"==typeof i&&i)l+=` ${n}\n`;else switch(n){case"min":case"max":case"step":l+=` ${n}="${i}"\n`;break;default:r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}else console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderDateTimeField(e,t,n,i,s){const r=["required","min","max","step","readonly","disabled","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{if(r.includes(n))if("boolean"==typeof i&&i)l+=` ${n}\n`;else switch(n){case"min":case"max":case"step":l+=` ${n}="${i}"\n`;break;default:r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}else console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}"> \n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderMonthField(e,t,n,i,s){const r=["required","min","max","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"min":case"max":case"pattern":l+=` ${e}="${n}"\n`;break;default:r.includes(e)&&console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'month'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'month'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderWeekField(e,t,n,i,s){const r=["required","min","max","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([e,n])=>{if(r.includes(e))if("boolean"==typeof n&&n)l+=` ${e}\n`;else switch(e){case"min":case"max":case"pattern":l+=` ${e}="${n}"\n`;break;default:r.includes(e)&&console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'week'.`)}else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'week'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderUrlField(e,t,n,i,s){const r=["required","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{if(r.includes(n))if("boolean"==typeof i&&i)l+=` ${n}\n`;else if("pattern"===n)l+=` ${n}="${i}"\n`;else r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`);else console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderSearchField(e,t,n,i,s){const r=["required","pattern","placeholder","readonly","disabled","size","autocomplete","spellcheck","inputmode","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{if(r.includes(n))if("boolean"==typeof i&&i)l+=` ${n}\n`;else if("pattern"===n)l+=` ${n}="${i}"\n`;else r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`);else console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderColorField(e,t,n,i,s){const r=["required","readonly","disabled","autocomplete","inputmode","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{r.includes(n)?"boolean"==typeof i&&i?l+=` ${n}\n`:r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`):console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);"class"in s&&(a=s.class),"color"===e&&(a+=" form-color-input");let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderFileField(e,t,n,i,s){const r=["required","accept","multiple","disabled","title"];let l="";i&&Object.entries(i).forEach((([n,i])=>{r.includes(n)?"boolean"==typeof i&&i?l+=` ${n}\n`:r.includes(n)||console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`):console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderHiddenField(e,t,n,i,s){const r=["type","name","value","id","class","style","required","readonly","disabled","tabindex"];let l="";i&&Object.entries(i).forEach((([n,i])=>{r.includes(n)&&"boolean"==typeof i&&i?l+=` ${n}\n`:console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if("bind:value"===s?.binding&&t&&(o=`bind:value="${t}"\n`),s?.binding?.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s?.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a,d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);a="class"in s?s.class:this.inputClass;let p=`\n <div class="${this.divClass}" id="${d+"-block"}">\n \x3c!--<label for="${d}">${n} \n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label> --\x3e\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${d}"\n class="${a}"\n ${c}\n ${l}\n />\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),p=p.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=p}renderImageField(e,t,n,i,s){const r=["accept","required","minwidth","maxwidth","minheight","maxheight","src","alt","width","height"];let l="";i&&Object.entries(i).forEach((([n,i])=>{r.includes(n)?l+="boolean"==typeof i&&i?` ${n}\n`:` ${n}="${i}"\n`:console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";const a=s?.binding;if("bind:value"===a&&t&&(o=`bind:value="${t}"\n`),"string"==typeof a&&a.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),a&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let d,c=s.id||t,p="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;p+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?p+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(p+=` ${e.replace(/_/g,"-")}="${t}"\n`);d="image"===e&&"submit"===t?`\n <input \n type="image"\n name="${t}"\n ${o}\n id="${c}"\n class="${s.class||this.inputClass}"\n src="${s.src||"img_submit.gif"}"\n alt="${s.alt||"Submit"}"\n width="${s.width||"48"}"\n height="${s.height||"48"}"\n ${p}\n ${l}\n />`:`\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${c}"\n class="${s.class||this.inputClass}"\n ${p}\n ${l}\n />`;let u=`\n <div class="${this.divClass}" id="${c+"-block"}">\n ${"image"===e&&"submit"===t?"":`<label for="${c}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>`}\n ${d}\n </div>\n `.replace(/^\s*\n/gm,"").trim().replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`));return u=u.replace(/(<div\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),u}renderTextAreaField(e,t,n,i,s){const r=["required","minlength","maxlength"];let l="";i&&Object.entries(i).forEach((([n,i])=>{r.includes(n)?l+="boolean"==typeof i&&i?` ${n}\n`:` ${n}="${i}"\n`:console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let o="";if(s.binding&&("bind:value"===s.binding&&t&&(o=`bind:value="${t}"\n`),s.binding.startsWith("::")&&t&&(o=`bind:value="${t}"\n`),s.binding&&!t))return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a=s.id||t,d="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){d+=` ${e}="${t.endsWith("()")?t:`${t}()`}"\n`}else!0===t?d+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(d+=` ${e.replace(/_/g,"-")}="${t}"\n`);let c=s.class||this.inputClass,p=`\n <div class="${this.divClass}" id="${a+"-block"}">\n <label for="${a}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <textarea \n name="${t}"\n ${o}\n id="${a}"\n class="${c}"\n ${d}\n ${l}\n ${d.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${n}"`:""}>\n </textarea>\n </div>\n`.replace(/^\s*\n/gm,"").trim();p=p.replace(/<textarea\s+([^>]*)>\s*<\/textarea>/,((e,t)=>`<textarea\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n></textarea>`)),this.formMarkUp+=p}renderRadioField(e,t,n,i,s,r){console.log("RADIO DEBUG - options:",JSON.stringify(r,null,2));const l=["required"];let o="";i&&Object.entries(i).forEach((([e,n])=>{if(l.includes(e))if("boolean"==typeof n&&n)o+=` ${e}\n`;else if("required"===e)o+=` ${e}\n`;else l.includes(e)||console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'radio'.`);else console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'radio'.`)}));let a="";if(s.binding)if("bind:value"===s.binding&&t)a=` bind:value="${t}"\n`;else if(s.binding.startsWith("::")&&t)a=` bind:value="${t}"\n`;else if(s.binding&&!t)return void console.log("%s",`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);let p=s.class||this.inputClass,u=null;if(r&&r.length){const e=r.find((e=>!0===e.selected));console.log("RADIO DEBUG - selectedOption:",e),e&&(u=e.value,console.log("RADIO DEBUG - selectedValue:",u))}let m="";r&&r.length&&(m=r.map((n=>{const i=n.value===u;console.log("RADIO DEBUG - option:",n.value,"isSelected:",i);const r=i?" checked":"";return`\n <div>\n <input \n type="${e}" \n name="${t}" \n value="${n.value}"\n ${a} \n ${c}\n ${s.id,`id="${d}-${n.value}"`}\n class="${p}"\n ${o}\n ${r}\n />\n <label \n for="${s.id,`${d}-${n.value}`}">\n ${n.label}\n </label>\n </div>\n `})).join(""));let f=`\n <fieldset class="${this.radioGroupClass}" id="${d+"-block"}">\n <legend>\n ${n} \n ${o.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n ${m}\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim().replace(/<input\s+([^>]*)\/>/g,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`));f=f.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=f}renderCheckboxField(e,t,n,i,s,r){console.log("CHECKBOX DEBUG - options:",JSON.stringify(r,null,2));const l=["required"];let o="";i&&Object.entries(i).forEach((([n,i])=>{l.includes(n)?"required"===n&&(o+=`${n}\n`):console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let a="";s.binding&&("bind:checked"===s.binding||s.binding.startsWith("::"))&&(a=` bind:checked="${t}"\n`);let d,c=s.id||t,p="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;p+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?p+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(p+=` ${e.replace(/_/g,"-")}="${t}"\n`);d="class"in s?s.class:this.inputClass;const u=[];r&&r.length&&r.forEach((e=>{!0!==e.checked&&!0!==e.selected||u.push(e.value)})),console.log("CHECKBOX DEBUG - checkedValues:",u);let m="";Array.isArray(r)&&(m=r.map((e=>{const n=`${c}-${e.value}`,i=u.includes(e.value);console.log("CHECKBOX DEBUG - option:",e.value,"isChecked:",i);const r=i?" checked":"";return`\n <div>\n <input \n type="checkbox" \n name="${t}" \n value="${e.value}"${a} ${p}\n ${s.id,`id="${n}"`}\n class="${d}"\n ${r}\n />\n <label \n for="${n}">\n ${e.label}\n </label>\n </div>\n `})).join(""));let f=`\n <fieldset class="${this.checkboxGroupClass}" id="${c+"-block"}">\n <legend>\n ${n} ${o.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n ${m}\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();f=f.replace(/<input\s+([^>]*)\/>/g,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),f=f.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=f}renderDynamicSingleSelectField(e,t,n,i,s,r,l){const o=r.map((e=>{const t=e.options?e.options.some((e=>!0===e.selected)):!0===e.selected;return{value:e.value,label:e.label,...t&&{selected:!0}}}));this.renderSingleSelectField(e,t,n,i,s,o,l,"dynamicSingleSelect")}renderSingleSelectField(e,t,n,i,s,r,l,o){const a=["required"];let d="",c=!1;i&&Object.entries(i).forEach((([e,t])=>{a.includes(e)&&"required"===e&&(d+=`${e} `,c=!0)}));let p="";s.binding&&"string"==typeof s.binding&&s.binding.startsWith("::")&&(p=` bind:value="${t}" `);let u=s.id||t,m="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;m+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?m+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(m+=` ${e.replace(/_/g,"-")}="${t}"\n`);let f="";Array.isArray(r)&&(f+='\n <option value="">Choose an option</option>\n ',f+=r.map((e=>{const t=e.selected?" selected":"";return`\n <option value="${e.value}"${t}>${e.label}</option>\n `})).join(""));let h,$,b=s.class||this.inputClass;if("dynamicSingleSelect"===o&&l)if(n.includes("-")){const[e]=n.split("-");h=e,$=n}else h=n,$=n;else h=n;let g=`\n <fieldset class="${this.selectGroupClass}" id="${u+"-block"}">\n <legend>${h}\n ${d.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </legend>\n <label for="${u}"> Select ${h}\n <select name="${t}"\n ${p}\n \n id="${u}"\n class="${b}"\n ${m}\n ${d}\n data-original-required="${c}" >\n ${f}\n </select>\n </fieldset>\n`.replace(/^\s*\n/gm,"").trim().replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,t,n)=>`<select\n${(t.match(/(\w+(?:-\w+)*=("[^"]*"|'[^']*'|\w+)|[^=\s]+(?!\s*=))/g)||[]).map((e=>` ${e}`)).join("\n")}\n>\n${n.trim()}\n</select>`));if(g=g.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=g,o&&"dynamicSingleSelect"===o&&l){const e=s.id||t;l.forEach((t=>{const{id:n,label:i,options:s}=t;const r=s.map((e=>{const t=e.selected?" selected":"";return`\n <option value="${e.value}"${t}>${e.label}</option>\n `})).join("");let l,o;l=$.includes("-")?$.split("-")?.[1]+" Options":"options",o="options"!==l?$.split("-")?.[1]+" Option":l;let a=`\n <fieldset class="${this.selectGroupClass} ${e}" id="${n}" style="display: none;"> <legend>${i} ${l} \n </legend>\n <label for="${n}"> Select ${i} ${o}\n </label>\n <select name="${n}"\n ${p}\n \n id="${n}"\n class="${b}"\n ${m}\n \n data-original-required="false" >\n <option value="">Choose an option</option>\n ${r}\n </select>\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();a=a.replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,t,n)=>`<select\n${(t.match(/(\w+(?:-\w+)*=("[^"]*"|'[^']*'|\w+)|[^=\s]+(?!\s*=))/g)||[]).map((e=>` ${e}`)).join("\n")}\n>\n${n.trim()}\n</select>`)),a=a.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=a}))}}renderMultipleSelectField(e,t,n,i,s,r){const l=["required","minlength","maxlength"];let o="";i&&Object.entries(i).forEach((([n,i])=>{l.includes(n)?"required"===n?o+=`${n} `:"minlength"===n?o+=`minlength="${i}" `:"maxlength"===n&&(o+=`maxlength="${i}" `):console.warn(`Unsupported validation attribute '${n}' for field '${t}' of type '${e}'.`)}));let a="";s.binding&&"string"==typeof s.binding&&s.binding.startsWith("::")&&(a=` bind:value="${t}" `);let d=s.id||t,c="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;c+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?c+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(c+=` ${e.replace(/_/g,"-")}="${t}"\n`);let p="";Array.isArray(r)&&(p=r.map((e=>{const t=e.selected?" selected":"";return`\n <option value="${e.value}"${t}>${e.label}</option>\n `})).join(""));let u;u="class"in s?s.class:this.inputClass;let m=`\n <fieldset class="${this.selectGroupClass}" id="${d+"-block"}">\n <label for="${d}">${n}\n ${o.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n</label>\n <select name="${t}"\n ${a}\n \n id="${d}"\n class="${u}"\n ${c}\n ${o}\n multiple\n >\n ${p}\n </select>\n </fieldset>\n `.replace(/^\s*\n/gm,"").trim();m=m.replace(/<select\s+([^>]*)>([\s\S]*?)<\/select>/g,((e,t,n)=>`<select\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n>\n${n.trim()}\n</select>`)),m=m.replace(/(<fieldset\s+[^>]*>)/g,(e=>`\n${e}\n`)).replace(/\n\s*\n/g,"\n"),this.formMarkUp+=m}renderRangeField(e,t,n,i,s){const r=["required","min","max","step"];let l="";i&&Object.entries(i).forEach((([e,n])=>{r.includes(e)?l+="boolean"==typeof n&&n?` ${e}\n`:` ${e}="${n}"\n`:console.warn(`Unsupported validation attribute '${e}' for field '${t}' of type 'range'.`)}));let o="";if(s.binding)if("bind:value"===s.binding&&t)o=`bind:value="${t}"\n`;else if(s.binding.startsWith("::")&&t)o=`bind:value="${t}"\n`;else if(s.binding&&!t)return void console.log(`You cannot set binding value when there is no name attribute defined in ${t} ${e} field.`);let a=s.id||t,d="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&void 0!==t)if(e.startsWith("on")){const n=t.endsWith("()")?t.slice(0,-2):t;d+=` @${e.replace(/^on/,"")}={${n}}\n`}else!0===t?d+=` ${e.replace(/_/g,"-")}\n`:!1!==t&&(d+=` ${e.replace(/_/g,"-")}="${t}"\n`);let c=s.class||this.inputClass,p=`\n <div class="${this.divClass}" id="${a}-block">\n <label for="${a}">${n}\n ${l.includes("required")&&this.formSettings.requiredFieldIndicator?this.formSettings.asteriskHtml:""}\n </label>\n <input \n type="${e}"\n name="${t}"\n ${o}\n id="${a}"\n class="${c}"\n ${d}\n ${l}\n ${d.includes("placeholder")?"":this.formSettings.placeholders?`placeholder="${n}"`:""}\n />\n <span id="${a}-value">50</span> \x3c!-- Displays the range value dynamically --\x3e\n </div>\n `.replace(/^\s*\n/gm,"").trim();p=p.replace(/<input\s+([^>]*)\/>/,((e,t)=>`<input\n${t.trim().split(/\s+/).map((e=>` ${e}`)).join("\n")}\n/>`)),this.formMarkUp+=p}renderRecaptchaField(e,t,n,i,s={}){const r=s.id||t,l=s.siteKey;return l?`\n <div class="${this.divClass}" id="${r}-block">\n <label for="${r}">${n}</label>\n <div class="g-recaptcha" id="${r}" data-sitekey="${l}"></div>\n </div>\n `:(console.error("reCAPTCHA siteKey is missing from the field attributes."),"")}renderSubmitButton(e,t,n,i,s){const r=s.id||t;let l,o="";for(const[e,t]of Object.entries(s))if("id"!==e&&"class"!==e&&"dependsOn"!==e&&"dependents"!==e&&void 0!==t)if(e.startsWith("on")){o+=` ${e}="${t.endsWith("()")?t.slice(0,-2):t}"`}else!0===t?o+=` ${e.replace(/_/g,"-")}`:!1!==t&&(o+=` ${e.replace(/_/g,"-")}="${t}"`);l="class"in s?s.class:this.submitButtonClass;let a=`\n <div id="formiqueSpinner" style="display: flex; align-items: center; gap: 1rem; font-family: sans-serif; display:none;">\n <div class="formique-spinner"></div>\n <p class="message">Hang in tight, we are submitting your details…</p>\n</div>\n\n <input type="${e}"\n id="${r+"-block"}"\n class="${l}"\n value="${n}"\n ${o}\n />\n `.replace(/^\s*\n/gm,"").trim();this.formMarkUp+=a}renderFormHTML(){this.formMarkUp+="</form>";const e=document.getElementById(this.formContainerId);e?e.innerHTML=this.formMarkUp:console.error(`Error: form container with ID ${this.formContainerId} not found. Please ensure an element with id ${this.formContainerId} exists in the HTML.`)}};