easy-forms-core 1.2.10 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/easy-form.js CHANGED
@@ -2181,5 +2181,5 @@ var q=class{parse(t){if(!t)throw new Error("Schema es requerido");if(!t.fields&&
2181
2181
  En tu app: <code>import 'leaflet'</code> y <code>import 'leaflet/dist/leaflet.css'</code><br>
2182
2182
  <a href="https://easyforms.dev/docs/tipos-campos#map" target="_blank" rel="noopener" style="color:var(--easy-form-primary,#007bff);">Ver documentaci\xF3n</a>
2183
2183
  </div>
2184
- `;return}delete E.Icon.Default.prototype._getIconUrl,E.Icon.Default.mergeOptions({iconRetinaUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png",iconUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",shadowUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png"}),this.mapInstance=E.map(u,{preferCanvas:!1,zoomControl:!0}).setView([o,i],a);let v=E.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',maxZoom:19}).addTo(this.mapInstance);this.mapInstance.invalidateSize(),v.on("load",()=>{this.mapInstance&&this.mapInstance.invalidateSize()});let C=()=>{this.mapInstance&&this.mapInstance.invalidateSize()};setTimeout(C,100),setTimeout(C,300),setTimeout(C,500),new IntersectionObserver(x=>{x.forEach(w=>{w.isIntersecting&&this.mapInstance&&setTimeout(()=>{this.mapInstance?.invalidateSize()},100)})}).observe(u),this.markerInstance=E.marker([o,i],{draggable:!0}).addTo(this.mapInstance).on("dragend",()=>{let x=this.markerInstance.getLatLng();d.value=String(Number(x.lat.toFixed(6))),m.value=String(Number(x.lng.toFixed(6))),this.onChange({lat:x.lat,lng:x.lng}),this.onBlur()}),this.mapInstance.on("click",x=>{let{lat:w,lng:S}=x.latlng;this.markerInstance.setLatLng([w,S]),d.value=String(Number(w.toFixed(6))),m.value=String(Number(S.toFixed(6))),this.onChange({lat:w,lng:S}),this.onBlur()})})(),this.createFieldContainer(n)}syncMarkerPosition(e,r){this.mapInstance&&this.markerInstance&&(this.markerInstance.setLatLng([e,r]),this.mapInstance.setView([e,r]),setTimeout(()=>{this.mapInstance?.invalidateSize()},50))}};var ke=c=>`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="${c?"currentColor":"none"}" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" role="img" aria-hidden="true"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>`,ae=class extends g{render(){let t=this.field,e=t.max??5,r=t.half??!1,a=this.value!=null?Number(this.value):0,s=document.createElement("div");s.className="easy-form-rating",s.setAttribute("role","slider"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuemax",String(e)),s.setAttribute("aria-valuenow",String(a)),s.setAttribute("aria-label",this.field.label||"Rating"),s.setAttribute("tabindex","0");let o=document.createElement("div");o.className="easy-form-rating-stars";for(let i=1;i<=e;i++){let n=document.createElement("button");n.type="button";let l=a>=i||r&&a>=i-.5;n.className=l?"easy-form-rating-star easy-form-rating-star-filled":"easy-form-rating-star",n.innerHTML=ke(l),n.setAttribute("aria-label",`${i} de ${e}`),n.addEventListener("click",d=>{d.preventDefault();let m=d.target.closest("button")?.getBoundingClientRect(),p=i;if(r&&m){let u=m.left+m.width/2;p=d.clientX<u?i-.5:i}this.onChange(p),this.onBlur(),this.rerenderStars(s,e,p,r),s.setAttribute("aria-valuenow",String(p))}),o.appendChild(n)}return s.appendChild(o),s.addEventListener("keydown",i=>{let n=Number(s.getAttribute("aria-valuenow"))||0,l=n;i.key==="ArrowRight"||i.key==="ArrowUp"?(i.preventDefault(),l=Math.min(e,r?n+.5:n+1),this.onChange(l)):(i.key==="ArrowLeft"||i.key==="ArrowDown")&&(i.preventDefault(),l=Math.max(0,r?n-.5:n-1),this.onChange(l)),l!==n&&(this.rerenderStars(s,e,l,r),s.setAttribute("aria-valuenow",String(l)))}),this.createFieldContainer(s)}rerenderStars(t,e,r,a){t.querySelectorAll(".easy-form-rating-star").forEach((o,i)=>{let n=i+1,l=r>=n||a&&r>=n-.5;o.className=l?"easy-form-rating-star easy-form-rating-star-filled":"easy-form-rating-star",o.innerHTML=ke(l)})}};var se=class extends g{render(){let t=this.field,e=t.min??0,r=t.max??100,a=t.step??1,s=t.showValue??!1,o=document.createElement("input");o.type="range",o.min=String(e),o.max=String(r),o.step=String(a),o.value=this.value!=null?String(this.value):String(e),o.setAttribute("aria-valuemin",String(e)),o.setAttribute("aria-valuemax",String(r)),o.setAttribute("aria-valuenow",o.value),this.applyCommonProps(o),o.addEventListener("input",n=>{let l=n.target,d=a>=1?parseInt(l.value,10):parseFloat(l.value);this.onChange(isNaN(d)?e:d),i&&(i.textContent=l.value),o.setAttribute("aria-valuenow",l.value)}),o.addEventListener("change",()=>{this.onBlur()});let i=null;if(s){i=document.createElement("span"),i.className="easy-form-slider-value",i.textContent=o.value;let n=document.createElement("div");return n.className="easy-form-slider-wrapper",n.appendChild(o),n.appendChild(i),this.createFieldContainer(n)}return this.createFieldContainer(o)}};var Ye=/^#?([0-9A-Fa-f]{6})$/;function ce(c){let t=c.match(Ye);return t?`#${t[1].toLowerCase()}`:/^[0-9A-Fa-f]{6}$/.test(c)?`#${c.toLowerCase()}`:"#000000"}var oe=class extends g{render(){let e=this.field.defaultValue??"#000000",r=this.value!=null&&typeof this.value=="string"?ce(this.value):e,a=document.createElement("div");a.className="easy-form-color-wrapper";let s=document.createElement("input");s.type="color",s.value=r,s.setAttribute("value",r),s.setAttribute("aria-label",this.field.label||"Color"),s.id=`${this.getFieldId()}-picker`,this.field.disabled&&s.setAttribute("disabled","true");let o=document.createElement("input");o.type="text",o.value=r,o.setAttribute("aria-label",`${this.field.label||"Color"} (hex)`),o.placeholder="#000000",o.className="easy-form-color-text",this.applyCommonProps(o);let i=()=>{let l=s.value||"#000000",d=ce(l);o.value=d,this.onChange(d)},n=()=>{let l=o.value.trim(),d=l.startsWith("#")?l:`#${l}`;if(/^#[0-9A-Fa-f]{6}$/.test(d)){let m=ce(d);s.value=m,this.onChange(m)}};return s.addEventListener("input",i),s.addEventListener("change",()=>{i(),this.onBlur()}),o.addEventListener("input",n),o.addEventListener("blur",()=>{n(),this.onBlur()}),a.appendChild(s),a.appendChild(o),this.createFieldContainer(a)}};function Ee(c,t,e,r,a){switch(c.type){case"text":case"email":return new $(c,t,e,r,a).render();case"password":return new ee(c,t,e,r,a).render();case"number":return new B(c,t,e,r,a).render();case"textarea":return new O(c,t,e,r,a).render();case"select":return new j(c,t,e,r,a).render();case"checkbox":return new W(c,t,e,r,a).render();case"radio":return new _(c,t,e,r,a).render();case"switch":return new Y(c,t,e,r,a).render();case"date":return new U(c,t,e,r,a).render();case"file":return new G(c,t,e,r,a).render();case"file-drop":return new te(c,t,e,r,a).render();case"map":return new re(c,t,e,r,a).render();case"rating":return new ae(c,t,e,r,a).render();case"slider":return new se(c,t,e,r,a).render();case"colorpicker":return new oe(c,t,e,r,a).render();case"quantity":return new K(c,t,e,r,a).render();case"accordion-select":return new Z(c,t,e,r,a).render();case"image-grid-select":return new J(c,t,e,r,a).render();case"otp":return new Q(c,t,e,r,a).render();default:let s=document.createElement("div");return s.textContent=`Tipo de campo no soportado: ${c.type}`,s}}var Ce=new Map;function Ue(c,t){Ce.set(c,t)}function Se(c){for(let[t,e]of Object.entries(c))Ue(t,e)}function pe(c){return Ce.get(c)}var Ge={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"password",name:"password",label:"Password",placeholder:"Enter your password",validations:[{type:"required",message:"Password is required"},{type:"minLength",value:6,message:"Password must be at least 6 characters"}]},{type:"checkbox",name:"rememberMe",label:"Remember me",defaultValue:!1}]},Ke={fields:[{type:"text",name:"name",label:"Full Name",placeholder:"Enter your full name",validations:[{type:"required",message:"Name is required"},{type:"minLength",value:2,message:"Name must be at least 2 characters"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"password",name:"password",label:"Password",placeholder:"Create a password",validations:[{type:"required",message:"Password is required"},{type:"minLength",value:8,message:"Password must be at least 8 characters"}]},{type:"password",name:"confirmPassword",label:"Confirm Password",placeholder:"Confirm your password",validations:[{type:"required",message:"Please confirm your password"},{type:"custom",validator:c=>typeof c=="string"&&c.length>=8,message:"Password must be at least 8 characters"}]}]},Ze={fields:[{type:"otp",name:"code",label:"Verification Code",validations:[{type:"required",message:"Verification code is required"}]}]},Je={fields:[{type:"text",name:"name",label:"Name",placeholder:"Enter your name",validations:[{type:"required",message:"Name is required"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"text",name:"subject",label:"Subject",placeholder:"Enter the subject",validations:[{type:"required",message:"Subject is required"}]},{type:"textarea",name:"message",label:"Message",placeholder:"Enter your message",rows:5,validations:[{type:"required",message:"Message is required"},{type:"minLength",value:10,message:"Message must be at least 10 characters"}]}]},Qe={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email address",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]}]},Xe={fields:[{type:"password",name:"currentPassword",label:"Current Password",placeholder:"Enter your current password",validations:[{type:"required",message:"Current password is required"}]},{type:"password",name:"newPassword",label:"New Password",placeholder:"Enter your new password",validations:[{type:"required",message:"New password is required"},{type:"minLength",value:8,message:"Password must be at least 8 characters"}]},{type:"password",name:"confirmPassword",label:"Confirm New Password",placeholder:"Confirm your new password",validations:[{type:"required",message:"Please confirm your new password"},{type:"custom",validator:c=>typeof c=="string"&&c.length>=8,message:"Password must be at least 8 characters"}]}]},et={fields:[{type:"text",name:"name",label:"Full Name",placeholder:"Enter your full name",validations:[{type:"required",message:"Name is required"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"text",name:"phone",label:"Phone",placeholder:"Enter your phone number",mask:{type:"phone"}},{type:"textarea",name:"bio",label:"Bio",placeholder:"Tell us about yourself",rows:4},{type:"file",name:"avatar",label:"Profile Picture",accept:"image/*"}]},tt={fields:[{type:"group",name:"billingAddress",label:"Billing Address",fields:[{type:"text",name:"street",label:"Street Address",placeholder:"Enter street address",validations:[{type:"required",message:"Street address is required"}]},{type:"row",name:"cityState",fields:[{type:"text",name:"city",label:"City",placeholder:"City",validations:[{type:"required",message:"City is required"}]},{type:"text",name:"state",label:"State",placeholder:"State",validations:[{type:"required",message:"State is required"}]}]},{type:"text",name:"zipCode",label:"ZIP Code",placeholder:"ZIP Code",validations:[{type:"required",message:"ZIP code is required"}]}]},{type:"select",name:"paymentMethod",label:"Payment Method",options:[{label:"Credit Card",value:"credit-card"},{label:"Debit Card",value:"debit-card"},{label:"PayPal",value:"paypal"},{label:"Bank Transfer",value:"bank-transfer"}],validations:[{type:"required",message:"Payment method is required"}]},{type:"select",name:"shipping",label:"Shipping Method",options:[{label:"Standard (5-7 days)",value:"standard"},{label:"Express (2-3 days)",value:"express"},{label:"Overnight",value:"overnight"}],validations:[{type:"required",message:"Shipping method is required"}]}]},rt={fields:[{type:"select",name:"rating",label:"Rating",options:[{label:"1 - Poor",value:1},{label:"2 - Fair",value:2},{label:"3 - Good",value:3},{label:"4 - Very Good",value:4},{label:"5 - Excellent",value:5}],validations:[{type:"required",message:"Rating is required"}]},{type:"textarea",name:"comment",label:"Comment",placeholder:"Share your feedback",rows:5,validations:[{type:"required",message:"Comment is required"}]},{type:"email",name:"email",label:"Email (optional)",placeholder:"Enter your email if you want a response"}]},at={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"checkbox",name:"weeklyNewsletter",label:"Weekly Newsletter",defaultValue:!0},{type:"checkbox",name:"productUpdates",label:"Product Updates",defaultValue:!1},{type:"checkbox",name:"promotions",label:"Promotions and Special Offers",defaultValue:!1}]},st={fields:[{type:"date",name:"date",label:"Date",validations:[{type:"required",message:"Date is required"}]},{type:"text",name:"time",label:"Time",placeholder:"HH:MM",mask:{type:"time"},validations:[{type:"required",message:"Time is required"}]},{type:"number",name:"guests",label:"Number of Guests",placeholder:"Enter number of guests",min:1,max:20,validations:[{type:"required",message:"Number of guests is required"},{type:"min",value:1,message:"At least 1 guest is required"}]},{type:"textarea",name:"specialRequests",label:"Special Requests",placeholder:"Any special requests or dietary restrictions?",rows:4}]},ot={fields:[{type:"select",name:"rating",label:"Rating",options:[{label:"1 Star",value:1},{label:"2 Stars",value:2},{label:"3 Stars",value:3},{label:"4 Stars",value:4},{label:"5 Stars",value:5}],validations:[{type:"required",message:"Rating is required"}]},{type:"text",name:"title",label:"Review Title",placeholder:"Give your review a title",validations:[{type:"required",message:"Review title is required"},{type:"minLength",value:5,message:"Title must be at least 5 characters"}]},{type:"textarea",name:"comment",label:"Your Review",placeholder:"Share your experience",rows:6,validations:[{type:"required",message:"Review comment is required"},{type:"minLength",value:20,message:"Review must be at least 20 characters"}]}]},Fe={login:Ge,register:Ke,otp:Ze,contact:Je,"password-reset":Qe,"password-change":Xe,profile:et,checkout:tt,feedback:rt,subscription:at,booking:st,review:ot};function ue(c){return c in Fe?Fe[c]:null}function Le(c,t){let e=ue(c);if(!e)throw new Error(`Template "${c}" not found`);let r=e.fields||[],a=e.steps;if(a&&a.length>0){let s=a[a.length-1];return{...e,steps:[...a.slice(0,-1),{...s,fields:[...s.fields,...t]}]}}return{...e,fields:[...r,...t]}}var it=typeof HTMLElement<"u"?HTMLElement:class{},fe=class extends it{constructor(){if(typeof HTMLElement>"u")throw new Error("EasyForm can only be used in a browser environment");super();this.customComponents={};this.isRendering=!1;this.attemptsLock=null;this.lockCountdownInterval=null;this.slotTemplates=null;this.skipPreserveValuesOnNextRender=!1;this.dependencyRenderTimeout=null;this.stateManager=new D,this.shadow=this.attachShadow({mode:"open"})}static get observedAttributes(){return["schema","template","template-extend","theme","colors","initialData","loading","disabled","max-attempts","block-duration-minutes","attempts-storage-key","submit-button","label-position","show-completed-indicator","form-direction"]}get schema(){let e=this.getAttribute("schema");return e?this.getAttribute("template")?(console.warn('EasyForm: Cannot use both "schema" and "template" attributes. "template" will be ignored.'),F(e)):F(e):null}set schema(e){e&&this.getAttribute("template")&&(console.warn('EasyForm: Setting "schema" will remove "template" attribute.'),this.removeAttribute("template"),this.removeAttribute("template-extend")),e?this.setAttribute("schema",L(e)):this.removeAttribute("schema")}get template(){let e=this.getAttribute("template");return e?(this.getAttribute("schema")&&console.warn('EasyForm: Cannot use both "template" and "schema" attributes. "schema" will be ignored.'),e):null}set template(e){e&&this.getAttribute("schema")&&(console.warn('EasyForm: Setting "template" will remove "schema" attribute.'),this.removeAttribute("schema")),e?this.setAttribute("template",e):(this.removeAttribute("template"),this.removeAttribute("template-extend"))}get templateExtend(){let e=this.getAttribute("template-extend");return e?F(e):null}set templateExtend(e){e?this.setAttribute("template-extend",L(e)):this.removeAttribute("template-extend")}get maxAttempts(){let e=this.getAttribute("max-attempts");if(!e)return null;let r=parseInt(e,10);return isNaN(r)?null:r}set maxAttempts(e){e!=null&&e>=1?this.setAttribute("max-attempts",String(e)):this.removeAttribute("max-attempts")}get blockDurationMinutes(){let e=this.getAttribute("block-duration-minutes");if(!e)return null;let r=parseInt(e,10);return isNaN(r)?null:r}set blockDurationMinutes(e){e!=null&&e>=1?this.setAttribute("block-duration-minutes",String(e)):this.removeAttribute("block-duration-minutes")}get attemptsStorageKey(){return this.getAttribute("attempts-storage-key")}set attemptsStorageKey(e){e?this.setAttribute("attempts-storage-key",e):this.removeAttribute("attempts-storage-key")}get submitButton(){let e=this.getAttribute("submit-button");if(e)try{return F(e)}catch{return null}return null}set submitButton(e){e&&typeof e=="object"?this.setAttribute("submit-button",L(e)):this.removeAttribute("submit-button")}getSubmitButtonConfig(e){let r=this.submitButton,s={...e?.submitButton,...r};return{visible:s.visible??!0,text:s.text??"Enviar",width:s.width??"auto",align:s.align??"left"}}connectedCallback(){this.setupAttemptsLock(),this.setupStyles(),this.render()}attributeChangedCallback(e,r,a){if(e==="schema"&&a!==r&&(this.getAttribute("template")&&(console.warn('EasyForm: "schema" and "template" cannot be used together. Removing "template".'),this.removeAttribute("template"),this.removeAttribute("template-extend")),this.handleSchemaChange()),e==="template"&&a!==r&&(this.getAttribute("schema")&&(console.warn('EasyForm: "template" and "schema" cannot be used together. Removing "schema".'),this.removeAttribute("schema")),this.handleSchemaChange()),e==="template-extend"&&a!==r&&this.handleSchemaChange(),e==="initialData"&&a!==r&&this.handleSchemaChange(),(e==="theme"||e==="colors")&&a!==r&&this.setupStyles(),e==="loading"&&a!==r){let s=this.shadow.querySelector("form");this.updateLoadingOverlay(s||void 0),s&&s.querySelectorAll("input, textarea, select, button").forEach(i=>{i instanceof HTMLElement&&"disabled"in i&&(i.disabled=this.loading)})}e==="disabled"&&a!==r&&this.render(),(e==="label-position"||e==="form-direction"||e==="show-completed-indicator")&&a!==r&&this.render(),(e==="max-attempts"||e==="block-duration-minutes"||e==="attempts-storage-key")&&a!==r&&(this.setupAttemptsLock(),this.updateLockOverlay()),e==="submit-button"&&a!==r&&this.render()}setupAttemptsLock(){let e=this.maxAttempts;if(e==null||e<1){this.attemptsLock=null;return}this.attemptsLock=new I({maxAttempts:e,blockDurationMinutes:this.blockDurationMinutes??5,storageKey:this.attemptsStorageKey??void 0,onLocked:()=>{this.updateLockOverlay()},onUnlocked:()=>{this.stopLockCountdown(),this.updateLockOverlay(),this.render()}})}handleSchemaChange(){let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,e){let a=this.initialData;this.stateManager.initializeSchema(e,a||void 0),this.render()}}getSchemaFromTemplate(e){let r=ue(e);if(!r)return console.error(`EasyForm: Template "${e}" not found`),null;let a=this.templateExtend;return a&&a.length>0?Le(e,a):r}async render(){if(!this.isRendering){this.isRendering=!0;try{let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,!e){let k=this.shadow.querySelector("form");k&&k.parentNode===this.shadow&&k.remove();return}let a=this.skipPreserveValuesOnNextRender,s=a?{}:this.preserveCurrentValues();this.skipPreserveValuesOnNextRender=!1;let o=this.stateManager.getWizardState();if(s&&Object.keys(s).length>0)for(let[k,x]of Object.entries(s))this.stateManager.setValueWithoutValidation(k,x);let i=this.initialData,n=o!==null,l=e.steps&&e.steps.length>0;if(!a&&(!o||!n||!l||o&&e.steps&&o.totalSteps!==e.steps.length)&&(this.stateManager.initializeSchema(e,i||void 0),n&&l&&o)){let k=this.stateManager.getWizardState();if(k&&o.totalSteps===k.totalSteps){o.currentStep>=0&&o.currentStep<k.totalSteps&&this.stateManager.goToStep(o.currentStep);for(let x of o.completedSteps)x>=0&&x<k.totalSteps&&this.stateManager.completeStep(x)}}let m=this.stateManager.getWizardState(),p=document.createElement("form");p.addEventListener("submit",k=>this.handleSubmit(k)),(this.disabled||this.loading)&&p.classList.add("easy-form-disabled");let u=this.getAttribute("form-direction"),h=e.direction??(u==="vertical"||u==="horizontal"?u:"vertical");p.classList.add(`easy-form-direction-${h}`);let b=this.getAttribute("show-completed-indicator"),f=e.completedIndicator??(b!==null&&b!=="false"),y=typeof f=="object"&&f?.position?f.position:"top";if(m)this.renderWizard(p,e);else{this.renderFields(p,e.fields||[]);let k=this.getSubmitButtonConfig(e);if(k.visible){let x=document.createElement("div");x.className="easy-form-submit-wrapper",x.style.textAlign=k.align;let w=document.createElement("button");w.type="submit",w.textContent=k.text,w.className="easy-form-submit",w.style.width=k.width,(this.disabled||this.loading)&&(w.disabled=!0),x.appendChild(w),p.appendChild(x)}}let E=null;if(f){let{completed:k,total:x}=this.getCompletedRequiredProgress(e),w=document.createElement("div");w.className="easy-form-completed-indicator",w.setAttribute("role","progressbar"),w.setAttribute("aria-valuenow",String(k)),w.setAttribute("aria-valuemin","0"),w.setAttribute("aria-valuemax",String(x)),w.setAttribute("aria-label",`Campos obligatorios completados: ${k} de ${x}`);let S=document.createElement("div");S.className="easy-form-completed-track";let ie=document.createElement("div");ie.className="easy-form-completed-fill",ie.style.width=x>0?`${k/x*100}%`:"0%",S.appendChild(ie),w.appendChild(S),E=document.createElement("div"),E.className="easy-form-wrapper",y==="top"?(E.appendChild(w),E.appendChild(p)):(E.appendChild(p),E.appendChild(w))}let v=this.shadow.querySelector("form");if(v&&v.parentNode===this.shadow&&v!==p)try{v.remove()}catch(k){console.warn("Error al eliminar formulario anterior:",k)}let C=this.shadow.querySelector(".easy-form-wrapper");C&&C.remove(),this.shadow.appendChild(E||p),this.loading&&this.updateLoadingOverlay(p),this.updateLockOverlay(p)}finally{this.isRendering=!1}}}updateLockOverlay(e){let r=this.shadow.querySelector(".easy-form-lock-overlay");if(r&&r.remove(),this.stopLockCountdown(),!this.attemptsLock?.isLocked())return;let a=e||this.shadow.querySelector("form");if(!a)return;let s=document.createElement("div");s.className="easy-form-lock-overlay";let o=document.createElement("div");o.className="easy-form-lock-message",o.setAttribute("role","alert");let i=()=>{let n=this.attemptsLock.getRemainingBlockTimeMs();if(n<=0){this.stopLockCountdown();return}let l=Math.floor(n/6e4),d=Math.floor(n%6e4/1e3),m=l>0?`${l} min ${d} s`:`${d} segundos`;o.textContent=`Demasiados intentos. Intenta de nuevo en ${m}.`};i(),s.appendChild(o),a.appendChild(s),this.lockCountdownInterval=setInterval(i,1e3)}stopLockCountdown(){this.lockCountdownInterval&&(clearInterval(this.lockCountdownInterval),this.lockCountdownInterval=null)}updateLoadingOverlay(e){let r=this.shadow.querySelector(".easy-form-loading-overlay");if(r&&r.remove(),this.loading){let a=e||this.shadow.querySelector("form");if(a){let s=document.createElement("div");s.className="easy-form-loading-overlay";let o=document.createElement("div");o.className="easy-form-loading-spinner",s.appendChild(o),a.appendChild(s)}}}preserveCurrentValues(){let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,!e)return{};let a=this.shadow.querySelector("form"),s={};if(!a)return s;let o=a.querySelectorAll("input, textarea, select");for(let i of o){let n=i.getAttribute("name");if(!n||!(this.findFieldInSchema(e,n)!==null))continue;let d;if(i instanceof HTMLInputElement)if(i.type==="checkbox")d=i.checked;else if(i.type==="radio")if(i.checked)d=i.value;else continue;else i.type==="number"?d=i.value===""?null:Number(i.value):d=i.value;else i instanceof HTMLTextAreaElement?d=i.value:i instanceof HTMLSelectElement&&(i.multiple?d=Array.from(i.selectedOptions).map(m=>m.value):d=i.value||null);d!==void 0&&(s[n]=d===""?null:d)}return s}initializeSlotTemplates(){if(this.slotTemplates!==null)return;let e=[];for(let r of Array.from(this.children))r instanceof HTMLElement&&e.push(r);if(e.length===0){this.slotTemplates=[];return}this.slotTemplates=e.map(r=>{let a=r.hasAttribute("row")?r.getAttribute("row"):null,s=a!=null&&a!==""?Number(a):NaN,o=Number.isFinite(s)?s:null;return{template:r.cloneNode(!0),row:o}})}getSlotClonesByRow(e){this.initializeSlotTemplates();let r=new Map;if(!this.slotTemplates||this.slotTemplates.length===0)return r;for(let{template:a,row:s}of this.slotTemplates){let o=typeof s=="number"?s:-1;Number.isFinite(o)||(o=-1),(o<0||o>=e)&&(o=-1);let i=a.cloneNode(!0),n=r.get(o)??[];n.push(i),r.set(o,n)}return r}applySlotDisabledState(e){if(!this.disabled&&!this.loading)return;e.classList.add("easy-form-slot-disabled"),e.querySelectorAll("input, textarea, select, button").forEach(a=>{"disabled"in a&&(a.disabled=!0)})}renderFields(e,r){if(r.length===0){let n=this.getSlotClonesByRow(0).get(-1);if(n&&n.length>0)for(let l of n)this.applySlotDisabledState(l),e.appendChild(l);return}let a=r.length,s=this.getSlotClonesByRow(a);for(let i=0;i<r.length;i++){let n=s.get(i);if(n&&n.length>0){for(let m of n)this.applySlotDisabledState(m),e.appendChild(m);s.delete(i)}let l=r[i],d=this.renderField(l);d&&e.appendChild(d)}let o=s.get(-1);if(o&&o.length>0)for(let i of o)this.applySlotDisabledState(i),e.appendChild(i)}renderField(e){let r=this.stateManager.getFieldVisibility(e.name),a=this.stateManager.getFieldEnabled(e.name);if(e.type==="group"){let f=this.renderGroup(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="row"){let f=this.renderRow(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="array"){let f=this.renderArray(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="custom"){let f=this.renderCustom(e);return f&&(r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled")),f}let s=this.stateManager.getValue(e.name),o=this.stateManager.getErrors(e.name),i=o.length>0?o[0]:void 0,n=this.disabled||this.loading,l=this.getAttribute("label-position"),d=["up","down","left","right","none"],m=e.labelPosition??(l&&d.includes(l)?l:"up"),p={...e,disabled:n||!a||e.disabled,labelPosition:m},u=pe(e.type);if(u){let f=u({field:p,value:s,error:i,onChange:y=>this.handleFieldChange(e.name,y),onBlur:()=>this.handleFieldBlur(e.name)});return f&&!r&&(f.style.display="none",f.classList.add("easy-form-field-hidden")),f}let h=Ee(p,s,i,f=>this.handleFieldChange(e.name,f),()=>this.handleFieldBlur(e.name)),b=h.querySelector(".easy-form-field")||h;return b instanceof HTMLElement&&b.setAttribute("data-field-name",e.name),r||(h.style.display="none",h.classList.add("easy-form-field-hidden")),h}renderGroup(e){let r=e,a=r.direction??"vertical",s=r.collapsible===!0,o=r.defaultOpen!==!1,i=document.createElement("div");if(i.className=`easy-form-group easy-form-direction-${a}`,e.name&&i.setAttribute("data-field-name",e.name),s){i.classList.add("easy-form-group-collapsible"),o||i.classList.add("easy-form-group-collapsed");let n=document.createElement("button");n.type="button",n.className="easy-form-group-header",n.setAttribute("aria-expanded",String(o));let l=`easy-form-group-${(e.name||"group").replace(/[^a-z0-9]/gi,"-")}-content`;n.setAttribute("aria-controls",l);let d=document.createElement("span");d.textContent=e.label||"Grupo";let m=document.createElement("span");m.className="easy-form-group-chevron",m.setAttribute("aria-hidden","true"),m.textContent="\u25BC",n.appendChild(d),n.appendChild(m),i.appendChild(n);let p=document.createElement("div");if(p.id=l,p.className="easy-form-group-content","fields"in e&&e.fields)for(let h of e.fields){let b=h.name.startsWith(e.name+".")?h.name:`${e.name}.${h.name}`,f={...h,name:b},y=this.renderField(f);y&&p.appendChild(y)}i.appendChild(p);let u=h=>{h?p.style.maxHeight=p.scrollHeight+"px":p.style.maxHeight="0"};o?requestAnimationFrame(()=>u(!0)):p.style.maxHeight="0",n.addEventListener("click",()=>{i.classList.contains("easy-form-group-collapsed")?(i.classList.remove("easy-form-group-collapsed"),n.setAttribute("aria-expanded","true"),u(!0)):(p.style.maxHeight=p.scrollHeight+"px",requestAnimationFrame(()=>{i.classList.add("easy-form-group-collapsed"),n.setAttribute("aria-expanded","false"),u(!1)}))})}else{if(e.label){let n=document.createElement("h3");n.className="easy-form-group-label",n.textContent=e.label,i.appendChild(n)}if("fields"in e&&e.fields)for(let n of e.fields){let l=n.name.startsWith(e.name+".")?n.name:`${e.name}.${n.name}`,d={...n,name:l},m=this.renderField(d);m&&i.appendChild(m)}}return i}renderRow(e){let r=document.createElement("div");r.className="easy-form-row";let a=e;if(r.style.display="flex",r.style.flexWrap="wrap",r.style.alignItems=a.align||"stretch",a.gap!==void 0){let s=typeof a.gap=="number"?`${a.gap}px`:a.gap;r.style.gap=s}else r.style.gap="1rem";if("fields"in e&&e.fields)for(let s of e.fields){let o=this.renderField(s);if(o){let i=document.createElement("div");i.style.flex="1",i.style.minWidth="0",i.appendChild(o),r.appendChild(i)}}return r}renderArray(e){let r=document.createElement("div");if(r.className="easy-form-array",r.setAttribute("data-field-name",e.name),e.label){let m=document.createElement("label");m.className="easy-form-label",m.textContent=e.label,r.appendChild(m)}let a=this.stateManager.getValue(e.name)||[],s=e,o=s.minItems??0,i=s.maxItems??1/0,n=document.createElement("div");n.className="easy-form-array-items";for(let m=0;m<a.length;m++){let p=document.createElement("div");if(p.className="easy-form-array-item",s.itemSchema?.fields)for(let b of s.itemSchema.fields){let f={...b,name:`${e.name}.${m}.${b.name}`},y=this.renderField(f);y&&p.appendChild(y)}let u=document.createElement("button");u.type="button",u.textContent="Eliminar",u.className="easy-form-array-remove";let h=a.length<=o;this.disabled||this.loading||h?u.disabled=!0:u.addEventListener("click",()=>{let b=[...a];b.splice(m,1),this.handleFieldChange(e.name,b)}),p.appendChild(u),n.appendChild(p)}r.appendChild(n);let l=document.createElement("button");l.type="button",l.textContent="Agregar",l.className="easy-form-array-add";let d=a.length>=i;return this.disabled||this.loading||d?l.disabled=!0:l.addEventListener("click",()=>{let m=this.stateManager.createDefaultArrayItem(e),p=[...a,m];this.handleFieldChange(e.name,p)}),r.appendChild(l),r}renderCustom(e){let r=pe("custom");if(!r){let i=document.createElement("div");return i.textContent=`Componente custom no registrado para: ${e.name}`,i}let a=this.stateManager.getValue(e.name),s=this.stateManager.getErrors(e.name),o=s.length>0?s[0]:void 0;return r({field:e,value:a,error:o,onChange:i=>this.handleFieldChange(e.name,i),onBlur:()=>this.handleFieldBlur(e.name)})}getCompletedRequiredProgress(e){let r=d=>{let m=[];for(let p of d)if(p.type==="array"&&"itemSchema"in p&&p.itemSchema?.fields){let u=this.stateManager.getValue(p.name),h=Array.isArray(u)?u.length:0;for(let b=0;b<h;b++)for(let f of p.itemSchema.fields)m.push({...f,name:`${p.name}.${b}.${f.name}`})}else(p.type==="group"||p.type==="row")&&"fields"in p&&p.fields?m.push(...r(p.fields)):m.push(p);return m},a=e.steps?this.stateManager.getCurrentStepFields()||[]:e.fields||[],i=r(a).filter(d=>d.validations?.some(m=>m.type==="required")).filter(d=>this.stateManager.getFieldVisibility(d.name)),n=i.length;return{completed:i.filter(d=>{if(this.stateManager.getErrors(d.name).length>0)return!1;let p=this.stateManager.getValue(d.name);return!(p==null||typeof p=="string"&&p.trim()===""||Array.isArray(p)&&p.length===0&&d.type==="array")}).length,total:n}}renderWizard(e,r){let a=this.stateManager.getWizardState();if(!a)return;let s=document.createElement("div");s.className="easy-form-wizard";let o=document.createElement("div");if(o.className="easy-form-wizard-steps",r?.steps)for(let m=0;m<r.steps.length;m++){let p=document.createElement("div");p.className="easy-form-wizard-step",m===a.currentStep&&p.classList.add("active"),a.completedSteps.includes(m)&&p.classList.add("completed"),p.textContent=r.steps[m].title,o.appendChild(p)}s.appendChild(o);let i=document.createElement("div");i.className="easy-form-wizard-fields";let n=this.stateManager.getCurrentStepFields();this.renderFields(i,n),s.appendChild(i);let l=document.createElement("div");if(l.className="easy-form-wizard-nav",a.currentStep>0){let m=document.createElement("button");m.type="button",m.textContent="Anterior",m.className="easy-form-wizard-prev",this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",()=>{this.stateManager.getWizardState()&&this.stateManager.previousStep()&&(this.render(),this.emitStepChange())}),l.appendChild(m)}if(a.currentStep<a.totalSteps-1){let m=document.createElement("button");m.type="button",m.textContent="Siguiente",m.className="easy-form-wizard-next",this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",async()=>{let p=this.stateManager.getWizardState();if(!p)return;let u=this.stateManager.getCurrentStepFields();for(let y of u)this.stateManager.getFieldVisibility(y.name)&&await this.stateManager.validateField(y.name);let h=this.stateManager.getAllErrors(),b={};for(let y of u)h[y.name]&&h[y.name].length>0&&(b[y.name]=h[y.name]);Object.keys(b).length>0?this.emitError(b):(this.stateManager.completeStep(p.currentStep),this.stateManager.nextStep()&&(this.render(),this.emitStepChange()))}),l.appendChild(m)}let d=this.getSubmitButtonConfig(r);if(a.currentStep===a.totalSteps-1&&d.visible){let m=document.createElement("button");m.type="button",m.textContent=d.text,m.className="easy-form-wizard-next",m.style.width=d.width,this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",async()=>{let p=this.stateManager.getCurrentStepFields();for(let f of p)this.stateManager.getFieldVisibility(f.name)&&await this.stateManager.validateField(f.name);let u=this.stateManager.getAllErrors(),h={};for(let f of p)u[f.name]&&u[f.name].length>0&&(h[f.name]=u[f.name]);Object.keys(h).length>0?this.emitError(h):await this.handleSubmit(new Event("submit"))}),l.appendChild(m)}s.appendChild(l),e.appendChild(s)}async handleFieldChange(e,r){await this.stateManager.setValue(e,r);let a=this.schema;if(a){let i=this.findFieldInSchema(a,e);i?.type==="array"&&(this.rerenderArrayField(i)||(this.skipPreserveValuesOnNextRender=!0,requestAnimationFrame(()=>this.render())))}let s=this.stateManager.getDependentFields(e);s.length>0&&(this.dependencyRenderTimeout&&clearTimeout(this.dependencyRenderTimeout),this.dependencyRenderTimeout=setTimeout(()=>{this.renderDependentFields(s),this.emitDependencyChange(e,s)},10));let o=new CustomEvent("change",{detail:{field:e,value:r,values:this.stateManager.getState().values},bubbles:!0,composed:!0});this.dispatchEvent(o)}rerenderArrayField(e){let r=this.shadow.querySelector(`[data-field-name="${e.name}"].easy-form-array`);if(!r?.parentNode)return!1;let a=this.renderArray(e);return r.parentNode.replaceChild(a,r),!0}renderDependentFields(e){let r=this.shadow.querySelector("form");if(!r)return;let a=this.schema;if(a)for(let s of e){let o=r.querySelector(`.easy-form-field[name="${s}"], [data-field-name="${s}"]`)?.closest(".easy-form-field")??r.querySelector(`[data-field-name="${s}"]`);if(o){let i=this.findFieldInSchema(a,s);if(!i)continue;let n=this.renderField(i);n&&o.parentNode&&o.parentNode.replaceChild(n,o)}}}emitDependencyChange(e,r){let a=new CustomEvent("dependencyChange",{detail:{changedField:e,affectedFields:r},bubbles:!0,composed:!0});this.dispatchEvent(a)}async handleFieldBlur(e){this.stateManager.setTouched(e),await this.stateManager.validateField(e),this.updateSingleField(e)}updateSingleField(e){let r=this.schema;if(!r||!this.findFieldInSchema(r,e))return;let s=this.stateManager.getErrors(e),o=s.length>0?s[0]:void 0,i=this.shadow.querySelector(`[name="${e}"]`)?.closest(".easy-form-field");if(!i)return;let n=i.querySelector(".easy-form-error");if(o){if(n)n.textContent=o;else{let d=document.createElement("p");d.className="easy-form-error",d.textContent=o,i.appendChild(d)}i.querySelector("input, textarea, select")?.classList.add("easy-form-input-error")}else n?.remove(),i.querySelector("input, textarea, select")?.classList.remove("easy-form-input-error")}findFieldInSchema(e,r){let a=e.fields||[],s=r.indexOf(".");if(s>0){let o=r.slice(0,s),i=r.slice(s+1),n=a.find(l=>l.name===o);if(!n)return null;if((n.type==="group"||n.type==="row")&&"fields"in n&&n.fields){let l=this.findFieldInSchema({fields:n.fields},i);return l?{...l,name:r}:null}return null}for(let o of a){if(o.name===r)return o;if(o.type==="group"&&"fields"in o){let i=this.findFieldInSchema({fields:o.fields},r);if(i)return i}if(o.type==="row"&&"fields"in o){let i=this.findFieldInSchema({fields:o.fields},r);if(i)return i}}return null}async handleSubmit(e){if(e.preventDefault(),this.attemptsLock?.isLocked())return;let r=await this.stateManager.validateForm(),a=this.stateManager.getState();if(Object.keys(r).length>0){this.emitError(r);return}let s=new CustomEvent("submit",{detail:{values:a.values,isValid:!0,errors:{}},bubbles:!0,composed:!0});this.dispatchEvent(s)}emitError(e){let r=new CustomEvent("error",{detail:{errors:e},bubbles:!0,composed:!0});this.dispatchEvent(r)}emitStepChange(){let e=this.stateManager.getWizardState();if(!e)return;let r=new CustomEvent("stepChange",{detail:{currentStep:e.currentStep,previousStep:e.currentStep>0?e.currentStep-1:e.currentStep,totalSteps:e.totalSteps},bubbles:!0,composed:!0});this.dispatchEvent(r)}registerComponents(e){this.customComponents={...this.customComponents,...e},Se(e)}reset(){this.stateManager.reset(),this.render()}incrementAttempts(){this.attemptsLock?.incrementAttempts(),this.attemptsLock?.isLocked()&&this.updateLockOverlay()}resetAttempts(){this.attemptsLock?.reset(),this.stopLockCountdown(),this.updateLockOverlay(),this.render()}isLocked(){return this.attemptsLock?.isLocked()??!1}getRemainingBlockTimeMs(){return this.attemptsLock?.getRemainingBlockTimeMs()??0}requestSubmit(){let e=this.shadow.querySelector("form");e&&typeof e.requestSubmit=="function"&&e.requestSubmit()}clear(){let e=this.schema,r=this.template,a=null;r?a=this.getSchemaFromTemplate(r):a=e,a&&(this.stateManager.initializeSchema(a,{}),this.render())}getValues(){return this.stateManager.getState().values}getValue(e){return this.stateManager.getValue(e)}async setValue(e,r){await this.stateManager.setValue(e,r),this.render()}async setValues(e){for(let[r,a]of Object.entries(e))await this.stateManager.setValue(r,a);this.render()}async validate(){let e=await this.stateManager.validateForm();return Object.keys(e).length>0&&this.emitError(e),e}async validateField(e){return await this.stateManager.validateField(e),this.updateSingleField(e),this.stateManager.getErrors(e)}getErrors(){return this.stateManager.getAllErrors()}getFieldErrors(e){return this.stateManager.getErrors(e)}isValid(){return this.stateManager.getState().isValid}get theme(){let e=this.getAttribute("theme");return e&&["plano","tradicional","material","rounded-shadow","lines","shadcn","chakra","mantine","glass","bordered","minimal","efc"].includes(e)?e:"plano"}set theme(e){e?this.setAttribute("theme",e):this.removeAttribute("theme")}get colors(){let e=this.getAttribute("colors");return e?F(e):null}set colors(e){e?this.setAttribute("colors",L(e)):this.removeAttribute("colors")}get initialData(){let e=this.getAttribute("initialData");return e?F(e):null}set initialData(e){e?this.setAttribute("initialData",L(e)):this.removeAttribute("initialData")}get loading(){return this.hasAttribute("loading")}set loading(e){e?this.setAttribute("loading",""):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}setupStyles(){let e=this.shadow.querySelector("style");e&&e.remove();let r=this.theme,a=ne(this.colors||void 0),s=le(r,a),o=document.createElement("style");o.textContent=s,this.shadow.firstChild?this.shadow.insertBefore(o,this.shadow.firstChild):this.shadow.appendChild(o)}};typeof window<"u"&&typeof customElements<"u"&&!customElements.get("easy-form")&&customElements.define("easy-form",fe);export{fe as EasyForm};
2184
+ `;return}delete E.Icon.Default.prototype._getIconUrl,E.Icon.Default.mergeOptions({iconRetinaUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png",iconUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",shadowUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png"}),this.mapInstance=E.map(u,{preferCanvas:!1,zoomControl:!0}).setView([o,i],a);let v=E.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',maxZoom:19}).addTo(this.mapInstance);this.mapInstance.invalidateSize(),v.on("load",()=>{this.mapInstance&&this.mapInstance.invalidateSize()});let C=()=>{this.mapInstance&&this.mapInstance.invalidateSize()};setTimeout(C,100),setTimeout(C,300),setTimeout(C,500),new IntersectionObserver(x=>{x.forEach(w=>{w.isIntersecting&&this.mapInstance&&setTimeout(()=>{this.mapInstance?.invalidateSize()},100)})}).observe(u),this.markerInstance=E.marker([o,i],{draggable:!0}).addTo(this.mapInstance).on("dragend",()=>{let x=this.markerInstance.getLatLng();d.value=String(Number(x.lat.toFixed(6))),m.value=String(Number(x.lng.toFixed(6))),this.onChange({lat:x.lat,lng:x.lng}),this.onBlur()}),this.mapInstance.on("click",x=>{let{lat:w,lng:S}=x.latlng;this.markerInstance.setLatLng([w,S]),d.value=String(Number(w.toFixed(6))),m.value=String(Number(S.toFixed(6))),this.onChange({lat:w,lng:S}),this.onBlur()})})(),this.createFieldContainer(n)}syncMarkerPosition(e,r){this.mapInstance&&this.markerInstance&&(this.markerInstance.setLatLng([e,r]),this.mapInstance.setView([e,r]),setTimeout(()=>{this.mapInstance?.invalidateSize()},50))}};var ke=c=>`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="${c?"currentColor":"none"}" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" role="img" aria-hidden="true"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>`,ae=class extends g{render(){let t=this.field,e=t.max??5,r=t.half??!1,a=this.value!=null?Number(this.value):0,s=document.createElement("div");s.className="easy-form-rating",s.setAttribute("role","slider"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuemax",String(e)),s.setAttribute("aria-valuenow",String(a)),s.setAttribute("aria-label",this.field.label||"Rating"),s.setAttribute("tabindex","0");let o=document.createElement("div");o.className="easy-form-rating-stars";for(let i=1;i<=e;i++){let n=document.createElement("button");n.type="button";let l=a>=i||r&&a>=i-.5;n.className=l?"easy-form-rating-star easy-form-rating-star-filled":"easy-form-rating-star",n.innerHTML=ke(l),n.setAttribute("aria-label",`${i} de ${e}`),n.addEventListener("click",d=>{d.preventDefault();let m=d.target.closest("button")?.getBoundingClientRect(),p=i;if(r&&m){let u=m.left+m.width/2;p=d.clientX<u?i-.5:i}this.onChange(p),this.onBlur(),this.rerenderStars(s,e,p,r),s.setAttribute("aria-valuenow",String(p))}),o.appendChild(n)}return s.appendChild(o),s.addEventListener("keydown",i=>{let n=Number(s.getAttribute("aria-valuenow"))||0,l=n;i.key==="ArrowRight"||i.key==="ArrowUp"?(i.preventDefault(),l=Math.min(e,r?n+.5:n+1),this.onChange(l)):(i.key==="ArrowLeft"||i.key==="ArrowDown")&&(i.preventDefault(),l=Math.max(0,r?n-.5:n-1),this.onChange(l)),l!==n&&(this.rerenderStars(s,e,l,r),s.setAttribute("aria-valuenow",String(l)))}),this.createFieldContainer(s)}rerenderStars(t,e,r,a){t.querySelectorAll(".easy-form-rating-star").forEach((o,i)=>{let n=i+1,l=r>=n||a&&r>=n-.5;o.className=l?"easy-form-rating-star easy-form-rating-star-filled":"easy-form-rating-star",o.innerHTML=ke(l)})}};var se=class extends g{render(){let t=this.field,e=t.min??0,r=t.max??100,a=t.step??1,s=t.showValue??!1,o=document.createElement("input");o.type="range",o.min=String(e),o.max=String(r),o.step=String(a),o.value=this.value!=null?String(this.value):String(e),o.setAttribute("aria-valuemin",String(e)),o.setAttribute("aria-valuemax",String(r)),o.setAttribute("aria-valuenow",o.value),this.applyCommonProps(o),o.addEventListener("input",n=>{let l=n.target,d=a>=1?parseInt(l.value,10):parseFloat(l.value);this.onChange(isNaN(d)?e:d),i&&(i.textContent=l.value),o.setAttribute("aria-valuenow",l.value)}),o.addEventListener("change",()=>{this.onBlur()});let i=null;if(s){i=document.createElement("span"),i.className="easy-form-slider-value",i.textContent=o.value;let n=document.createElement("div");return n.className="easy-form-slider-wrapper",n.appendChild(o),n.appendChild(i),this.createFieldContainer(n)}return this.createFieldContainer(o)}};var Ye=/^#?([0-9A-Fa-f]{6})$/;function ce(c){let t=c.match(Ye);return t?`#${t[1].toLowerCase()}`:/^[0-9A-Fa-f]{6}$/.test(c)?`#${c.toLowerCase()}`:"#000000"}var oe=class extends g{render(){let e=this.field.defaultValue??"#000000",r=this.value!=null&&typeof this.value=="string"?ce(this.value):e,a=document.createElement("div");a.className="easy-form-color-wrapper";let s=document.createElement("input");s.type="color",s.value=r,s.setAttribute("value",r),s.setAttribute("aria-label",this.field.label||"Color"),s.id=`${this.getFieldId()}-picker`,this.field.disabled&&s.setAttribute("disabled","true");let o=document.createElement("input");o.type="text",o.value=r,o.setAttribute("aria-label",`${this.field.label||"Color"} (hex)`),o.placeholder="#000000",o.className="easy-form-color-text",this.applyCommonProps(o);let i=()=>{let l=s.value||"#000000",d=ce(l);o.value=d,this.onChange(d)},n=()=>{let l=o.value.trim(),d=l.startsWith("#")?l:`#${l}`;if(/^#[0-9A-Fa-f]{6}$/.test(d)){let m=ce(d);s.value=m,this.onChange(m)}};return s.addEventListener("input",i),s.addEventListener("change",()=>{i(),this.onBlur()}),o.addEventListener("input",n),o.addEventListener("blur",()=>{n(),this.onBlur()}),a.appendChild(s),a.appendChild(o),this.createFieldContainer(a)}};function Ee(c,t,e,r,a){switch(c.type){case"text":case"email":return new $(c,t,e,r,a).render();case"password":return new ee(c,t,e,r,a).render();case"number":return new B(c,t,e,r,a).render();case"textarea":return new O(c,t,e,r,a).render();case"select":return new j(c,t,e,r,a).render();case"checkbox":return new W(c,t,e,r,a).render();case"radio":return new _(c,t,e,r,a).render();case"switch":return new Y(c,t,e,r,a).render();case"date":return new U(c,t,e,r,a).render();case"file":return new G(c,t,e,r,a).render();case"file-drop":return new te(c,t,e,r,a).render();case"map":return new re(c,t,e,r,a).render();case"rating":return new ae(c,t,e,r,a).render();case"slider":return new se(c,t,e,r,a).render();case"colorpicker":return new oe(c,t,e,r,a).render();case"quantity":return new K(c,t,e,r,a).render();case"accordion-select":return new Z(c,t,e,r,a).render();case"image-grid-select":return new J(c,t,e,r,a).render();case"otp":return new Q(c,t,e,r,a).render();default:let s=document.createElement("div");return s.textContent=`Tipo de campo no soportado: ${c.type}`,s}}var Ce=new Map;function Ue(c,t){Ce.set(c,t)}function Se(c){for(let[t,e]of Object.entries(c))Ue(t,e)}function pe(c){return Ce.get(c)}var Ge={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"password",name:"password",label:"Password",placeholder:"Enter your password",validations:[{type:"required",message:"Password is required"},{type:"minLength",value:6,message:"Password must be at least 6 characters"}]},{type:"checkbox",name:"rememberMe",label:"Remember me",defaultValue:!1}]},Ke={fields:[{type:"text",name:"name",label:"Full Name",placeholder:"Enter your full name",validations:[{type:"required",message:"Name is required"},{type:"minLength",value:2,message:"Name must be at least 2 characters"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"password",name:"password",label:"Password",placeholder:"Create a password",validations:[{type:"required",message:"Password is required"},{type:"minLength",value:8,message:"Password must be at least 8 characters"}]},{type:"password",name:"confirmPassword",label:"Confirm Password",placeholder:"Confirm your password",validations:[{type:"required",message:"Please confirm your password"},{type:"custom",validator:c=>typeof c=="string"&&c.length>=8,message:"Password must be at least 8 characters"}]}]},Ze={fields:[{type:"otp",name:"code",label:"Verification Code",validations:[{type:"required",message:"Verification code is required"}]}]},Je={fields:[{type:"text",name:"name",label:"Name",placeholder:"Enter your name",validations:[{type:"required",message:"Name is required"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"text",name:"subject",label:"Subject",placeholder:"Enter the subject",validations:[{type:"required",message:"Subject is required"}]},{type:"textarea",name:"message",label:"Message",placeholder:"Enter your message",rows:5,validations:[{type:"required",message:"Message is required"},{type:"minLength",value:10,message:"Message must be at least 10 characters"}]}]},Qe={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email address",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]}]},Xe={fields:[{type:"password",name:"currentPassword",label:"Current Password",placeholder:"Enter your current password",validations:[{type:"required",message:"Current password is required"}]},{type:"password",name:"newPassword",label:"New Password",placeholder:"Enter your new password",validations:[{type:"required",message:"New password is required"},{type:"minLength",value:8,message:"Password must be at least 8 characters"}]},{type:"password",name:"confirmPassword",label:"Confirm New Password",placeholder:"Confirm your new password",validations:[{type:"required",message:"Please confirm your new password"},{type:"custom",validator:c=>typeof c=="string"&&c.length>=8,message:"Password must be at least 8 characters"}]}]},et={fields:[{type:"text",name:"name",label:"Full Name",placeholder:"Enter your full name",validations:[{type:"required",message:"Name is required"}]},{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"text",name:"phone",label:"Phone",placeholder:"Enter your phone number",mask:{type:"phone"}},{type:"textarea",name:"bio",label:"Bio",placeholder:"Tell us about yourself",rows:4},{type:"file",name:"avatar",label:"Profile Picture",accept:"image/*"}]},tt={fields:[{type:"group",name:"billingAddress",label:"Billing Address",fields:[{type:"text",name:"street",label:"Street Address",placeholder:"Enter street address",validations:[{type:"required",message:"Street address is required"}]},{type:"row",name:"cityState",fields:[{type:"text",name:"city",label:"City",placeholder:"City",validations:[{type:"required",message:"City is required"}]},{type:"text",name:"state",label:"State",placeholder:"State",validations:[{type:"required",message:"State is required"}]}]},{type:"text",name:"zipCode",label:"ZIP Code",placeholder:"ZIP Code",validations:[{type:"required",message:"ZIP code is required"}]}]},{type:"select",name:"paymentMethod",label:"Payment Method",options:[{label:"Credit Card",value:"credit-card"},{label:"Debit Card",value:"debit-card"},{label:"PayPal",value:"paypal"},{label:"Bank Transfer",value:"bank-transfer"}],validations:[{type:"required",message:"Payment method is required"}]},{type:"select",name:"shipping",label:"Shipping Method",options:[{label:"Standard (5-7 days)",value:"standard"},{label:"Express (2-3 days)",value:"express"},{label:"Overnight",value:"overnight"}],validations:[{type:"required",message:"Shipping method is required"}]}]},rt={fields:[{type:"select",name:"rating",label:"Rating",options:[{label:"1 - Poor",value:1},{label:"2 - Fair",value:2},{label:"3 - Good",value:3},{label:"4 - Very Good",value:4},{label:"5 - Excellent",value:5}],validations:[{type:"required",message:"Rating is required"}]},{type:"textarea",name:"comment",label:"Comment",placeholder:"Share your feedback",rows:5,validations:[{type:"required",message:"Comment is required"}]},{type:"email",name:"email",label:"Email (optional)",placeholder:"Enter your email if you want a response"}]},at={fields:[{type:"email",name:"email",label:"Email",placeholder:"Enter your email",validations:[{type:"required",message:"Email is required"},{type:"email",message:"Please enter a valid email"}]},{type:"checkbox",name:"weeklyNewsletter",label:"Weekly Newsletter",defaultValue:!0},{type:"checkbox",name:"productUpdates",label:"Product Updates",defaultValue:!1},{type:"checkbox",name:"promotions",label:"Promotions and Special Offers",defaultValue:!1}]},st={fields:[{type:"date",name:"date",label:"Date",validations:[{type:"required",message:"Date is required"}]},{type:"text",name:"time",label:"Time",placeholder:"HH:MM",mask:{type:"time"},validations:[{type:"required",message:"Time is required"}]},{type:"number",name:"guests",label:"Number of Guests",placeholder:"Enter number of guests",min:1,max:20,validations:[{type:"required",message:"Number of guests is required"},{type:"min",value:1,message:"At least 1 guest is required"}]},{type:"textarea",name:"specialRequests",label:"Special Requests",placeholder:"Any special requests or dietary restrictions?",rows:4}]},ot={fields:[{type:"select",name:"rating",label:"Rating",options:[{label:"1 Star",value:1},{label:"2 Stars",value:2},{label:"3 Stars",value:3},{label:"4 Stars",value:4},{label:"5 Stars",value:5}],validations:[{type:"required",message:"Rating is required"}]},{type:"text",name:"title",label:"Review Title",placeholder:"Give your review a title",validations:[{type:"required",message:"Review title is required"},{type:"minLength",value:5,message:"Title must be at least 5 characters"}]},{type:"textarea",name:"comment",label:"Your Review",placeholder:"Share your experience",rows:6,validations:[{type:"required",message:"Review comment is required"},{type:"minLength",value:20,message:"Review must be at least 20 characters"}]}]},Fe={login:Ge,register:Ke,otp:Ze,contact:Je,"password-reset":Qe,"password-change":Xe,profile:et,checkout:tt,feedback:rt,subscription:at,booking:st,review:ot};function ue(c){return c in Fe?Fe[c]:null}function Le(c,t){let e=ue(c);if(!e)throw new Error(`Template "${c}" not found`);let r=e.fields||[],a=e.steps;if(a&&a.length>0){let s=a[a.length-1];return{...e,steps:[...a.slice(0,-1),{...s,fields:[...s.fields,...t]}]}}return{...e,fields:[...r,...t]}}var it=typeof HTMLElement<"u"?HTMLElement:class{},fe=class extends it{constructor(){if(typeof HTMLElement>"u")throw new Error("EasyForm can only be used in a browser environment");super();this.customComponents={};this.isRendering=!1;this.attemptsLock=null;this.lockCountdownInterval=null;this.slotTemplates=null;this.skipPreserveValuesOnNextRender=!1;this.dependencyRenderTimeout=null;this.stateManager=new D,this.shadow=this.attachShadow({mode:"open"})}static get observedAttributes(){return["schema","template","template-extend","theme","colors","initialData","loading","disabled","max-attempts","block-duration-minutes","attempts-storage-key","submit-button","label-position","show-completed-indicator","form-direction"]}get schema(){let e=this.getAttribute("schema");return e?this.getAttribute("template")?(console.warn('EasyForm: Cannot use both "schema" and "template" attributes. "template" will be ignored.'),F(e)):F(e):null}set schema(e){e&&this.getAttribute("template")&&(console.warn('EasyForm: Setting "schema" will remove "template" attribute.'),this.removeAttribute("template"),this.removeAttribute("template-extend")),e?this.setAttribute("schema",L(e)):this.removeAttribute("schema")}get template(){let e=this.getAttribute("template");return e?(this.getAttribute("schema")&&console.warn('EasyForm: Cannot use both "template" and "schema" attributes. "schema" will be ignored.'),e):null}set template(e){e&&this.getAttribute("schema")&&(console.warn('EasyForm: Setting "template" will remove "schema" attribute.'),this.removeAttribute("schema")),e?this.setAttribute("template",e):(this.removeAttribute("template"),this.removeAttribute("template-extend"))}get templateExtend(){let e=this.getAttribute("template-extend");return e?F(e):null}set templateExtend(e){e?this.setAttribute("template-extend",L(e)):this.removeAttribute("template-extend")}get maxAttempts(){let e=this.getAttribute("max-attempts");if(!e)return null;let r=parseInt(e,10);return isNaN(r)?null:r}set maxAttempts(e){e!=null&&e>=1?this.setAttribute("max-attempts",String(e)):this.removeAttribute("max-attempts")}get blockDurationMinutes(){let e=this.getAttribute("block-duration-minutes");if(!e)return null;let r=parseInt(e,10);return isNaN(r)?null:r}set blockDurationMinutes(e){e!=null&&e>=1?this.setAttribute("block-duration-minutes",String(e)):this.removeAttribute("block-duration-minutes")}get attemptsStorageKey(){return this.getAttribute("attempts-storage-key")}set attemptsStorageKey(e){e?this.setAttribute("attempts-storage-key",e):this.removeAttribute("attempts-storage-key")}get submitButton(){let e=this.getAttribute("submit-button");if(e)try{return F(e)}catch{return null}return null}set submitButton(e){e&&typeof e=="object"?this.setAttribute("submit-button",L(e)):this.removeAttribute("submit-button")}getSubmitButtonConfig(e){let r=this.submitButton,s={...e?.submitButton,...r};return{visible:s.visible??!0,text:s.text??"Enviar",width:s.width??"auto",align:s.align??"left"}}connectedCallback(){this.setupAttemptsLock(),this.setupStyles(),this.render()}attributeChangedCallback(e,r,a){if(e==="schema"&&a!==r&&(this.getAttribute("template")&&(console.warn('EasyForm: "schema" and "template" cannot be used together. Removing "template".'),this.removeAttribute("template"),this.removeAttribute("template-extend")),this.handleSchemaChange()),e==="template"&&a!==r&&(this.getAttribute("schema")&&(console.warn('EasyForm: "template" and "schema" cannot be used together. Removing "schema".'),this.removeAttribute("schema")),this.handleSchemaChange()),e==="template-extend"&&a!==r&&this.handleSchemaChange(),e==="initialData"&&a!==r&&this.handleSchemaChange(),(e==="theme"||e==="colors")&&a!==r&&this.setupStyles(),e==="loading"&&a!==r){let s=this.shadow.querySelector("form");this.updateLoadingOverlay(s||void 0),s&&s.querySelectorAll("input, textarea, select, button").forEach(i=>{i instanceof HTMLElement&&"disabled"in i&&(i.disabled=this.loading)})}e==="disabled"&&a!==r&&this.render(),(e==="label-position"||e==="form-direction"||e==="show-completed-indicator")&&a!==r&&this.render(),(e==="max-attempts"||e==="block-duration-minutes"||e==="attempts-storage-key")&&a!==r&&(this.setupAttemptsLock(),this.updateLockOverlay()),e==="submit-button"&&a!==r&&this.render()}setupAttemptsLock(){let e=this.maxAttempts;if(e==null||e<1){this.attemptsLock=null;return}this.attemptsLock=new I({maxAttempts:e,blockDurationMinutes:this.blockDurationMinutes??5,storageKey:this.attemptsStorageKey??void 0,onLocked:()=>{this.updateLockOverlay()},onUnlocked:()=>{this.stopLockCountdown(),this.updateLockOverlay(),this.render()}})}handleSchemaChange(){let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,e){let a=this.initialData;this.stateManager.initializeSchema(e,a||void 0),this.render()}}getSchemaFromTemplate(e){let r=ue(e);if(!r)return console.error(`EasyForm: Template "${e}" not found`),null;let a=this.templateExtend;return a&&a.length>0?Le(e,a):r}async render(){if(!this.isRendering){this.isRendering=!0;try{let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,!e){let k=this.shadow.querySelector("form");k&&k.parentNode===this.shadow&&k.remove();return}let a=this.skipPreserveValuesOnNextRender,s=a?{}:this.preserveCurrentValues();this.skipPreserveValuesOnNextRender=!1;let o=this.stateManager.getWizardState();if(s&&Object.keys(s).length>0)for(let[k,x]of Object.entries(s))this.stateManager.setValueWithoutValidation(k,x);let i=this.initialData,n=o!==null,l=e.steps&&e.steps.length>0;if(!a&&(!o||!n||!l||o&&e.steps&&o.totalSteps!==e.steps.length)&&(this.stateManager.initializeSchema(e,i||void 0),n&&l&&o)){let k=this.stateManager.getWizardState();if(k&&o.totalSteps===k.totalSteps){o.currentStep>=0&&o.currentStep<k.totalSteps&&this.stateManager.goToStep(o.currentStep);for(let x of o.completedSteps)x>=0&&x<k.totalSteps&&this.stateManager.completeStep(x)}}let m=this.stateManager.getWizardState(),p=document.createElement("form");p.addEventListener("submit",k=>this.handleSubmit(k)),(this.disabled||this.loading)&&p.classList.add("easy-form-disabled");let u=this.getAttribute("form-direction"),h=e.direction??(u==="vertical"||u==="horizontal"?u:"vertical");p.classList.add(`easy-form-direction-${h}`);let b=this.getAttribute("show-completed-indicator"),f=e.completedIndicator??(b!==null&&b!=="false"),y=typeof f=="object"&&f?.position?f.position:"top";if(m)this.renderWizard(p,e);else{this.renderFields(p,e.fields||[]);let k=this.getSubmitButtonConfig(e);if(k.visible){let x=document.createElement("div");x.className="easy-form-submit-wrapper",x.style.textAlign=k.align;let w=document.createElement("button");w.type="submit",w.textContent=k.text,w.className="easy-form-submit",w.style.width=k.width,(this.disabled||this.loading)&&(w.disabled=!0),x.appendChild(w),p.appendChild(x)}}let E=null;if(f){let{completed:k,total:x}=this.getCompletedRequiredProgress(e),w=document.createElement("div");w.className="easy-form-completed-indicator",w.setAttribute("role","progressbar"),w.setAttribute("aria-valuenow",String(k)),w.setAttribute("aria-valuemin","0"),w.setAttribute("aria-valuemax",String(x)),w.setAttribute("aria-label",`Campos obligatorios completados: ${k} de ${x}`);let S=document.createElement("div");S.className="easy-form-completed-track";let ie=document.createElement("div");ie.className="easy-form-completed-fill",ie.style.width=x>0?`${k/x*100}%`:"0%",S.appendChild(ie),w.appendChild(S),E=document.createElement("div"),E.className="easy-form-wrapper",y==="top"?(E.appendChild(w),E.appendChild(p)):(E.appendChild(p),E.appendChild(w))}let v=this.shadow.querySelector("form");if(v&&v.parentNode===this.shadow&&v!==p)try{v.remove()}catch(k){console.warn("Error al eliminar formulario anterior:",k)}let C=this.shadow.querySelector(".easy-form-wrapper");C&&C.remove(),this.shadow.appendChild(E||p),this.loading&&this.updateLoadingOverlay(p),this.updateLockOverlay(p)}finally{this.isRendering=!1}}}updateLockOverlay(e){let r=this.shadow.querySelector(".easy-form-lock-overlay");if(r&&r.remove(),this.stopLockCountdown(),!this.attemptsLock?.isLocked())return;let a=e||this.shadow.querySelector("form");if(!a)return;let s=document.createElement("div");s.className="easy-form-lock-overlay";let o=document.createElement("div");o.className="easy-form-lock-message",o.setAttribute("role","alert");let i=()=>{let n=this.attemptsLock.getRemainingBlockTimeMs();if(n<=0){this.stopLockCountdown();return}let l=Math.floor(n/6e4),d=Math.floor(n%6e4/1e3),m=l>0?`${l} min ${d} s`:`${d} segundos`;o.textContent=`Demasiados intentos. Intenta de nuevo en ${m}.`};i(),s.appendChild(o),a.appendChild(s),this.lockCountdownInterval=setInterval(i,1e3)}stopLockCountdown(){this.lockCountdownInterval&&(clearInterval(this.lockCountdownInterval),this.lockCountdownInterval=null)}updateLoadingOverlay(e){let r=this.shadow.querySelector(".easy-form-loading-overlay");if(r&&r.remove(),this.loading){let a=e||this.shadow.querySelector("form");if(a){let s=document.createElement("div");s.className="easy-form-loading-overlay";let o=document.createElement("div");o.className="easy-form-loading-spinner",s.appendChild(o),a.appendChild(s)}}}preserveCurrentValues(){let e=null,r=this.template;if(r?e=this.getSchemaFromTemplate(r):e=this.schema,!e)return{};let a=this.shadow.querySelector("form"),s={};if(!a)return s;let o=a.querySelectorAll("input, textarea, select");for(let i of o){let n=i.getAttribute("name");if(!n||!(this.findFieldInSchema(e,n)!==null))continue;let d;if(i instanceof HTMLInputElement)if(i.type==="checkbox")d=i.checked;else if(i.type==="radio")if(i.checked)d=i.value;else continue;else i.type==="number"?d=i.value===""?null:Number(i.value):d=i.value;else i instanceof HTMLTextAreaElement?d=i.value:i instanceof HTMLSelectElement&&(i.multiple?d=Array.from(i.selectedOptions).map(m=>m.value):d=i.value||null);d!==void 0&&(s[n]=d===""?null:d)}return s}initializeSlotTemplates(){if(this.slotTemplates!==null)return;let e=[];for(let r of Array.from(this.children))r instanceof HTMLElement&&e.push(r);if(e.length===0){this.slotTemplates=[];return}this.slotTemplates=e.map(r=>{let a=r.hasAttribute("row")?r.getAttribute("row"):null,s=a!=null&&a!==""?Number(a):NaN,o=Number.isFinite(s)?s:null;return{template:r.cloneNode(!0),row:o}})}getSlotClonesByRow(e){this.initializeSlotTemplates();let r=new Map;if(!this.slotTemplates||this.slotTemplates.length===0)return r;for(let{template:a,row:s}of this.slotTemplates){let o=typeof s=="number"?s:-1;Number.isFinite(o)||(o=-1),(o<0||o>=e)&&(o=-1);let i=a.cloneNode(!0),n=r.get(o)??[];n.push(i),r.set(o,n)}return r}applySlotDisabledState(e){if(!this.disabled&&!this.loading)return;e.classList.add("easy-form-slot-disabled"),e.querySelectorAll("input, textarea, select, button").forEach(a=>{"disabled"in a&&(a.disabled=!0)})}renderFields(e,r){if(r.length===0){let n=this.getSlotClonesByRow(0).get(-1);if(n&&n.length>0)for(let l of n)this.applySlotDisabledState(l),e.appendChild(l);return}let a=r.length,s=this.getSlotClonesByRow(a);for(let i=0;i<r.length;i++){let n=s.get(i);if(n&&n.length>0){for(let m of n)this.applySlotDisabledState(m),e.appendChild(m);s.delete(i)}let l=r[i],d=this.renderField(l);d&&e.appendChild(d)}let o=s.get(-1);if(o&&o.length>0)for(let i of o)this.applySlotDisabledState(i),e.appendChild(i)}renderField(e){let r=this.stateManager.getFieldVisibility(e.name),a=this.stateManager.getFieldEnabled(e.name);if(e.type==="group"){let f=this.renderGroup(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="row"){let f=this.renderRow(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="array"){let f=this.renderArray(e);return r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled"),f}if(e.type==="custom"){let f=this.renderCustom(e);return f&&(r||(f.style.display="none",f.classList.add("easy-form-field-hidden")),a||f.classList.add("easy-form-field-disabled")),f}let s=this.stateManager.getValue(e.name),o=this.stateManager.getErrors(e.name),i=o.length>0?o[0]:void 0,n=this.disabled||this.loading,l=this.getAttribute("label-position"),d=["up","down","left","right","none"],m=e.labelPosition??(l&&d.includes(l)?l:"up"),p={...e,disabled:n||!a||e.disabled,labelPosition:m},u=pe(e.type);if(u){let f=u({field:p,value:s,error:i,onChange:y=>this.handleFieldChange(e.name,y),onBlur:()=>this.handleFieldBlur(e.name)});return f&&!r&&(f.style.display="none",f.classList.add("easy-form-field-hidden")),f}let h=Ee(p,s,i,f=>this.handleFieldChange(e.name,f),()=>this.handleFieldBlur(e.name)),b=h.querySelector(".easy-form-field")||h;return b instanceof HTMLElement&&b.setAttribute("data-field-name",e.name),r||(h.style.display="none",h.classList.add("easy-form-field-hidden")),h}renderGroup(e){let r=e,a=r.direction??"vertical",s=r.collapsible===!0,o=r.defaultOpen!==!1,i=document.createElement("div");if(i.className=`easy-form-group easy-form-direction-${a}`,e.name&&i.setAttribute("data-field-name",e.name),s){i.classList.add("easy-form-group-collapsible"),o||i.classList.add("easy-form-group-collapsed");let n=document.createElement("button");n.type="button",n.className="easy-form-group-header",n.setAttribute("aria-expanded",String(o));let l=`easy-form-group-${(e.name||"group").replace(/[^a-z0-9]/gi,"-")}-content`;n.setAttribute("aria-controls",l);let d=document.createElement("span");d.textContent=e.label||"Grupo";let m=document.createElement("span");m.className="easy-form-group-chevron",m.setAttribute("aria-hidden","true"),m.textContent="\u25BC",n.appendChild(d),n.appendChild(m),i.appendChild(n);let p=document.createElement("div");if(p.id=l,p.className="easy-form-group-content","fields"in e&&e.fields)for(let h of e.fields){let b=h.name.startsWith(e.name+".")?h.name:`${e.name}.${h.name}`,f={...h,name:b},y=this.renderField(f);y&&p.appendChild(y)}i.appendChild(p);let u=h=>{h?p.style.maxHeight=p.scrollHeight+"px":p.style.maxHeight="0"};o?requestAnimationFrame(()=>u(!0)):p.style.maxHeight="0",n.addEventListener("click",()=>{i.classList.contains("easy-form-group-collapsed")?(i.classList.remove("easy-form-group-collapsed"),n.setAttribute("aria-expanded","true"),u(!0)):(p.style.maxHeight=p.scrollHeight+"px",requestAnimationFrame(()=>{i.classList.add("easy-form-group-collapsed"),n.setAttribute("aria-expanded","false"),u(!1)}))})}else{if(e.label){let n=document.createElement("h3");n.className="easy-form-group-label",n.textContent=e.label,i.appendChild(n)}if("fields"in e&&e.fields)for(let n of e.fields){let l=n.name.startsWith(e.name+".")?n.name:`${e.name}.${n.name}`,d={...n,name:l},m=this.renderField(d);m&&i.appendChild(m)}}return i}renderRow(e){let r=document.createElement("div");r.className="easy-form-row";let a=e;if(r.style.display="flex",r.style.flexWrap="wrap",r.style.alignItems=a.align||"stretch",a.gap!==void 0){let s=typeof a.gap=="number"?`${a.gap}px`:a.gap;r.style.gap=s}else r.style.gap="1rem";if("fields"in e&&e.fields)for(let s of e.fields){let o=this.renderField(s);if(o){let i=document.createElement("div");i.style.flex="1",i.style.minWidth="0",i.appendChild(o),r.appendChild(i)}}return r}renderArray(e){let r=document.createElement("div");if(r.className="easy-form-array",r.setAttribute("data-field-name",e.name),e.label){let m=document.createElement("label");m.className="easy-form-label",m.textContent=e.label,r.appendChild(m)}let a=this.stateManager.getValue(e.name)||[],s=e,o=s.minItems??0,i=s.maxItems??1/0,n=document.createElement("div");n.className="easy-form-array-items";for(let m=0;m<a.length;m++){let p=document.createElement("div");if(p.className="easy-form-array-item",s.itemSchema?.fields)for(let b of s.itemSchema.fields){let f={...b,name:`${e.name}.${m}.${b.name}`},y=this.renderField(f);y&&p.appendChild(y)}let u=document.createElement("button");u.type="button",u.textContent="Eliminar",u.className="easy-form-array-remove";let h=a.length<=o;this.disabled||this.loading||h?u.disabled=!0:u.addEventListener("click",()=>{let b=[...a];b.splice(m,1),this.handleFieldChange(e.name,b)}),p.appendChild(u),n.appendChild(p)}r.appendChild(n);let l=document.createElement("button");l.type="button",l.textContent="Agregar",l.className="easy-form-array-add";let d=a.length>=i;return this.disabled||this.loading||d?l.disabled=!0:l.addEventListener("click",()=>{let m=this.stateManager.createDefaultArrayItem(e),p=[...a,m];this.handleFieldChange(e.name,p)}),r.appendChild(l),r}renderCustom(e){let r=pe("custom");if(!r){let i=document.createElement("div");return i.textContent=`Componente custom no registrado para: ${e.name}`,i}let a=this.stateManager.getValue(e.name),s=this.stateManager.getErrors(e.name),o=s.length>0?s[0]:void 0;return r({field:e,value:a,error:o,onChange:i=>this.handleFieldChange(e.name,i),onBlur:()=>this.handleFieldBlur(e.name)})}getCompletedRequiredProgress(e){let r=d=>{let m=[];for(let p of d)if(p.type==="array"&&"itemSchema"in p&&p.itemSchema?.fields){let u=this.stateManager.getValue(p.name),h=Array.isArray(u)?u.length:0;for(let b=0;b<h;b++)for(let f of p.itemSchema.fields)m.push({...f,name:`${p.name}.${b}.${f.name}`})}else(p.type==="group"||p.type==="row")&&"fields"in p&&p.fields?m.push(...r(p.fields)):m.push(p);return m},a=e.steps?this.stateManager.getCurrentStepFields()||[]:e.fields||[],i=r(a).filter(d=>d.validations?.some(m=>m.type==="required")).filter(d=>this.stateManager.getFieldVisibility(d.name)),n=i.length;return{completed:i.filter(d=>{if(this.stateManager.getErrors(d.name).length>0)return!1;let p=this.stateManager.getValue(d.name);return!(p==null||typeof p=="string"&&p.trim()===""||Array.isArray(p)&&p.length===0&&d.type==="array")}).length,total:n}}renderWizard(e,r){let a=this.stateManager.getWizardState();if(!a)return;let s=document.createElement("div");s.className="easy-form-wizard";let o=document.createElement("div");if(o.className="easy-form-wizard-steps",r?.steps)for(let m=0;m<r.steps.length;m++){let p=document.createElement("div");p.className="easy-form-wizard-step",m===a.currentStep&&p.classList.add("active"),a.completedSteps.includes(m)&&p.classList.add("completed"),p.textContent=r.steps[m].title,o.appendChild(p)}s.appendChild(o);let i=document.createElement("div");i.className="easy-form-wizard-fields";let n=this.stateManager.getCurrentStepFields();this.renderFields(i,n),s.appendChild(i);let l=document.createElement("div");if(l.className="easy-form-wizard-nav",a.currentStep>0){let m=document.createElement("button");m.type="button",m.textContent="Anterior",m.className="easy-form-wizard-prev",this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",()=>{this.stateManager.getWizardState()&&this.stateManager.previousStep()&&(this.render(),this.emitStepChange())}),l.appendChild(m)}if(a.currentStep<a.totalSteps-1){let m=document.createElement("button");m.type="button",m.textContent="Siguiente",m.className="easy-form-wizard-next",this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",async()=>{let p=this.stateManager.getWizardState();if(!p)return;let u=this.stateManager.getCurrentStepFields();for(let y of u)this.stateManager.getFieldVisibility(y.name)&&await this.stateManager.validateField(y.name);let h=this.stateManager.getAllErrors(),b={};for(let y of u)h[y.name]&&h[y.name].length>0&&(b[y.name]=h[y.name]);Object.keys(b).length>0?this.emitError(b):(this.stateManager.completeStep(p.currentStep),this.stateManager.nextStep()&&(this.render(),this.emitStepChange()))}),l.appendChild(m)}let d=this.getSubmitButtonConfig(r);if(a.currentStep===a.totalSteps-1&&d.visible){let m=document.createElement("button");m.type="button",m.textContent=d.text,m.className="easy-form-wizard-next",m.style.width=d.width,this.disabled||this.loading?m.disabled=!0:m.addEventListener("click",async()=>{let p=this.stateManager.getCurrentStepFields();for(let f of p)this.stateManager.getFieldVisibility(f.name)&&await this.stateManager.validateField(f.name);let u=this.stateManager.getAllErrors(),h={};for(let f of p)u[f.name]&&u[f.name].length>0&&(h[f.name]=u[f.name]);Object.keys(h).length>0?this.emitError(h):await this.handleSubmit(new Event("submit"))}),l.appendChild(m)}s.appendChild(l),e.appendChild(s)}async handleFieldChange(e,r){await this.stateManager.setValue(e,r);let a=this.schema;if(a){let i=this.findFieldInSchema(a,e);i?.type==="array"&&(this.rerenderArrayField(i)||(this.skipPreserveValuesOnNextRender=!0,requestAnimationFrame(()=>this.render())))}let s=this.stateManager.getDependentFields(e);s.length>0&&(this.dependencyRenderTimeout&&clearTimeout(this.dependencyRenderTimeout),this.dependencyRenderTimeout=setTimeout(()=>{this.renderDependentFields(s),this.emitDependencyChange(e,s)},10));let o=new CustomEvent("change",{detail:{field:e,value:r,values:this.stateManager.getState().values},bubbles:!0,composed:!0});this.dispatchEvent(o)}rerenderArrayField(e){let r=this.shadow.querySelector(`[data-field-name="${e.name}"].easy-form-array`);if(!r?.parentNode)return!1;let a=this.renderArray(e);return r.parentNode.replaceChild(a,r),!0}renderDependentFields(e){let r=this.shadow.querySelector("form");if(!r)return;let a=this.schema;if(a)for(let s of e){let o=r.querySelector(`.easy-form-field[name="${s}"], [data-field-name="${s}"]`)?.closest(".easy-form-field")??r.querySelector(`[data-field-name="${s}"]`);if(o){let i=this.findFieldInSchema(a,s);if(!i)continue;let n=this.renderField(i);n&&o.parentNode&&o.parentNode.replaceChild(n,o)}}}emitDependencyChange(e,r){let a=new CustomEvent("dependencyChange",{detail:{changedField:e,affectedFields:r},bubbles:!0,composed:!0});this.dispatchEvent(a)}async handleFieldBlur(e){this.stateManager.setTouched(e),await this.stateManager.validateField(e),this.updateSingleField(e)}updateSingleField(e){let r=this.schema;if(!r||!this.findFieldInSchema(r,e))return;let s=this.stateManager.getErrors(e),o=s.length>0?s[0]:void 0,i=this.shadow.querySelector(`[name="${e}"]`)?.closest(".easy-form-field");if(!i)return;let n=i.querySelector(".easy-form-error");if(o){if(n)n.textContent=o;else{let d=document.createElement("p");d.className="easy-form-error",d.textContent=o,i.appendChild(d)}i.querySelector("input, textarea, select")?.classList.add("easy-form-input-error")}else n?.remove(),i.querySelector("input, textarea, select")?.classList.remove("easy-form-input-error")}findFieldInSchema(e,r){let a=e.fields||[],s=r.indexOf(".");if(s>0){let o=r.slice(0,s),i=r.slice(s+1),n=a.find(l=>l.name===o);if(!n)return null;if((n.type==="group"||n.type==="row")&&"fields"in n&&n.fields){let l=this.findFieldInSchema({fields:n.fields},i);return l?{...l,name:r}:null}return null}for(let o of a){if(o.name===r)return o;if(o.type==="group"&&"fields"in o){let i=this.findFieldInSchema({fields:o.fields},r);if(i)return i}if(o.type==="row"&&"fields"in o){let i=this.findFieldInSchema({fields:o.fields},r);if(i)return i}}return null}async handleSubmit(e){if(e.preventDefault(),this.attemptsLock?.isLocked())return;let r=await this.stateManager.validateForm(),a=this.stateManager.getState();if(Object.keys(r).length>0){for(let o of Object.keys(r))this.updateSingleField(o);this.emitError(r);return}let s=new CustomEvent("submit",{detail:{values:a.values,isValid:!0,errors:{}},bubbles:!0,composed:!0});this.dispatchEvent(s)}emitError(e){let r=new CustomEvent("error",{detail:{errors:e},bubbles:!0,composed:!0});this.dispatchEvent(r)}emitStepChange(){let e=this.stateManager.getWizardState();if(!e)return;let r=new CustomEvent("stepChange",{detail:{currentStep:e.currentStep,previousStep:e.currentStep>0?e.currentStep-1:e.currentStep,totalSteps:e.totalSteps},bubbles:!0,composed:!0});this.dispatchEvent(r)}registerComponents(e){this.customComponents={...this.customComponents,...e},Se(e)}reset(){this.stateManager.reset(),this.render()}incrementAttempts(){this.attemptsLock?.incrementAttempts(),this.attemptsLock?.isLocked()&&this.updateLockOverlay()}resetAttempts(){this.attemptsLock?.reset(),this.stopLockCountdown(),this.updateLockOverlay(),this.render()}isLocked(){return this.attemptsLock?.isLocked()??!1}getRemainingBlockTimeMs(){return this.attemptsLock?.getRemainingBlockTimeMs()??0}requestSubmit(){let e=this.shadow.querySelector("form");e&&typeof e.requestSubmit=="function"&&e.requestSubmit()}clear(){let e=this.schema,r=this.template,a=null;r?a=this.getSchemaFromTemplate(r):a=e,a&&(this.stateManager.initializeSchema(a,{}),this.render())}getValues(){return this.stateManager.getState().values}getValue(e){return this.stateManager.getValue(e)}async setValue(e,r){await this.stateManager.setValue(e,r),this.render()}async setValues(e){for(let[r,a]of Object.entries(e))await this.stateManager.setValue(r,a);this.render()}async validate(){let e=await this.stateManager.validateForm();if(Object.keys(e).length>0){for(let r of Object.keys(e))this.updateSingleField(r);this.emitError(e)}else this.shadow.querySelectorAll(".easy-form-error").forEach(s=>s.remove()),this.shadow.querySelectorAll(".easy-form-input-error").forEach(s=>s.classList.remove("easy-form-input-error"));return e}async validateField(e){return await this.stateManager.validateField(e),this.updateSingleField(e),this.stateManager.getErrors(e)}getErrors(){return this.stateManager.getAllErrors()}getFieldErrors(e){return this.stateManager.getErrors(e)}isValid(){return this.stateManager.getState().isValid}get theme(){let e=this.getAttribute("theme");return e&&["plano","tradicional","material","rounded-shadow","lines","shadcn","chakra","mantine","glass","bordered","minimal","efc"].includes(e)?e:"plano"}set theme(e){e?this.setAttribute("theme",e):this.removeAttribute("theme")}get colors(){let e=this.getAttribute("colors");return e?F(e):null}set colors(e){e?this.setAttribute("colors",L(e)):this.removeAttribute("colors")}get initialData(){let e=this.getAttribute("initialData");return e?F(e):null}set initialData(e){e?this.setAttribute("initialData",L(e)):this.removeAttribute("initialData")}get loading(){return this.hasAttribute("loading")}set loading(e){e?this.setAttribute("loading",""):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}setupStyles(){let e=this.shadow.querySelector("style");e&&e.remove();let r=this.theme,a=ne(this.colors||void 0),s=le(r,a),o=document.createElement("style");o.textContent=s,this.shadow.firstChild?this.shadow.insertBefore(o,this.shadow.firstChild):this.shadow.appendChild(o)}};typeof window<"u"&&typeof customElements<"u"&&!customElements.get("easy-form")&&customElements.define("easy-form",fe);export{fe as EasyForm};
2185
2185
  //# sourceMappingURL=easy-form.js.map