1function debounce(fn,wait){let timeoutId;return(...args)=>{clearTimeout(timeoutId),timeoutId=setTimeout(()=>fn(...args),wait)}}function normalizeValue(value){return typeof value=="string"?value.trim():value}function validateFieldState(field){const value=normalizeValue(field.value??""),tagName=(field.tagName||"").toLowerCase(),type=field.type||"",minlength=Number(field.minlength||0);return field.required?type==="checkbox"?{isValid:!!field.checked}:tagName==="select"?{isValid:value!==""&&value!=="0"}:type==="email"?{isValid:value!==""&&isValidEmail(value)}:type==="tel"?{isValid:value!==""&&isValidPhone(value)}:value===""?{isValid:!1}:minlength>0?{isValid:value.length>=minlength}:{isValid:!0}:value===""?{isValid:!0}:type==="email"?{isValid:isValidEmail(value)}:type==="tel"?{isValid:isValidPhone(value)}:{isValid:!0}}function validateRadioGroupState(radios){return radios.some(radio=>radio.required)?{isValid:radios.some(radio=>radio.checked)}:{isValid:!0}}function isValidEmail(email){return/^[^\s@]+@[^\s@]+\.[a-zA-Z]{2,}$/.test(email)}function isValidPhone(phone){return/^\+?[0-9\-]*$/.test(phone)?phone.replace(/[\+\-]/g,"").length>=8:!1}function isSupportedControl(element){return!!(element&&typeof element.matches=="function"&&element.matches("input, textarea, select"))}function getManagedForm(element){return element?.closest?.("form.form-validation")||null}function getAllFormControls(form){return[...form.querySelectorAll("input, textarea, select")]}function getFieldWrapper(field){return field?.closest?.(".field")||field?.closest?.(".form-group")||null}function refreshWrapperState(wrapper){wrapper&&wrapper.classList.toggle("field--with-error",!!wrapper.querySelector(".error-input"))}function setControlValidityState(field,isValid){field&&(field.classList.toggle("error-input",!isValid),field.setAttribute("aria-invalid",isValid?"false":"true"))}function setFieldValidityState(field,isValid){setControlValidityState(field,isValid),refreshWrapperState(getFieldWrapper(field))}function clearFieldValidityState(field){setFieldValidityState(field,!0)}function describeField(field){return{tagName:field.tagName,type:field.type,required:field.required,checked:field.checked,value:field.value,minlength:field.getAttribute("minlength")||0}}function isEligibleControl(field){return!isSupportedControl(field)||!getManagedForm(field)||field.disabled||field.classList.contains("no-js-validation")||field.type==="hidden"||field.closest("[hidden]")?!1:field.required?!0:field.type==="email"||field.type==="tel"}function getEligibleControls(form){return getAllFormControls(form).filter(isEligibleControl)}function getRadioGroupFields(field){const form=getManagedForm(field);return!form||field.type!=="radio"?[]:field.name?getAllFormControls(form).filter(candidate=>candidate.type==="radio"&&candidate.name===field.name&&isEligibleControl(candidate)):isEligibleControl(field)?[field]:[]}function validateSingleField(field){const result=validateFieldState(describeField(field));return setFieldValidityState(field,result.isValid),result}function shouldDeferEmptyRequiredFocusOut(field){return!field?.required||field.type==="radio"||field.type==="checkbox"||field.classList.contains("error-input")?!1:normalizeValue(field.value??"")===""}function validateRadioGroup(field){const radios=getRadioGroupFields(field);if(!radios.length)return{isValid:!0,field};const result=validateRadioGroupState(radios.map(radio=>({required:radio.required,checked:radio.checked})));return radios.forEach(radio=>{setControlValidityState(radio,result.isValid)}),refreshWrapperState(getFieldWrapper(radios[0])),{isValid:result.isValid,field:radios[0]}}function clearInactiveFieldStates(form){getAllFormControls(form).forEach(field=>{isEligibleControl(field)||field.classList.contains("no-js-validation")||field.classList.contains("error-input")&&(setControlValidityState(field,!0),refreshWrapperState(getFieldWrapper(field)))})}function validateForm(form){clearInactiveFieldStates(form);const controls=getEligibleControls(form),processedRadioNames=new Set;let firstInvalidField=null;return controls.forEach((field,index)=>{if(field.type==="radio"){const radioKey=field.name||`radio-${index}`;if(processedRadioNames.has(radioKey))return;processedRadioNames.add(radioKey);const result2=validateRadioGroup(field);!result2.isValid&&!firstInvalidField&&(firstInvalidField=result2.field);return}!validateSingleField(field).isValid&&!firstInvalidField&&(firstInvalidField=field)}),{isValid:!firstInvalidField,firstInvalidField}}function validateRequiredInputs(container=document){if(!container)return!0;
1if(container.matches?.("form.form-validation"))return validateForm(container).isValid;const forms=container.querySelectorAll?.("form.form-validation")||[];let isValid=!0;return forms.forEach(form=>{validateForm(form).isValid||(isValid=!1)}),isValid}function setSubmitButtonLoadingState(form,submitter){const submitButton=submitter||form.querySelector('button[type="submit"]'),spinner=submitButton?.querySelector(".icon-load"),text=submitButton?.querySelector(".hidden-on-load, .hidden-on-load.transition-short");submitButton?.classList.add("loading"),spinner?.classList.remove("opacity-0","pointer-none"),text?.classList.add("opacity-0")}function focusFirstInvalidControl(field){!field||typeof field.focus!="function"||(field.focus(),field.type!=="radio"&&typeof field.reportValidity=="function"&&field.reportValidity())}function handleFieldInput(event){const field=event.target;if(!isSupportedControl(field))return;const form=getManagedForm(field);if(form&&(clearInactiveFieldStates(form),!(field.type==="radio"||field.type==="checkbox"||field.tagName.toLowerCase()==="select"))){if(!isEligibleControl(field)){clearFieldValidityState(field);return}validateSingleField(field)}}function handleFieldChange(event){const field=event.target;if(!isSupportedControl(field))return;const form=getManagedForm(field);if(form){if(clearInactiveFieldStates(form),field.type==="radio"){validateRadioGroup(field);return}if(!isEligibleControl(field)){clearFieldValidityState(field);return}validateSingleField(field)}}function handleFieldFocusIn(event){const field=event.target;if(!isSupportedControl(field)||!field.classList.contains("error-input"))return;const form=getManagedForm(field);if(form){if(clearInactiveFieldStates(form),field.type==="radio"){validateRadioGroup(field);return}if(!isEligibleControl(field)){clearFieldValidityState(field);return}validateSingleField(field)}}function handleFieldFocusOut(event){const field=event.target;if(!isSupportedControl(field))return;const form=getManagedForm(field);if(form){if(clearInactiveFieldStates(form),field.type==="radio"){validateRadioGroup(field);return}if(!isEligibleControl(field)){clearFieldValidityState(field);return}if(shouldDeferEmptyRequiredFocusOut(field)){clearFieldValidityState(field);return}validateSingleField(field)}}function syncInvalidStateFromNative(event){const field=event.target;if(!isSupportedControl(field))return;const form=getManagedForm(field);if(form){if(clearInactiveFieldStates(form),field.type==="radio"){validateRadioGroup(field);return}isEligibleControl(field)&&validateSingleField(field)}}function handleFormSubmit(event){const form=event.target;if(!form.matches?.("form.form-validation, form.form-password-page"))return;const result=form.matches?.("form.form-validation")?validateForm(form):{isValid:!0,firstInvalidField:null};if(!result.isValid){event.preventDefault(),event.stopPropagation(),focusFirstInvalidControl(result.firstInvalidField);return}setSubmitButtonLoadingState(form,event.submitter)}function initFormValidation(){document.addEventListener("invalid",syncInvalidStateFromNative,!0),document.addEventListener("submit",handleFormSubmit,!0),document.addEventListener("input",debounce(handleFieldInput,300)),document.addEventListener("change",handleFieldChange),document.addEventListener("focusin",handleFieldFocusIn),document.addEventListener("focusout",handleFieldFocusOut)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",initFormValidation):initFormValidation()); 2//# sourceMappingURL=/cdn/shop/t/40/assets/form-validation.js.map?v=75749809948797062971790398562
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.