@nuralyui/input 0.0.14 → 0.0.16

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/bundle.js CHANGED
@@ -1,20 +1,847 @@
1
- import{css as t,html as r,nothing as i,LitElement as n}from"lit";import{property as a,state as e,customElement as o}from"lit/decorators.js";import{NuralyUIBaseMixin as s}from"@nuralyui/common/mixins";const l=[t`:host{display:flex;flex-direction:column;font-family:var(--nuraly-font-family-input, 'IBM Plex Sans', ui-sans-serif, system-ui)}.input-wrapper{background-color:var(--nuraly-color-input-background,var(--nuraly-color-input-background-fallback,#fff))}#input-container>input{background-color:transparent;border:var(--nuraly-input-border,none);outline:var(--nuraly-input-outline,none);flex:1;min-width:0;width:100%;font-family:var(--nuraly-font-family-input, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto);font-size:var(--nuraly-font-size-input,14px);color:var(--nuraly-color-input-text,var(--nuraly-color-input-text-fallback,rgba(0,0,0,.88)));padding:var(--nuraly-spacing-input-medium-vertical,4px) var(--nuraly-spacing-input-medium-horizontal,11px)}:host([disabled]) .input-wrapper{background-color:var(--nuraly-color-input-disabled-background,var(--nuraly-color-input-disabled-background-fallback,#f4f4f4))}:host([disabled]) #input-container>input{background-color:transparent;cursor:var(--nuraly-cursor-disabled,not-allowed);color:var(--nuraly-color-input-disabled-text,var(--nuraly-color-input-disabled-text-fallback,rgba(0,0,0,.25)))}nr-icon{display:flex;align-items:center;--nuraly-color-icon:var(--nuraly-color-input-icon, var(--nuraly-color-icon, var(--nuraly-color-icon-fallback, #161616)));--nuraly-icon-size:var(--nuraly-size-input-icon, var(--nuraly-icon-size, var(--nuraly-icon-size-fallback, 18px)));--nuraly-color-icon-hover:var(--nuraly-color-input-icon-hover, var(--nuraly-color-icon-hover, var(--nuraly-color-icon-hover-fallback, #0f62fe)));--nuraly-color-icon-active:var(--nuraly-color-input-icon-active, var(--nuraly-color-icon-active, var(--nuraly-color-icon-active-fallback, #054ada)));--nuraly-color-icon-disabled:var(--nuraly-color-input-icon-disabled, var(--nuraly-color-icon-disabled, var(--nuraly-color-icon-disabled-fallback, #c6c6c6)))}::placeholder{color:var(--nuraly-color-input-placeholder,var(--nuraly-color-input-placeholder-fallback,#a8a8a8));font-size:var(--nuraly-font-size-input-placeholder,14px);font-family:var(--nuraly-font-family-input, 'IBM Plex Sans', ui-sans-serif, system-ui)}:host([disabled]) ::placeholder{color:var(--nuraly-color-input-disabled-placeholder,var(--nuraly-color-input-disabled-placeholder-fallback,#c6c6c6))}#warning-icon{--nuraly-color-icon:var(--nuraly-color-input-warning-icon, #f1c21b)}#error-icon{--nuraly-color-icon:var(--nuraly-color-input-error-icon, #da1e28)}#calendar-icon{--nuraly-color-icon:var(--nuraly-color-input-calendar-icon, #161616)}#password-icon{padding-left:var(--nuraly-input-password-icon-padding-left,var(--nuraly-password-icon-padding-left,8px));padding-right:var(--nuraly-input-password-icon-padding-right,var(--nuraly-password-icon-padding-right,8px));cursor:var(--nuraly-cursor-interactive,pointer);--nuraly-color-icon:var(--nuraly-color-input-password-icon, #161616)}#copy-icon{padding-right:var(--nuraly-input-copy-icon-padding-right,var(--nuraly-copy-icon-padding-right,8px));--nuraly-color-icon:var(--nuraly-color-input-copy-icon, #161616);cursor:var(--nuraly-cursor-interactive,pointer)}#clear-icon{padding-right:var(--nuraly-input-clear-icon-padding-right,var(--nuraly-clear-icon-padding-right,8px));--nuraly-color-icon:var(--nuraly-color-input-clear-icon, #161616);cursor:var(--nuraly-cursor-interactive,pointer)}#number-icons{display:flex;justify-content:space-between;align-items:center;cursor:var(--nuraly-cursor-interactive,pointer);position:absolute;right:0;top:0;height:100%;width:var(--nuraly-input-number-icons-container-width,var(--nuraly-number-icons-container-width,50px));padding-right:var(--nuraly-input-number-icons-container-padding-right,var(--nuraly-number-icons-container-padding-right,8px))}#number-icons nr-icon{--nuraly-color-icon:var(--nuraly-color-input-number-icons, #161616);padding-left:var(--nuraly-input-number-icons-padding-left,var(--nuraly-number-icons-padding-left,4px));padding-right:var(--nuraly-input-number-icons-padding-right,var(--nuraly-number-icons-padding-right,4px));width:var(--nuraly-input-number-icons-width,var(--nuraly-number-icons-width,24px));height:var(--nuraly-input-number-icons-height,var(--nuraly-number-icons-height,24px))}#icons-separator{color:var(--nuraly-input-number-icons-separator-color,var(--nuraly-number-icons-separator-color));padding-bottom:var(--nuraly-input-number-icons-separator-padding-bottom,var(--nuraly-number-icons-separator-padding-bottom));padding-left:var(--nuraly-input-number-icons-separator-padding-left,var(--nuraly-number-icons-separator-padding-left));padding-right:var(--nuraly-input-number-icons-separator-padding-right,var(--nuraly-number-icons-separator-padding-right))}:host([disabled]) #calendar-icon,:host([disabled]) #clear-icon,:host([disabled]) #copy-icon,:host([disabled]) #error-icon,:host([disabled]) #number-icons,:host([disabled]) #password-icon,:host([disabled]) #warning-icon{opacity:var(--nuraly-input-disabled-icon-opacity,var(--nuraly-disabled-icon-opacity))}:host([disabled]) #clear-icon,:host([disabled]) #copy-icon,:host([disabled]) #number-icons,:host([disabled]) #password-icon{cursor:not-allowed}.input-wrapper{display:flex;align-items:stretch;width:100%}.input-addon-before{background-color:var(--nuraly-input-addon-background-color,var(--nuraly-addon-background-color));border:var(--nuraly-input-border,var(--nuraly-border));border-right:none;border-top-left-radius:var(--nuraly-input-border-radius,var(--nuraly-border-radius));border-bottom-left-radius:var(--nuraly-input-border-radius,var(--nuraly-border-radius));padding:var(--nuraly-input-addon-padding,var(--nuraly-addon-padding));display:flex;align-items:center;color:var(--nuraly-input-addon-color,var(--nuraly-addon-color));font-size:var(--nuraly-input-font-size,var(--nuraly-font-size));white-space:nowrap;min-width:0;flex-shrink:0}.input-addon-after{background-color:var(--nuraly-input-addon-background-color,var(--nuraly-addon-background-color));border:var(--nuraly-input-border,var(--nuraly-border));border-left:none;border-top-right-radius:var(--nuraly-input-border-radius,var(--nuraly-border-radius));border-bottom-right-radius:var(--nuraly-input-border-radius,var(--nuraly-border-radius));padding:var(--nuraly-input-addon-padding,var(--nuraly-addon-padding));display:flex;align-items:center;color:var(--nuraly-input-addon-color,var(--nuraly-addon-color));font-size:var(--nuraly-input-font-size,var(--nuraly-font-size));white-space:nowrap;min-width:0;flex-shrink:0}.input-wrapper:has(.input-addon-before) #input-container{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none}.input-wrapper:has(.input-addon-after) #input-container{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none}#input-container{border:var(--nuraly-border-width-input,1px) solid var(--nuraly-color-input-border,#d9d9d9);border-radius:var(--nuraly-border-radius-input,6px);background-color:var(--nuraly-color-input-background,#fff);color:var(--nuraly-color-input-text,rgba(0,0,0,.88));font-family:var(--nuraly-font-family-input, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto);font-size:var(--nuraly-font-size-input,14px);display:flex;position:relative;flex:1;min-width:0;transition:var(--nuraly-transition-input,border-color .2s,box-shadow .2s)}.input-wrapper[data-theme^=carbon] #input-container,[data-theme^=carbon] nr-input #input-container,body[data-theme^=carbon] nr-input #input-container,html[data-theme^=carbon] nr-input #input-container{border:var(--nuraly-border-width-input,1px) solid var(--nuraly-color-input-border,transparent)!important;border-bottom:var(--nuraly-border-width-input,2px) solid var(--nuraly-color-input-border-bottom,#8d8d8d)!important;border-radius:var(--nuraly-border-radius-input,0)!important;background-color:var(--nuraly-color-input-background,#f4f4f4)!important;color:var(--nuraly-color-input-text,#161616)!important}.input-wrapper[data-theme^=default] #input-container,[data-theme^=default] nr-input #input-container,body[data-theme^=default] nr-input #input-container,html[data-theme^=default] nr-input #input-container{border:var(--nuraly-border-width-input,1px) solid var(--nuraly-color-input-border,#d9d9d9)!important;border-radius:var(--nuraly-border-radius-input,6px)!important;background-color:var(--nuraly-color-input-background,#fff)!important;color:var(--nuraly-color-input-text,rgba(0,0,0,.88))!important}.input-wrapper[data-theme^=carbon] #input-container>input,[data-theme^=carbon] nr-input #input-container>input,body[data-theme^=carbon] nr-input #input-container>input,html[data-theme^=carbon] nr-input #input-container>input{padding:7px 16px!important}.input-wrapper[data-theme^=default] #input-container>input,[data-theme^=default] nr-input #input-container>input,body[data-theme^=default] nr-input #input-container>input,html[data-theme^=default] nr-input #input-container>input{padding:var(--nuraly-spacing-input-medium-vertical,4px) var(--nuraly-spacing-input-medium-horizontal,11px)!important}#input-container:focus-within{border-color:var(--nuraly-color-input-border-focus,#1890ff);box-shadow:var(--nuraly-shadow-input-focus,0 0 0 2px rgba(24,144,255,.2));outline:0}.input-wrapper[data-theme^=carbon] #input-container:focus-within,[data-theme^=carbon] nr-input #input-container:focus-within,body[data-theme^=carbon] nr-input #input-container:focus-within,html[data-theme^=carbon] nr-input #input-container:focus-within{border:var(--nuraly-border-width-input,2px) solid var(--nuraly-color-input-border-focus,#0f62fe)!important;border-radius:var(--nuraly-border-radius-input,0)!important;box-shadow:var(--nuraly-shadow-input-focus,none)!important;outline:0!important}.input-wrapper[data-theme^=default] #input-container:focus-within,[data-theme^=default] nr-input #input-container:focus-within,body[data-theme^=default] nr-input #input-container:focus-within,html[data-theme^=default] nr-input #input-container:focus-within{border-color:var(--nuraly-color-input-border-focus,#1890ff)!important;border-radius:var(--nuraly-border-radius-input,6px)!important;box-shadow:var(--nuraly-shadow-input-focus,0 0 0 2px rgba(24,144,255,.2))!important;outline:0!important}:host([disabled]) #input-container{background-color:var(--nuraly-color-input-disabled-background,#f5f5f5);border-color:var(--nuraly-color-input-disabled-border,#d9d9d9);color:var(--nuraly-color-input-disabled-text,rgba(0,0,0,.25));cursor:not-allowed}:host([variant=outlined]) #input-container{border:var(--nuraly-input-outlined-border,var(--nuraly-outlined-border));border-radius:var(--nuraly-input-outlined-border-radius,var(--nuraly-outlined-border-radius));background-color:var(--nuraly-input-outlined-background,var(--nuraly-outlined-background))}:host([variant=outlined]) .input-wrapper{background-color:transparent}:host([variant=outlined]:not([state=error])) #input-container:focus-within{border:var(--nuraly-input-outlined-focus-border,var(--nuraly-outlined-focus-border))}:host([variant=filled]) #input-container{background-color:var(--nuraly-input-filled-background,var(--nuraly-filled-background));border-radius:var(--nuraly-input-filled-border-radius,var(--nuraly-filled-border-radius));border-bottom:var(--nuraly-input-filled-border-bottom,var(--nuraly-filled-border-bottom));border-top:none;border-left:none;border-right:none}:host([variant=filled]) .input-wrapper{background-color:transparent}:host([variant=filled]:not([state=error])) #input-container:focus-within{border-bottom:var(--nuraly-input-filled-focus-border-bottom,var(--nuraly-filled-focus-border-bottom));border-top:none;border-left:none;border-right:none}:host([variant=borderless]) #input-container{background-color:var(--nuraly-input-borderless-background,var(--nuraly-borderless-background));border:none;border-radius:var(--nuraly-input-borderless-border-radius,var(--nuraly-borderless-border-radius))}:host([variant=borderless]) .input-wrapper{background-color:transparent}:host([variant=borderless]:not([state=error])) #input-container:focus-within{outline:var(--nuraly-input-borderless-focus-outline,var(--nuraly-borderless-focus-outline));border:none}:host([variant=underlined]) #input-container{border-bottom:var(--nuraly-input-underlined-border-bottom,var(--nuraly-underlined-border-bottom));border-top:none;border-left:none;border-right:none;border-radius:0}:host([variant=underlined]:not([state=error])) #input-container:focus-within{border-bottom:var(--nuraly-input-underlined-focus-border-bottom,var(--nuraly-underlined-focus-border-bottom));border-top:none;border-left:none;border-right:none}input{width:100%;border:none;outline:0;color:var(--nuraly-input-text-color,var(--nuraly-text-color));font-family:var(--nuraly-input-font-family,var(--nuraly-font-family));font-size:var(--nuraly-input-font-size,var(--nuraly-font-size))}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none}input[type=number]{-moz-appearance:textfield}:host(:not([disabled])[state=error]) #input-container{border:var(--nuraly-input-error-border,var(--nuraly-error-border))!important;outline:0!important}:host([variant=borderless][state=error]) #input-container{border:var(--nuraly-input-error-border,var(--nuraly-error-border))!important;outline:0!important}:host([variant=filled][state=error]) #input-container,:host([variant=underlined][state=error]) #input-container{border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:var(--nuraly-input-error-border,var(--nuraly-error-border))!important}:host([state=error]) input[type=number]~#number-icons,:host([state=warning]) input[type=number]~#number-icons{position:static;padding-left:var(--nuraly-input-number-icons-container-padding-left,var(--nuraly-number-icons-container-padding-left))}::slotted([slot=label]){color:var(--nuraly-input-label-color,var(--nuraly-label-color));font-size:var(--nuraly-input-label-font-size,var(--nuraly-label-font-size));padding-bottom:var(--nuraly-input-label-padding-bottom,var(--nuraly-label-padding-bottom))}::slotted([slot=helper-text]){color:var(--nuraly-input-helper-text-color,var(--nuraly-helper-text-color));font-size:var(--nuraly-input-helper-text-font-size,var(--nuraly-helper-text-font-size));padding-top:var(--nuraly-input-helper-text-padding-top,var(--nuraly-helper-text-padding-top));word-wrap:break-word;word-break:break-word;overflow-wrap:break-word;hyphens:auto;white-space:normal;max-width:100%;width:0;min-width:100%;box-sizing:border-box;line-height:1.4}:host([state=error]) ::slotted([slot=helper-text]){color:var(--nuraly-input-error-helper-text-color,var(--nuraly-error-helper-text-color))}:host([state=warning]) ::slotted([slot=helper-text]){color:var(--nuraly-input-warning-helper-text-color,var(--nuraly-warning-helper-text-color))}:host([disabled]) ::slotted([slot=helper-text]){color:var(--nuraly-input-disabled-helper-text-color,var(--nuraly-disabled-helper-text-color))}:host([disabled]) ::slotted([slot=label]){color:var(--nuraly-input-disabled-label-color,var(--nuraly-disabled-label-color))}.input-prefix{display:flex;align-items:center;justify-content:center}::slotted([slot=prefix]){display:flex;align-items:center;padding-right:var(--nuraly-input-prefix-padding-right,var(--nuraly-prefix-padding-right));color:var(--nuraly-input-prefix-color,var(--nuraly-prefix-color));font-size:var(--nuraly-input-prefix-font-size,var(--nuraly-prefix-font-size));flex-shrink:0}.input-suffix{display:flex;align-items:center;justify-content:center}::slotted([slot=suffix]){display:flex;align-items:center;padding-left:var(--nuraly-input-suffix-padding-left,var(--nuraly-suffix-padding-left));color:var(--nuraly-input-suffix-color,var(--nuraly-suffix-color));font-size:var(--nuraly-input-suffix-font-size,var(--nuraly-suffix-font-size));flex-shrink:0}:host([disabled]) ::slotted([slot=prefix]),:host([disabled]) ::slotted([slot=suffix]){opacity:var(--nuraly-input-disabled-icon-opacity,var(--nuraly-disabled-icon-opacity));color:var(--nuraly-input-disabled-prefix-suffix-color,var(--nuraly-disabled-prefix-suffix-color))}`,t`div[data-size=large]{padding-top:var(--nuraly-input-large-padding-top,var(--nuraly-large-padding-top));padding-bottom:var(--nuraly-input-large-padding-bottom,var(--nuraly-large-padding-bottom));padding-left:var(--nuraly-input-large-padding-left,var(--nuraly-large-padding-left));padding-right:var(--nuraly-input-large-padding-right,var(--nuraly-large-padding-right))}div[data-size=medium]{padding-top:var(--nuraly-input-medium-padding-top,var(--nuraly-medium-padding-top));padding-bottom:var(--nuraly-input-medium-padding-bottom,var(--nuraly-medium-padding-bottom));padding-left:var(--nuraly-input-medium-padding-left,var(--nuraly-medium-padding-left));padding-right:var(--nuraly-input-medium-padding-right,var(--nuraly-medium-padding-right))}div[data-size=small]{padding-top:var(--nuraly-input-small-padding-top,var(--nuraly-small-padding-top));padding-bottom:var(--nuraly-input-small-padding-bottom,var(--nuraly-small-padding-bottom));padding-left:var(--nuraly-input-small-padding-left,var(--nuraly-small-padding-left));padding-right:var(--nuraly-input-small-padding-right,var(--nuraly-small-padding-right))}[data-theme^=carbon] div[data-size=medium],body[data-theme^=carbon] nr-input div[data-size=medium],html[data-theme^=carbon] nr-input div[data-size=medium]{padding:4px 8px!important}.character-count{font-size:var(--nuraly-input-character-count-font-size,var(--nuraly-character-count-font-size));color:var(--nuraly-input-character-count-color,var(--nuraly-character-count-color));text-align:right;margin-top:var(--nuraly-input-character-count-margin-top,var(--nuraly-character-count-margin-top));font-family:var(--nuraly-input-font-family,var(--nuraly-font-family))}.character-count[data-over-limit]{color:var(--nuraly-input-character-count-over-limit-color,var(--nuraly-character-count-over-limit-color))}.validation-message{font-size:var(--nuraly-input-validation-message-font-size,var(--nuraly-validation-message-font-size,.875rem));font-family:var(--nuraly-input-font-family,var(--nuraly-font-family));margin-top:var(--nuraly-input-validation-message-margin-top,var(--nuraly-validation-message-margin-top,.25rem));padding:var(--nuraly-input-validation-message-padding,var(--nuraly-validation-message-padding,0));word-wrap:break-word;word-break:break-word;overflow-wrap:break-word;hyphens:auto;white-space:normal;max-width:100%;width:0;min-width:100%;box-sizing:border-box;line-height:var(--nuraly-input-validation-message-line-height,var(--nuraly-validation-message-line-height,1.4))}.validation-message.error{color:var(--nuraly-input-error-message-color,var(--nuraly-error-message-color,var(--nuraly-input-error-color,var(--nuraly-error-color,#dc2626))))}.validation-message.warning{color:var(--nuraly-input-warning-message-color,var(--nuraly-warning-message-color,var(--nuraly-input-warning-color,var(--nuraly-warning-color,#d97706))))}:host([disabled]) .validation-message{opacity:var(--nuraly-input-disabled-validation-message-opacity,var(--nuraly-disabled-validation-message-opacity,.6));color:var(--nuraly-input-disabled-validation-message-color,var(--nuraly-disabled-validation-message-color))}.validation-icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center}.validation-icon.validation-loading{color:var(--nuraly-input-primary-color,var(--nuraly-primary-color,#3b82f6));animation:validation-hourglass 2s ease-in-out infinite;transform-origin:center}.validation-icon.validation-error{color:var(--nuraly-input-error-color,var(--nuraly-error-color,#dc2626))}.validation-icon.validation-warning{color:var(--nuraly-input-warning-color,var(--nuraly-warning-color,#d97706))}.validation-icon.validation-success{color:var(--nuraly-input-success-color,var(--nuraly-success-color,#16a34a))}@keyframes validation-hourglass{0%{opacity:.7;transform:scale(1)}25%{opacity:1;transform:scale(1.03)}50%{opacity:.8;transform:scale(1)}75%{opacity:1;transform:scale(1.03)}100%{opacity:.7;transform:scale(1)}}`],u={EMAIL:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,URL:/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/,PHONE:/^[\+]?[1-9][\d]{0,15}$/,PASSWORD_STRONG:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,ALPHANUMERIC:/^[a-zA-Z0-9]+$/,NUMERIC:/^\d+$/,ALPHA:/^[a-zA-Z]+$/,USERNAME:/^[a-zA-Z0-9_-]{3,16}$/,HEX_COLOR:/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,IPV4:/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,CREDIT_CARD:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3[0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$/},d=t=>({required:!0,message:t||"This field is required"}),c=t=>({type:"email",pattern:u.EMAIL,message:t||"Please enter a valid email address"}),h=t=>({type:"url",pattern:u.URL,message:t||"Please enter a valid URL"}),p=(t,r)=>({maxLength:t,message:r||`Maximum length is ${t} characters`}),v=(t,r)=>({type:"number",min:t,message:r||`Minimum value is ${t}`}),b=(t,r)=>({type:"number",max:t,message:r||`Maximum value is ${t}`});
1
+ import{css as t,html as i,nothing as r,LitElement as n}from"lit";import{property as e,state as a,customElement as o}from"lit/decorators.js";import{NuralyUIBaseMixin as s}from"@nuralyui/common/mixins";const l=[t`
2
+ /*
3
+ * Host element base styles
4
+ * Container for the input component with flexible layout
5
+ */
6
+ :host {
7
+ display: flex;
8
+ flex-direction: column;
9
+ font-family: var(--nuraly-font-family-input, 'IBM Plex Sans', ui-sans-serif, system-ui);
10
+ }
11
+
12
+ /*
13
+ * Base input wrapper and input element styles
14
+ * Background applied to wrapper to cover entire container including addons
15
+ * Uses theme CSS custom properties for comprehensive theming support
16
+ */
17
+ .input-wrapper {
18
+ background-color: var(--nuraly-color-input-background, var(--nuraly-color-input-background-fallback, #ffffff));
19
+ }
20
+
21
+
22
+ #input-container > input {
23
+ background-color: transparent;
24
+ border: var(--nuraly-input-border, none);
25
+ outline: var(--nuraly-input-outline, none);
26
+ flex: 1;
27
+ min-width: 0;
28
+ width: 100%;
29
+
30
+ /* Typography from theme */
31
+ font-family: var(--nuraly-font-family-input, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto);
32
+ font-size: var(--nuraly-font-size-input, 14px);
33
+ color: var(--nuraly-color-input-text, var(--nuraly-color-input-text-fallback, rgba(0, 0, 0, 0.88)));
34
+
35
+ /* Padding from theme */
36
+ padding: var(--nuraly-spacing-input-medium-vertical, 4px) var(--nuraly-spacing-input-medium-horizontal, 11px);
37
+ }
38
+
39
+ /*
40
+ * Disabled state styles for wrapper and input
41
+ * Applied when input is disabled - removes interactivity and applies muted colors
42
+ */
43
+ :host([disabled]) .input-wrapper {
44
+ background-color: var(--nuraly-color-input-disabled-background, var(--nuraly-color-input-disabled-background-fallback, #f4f4f4));
45
+ }
46
+
47
+ :host([disabled]) #input-container > input {
48
+ background-color: transparent;
49
+ cursor: var(--nuraly-cursor-disabled, not-allowed);
50
+ color: var(--nuraly-color-input-disabled-text, var(--nuraly-color-input-disabled-text-fallback, rgba(0, 0, 0, 0.25)));
51
+ }
52
+
53
+ /*
54
+ * Icon base styles
55
+ * Common styling for all icons within the input component
56
+ * Provides comprehensive CSS variable override system
57
+ */
58
+ nr-icon {
59
+ display: flex;
60
+ align-items: center;
61
+
62
+ /* Global icon color override - applies to all icons in input */
63
+ --nuraly-color-icon: var(--nuraly-color-input-icon, var(--nuraly-color-icon, var(--nuraly-color-icon-fallback, #161616)));
64
+
65
+ /* Size override for input icons */
66
+ --nuraly-icon-size: var(--nuraly-size-input-icon, var(--nuraly-icon-size, var(--nuraly-icon-size-fallback, 18px)));
67
+
68
+ /* Interactive state overrides */
69
+ --nuraly-color-icon-hover: var(--nuraly-color-input-icon-hover, var(--nuraly-color-icon-hover, var(--nuraly-color-icon-hover-fallback, #0f62fe)));
70
+ --nuraly-color-icon-active: var(--nuraly-color-input-icon-active, var(--nuraly-color-icon-active, var(--nuraly-color-icon-active-fallback, #054ada)));
71
+ --nuraly-color-icon-disabled: var(--nuraly-color-input-icon-disabled, var(--nuraly-color-icon-disabled, var(--nuraly-color-icon-disabled-fallback, #c6c6c6)));
72
+ }
73
+
74
+ /*
75
+ * Placeholder styling
76
+ * Customizable placeholder text appearance
77
+ */
78
+ ::placeholder {
79
+ color: var(--nuraly-color-input-placeholder, var(--nuraly-color-input-placeholder-fallback, #a8a8a8));
80
+ font-size: var(--nuraly-font-size-input-placeholder, 14px);
81
+ font-family: var(--nuraly-font-family-input, 'IBM Plex Sans', ui-sans-serif, system-ui);
82
+ }
83
+
84
+ /*
85
+ * Disabled placeholder styling
86
+ * Applied when input is disabled
87
+ */
88
+ :host([disabled]) ::placeholder {
89
+ color: var(--nuraly-color-input-disabled-placeholder, var(--nuraly-color-input-disabled-placeholder-fallback, #c6c6c6));
90
+ }
91
+
92
+ /* ========================================
93
+ * ICON VARIANTS AND STATES
94
+ * ======================================== */
95
+
96
+ /* Warning state icon */
97
+ #warning-icon {
98
+ --nuraly-color-icon: var(--nuraly-color-input-warning-icon, #f1c21b);
99
+ }
100
+
101
+ /* Error state icon */
102
+ #error-icon {
103
+ --nuraly-color-icon: var(--nuraly-color-input-error-icon, #da1e28);
104
+ }
105
+
106
+ /* Calendar input type icon */
107
+ #calendar-icon {
108
+ --nuraly-color-icon: var(--nuraly-color-input-calendar-icon, #161616);
109
+ }
110
+
111
+ /* Password toggle icon */
112
+ #password-icon {
113
+ padding-left: var(--nuraly-input-password-icon-padding-left, var(--nuraly-password-icon-padding-left, 8px));
114
+ padding-right: var(--nuraly-input-password-icon-padding-right, var(--nuraly-password-icon-padding-right, 8px));
115
+ cursor: var(--nuraly-cursor-interactive, pointer);
116
+ --nuraly-color-icon: var(--nuraly-color-input-password-icon, #161616);
117
+ }
118
+
119
+ /* Copy functionality icon */
120
+ #copy-icon {
121
+ padding-right: var(--nuraly-input-copy-icon-padding-right, var(--nuraly-copy-icon-padding-right, 8px));
122
+ --nuraly-color-icon: var(--nuraly-color-input-copy-icon, #161616);
123
+ cursor: var(--nuraly-cursor-interactive, pointer);
124
+ }
125
+
126
+ /* Clear functionality icon */
127
+ #clear-icon {
128
+ padding-right: var(--nuraly-input-clear-icon-padding-right, var(--nuraly-clear-icon-padding-right, 8px));
129
+ --nuraly-color-icon: var(--nuraly-color-input-clear-icon, #161616);
130
+ cursor: var(--nuraly-cursor-interactive, pointer);
131
+ }
132
+
133
+ /*
134
+ * Number input increment/decrement icons container
135
+ * Positioned absolutely for overlay on input
136
+ */
137
+ #number-icons {
138
+ display: flex;
139
+ justify-content: space-between;
140
+ align-items: center;
141
+ cursor: var(--nuraly-cursor-interactive, pointer);
142
+ position: absolute;
143
+ right: 0;
144
+ top: 0;
145
+ height: 100%;
146
+ width: var(--nuraly-input-number-icons-container-width, var(--nuraly-number-icons-container-width, 50px));
147
+ padding-right: var(--nuraly-input-number-icons-container-padding-right, var(--nuraly-number-icons-container-padding-right, 8px));
148
+ }
149
+
150
+ /* Individual number icons styling */
151
+ #number-icons nr-icon {
152
+ --nuraly-color-icon: var(--nuraly-color-input-number-icons, #161616);
153
+ padding-left: var(--nuraly-input-number-icons-padding-left, var(--nuraly-number-icons-padding-left, 4px));
154
+ padding-right: var(--nuraly-input-number-icons-padding-right, var(--nuraly-number-icons-padding-right, 4px));
155
+ width: var(--nuraly-input-number-icons-width, var(--nuraly-number-icons-width, 24px));
156
+ height: var(--nuraly-input-number-icons-height, var(--nuraly-number-icons-height, 24px));
157
+ }
158
+
159
+ /* Number icons separator styling */
160
+ #icons-separator {
161
+ color: var(--nuraly-input-number-icons-separator-color, var(--nuraly-number-icons-separator-color));
162
+ padding-bottom: var(--nuraly-input-number-icons-separator-padding-bottom, var(--nuraly-number-icons-separator-padding-bottom));
163
+ padding-left: var(--nuraly-input-number-icons-separator-padding-left, var(--nuraly-number-icons-separator-padding-left));
164
+ padding-right: var(--nuraly-input-number-icons-separator-padding-right, var(--nuraly-number-icons-separator-padding-right));
165
+ }
166
+
167
+ /*
168
+ * Disabled state for all icons
169
+ * Applied when input is disabled - reduces opacity and disables interaction
170
+ */
171
+ :host([disabled]) #password-icon,
172
+ :host([disabled]) #error-icon,
173
+ :host([disabled]) #warning-icon,
174
+ :host([disabled]) #number-icons,
175
+ :host([disabled]) #calendar-icon,
176
+ :host([disabled]) #copy-icon,
177
+ :host([disabled]) #clear-icon {
178
+ opacity: var(--nuraly-input-disabled-icon-opacity, var(--nuraly-disabled-icon-opacity));
179
+ }
180
+
181
+ /* Disabled icons cursor override */
182
+ :host([disabled]) #password-icon,
183
+ :host([disabled]) #number-icons,
184
+ :host([disabled]) #copy-icon,
185
+ :host([disabled]) #clear-icon {
186
+ cursor: not-allowed;
187
+ }
188
+
189
+ /* ========================================
190
+ * INPUT CONTAINER STYLES
191
+ * ======================================== */
192
+
193
+ /*
194
+ * Input wrapper - contains addons and input container
195
+ * Provides horizontal layout for addon before/after elements
196
+ */
197
+ .input-wrapper {
198
+ display: flex;
199
+ align-items: stretch;
200
+ width: 100%;
201
+ }
202
+
203
+ /*
204
+ * Addon before element - content before input (outside borders)
205
+ * Styled to visually connect with input
206
+ */
207
+ .input-addon-before {
208
+ background-color: var(--nuraly-input-addon-background-color, var(--nuraly-addon-background-color));
209
+ border: var(--nuraly-input-border, var(--nuraly-border));
210
+ border-right: none;
211
+ border-top-left-radius: var(--nuraly-input-border-radius, var(--nuraly-border-radius));
212
+ border-bottom-left-radius: var(--nuraly-input-border-radius, var(--nuraly-border-radius));
213
+ padding: var(--nuraly-input-addon-padding, var(--nuraly-addon-padding));
214
+ display: flex;
215
+ align-items: center;
216
+ color: var(--nuraly-input-addon-color, var(--nuraly-addon-color));
217
+ font-size: var(--nuraly-input-font-size, var(--nuraly-font-size));
218
+ white-space: nowrap;
219
+ min-width: 0; /* Allow shrinking */
220
+ flex-shrink: 0; /* Prevent shrinking */
221
+ }
222
+
223
+ /*
224
+ * Addon after element - content after input (outside borders)
225
+ * Styled to visually connect with input
226
+ */
227
+ .input-addon-after {
228
+ background-color: var(--nuraly-input-addon-background-color, var(--nuraly-addon-background-color));
229
+ border: var(--nuraly-input-border, var(--nuraly-border));
230
+ border-left: none;
231
+ border-top-right-radius: var(--nuraly-input-border-radius, var(--nuraly-border-radius));
232
+ border-bottom-right-radius: var(--nuraly-input-border-radius, var(--nuraly-border-radius));
233
+ padding: var(--nuraly-input-addon-padding, var(--nuraly-addon-padding));
234
+ display: flex;
235
+ align-items: center;
236
+ color: var(--nuraly-input-addon-color, var(--nuraly-addon-color));
237
+ font-size: var(--nuraly-input-font-size, var(--nuraly-font-size));
238
+ white-space: nowrap;
239
+ min-width: 0; /* Allow shrinking */
240
+ flex-shrink: 0; /* Prevent shrinking */
241
+ }
242
+
243
+ /*
244
+ * Input container border radius adjustments when addons are present
245
+ * Removes border radius on sides where addons are attached
246
+ */
247
+ .input-wrapper:has(.input-addon-before) #input-container {
248
+ border-top-left-radius: 0;
249
+ border-bottom-left-radius: 0;
250
+ border-left: none;
251
+ }
252
+
253
+ .input-wrapper:has(.input-addon-after) #input-container {
254
+ border-top-right-radius: 0;
255
+ border-bottom-right-radius: 0;
256
+ border-right: none;
257
+ }
258
+
259
+ /*
260
+ * Main input container element
261
+ * Uses theme CSS custom properties for comprehensive border and layout control
262
+ */
263
+ #input-container {
264
+ /* Default outlined style */
265
+ border: var(--nuraly-border-width-input, 1px) solid var(--nuraly-color-input-border, #d9d9d9);
266
+ border-radius: var(--nuraly-border-radius-input, 6px);
267
+
268
+ /* Background and text styling */
269
+ background-color: var(--nuraly-color-input-background, #ffffff);
270
+ color: var(--nuraly-color-input-text, rgba(0, 0, 0, 0.88));
271
+ font-family: var(--nuraly-font-family-input, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto);
272
+ font-size: var(--nuraly-font-size-input, 14px);
273
+
274
+ /* Layout */
275
+ display: flex;
276
+ position: relative;
277
+ flex: 1; /* Take available space in wrapper */
278
+ min-width: 0; /* Allow shrinking below content size */
279
+
280
+ /* Transitions for smooth theme changes */
281
+ transition: var(--nuraly-transition-input, border-color 0.2s, box-shadow 0.2s);
282
+ }
283
+
284
+ /* Focus state for input container */
285
+ #input-container:focus-within {
286
+ border-color: var(--nuraly-color-input-border-focus, #1890ff);
287
+ box-shadow: var(--nuraly-shadow-input-focus, 0 0 0 2px rgba(24, 144, 255, 0.2));
288
+ outline: none;
289
+ }
290
+
291
+ /*
292
+ * Disabled container styles
293
+ * Applied when input is disabled
294
+ */
295
+ :host([disabled]) #input-container {
296
+ background-color: var(--nuraly-color-input-disabled-background, #f5f5f5);
297
+ border-color: var(--nuraly-color-input-disabled-border, #d9d9d9);
298
+ color: var(--nuraly-color-input-disabled-text, rgba(0, 0, 0, 0.25));
299
+ cursor: not-allowed;
300
+ }
301
+
302
+ /* ========================================
303
+ * INPUT VARIANT STYLES
304
+ * ======================================== */
305
+
306
+ /*
307
+ * Outlined variant - full border around input
308
+ * Default: light border, focus: blue border
309
+ */
310
+ :host([variant='outlined']) #input-container {
311
+ border: var(--nuraly-input-outlined-border, var(--nuraly-outlined-border, 1px solid #d1d5db));
312
+ border-radius: var(--nuraly-input-outlined-border-radius, var(--nuraly-outlined-border-radius, var(--nuraly-border-radius-input, 6px)));
313
+ background-color: var(--nuraly-input-outlined-background, var(--nuraly-outlined-background, transparent));
314
+ }
315
+
316
+ :host([variant='outlined']) .input-wrapper {
317
+ background-color: transparent;
318
+ }
319
+
320
+ :host([variant='outlined']:not([state='error'])) #input-container:focus-within {
321
+ border-color: var(--nuraly-color-input-border-focus, #3b82f6);
322
+ box-shadow: var(--nuraly-shadow-input-focus, 0 0 0 1px #3b82f6);
323
+ }
324
+
325
+ /*
326
+ * Filled variant - background with bottom border only
327
+ * Subtle background with bottom border indication
328
+ */
329
+ :host([variant='filled']) #input-container {
330
+ background-color: var(--nuraly-input-filled-background, var(--nuraly-filled-background));
331
+ border-radius: var(--nuraly-input-filled-border-radius, var(--nuraly-filled-border-radius, var(--nuraly-border-radius-input, 6px)));
332
+ border-bottom: var(--nuraly-input-filled-border-bottom, var(--nuraly-filled-border-bottom));
333
+ border-top: none;
334
+ border-left: none;
335
+ border-right: none;
336
+ }
337
+
338
+ :host([variant='filled']) .input-wrapper {
339
+ background-color: transparent;
340
+ }
341
+
342
+ :host([variant='filled']:not([state='error'])) #input-container:focus-within {
343
+ border-bottom: var(--nuraly-input-filled-focus-border-bottom, var(--nuraly-filled-focus-border-bottom));
344
+ border-top: none;
345
+ border-left: none;
346
+ border-right: none;
347
+ }
348
+
349
+ /*
350
+ * Borderless variant - no borders, focus with outline
351
+ * Clean appearance with focus indication via outline
352
+ */
353
+ :host([variant='borderless']) #input-container {
354
+ background-color: var(--nuraly-input-borderless-background, var(--nuraly-borderless-background));
355
+ border: none;
356
+ border-radius: var(--nuraly-input-borderless-border-radius, var(--nuraly-borderless-border-radius));
357
+ }
358
+
359
+ :host([variant='borderless']) .input-wrapper {
360
+ background-color: transparent;
361
+ }
362
+
363
+ :host([variant='borderless']:not([state='error'])) #input-container:focus-within {
364
+ outline: var(--nuraly-input-borderless-focus-outline, var(--nuraly-borderless-focus-outline));
365
+ border: none;
366
+ }
367
+
368
+ /*
369
+ * Underlined variant - bottom border only (default/current behavior)
370
+ * Maintains existing behavior as default
371
+ */
372
+ :host([variant='underlined']) #input-container {
373
+ border-bottom: var(--nuraly-input-underlined-border-bottom, var(--nuraly-underlined-border-bottom));
374
+ border-top: none;
375
+ border-left: none;
376
+ border-right: none;
377
+ border-radius: var(--nuraly-input-underlined-border-radius, 0);
378
+ }
379
+
380
+ :host([variant='underlined']:not([state='error'])) #input-container:focus-within {
381
+ border-bottom: var(--nuraly-input-underlined-focus-border-bottom, var(--nuraly-underlined-focus-border-bottom));
382
+ border-top: none;
383
+ border-left: none;
384
+ border-right: none;
385
+ }
386
+
387
+ /* ========================================
388
+ * INPUT ELEMENT STYLES
389
+ * ======================================== */
390
+
391
+ /*
392
+ * Base input element styling
393
+ * Full width with no default borders, using container for styling
394
+ */
395
+ input {
396
+ width: 100%;
397
+ border: none;
398
+ outline: none;
399
+ color: var(--nuraly-input-text-color, var(--nuraly-text-color));
400
+ font-family: var(--nuraly-input-font-family, var(--nuraly-font-family));
401
+ font-size: var(--nuraly-input-font-size, var(--nuraly-font-size));
402
+ }
403
+
404
+ /* Remove default number input spinners */
405
+ /* Chrome, Safari, Edge, Opera */
406
+ input::-webkit-outer-spin-button,
407
+ input::-webkit-inner-spin-button {
408
+ -webkit-appearance: none;
409
+ }
410
+
411
+ /* Firefox */
412
+ input[type='number'] {
413
+ -moz-appearance: textfield;
414
+ }
415
+
416
+ /* ========================================
417
+ * STATE STYLES
418
+ * ======================================== */
419
+
420
+ /*
421
+ * Error state styling - works with all variants
422
+ * Applied when state='error' and not disabled
423
+ */
424
+ :host(:not([disabled])[state='error']) #input-container {
425
+ border: var(--nuraly-input-error-border, var(--nuraly-error-border)) !important;
426
+ outline: none !important;
427
+ }
428
+
429
+ /* Override variant-specific error state styling */
430
+ :host([variant='borderless'][state='error']) #input-container {
431
+ border: var(--nuraly-input-error-border, var(--nuraly-error-border)) !important;
432
+ outline: none !important;
433
+ }
434
+
435
+ :host([variant='underlined'][state='error']) #input-container,
436
+ :host([variant='filled'][state='error']) #input-container {
437
+ border-top: none !important;
438
+ border-left: none !important;
439
+ border-right: none !important;
440
+ border-bottom: var(--nuraly-input-error-border, var(--nuraly-error-border)) !important;
441
+ }
442
+
443
+ /*
444
+ * Number input icon positioning adjustments for error/warning states
445
+ * When validation states are present, adjust icon positioning
446
+ */
447
+ :host([state='error']) input[type='number'] ~ #number-icons,
448
+ :host([state='warning']) input[type='number'] ~ #number-icons {
449
+ position: static;
450
+ padding-left: var(--nuraly-input-number-icons-container-padding-left, var(--nuraly-number-icons-container-padding-left));
451
+ }
452
+
453
+ /* ========================================
454
+ * SLOTTED CONTENT STYLES
455
+ * ======================================== */
456
+
457
+ /*
458
+ * Label slot styling
459
+ * Applied to slotted label elements
460
+ */
461
+ ::slotted([slot='label']) {
462
+ color: var(--nuraly-input-label-color, var(--nuraly-label-color));
463
+ font-size: var(--nuraly-input-label-font-size, var(--nuraly-label-font-size));
464
+ padding-bottom: var(--nuraly-input-label-padding-bottom, var(--nuraly-label-padding-bottom));
465
+ }
466
+
467
+ /*
468
+ * Helper text slot styling
469
+ * Applied to slotted helper text elements
470
+ */
471
+ ::slotted([slot='helper-text']) {
472
+ color: var(--nuraly-input-helper-text-color, var(--nuraly-helper-text-color));
473
+ font-size: var(--nuraly-input-helper-text-font-size, var(--nuraly-helper-text-font-size));
474
+ padding-top: var(--nuraly-input-helper-text-padding-top, var(--nuraly-helper-text-padding-top));
475
+
476
+ /* Prevent text overflow and ensure proper wrapping without affecting parent width */
477
+ word-wrap: break-word;
478
+ word-break: break-word;
479
+ overflow-wrap: break-word;
480
+ hyphens: auto;
481
+ white-space: normal;
482
+ max-width: 100%;
483
+ width: 0;
484
+ min-width: 100%;
485
+ box-sizing: border-box;
486
+ line-height: 1.4;
487
+ }
488
+
489
+ /*
490
+ * State-specific helper text colors
491
+ * Override helper text color based on validation state
492
+ */
493
+ :host([state='error']) ::slotted([slot='helper-text']) {
494
+ color: var(--nuraly-input-error-helper-text-color, var(--nuraly-error-helper-text-color));
495
+ }
496
+
497
+ :host([state='warning']) ::slotted([slot='helper-text']) {
498
+ color: var(--nuraly-input-warning-helper-text-color, var(--nuraly-warning-helper-text-color));
499
+ }
500
+
501
+ /*
502
+ * Disabled state for slotted content
503
+ * Applied when input is disabled
504
+ */
505
+ :host([disabled]) ::slotted([slot='helper-text']) {
506
+ color: var(--nuraly-input-disabled-helper-text-color, var(--nuraly-disabled-helper-text-color));
507
+ }
508
+
509
+ :host([disabled]) ::slotted([slot='label']) {
510
+ color: var(--nuraly-input-disabled-label-color, var(--nuraly-disabled-label-color));
511
+ }
512
+
513
+ /*
514
+ * Input prefix wrapper styling
515
+ * Centers the prefix content vertically and horizontally
516
+ */
517
+ .input-prefix {
518
+ display: flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ }
522
+
523
+ /*
524
+ * Prefix slot styling
525
+ * Applied to slotted prefix content (icons, text, etc.)
526
+ */
527
+ ::slotted([slot='prefix']) {
528
+ display: flex;
529
+ align-items: center;
530
+ padding-right: var(--nuraly-input-prefix-padding-right, var(--nuraly-prefix-padding-right));
531
+ color: var(--nuraly-input-prefix-color, var(--nuraly-prefix-color));
532
+ font-size: var(--nuraly-input-prefix-font-size, var(--nuraly-prefix-font-size));
533
+ flex-shrink: 0;
534
+ }
535
+
536
+ /*
537
+ * Input suffix wrapper styling
538
+ * Centers the suffix content vertically and horizontally
539
+ */
540
+ .input-suffix {
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: center;
544
+ }
545
+
546
+ /*
547
+ * Suffix slot styling
548
+ * Applied to slotted suffix content (icons, text, etc.)
549
+ */
550
+ ::slotted([slot='suffix']) {
551
+ display: flex;
552
+ align-items: center;
553
+ padding-left: var(--nuraly-input-suffix-padding-left, var(--nuraly-suffix-padding-left));
554
+ color: var(--nuraly-input-suffix-color, var(--nuraly-suffix-color));
555
+ font-size: var(--nuraly-input-suffix-font-size, var(--nuraly-suffix-font-size));
556
+ flex-shrink: 0;
557
+ }
558
+
559
+ /*
560
+ * Disabled state for prefix and suffix slots
561
+ * Applied when input is disabled
562
+ */
563
+ :host([disabled]) ::slotted([slot='prefix']),
564
+ :host([disabled]) ::slotted([slot='suffix']) {
565
+ opacity: var(--nuraly-input-disabled-icon-opacity, var(--nuraly-disabled-icon-opacity));
566
+ color: var(--nuraly-input-disabled-prefix-suffix-color, var(--nuraly-disabled-prefix-suffix-color));
567
+ }
568
+ `,t`
569
+ /* ========================================
570
+ * SIZE VARIATIONS
571
+ * ======================================== */
572
+
573
+ /* Large input size variant */
574
+ div[data-size='large'] {
575
+ padding-top: var(--nuraly-input-large-padding-top, var(--nuraly-large-padding-top));
576
+ padding-bottom: var(--nuraly-input-large-padding-bottom, var(--nuraly-large-padding-bottom));
577
+ padding-left: var(--nuraly-input-large-padding-left, var(--nuraly-large-padding-left));
578
+ padding-right: var(--nuraly-input-large-padding-right, var(--nuraly-large-padding-right));
579
+ }
580
+
581
+ /* Medium input size variant (default) */
582
+ div[data-size='medium'] {
583
+ padding-top: var(--nuraly-input-medium-padding-top, var(--nuraly-medium-padding-top));
584
+ padding-bottom: var(--nuraly-input-medium-padding-bottom, var(--nuraly-medium-padding-bottom));
585
+ padding-left: var(--nuraly-input-medium-padding-left, var(--nuraly-medium-padding-left));
586
+ padding-right: var(--nuraly-input-medium-padding-right, var(--nuraly-medium-padding-right));
587
+ }
588
+
589
+ /* Small input size variant */
590
+ div[data-size='small'] {
591
+ padding-top: var(--nuraly-input-small-padding-top, var(--nuraly-small-padding-top));
592
+ padding-bottom: var(--nuraly-input-small-padding-bottom, var(--nuraly-small-padding-bottom));
593
+ padding-left: var(--nuraly-input-small-padding-left, var(--nuraly-small-padding-left));
594
+ padding-right: var(--nuraly-input-small-padding-right, var(--nuraly-small-padding-right));
595
+ }
596
+
597
+ /*
598
+ * Character count display
599
+ * Shows character count and limit information
600
+ */
601
+ .character-count {
602
+ font-size: var(--nuraly-input-character-count-font-size, var(--nuraly-character-count-font-size));
603
+ color: var(--nuraly-input-character-count-color, var(--nuraly-character-count-color));
604
+ text-align: right;
605
+ margin-top: var(--nuraly-input-character-count-margin-top, var(--nuraly-character-count-margin-top));
606
+ font-family: var(--nuraly-input-font-family, var(--nuraly-font-family));
607
+ }
608
+
609
+ /* Character count over limit styling */
610
+ .character-count[data-over-limit] {
611
+ color: var(--nuraly-input-character-count-over-limit-color, var(--nuraly-character-count-over-limit-color));
612
+ }
613
+
614
+ /* ========================================
615
+ * VALIDATION MESSAGE STYLES
616
+ * ======================================== */
617
+
618
+ /*
619
+ * Base validation message styling
620
+ * Common styles for error and warning messages
621
+ */
622
+ .validation-message {
623
+ font-size: var(--nuraly-input-validation-message-font-size, var(--nuraly-validation-message-font-size, 0.875rem));
624
+ font-family: var(--nuraly-input-font-family, var(--nuraly-font-family));
625
+ margin-top: var(--nuraly-input-validation-message-margin-top, var(--nuraly-validation-message-margin-top, 0.25rem));
626
+ padding: var(--nuraly-input-validation-message-padding, var(--nuraly-validation-message-padding, 0));
627
+
628
+ /* Prevent text overflow and ensure proper wrapping without affecting parent width */
629
+ word-wrap: break-word;
630
+ word-break: break-word;
631
+ overflow-wrap: break-word;
632
+ hyphens: auto;
633
+ white-space: normal;
634
+ max-width: 100%;
635
+ width: 0;
636
+ min-width: 100%;
637
+ box-sizing: border-box;
638
+ line-height: var(--nuraly-input-validation-message-line-height, var(--nuraly-validation-message-line-height, 1.4));
639
+ }
640
+
641
+ /*
642
+ * Error validation message styling
643
+ * Applied when validation message has error class
644
+ */
645
+ .validation-message.error {
646
+ color: var(--nuraly-input-error-message-color, var(--nuraly-error-message-color, var(--nuraly-input-error-color, var(--nuraly-error-color, #dc2626))));
647
+ }
648
+
649
+ /*
650
+ * Warning validation message styling
651
+ * Applied when validation message has warning class
652
+ */
653
+ .validation-message.warning {
654
+ color: var(--nuraly-input-warning-message-color, var(--nuraly-warning-message-color, var(--nuraly-input-warning-color, var(--nuraly-warning-color, #d97706))));
655
+ }
656
+
657
+ /*
658
+ * Disabled state for validation messages
659
+ * Applied when input is disabled
660
+ */
661
+ :host([disabled]) .validation-message {
662
+ opacity: var(--nuraly-input-disabled-validation-message-opacity, var(--nuraly-disabled-validation-message-opacity, 0.6));
663
+ color: var(--nuraly-input-disabled-validation-message-color, var(--nuraly-disabled-validation-message-color));
664
+ }
665
+
666
+ /*
667
+ * Validation icon styles
668
+ * Base styles for validation feedback icons
669
+ */
670
+ .validation-icon {
671
+ width: 16px;
672
+ height: 16px;
673
+ display: inline-flex;
674
+ align-items: center;
675
+ justify-content: center;
676
+ }
677
+
678
+ /*
679
+ * Loading validation icon with hourglass animation
680
+ * Applied when async validation is in progress
681
+ */
682
+ .validation-icon.validation-loading {
683
+ color: var(--nuraly-input-primary-color, var(--nuraly-primary-color, #3b82f6));
684
+ animation: validation-hourglass 2s ease-in-out infinite;
685
+ transform-origin: center;
686
+ }
687
+
688
+ /*
689
+ * Error validation icon styling
690
+ * Applied when validation fails
691
+ */
692
+ .validation-icon.validation-error {
693
+ color: var(--nuraly-input-error-color, var(--nuraly-error-color, #dc2626));
694
+ }
695
+
696
+ /*
697
+ * Warning validation icon styling
698
+ * Applied when validation has warnings
699
+ */
700
+ .validation-icon.validation-warning {
701
+ color: var(--nuraly-input-warning-color, var(--nuraly-warning-color, #d97706));
702
+ }
703
+
704
+ /*
705
+ * Success validation icon styling
706
+ * Applied when validation passes
707
+ */
708
+ .validation-icon.validation-success {
709
+ color: var(--nuraly-input-success-color, var(--nuraly-success-color, #16a34a));
710
+ }
711
+
712
+ /*
713
+ * Hourglass animation for validation loading
714
+ * Gentle pulsing effect without rotation for clean appearance
715
+ */
716
+ @keyframes validation-hourglass {
717
+ 0% {
718
+ opacity: 0.7;
719
+ transform: scale(1);
720
+ }
721
+ 25% {
722
+ opacity: 1;
723
+ transform: scale(1.03);
724
+ }
725
+ 50% {
726
+ opacity: 0.8;
727
+ transform: scale(1);
728
+ }
729
+ 75% {
730
+ opacity: 1;
731
+ transform: scale(1.03);
732
+ }
733
+ 100% {
734
+ opacity: 0.7;
735
+ transform: scale(1);
736
+ }
737
+ }
738
+
739
+ /*
740
+ * Alternative pulse animation option
741
+ * Uncomment this and change animation above to use pulse instead of hourglass
742
+ */
743
+ /*
744
+ @keyframes validation-pulse {
745
+ 0%, 100% {
746
+ opacity: 1;
747
+ transform: scale(1);
748
+ }
749
+ 50% {
750
+ opacity: 0.7;
751
+ transform: scale(1.1);
752
+ }
753
+ }
754
+ */
755
+ `],d={EMAIL:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,URL:/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/,PHONE:/^[\+]?[1-9][\d]{0,15}$/,PASSWORD_STRONG:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,ALPHANUMERIC:/^[a-zA-Z0-9]+$/,NUMERIC:/^\d+$/,ALPHA:/^[a-zA-Z]+$/,USERNAME:/^[a-zA-Z0-9_-]{3,16}$/,HEX_COLOR:/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,IPV4:/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,CREDIT_CARD:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3[0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$/},u=t=>({required:!0,message:t||"This field is required"}),c=t=>({type:"email",pattern:d.EMAIL,message:t||"Please enter a valid email address"}),h=t=>({type:"url",pattern:d.URL,message:t||"Please enter a valid URL"}),p=(t,i)=>({maxLength:t,message:i||`Maximum length is ${t} characters`}),v=(t,i)=>({type:"number",min:t,message:i||`Minimum value is ${t}`}),g=(t,i)=>({type:"number",max:t,message:i||`Maximum value is ${t}`});
2
756
  /**
3
757
  * @license
4
758
  * Copyright 2023 Google Laabidi Aymen
5
759
  * SPDX-License-Identifier: MIT
6
760
  */
7
- class m{static validateNumericProperties(t,r,i,n){"number"===t&&(r&&isNaN(Number(r))&&console.warn(`Invalid min value: "${r}" is not a valid number`),i&&isNaN(Number(i))&&console.warn(`Invalid max value: "${i}" is not a valid number`),n&&isNaN(Number(n))&&console.warn(`Invalid step value: "${n}" is not a valid number`),r&&i&&Number(r)>=Number(i)&&console.warn(`Invalid range: min value (${r}) should be less than max value (${i})`))}static preventNonNumericInput(t,r){const i=t.key,n=t.target,a=n.value,e=n.selectionStart||0;if(!(t.ctrlKey||t.metaKey||["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(i)||/^\d$/.test(i))){if("."===i||","===i){if(!(a.includes(".")||a.includes(",")))return}if("-"===i){const t=a.includes("-"),i=!r||Number(r)<0;if(!t&&0===e&&i)return}if("+"===i){if(!a.includes("+")&&0===e)return}t.preventDefault()}}static validateNumericValue(t,r,i){const n=[];if(!t)return{isValid:!0,warnings:n};const a=Number(t);return isNaN(a)?{isValid:!1,warnings:[`Invalid numeric value: "${t}"`]}:(r&&a<Number(r)&&n.push(`Value ${a} is below minimum ${r}`),i&&a>Number(i)&&n.push(`Value ${a} is above maximum ${i}`),{isValid:!0,warnings:n})}}
761
+ class y{static validateNumericProperties(t,i,r,n){"number"===t&&(i&&isNaN(Number(i))&&console.warn(`Invalid min value: "${i}" is not a valid number`),r&&isNaN(Number(r))&&console.warn(`Invalid max value: "${r}" is not a valid number`),n&&isNaN(Number(n))&&console.warn(`Invalid step value: "${n}" is not a valid number`),i&&r&&Number(i)>=Number(r)&&console.warn(`Invalid range: min value (${i}) should be less than max value (${r})`))}static preventNonNumericInput(t,i){const r=t.key,n=t.target,e=n.value,a=n.selectionStart||0;if(!(t.ctrlKey||t.metaKey||["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(r)||/^\d$/.test(r))){if("."===r||","===r){if(!(e.includes(".")||e.includes(",")))return}if("-"===r){const t=e.includes("-"),r=!i||Number(i)<0;if(!t&&0===a&&r)return}if("+"===r){if(!e.includes("+")&&0===a)return}t.preventDefault()}}static validateNumericValue(t,i,r){const n=[];if(!t)return{isValid:!0,warnings:n};const e=Number(t);return isNaN(e)?{isValid:!1,warnings:[`Invalid numeric value: "${t}"`]}:(i&&e<Number(i)&&n.push(`Value ${e} is below minimum ${i}`),r&&e>Number(r)&&n.push(`Value ${e} is above maximum ${r}`),{isValid:!0,warnings:n})}}
8
762
  /**
9
763
  * @license
10
764
  * Copyright 2023 Google Laabidi Aymen
11
765
  * SPDX-License-Identifier: MIT
12
- */class y{static renderPrefix(){return r`<div class="input-prefix"><slot name="prefix"></slot></div>`}static renderSuffix(){return r`<div class="input-suffix"><slot name="suffix"></slot></div>`}static renderAddonBefore(t,n){return t?r`<div class="input-addon-before"><slot name="addon-before" @slotchange="${n}"></slot></div>`:i}static renderAddonAfter(t,n){return t?r`<div class="input-addon-after"><slot name="addon-after" @slotchange="${n}"></slot></div>`:i}static renderCopyIcon(t,n,a,e,o){return t?r`<nr-icon name="copy" type="regular" id="copy-icon" role="button" aria-label="Copy input value" tabindex="0" @click="${n||a?i:e}" @keydown="${o}"></nr-icon>`:i}static renderClearIcon(t,n,a,e,o,s){return!t||!n||a||e?i:r`<nr-icon name="times-circle" type="regular" id="clear-icon" role="button" aria-label="Clear input value" tabindex="0" @click="${o}" @keydown="${s}"></nr-icon>`}static renderStateIcon(t){switch(t){case"warning":return r`<nr-icon name="warning" id="warning-icon"></nr-icon>`;case"error":return r`<nr-icon name="exclamation-circle" id="error-icon"></nr-icon>`;default:return i}}static renderCalendarIcon(t,n){return"default"!==t||"calendar"!==n?i:r`<nr-icon name="calendar" type="regular" id="calendar-icon"></nr-icon>`}static renderPasswordIcon(t,n,a,e,o,s){return"password"!==t?i:"text"===n?r`<nr-icon name="eye-slash" type="regular" id="password-icon" role="button" aria-label="Hide password" tabindex="0" @click="${a||e?i:o}" @keydown="${s}"></nr-icon>`:r`<nr-icon name="eye" type="regular" id="password-icon" role="button" aria-label="Show password" tabindex="0" @click="${a||e?i:o}" @keydown="${s}"></nr-icon>`}static renderNumberIcons(t,n,a,e,o,s,l){return"number"!==t?i:r`<div id="number-icons">${"default"!==n?r`<span id="icons-separator">|</span>`:i}<nr-icon name="minus" aria-label="Decrease value" role="button" tabindex="0" @click="${a||e?i:s}" @keydown="${l}"></nr-icon><span id="icons-separator">|</span><nr-icon name="plus" aria-label="Increase value" role="button" tabindex="0" @click="${a||e?i:o}" @keydown="${l}"></nr-icon></div>`}}
766
+ */class b{static renderPrefix(){return i`
767
+ <div class="input-prefix">
768
+ <slot name="prefix"></slot>
769
+ </div>
770
+ `}static renderSuffix(){return i`
771
+ <div class="input-suffix">
772
+ <slot name="suffix"></slot>
773
+ </div>
774
+ `}static renderAddonBefore(t,n){return t?i`
775
+ <div class="input-addon-before">
776
+ <slot name="addon-before" @slotchange=${n}></slot>
777
+ </div>
778
+ `:r}static renderAddonAfter(t,n){return t?i`
779
+ <div class="input-addon-after">
780
+ <slot name="addon-after" @slotchange=${n}></slot>
781
+ </div>
782
+ `:r}static renderCopyIcon(t,n,e,a,o){return t?i`<nr-icon
783
+ name="copy"
784
+ type="regular"
785
+ id="copy-icon"
786
+ role="button"
787
+ aria-label="Copy input value"
788
+ tabindex="0"
789
+ @click=${n||e?r:a}
790
+ @keydown=${o}
791
+ ></nr-icon>`:r}static renderClearIcon(t,n,e,a,o,s){return!t||!n||e||a?r:i`<nr-icon
792
+ name="times-circle"
793
+ type="regular"
794
+ id="clear-icon"
795
+ role="button"
796
+ aria-label="Clear input value"
797
+ tabindex="0"
798
+ @click=${o}
799
+ @keydown=${s}
800
+ ></nr-icon>`}static renderStateIcon(t){switch(t){case"warning":return i`<nr-icon name="warning" id="warning-icon"></nr-icon>`;case"error":return i`<nr-icon name="exclamation-circle" id="error-icon"></nr-icon>`;default:return r}}static renderCalendarIcon(t,n){return"default"!==t||"calendar"!==n?r:i`<nr-icon name="calendar" type="regular" id="calendar-icon"></nr-icon>`}static renderPasswordIcon(t,n,e,a,o,s){return"password"!==t?r:"text"===n?i`<nr-icon
801
+ name="eye-slash"
802
+ type="regular"
803
+ id="password-icon"
804
+ role="button"
805
+ aria-label="Hide password"
806
+ tabindex="0"
807
+ @click=${e||a?r:o}
808
+ @keydown=${s}
809
+ ></nr-icon>`:i`<nr-icon
810
+ name="eye"
811
+ type="regular"
812
+ id="password-icon"
813
+ role="button"
814
+ aria-label="Show password"
815
+ tabindex="0"
816
+ @click=${e||a?r:o}
817
+ @keydown=${s}
818
+ ></nr-icon>`}static renderNumberIcons(t,n,e,a,o,s,l){return"number"!==t?r:i`
819
+ <div id="number-icons">
820
+ ${"default"!==n?i`<span id="icons-separator">|</span>`:r}
821
+ <nr-icon
822
+ name="minus"
823
+ aria-label="Decrease value"
824
+ role="button"
825
+ tabindex="0"
826
+ @click=${e||a?r:s}
827
+ @keydown=${l}
828
+ ></nr-icon>
829
+ <span id="icons-separator">|</span>
830
+ <nr-icon
831
+ name="plus"
832
+ aria-label="Increase value"
833
+ role="button"
834
+ tabindex="0"
835
+ @click=${e||a?r:o}
836
+ @keydown=${l}
837
+ ></nr-icon>
838
+ </div>
839
+ `}}
13
840
  /**
14
841
  * @license
15
842
  * Copyright 2023 Nuraly, Laabidi Aymen
16
843
  * SPDX-License-Identifier: MIT
17
- */const g=t=>class extends t{get inputElement(){var t;const r=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input, textarea");if(r)return r;const i=this.querySelector("input, textarea");if(!i)throw new Error("SelectionMixin requires an input or textarea element");return i}selectAll(){const t=this.inputElement;t&&t.select()}selectRange(t,r){const i=this.inputElement;i&&i.setSelectionRange&&(i.focus(),i.setSelectionRange(t,r))}getCursorPosition(){const t=this.inputElement;return t&&"number"==typeof t.selectionStart?t.selectionStart:null}setCursorPosition(t){const r=this.inputElement;r&&r.setSelectionRange&&(r.focus(),r.setSelectionRange(t,t))}getSelectedText(){const t=this.inputElement;return t&&null!==t.selectionStart&&null!==t.selectionEnd?t.value.substring(t.selectionStart,t.selectionEnd):""}},f=t=>class extends t{get inputElement(){var t;const r=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input, textarea");if(r)return r;const i=this.querySelector("input, textarea");if(!i)throw new Error("FocusMixin requires an input or textarea element");return i}focus(t={}){const r=this.inputElement;r&&(r.focus({preventScroll:t.preventScroll}),t.selectText&&r.select())}blur(){const t=this.inputElement;t&&t.blur()}isFocused(){const t=this.inputElement;return!!t&&document.activeElement===t}},w=t=>class extends t{get inputElement(){var t;const r=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input");if(r)return r;const i=this.querySelector("input");if(!i)throw new Error("NumberMixin requires an input element");return i}dispatchInputEvent(t,r){"_dispatchInputEvent"in this&&"function"==typeof this._dispatchInputEvent?this._dispatchInputEvent(t,r):this.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0}))}increment(){try{const t=this.inputElement;if(!t.value){const r=t.getAttribute("min");t.value=r||"0"}t.stepUp();const r=t.value;this.dispatchInputEvent("nr-input",{value:r,target:t,action:"increment"}),"value"in this&&(this.value=r)}catch(t){console.warn("Failed to increment value:",t),this.dispatchInputEvent("nr-increment-error",{error:t,value:this.inputElement.value,target:this.inputElement})}}decrement(){try{const t=this.inputElement;t.stepDown();const r=t.value;this.dispatchInputEvent("nr-input",{value:r,target:t,action:"decrement"}),"value"in this&&(this.value=r)}catch(t){console.warn("Failed to decrement value:",t),this.dispatchInputEvent("nr-decrement-error",{error:t,value:this.inputElement.value,target:this.inputElement})}}setStep(t){const r=this.inputElement;t&&this.isValidStep(t)?r.setAttribute("step",t):r.removeAttribute("step")}isValidStep(t){if(!t)return!0;const r=parseFloat(t);return!isNaN(r)&&r>0}};
844
+ */const m=t=>class extends t{get inputElement(){var t;const i=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input, textarea");if(i)return i;const r=this.querySelector("input, textarea");if(!r)throw new Error("SelectionMixin requires an input or textarea element");return r}selectAll(){const t=this.inputElement;t&&t.select()}selectRange(t,i){const r=this.inputElement;r&&r.setSelectionRange&&(r.focus(),r.setSelectionRange(t,i))}getCursorPosition(){const t=this.inputElement;return t&&"number"==typeof t.selectionStart?t.selectionStart:null}setCursorPosition(t){const i=this.inputElement;i&&i.setSelectionRange&&(i.focus(),i.setSelectionRange(t,t))}getSelectedText(){const t=this.inputElement;return t&&null!==t.selectionStart&&null!==t.selectionEnd?t.value.substring(t.selectionStart,t.selectionEnd):""}},f=t=>class extends t{get inputElement(){var t;const i=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input, textarea");if(i)return i;const r=this.querySelector("input, textarea");if(!r)throw new Error("FocusMixin requires an input or textarea element");return r}focus(t={}){const i=this.inputElement;i&&(i.focus({preventScroll:t.preventScroll}),t.selectText&&i.select())}blur(){const t=this.inputElement;t&&t.blur()}isFocused(){const t=this.inputElement;return!!t&&document.activeElement===t}},w=t=>class extends t{get inputElement(){var t;const i=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector("#input, input");if(i)return i;const r=this.querySelector("input");if(!r)throw new Error("NumberMixin requires an input element");return r}dispatchInputEvent(t,i){"_dispatchInputEvent"in this&&"function"==typeof this._dispatchInputEvent?this._dispatchInputEvent(t,i):this.dispatchEvent(new CustomEvent(t,{detail:i,bubbles:!0,composed:!0}))}increment(){try{const t=this.inputElement;if(!t.value){const i=t.getAttribute("min");t.value=i||"0"}t.stepUp();const i=t.value;this.dispatchInputEvent("nr-input",{value:i,target:t,action:"increment"}),"value"in this&&(this.value=i)}catch(t){console.warn("Failed to increment value:",t),this.dispatchInputEvent("nr-increment-error",{error:t,value:this.inputElement.value,target:this.inputElement})}}decrement(){try{const t=this.inputElement;t.stepDown();const i=t.value;this.dispatchInputEvent("nr-input",{value:i,target:t,action:"decrement"}),"value"in this&&(this.value=i)}catch(t){console.warn("Failed to decrement value:",t),this.dispatchInputEvent("nr-decrement-error",{error:t,value:this.inputElement.value,target:this.inputElement})}}setStep(t){const i=this.inputElement;t&&this.isValidStep(t)?i.setAttribute("step",t):i.removeAttribute("step")}isValidStep(t){if(!t)return!0;const i=parseFloat(t);return!isNaN(i)&&i>0}};
18
845
  /**
19
846
  * @license
20
847
  * Copyright 2023 Nuraly, Laabidi Aymen
@@ -25,24 +852,79 @@ class m{static validateNumericProperties(t,r,i,n){"number"===t&&(r&&isNaN(Number
25
852
  * Copyright 2023 Nuraly, Laabidi Aymen
26
853
  * SPDX-License-Identifier: MIT
27
854
  */
28
- class x{constructor(t){this._host=t,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdate(){}hostUpdated(){}requestUpdate(){this._host.requestUpdate()}dispatchEvent(t){return this._host.dispatchEvent(t)}handleError(t,r){console.error(`[InputController:${r}]`,t),this.dispatchEvent(new CustomEvent("nr-controller-error",{detail:{error:t,context:r,controller:this.constructor.name},bubbles:!0,composed:!0}))}}
855
+ class x{constructor(t){this._host=t,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdate(){}hostUpdated(){}requestUpdate(){this._host.requestUpdate()}dispatchEvent(t){return this._host.dispatchEvent(t)}handleError(t,i){console.error(`[InputController:${i}]`,t),this.dispatchEvent(new CustomEvent("nr-controller-error",{detail:{error:t,context:i,controller:this.constructor.name},bubbles:!0,composed:!0}))}}
29
856
  /**
30
857
  * @license
31
858
  * Copyright 2023 Nuraly, Laabidi Aymen
32
859
  * SPDX-License-Identifier: MIT
33
- */var k;!function(t){t.Pristine="pristine",t.Pending="pending",t.Valid="valid",t.Invalid="invalid",t.Warning="warning"}(k||(k={}));class $ extends x{constructor(){super(...arguments),this._validationState=k.Pristine,this._isValidating=!1,this._isValid=!0,this._validationMessage="",this._validationResult={isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1},this._debounceTimer=null}get stateHost(){return this.host}get validationState(){return this._validationState}get isValidating(){return this._isValidating}get isValid(){return this._isValid}get validationMessage(){return this._validationMessage}get validationResult(){return this._validationResult}setValidationState(t){if(this._validationState!==t){const r=this._validationState;this._validationState=t,this.dispatchStateChangeEvent(r,t),this.requestUpdate()}}setValidationResult(t){this._validationResult=t,this._isValid=t.isValid,this._validationMessage=t.hasError?t.errorMessage||"":t.hasWarning&&t.warningMessage||"";let r=k.Valid;t.hasError?r=k.Invalid:t.hasWarning&&this.stateHost.allowWarnings&&(r=k.Warning),this.setValidationState(r)}setValidating(t){this._isValidating!==t&&(this._isValidating=t,t&&this.setValidationState(k.Pending),this.requestUpdate())}shouldValidateOnChange(){return this.stateHost.validateOnChangeInput&&("change"===this.stateHost.validationTrigger||this._validationState!==k.Pristine)}shouldValidateOnBlur(){return this.stateHost.validateOnBlurInput&&("blur"===this.stateHost.validationTrigger||"change"===this.stateHost.validationTrigger)}clearDebounceTimer(){null!==this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=null)}debounceValidation(t){this.clearDebounceTimer();const r=this.stateHost.validationDebounce;r&&r>0?this._debounceTimer=window.setTimeout((()=>{this._debounceTimer=null,t()}),r):t()}resetValidationState(){this.clearDebounceTimer(),this._validationState=k.Pristine,this._isValidating=!1,this._isValid=!0,this._validationMessage="",this._validationResult={isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1},this.requestUpdate()}markAsTouched(){this._validationState===k.Pristine&&this.setValidationState(k.Valid)}isPristine(){return this._validationState===k.Pristine}hasError(){return this._validationState===k.Invalid}hasWarning(){return this._validationState===k.Warning}isPending(){return this._validationState===k.Pending}getStateSummary(){return{state:this._validationState,isValidating:this._isValidating,isValid:this._isValid,message:this._validationMessage,result:this._validationResult,isPristine:this.isPristine(),hasError:this.hasError(),hasWarning:this.hasWarning(),shouldValidateOnChange:this.shouldValidateOnChange(),shouldValidateOnBlur:this.shouldValidateOnBlur()}}hostDisconnected(){super.hostDisconnected(),this.clearDebounceTimer()}dispatchStateChangeEvent(t,r){this.dispatchEvent(new CustomEvent("nr-validation-state-change",{detail:{previousState:t,newState:r,isValidating:this._isValidating,isValid:this._isValid,validationResult:this._validationResult},bubbles:!0,composed:!0}))}}
860
+ */var k;!function(t){t.Pristine="pristine",t.Pending="pending",t.Valid="valid",t.Invalid="invalid",t.Warning="warning"}(k||(k={}));class V extends x{constructor(){super(...arguments),this._validationState=k.Pristine,this._isValidating=!1,this._isValid=!0,this._validationMessage="",this._validationResult={isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1},this._debounceTimer=null}get stateHost(){return this.host}get validationState(){return this._validationState}get isValidating(){return this._isValidating}get isValid(){return this._isValid}get validationMessage(){return this._validationMessage}get validationResult(){return this._validationResult}setValidationState(t){if(this._validationState!==t){const i=this._validationState;this._validationState=t,this.dispatchStateChangeEvent(i,t),this.requestUpdate()}}setValidationResult(t){this._validationResult=t,this._isValid=t.isValid,this._validationMessage=t.hasError?t.errorMessage||"":t.hasWarning&&t.warningMessage||"";let i=k.Valid;t.hasError?i=k.Invalid:t.hasWarning&&this.stateHost.allowWarnings&&(i=k.Warning),this.setValidationState(i)}setValidating(t){this._isValidating!==t&&(this._isValidating=t,t&&this.setValidationState(k.Pending),this.requestUpdate())}shouldValidateOnChange(){return this.stateHost.validateOnChangeInput&&("change"===this.stateHost.validationTrigger||this._validationState!==k.Pristine)}shouldValidateOnBlur(){return this.stateHost.validateOnBlurInput&&("blur"===this.stateHost.validationTrigger||"change"===this.stateHost.validationTrigger)}clearDebounceTimer(){null!==this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=null)}debounceValidation(t){this.clearDebounceTimer();const i=this.stateHost.validationDebounce;i&&i>0?this._debounceTimer=window.setTimeout(()=>{this._debounceTimer=null,t()},i):t()}resetValidationState(){this.clearDebounceTimer(),this._validationState=k.Pristine,this._isValidating=!1,this._isValid=!0,this._validationMessage="",this._validationResult={isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1},this.requestUpdate()}markAsTouched(){this._validationState===k.Pristine&&this.setValidationState(k.Valid)}isPristine(){return this._validationState===k.Pristine}hasError(){return this._validationState===k.Invalid}hasWarning(){return this._validationState===k.Warning}isPending(){return this._validationState===k.Pending}getStateSummary(){return{state:this._validationState,isValidating:this._isValidating,isValid:this._isValid,message:this._validationMessage,result:this._validationResult,isPristine:this.isPristine(),hasError:this.hasError(),hasWarning:this.hasWarning(),shouldValidateOnChange:this.shouldValidateOnChange(),shouldValidateOnBlur:this.shouldValidateOnBlur()}}hostDisconnected(){super.hostDisconnected(),this.clearDebounceTimer()}dispatchStateChangeEvent(t,i){this.dispatchEvent(new CustomEvent("nr-validation-state-change",{detail:{previousState:t,newState:i,isValidating:this._isValidating,isValid:this._isValid,validationResult:this._validationResult},bubbles:!0,composed:!0}))}}
34
861
  /**
35
862
  * @license
36
863
  * Copyright 2023 Nuraly, Laabidi Aymen
37
864
  * SPDX-License-Identifier: MIT
38
- */var V=function(t,r,i,n){return new(i||(i=Promise))((function(a,e){function o(t){try{l(n.next(t))}catch(t){e(t)}}function s(t){try{l(n.throw(t))}catch(t){e(t)}}function l(t){var r;t.done?a(t.value):(r=t.value,r instanceof i?r:new i((function(t){t(r)}))).then(o,s)}l((n=n.apply(t,r||[])).next())}))};class z extends x{constructor(t){super(t),this.stateController=new $(this._host)}get validationHost(){return this._host}get isValid(){return this.stateController.isValid}get validationMessage(){return this.stateController.validationMessage}get validationState(){return this.stateController.validationState}get validationResult(){return this.stateController.validationResult}get isValidating(){return this.stateController.isValidating}hostConnected(){this.setupValidationRules()}hostUpdated(){}setupValidationRules(){const t=[],r=this.validationHost;"email"===r.type&&t.push(c()),"url"===r.type&&t.push(h()),r.required&&t.push(d(r.label?`${r.label} is required`:void 0)),r.maxLength&&t.push(p(r.maxLength)),"number"===r.type&&(void 0!==r.min&&t.push(v(Number(r.min))),void 0!==r.max&&t.push(b(Number(r.max))));const i=r.rules||[],n=[...t.filter((t=>!i.some((r=>this.isSameRuleType(t,r))))),...i];JSON.stringify(r.rules)!==JSON.stringify(n)&&(r.rules=n,this.requestUpdate())}validate(){try{this.stateController.setValidationState(k.Pending),this.stateController.setValidating(!0),this.dispatchValidationEvent();if(this.hasAsyncValidators())return this.performAsyncValidation(this.validationHost.value),!0;const t=this.performDetailedValidation(this.validationHost.value);return this.stateController.setValidationResult(t),t.hasError?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):t.hasWarning&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):this.setValidationResult(!0,"",k.Valid),this.stateController.setValidating(!1),this.updateHostValidationState(),t.isValid}catch(t){return this.handleError(t,"validate"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Validation error occurred",k.Invalid),this.updateHostValidationState(),!1}}validateOnChange(){this.stateController.shouldValidateOnChange()&&this.stateController.debounceValidation((()=>{this.validate()}))}validateOnBlur(){this.stateController.shouldValidateOnBlur()&&(this.stateController.clearDebounceTimer(),this.validate())}addRule(t){const r=this.validationHost.rules||[];this.validationHost.rules=[...r,t],this.requestUpdate()}removeRule(t){const r=this.validationHost.rules||[];this.validationHost.rules=r.filter((r=>!t(r))),this.requestUpdate()}clearRules(){this.validationHost.rules=[],this.reset()}hasAsyncValidators(){return(this.validationHost.rules||[]).some((t=>t.asyncValidator||t.validator&&this.isValidatorAsync(t.validator)))}isValidatorAsync(t){const r=t.toString();return r.includes("Promise")||r.includes("async")||r.includes("setTimeout")||r.includes("new Promise")}performAsyncValidation(t){return V(this,void 0,void 0,(function*(){try{this.stateController.setValidating(!0),this.updateHostValidationState();const r=[],i=[],n=this.validationHost.rules||[];for(const a of n)if(!(a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))){const n=this.validateRule(a,t);n.isValid||(a.warningOnly&&this.validationHost.allowWarnings?i.push(n.message):r.push(n.message))}if(r.length>0)return this.stateController.setValidationResult({isValid:!1,errors:r,warnings:i,hasError:!0,hasWarning:i.length>0,errorMessage:r[0],warningMessage:i[0]}),this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid),this.stateController.setValidating(!1),void this.updateHostValidationState();for(const a of n)if(a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))try{yield this.validateAsyncRule(a,t)}catch(t){const n=t.message||a.message||"Validation failed";a.warningOnly&&this.validationHost.allowWarnings?i.push(n):r.push(n)}const a=r.length>0,e=i.length>0;this.stateController.setValidationResult({isValid:!a,errors:r,warnings:i,hasError:a,hasWarning:e,errorMessage:r[0],warningMessage:i[0]}),a?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):e&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):this.setValidationResult(!0,"",k.Valid),this.stateController.setValidating(!1),this.updateHostValidationState()}catch(t){this.handleError(t,"performAsyncValidation"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Async validation error occurred",k.Invalid),this.updateHostValidationState()}}))}validateAsyncRule(t,r){return V(this,void 0,void 0,(function*(){if(t.asyncValidator)yield t.asyncValidator(t,r);else if(t.validator){const i=t.validator(t,r);i&&"object"==typeof i&&"then"in i&&(yield i)}}))}reset(){this.stateController.setValidationResult({isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1}),this.stateController.setValidationState(k.Pristine),this.stateController.setValidating(!1),this.updateHostValidationState(),this.dispatchValidationEvent()}getValidationStatus(){return{isValid:this.stateController.validationResult.isValid,isValidating:this.stateController.isValidating,errors:this.stateController.validationResult.errors,warnings:this.stateController.validationResult.warnings,validationResult:this.stateController.validationResult}}setValidationStatus(t){this.stateController.setValidationResult(t),t.hasError?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):t.hasWarning?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):t.isValid?this.setValidationResult(!0,"",k.Valid):this.setValidationResult(!0,"",k.Pristine),this.updateHostValidationState()}performDetailedValidation(t){const r=[],i=[],n=this.validationHost.rules||[];for(const a of n){const n=this.validateRule(a,t);n.isValid||(a.warningOnly&&this.validationHost.allowWarnings?i.push(n.message):r.push(n.message))}const a=r.length>0;return{isValid:!a,errors:r,warnings:i,hasError:a,hasWarning:i.length>0,errorMessage:r[0],warningMessage:i[0]}}validateRule(t,r){if(t.asyncValidator||t.validator&&this.isValidatorAsync(t.validator))return{isValid:!0,message:""};const i=t.transform?t.transform(r):r;if(t.required&&this.isValueEmpty(r))return{isValid:!1,message:t.message||`${this.validationHost.label||"This field"} is required`};if(this.isValueEmpty(r)&&!t.required)return{isValid:!0,message:""};if(t.type){const r=this.validateType(t.type,i);if(!r.isValid)return{isValid:!1,message:t.message||r.message}}if(t.pattern&&!t.pattern.test(i))return{isValid:!1,message:t.message||"Invalid format"};if(void 0!==t.minLength&&i.length<t.minLength)return{isValid:!1,message:t.message||`Minimum length is ${t.minLength} characters`};if(void 0!==t.maxLength&&i.length>t.maxLength)return{isValid:!1,message:t.message||`Maximum length is ${t.maxLength} characters`};if("number"===t.type||"number"===this.validationHost.type){const r=Number(i);if(void 0!==t.min&&r<t.min)return{isValid:!1,message:t.message||`Minimum value is ${t.min}`};if(void 0!==t.max&&r>t.max)return{isValid:!1,message:t.message||`Maximum value is ${t.max}`}}if(t.enum&&!t.enum.includes(i))return{isValid:!1,message:t.message||`Value must be one of: ${t.enum.join(", ")}`};if(t.validator)try{const r=t.validator(t,i);return r&&"object"==typeof r&&"isValid"in r?{isValid:r.isValid,message:r.isValid?"":r.message||t.message||"Validation failed"}:{isValid:!0,message:""}}catch(r){return{isValid:!1,message:t.message||r.message||"Validation failed"}}return{isValid:!0,message:""}}validateType(t,r){switch(t){case"email":return{isValid:u.EMAIL.test(r),message:"Please enter a valid email address"};case"url":return{isValid:u.URL.test(r),message:"Please enter a valid URL"};case"number":case"integer":return{isValid:!isNaN(Number(r))&&("number"===t||Number.isInteger(Number(r))),message:`Please enter a valid ${t}`};case"float":return{isValid:!isNaN(parseFloat(r)),message:"Please enter a valid number"};default:return{isValid:!0,message:""}}}isValueEmpty(t){return null==t||""===t}isSameRuleType(t,r){return t.type===r.type&&t.required===r.required&&!!t.pattern==!!r.pattern}setValidationResult(t,r,i){const n=this.stateController.isValid!==t||this.stateController.validationMessage!==r||this.stateController.validationState!==i;this.stateController.setValidationState(i),this.stateController.setValidationResult({isValid:t,errors:t?[]:[r],warnings:[],hasError:!t,hasWarning:!1,errorMessage:t?"":r,warningMessage:""}),n&&this.dispatchValidationEvent()}updateHostValidationState(){this.dispatchValidationEvent()}dispatchValidationEvent(){const t={isValid:this.stateController.isValid,validationMessage:this.stateController.validationMessage,validationState:this.stateController.validationState,errors:this.stateController.validationResult.errors,warnings:this.stateController.validationResult.warnings,validationResult:this.stateController.validationResult};this.dispatchEvent(new CustomEvent("nr-validation",{detail:t,bubbles:!0,composed:!0}))}getValidationClasses(){const t=this.host,r=this.host;return{valid:this.stateController.validationResult.isValid&&!this.stateController.validationResult.hasWarning,invalid:this.stateController.validationResult.hasError,warning:this.stateController.validationResult.hasWarning&&!this.stateController.validationResult.hasError,validating:this.stateController.isValidating,"has-feedback":r.hasFeedback||!1,touched:t.isTouched||!1,dirty:t.isDirty||!1,required:this.host.required||!1}}hasValidationFeedback(){const t=this.host;return!!t.hasFeedback&&(this.stateController.isValidating||this.stateController.validationResult.hasError||this.stateController.validationResult.hasWarning||this.stateController.validationResult.isValid&&t.value&&""!==t.value.trim()&&this.stateController.validationState!==k.Pristine)}renderValidationIcon(){const t=this.host;if(!t.hasFeedback)return"";let i="",n="";return this.stateController.isValidating?(i="hourglass-half",n="validation-loading"):this.stateController.validationResult.hasError?(i="exclamation-circle",n="validation-error"):this.stateController.validationResult.hasWarning?(i="exclamation-triangle",n="validation-warning"):this.stateController.validationResult.isValid&&t.value&&""!==t.value.trim()&&this.stateController.validationState!==k.Pristine&&(i="check-circle",n="validation-success"),i?r`<nr-icon name="${i}" class="validation-icon ${n}" part="validation-icon"></nr-icon>`:""}renderValidationMessage(){const t=this.stateController.validationResult.hasError,i=this.stateController.validationResult.hasWarning&&!t,n=t?this.stateController.validationResult.errorMessage:i?this.stateController.validationResult.warningMessage:"";return n?r`<div class="validation-message ${t?"error":"warning"}" part="validation-message" role="alert" aria-live="polite">${n}</div>`:""}clearDebounceTimer(){this.stateController.clearDebounceTimer()}getValidationRenderState(){return{classes:this.getValidationClasses(),hasValidationFeedback:this.hasValidationFeedback(),isValidating:this.stateController.isValidating,validationResult:this.stateController.validationResult,validationState:this.stateController.validationState}}}
865
+ */var S=function(t,i,r,n){return new(r||(r=Promise))(function(e,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function s(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r(function(t){t(i)})).then(o,s)}l((n=n.apply(t,i||[])).next())})};class $ extends x{constructor(t){super(t),this.stateController=new V(this._host)}get validationHost(){return this._host}get isValid(){return this.stateController.isValid}get validationMessage(){return this.stateController.validationMessage}get validationState(){return this.stateController.validationState}get validationResult(){return this.stateController.validationResult}get isValidating(){return this.stateController.isValidating}hostConnected(){this.setupValidationRules()}hostUpdated(){}setupValidationRules(){const t=[],i=this.validationHost;"email"===i.type&&t.push(c()),"url"===i.type&&t.push(h()),i.required&&t.push(u(i.label?`${i.label} is required`:void 0)),i.maxLength&&t.push(p(i.maxLength)),"number"===i.type&&(void 0!==i.min&&t.push(v(Number(i.min))),void 0!==i.max&&t.push(g(Number(i.max))));const r=i.rules||[],n=[...t.filter(t=>!r.some(i=>this.isSameRuleType(t,i))),...r];JSON.stringify(i.rules)!==JSON.stringify(n)&&(i.rules=n,this.requestUpdate())}validate(){try{this.stateController.setValidationState(k.Pending),this.stateController.setValidating(!0),this.dispatchValidationEvent();if(this.hasAsyncValidators())return this.performAsyncValidation(this.validationHost.value),!0;const t=this.performDetailedValidation(this.validationHost.value);return this.stateController.setValidationResult(t),t.hasError?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):t.hasWarning&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):this.setValidationResult(!0,"",k.Valid),this.stateController.setValidating(!1),this.updateHostValidationState(),t.isValid}catch(t){return this.handleError(t,"validate"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Validation error occurred",k.Invalid),this.updateHostValidationState(),!1}}validateOnChange(){this.stateController.shouldValidateOnChange()&&this.stateController.debounceValidation(()=>{this.validate()})}validateOnBlur(){this.stateController.shouldValidateOnBlur()&&(this.stateController.clearDebounceTimer(),this.validate())}addRule(t){const i=this.validationHost.rules||[];this.validationHost.rules=[...i,t],this.requestUpdate()}removeRule(t){const i=this.validationHost.rules||[];this.validationHost.rules=i.filter(i=>!t(i)),this.requestUpdate()}clearRules(){this.validationHost.rules=[],this.reset()}hasAsyncValidators(){return(this.validationHost.rules||[]).some(t=>t.asyncValidator||t.validator&&this.isValidatorAsync(t.validator))}isValidatorAsync(t){const i=t.toString();return i.includes("Promise")||i.includes("async")||i.includes("setTimeout")||i.includes("new Promise")}performAsyncValidation(t){return S(this,void 0,void 0,function*(){try{this.stateController.setValidating(!0),this.updateHostValidationState();const i=[],r=[],n=this.validationHost.rules||[];for(const e of n)if(!(e.asyncValidator||e.validator&&this.isValidatorAsync(e.validator))){const n=this.validateRule(e,t);n.isValid||(e.warningOnly&&this.validationHost.allowWarnings?r.push(n.message):i.push(n.message))}if(i.length>0)return this.stateController.setValidationResult({isValid:!1,errors:i,warnings:r,hasError:!0,hasWarning:r.length>0,errorMessage:i[0],warningMessage:r[0]}),this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid),this.stateController.setValidating(!1),void this.updateHostValidationState();for(const e of n)if(e.asyncValidator||e.validator&&this.isValidatorAsync(e.validator))try{yield this.validateAsyncRule(e,t)}catch(t){const n=t.message||e.message||"Validation failed";e.warningOnly&&this.validationHost.allowWarnings?r.push(n):i.push(n)}const e=i.length>0,a=r.length>0;this.stateController.setValidationResult({isValid:!e,errors:i,warnings:r,hasError:e,hasWarning:a,errorMessage:i[0],warningMessage:r[0]}),e?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):a&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):this.setValidationResult(!0,"",k.Valid),this.stateController.setValidating(!1),this.updateHostValidationState()}catch(t){this.handleError(t,"performAsyncValidation"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Async validation error occurred",k.Invalid),this.updateHostValidationState()}})}validateAsyncRule(t,i){return S(this,void 0,void 0,function*(){if(t.asyncValidator)yield t.asyncValidator(t,i);else if(t.validator){const r=t.validator(t,i);r&&"object"==typeof r&&"then"in r&&(yield r)}})}reset(){this.stateController.setValidationResult({isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1}),this.stateController.setValidationState(k.Pristine),this.stateController.setValidating(!1),this.updateHostValidationState(),this.dispatchValidationEvent()}getValidationStatus(){return{isValid:this.stateController.validationResult.isValid,isValidating:this.stateController.isValidating,errors:this.stateController.validationResult.errors,warnings:this.stateController.validationResult.warnings,validationResult:this.stateController.validationResult}}setValidationStatus(t){this.stateController.setValidationResult(t),t.hasError?this.setValidationResult(!1,this.stateController.validationMessage,k.Invalid):t.hasWarning?this.setValidationResult(!0,this.stateController.validationMessage,k.Warning):t.isValid?this.setValidationResult(!0,"",k.Valid):this.setValidationResult(!0,"",k.Pristine),this.updateHostValidationState()}performDetailedValidation(t){const i=[],r=[],n=this.validationHost.rules||[];for(const e of n){const n=this.validateRule(e,t);n.isValid||(e.warningOnly&&this.validationHost.allowWarnings?r.push(n.message):i.push(n.message))}const e=i.length>0;return{isValid:!e,errors:i,warnings:r,hasError:e,hasWarning:r.length>0,errorMessage:i[0],warningMessage:r[0]}}validateRule(t,i){if(t.asyncValidator||t.validator&&this.isValidatorAsync(t.validator))return{isValid:!0,message:""};const r=t.transform?t.transform(i):i;if(t.required&&this.isValueEmpty(i))return{isValid:!1,message:t.message||`${this.validationHost.label||"This field"} is required`};if(this.isValueEmpty(i)&&!t.required)return{isValid:!0,message:""};if(t.type){const i=this.validateType(t.type,r);if(!i.isValid)return{isValid:!1,message:t.message||i.message}}if(t.pattern&&!t.pattern.test(r))return{isValid:!1,message:t.message||"Invalid format"};if(void 0!==t.minLength&&r.length<t.minLength)return{isValid:!1,message:t.message||`Minimum length is ${t.minLength} characters`};if(void 0!==t.maxLength&&r.length>t.maxLength)return{isValid:!1,message:t.message||`Maximum length is ${t.maxLength} characters`};if("number"===t.type||"number"===this.validationHost.type){const i=Number(r);if(void 0!==t.min&&i<t.min)return{isValid:!1,message:t.message||`Minimum value is ${t.min}`};if(void 0!==t.max&&i>t.max)return{isValid:!1,message:t.message||`Maximum value is ${t.max}`}}if(t.enum&&!t.enum.includes(r))return{isValid:!1,message:t.message||`Value must be one of: ${t.enum.join(", ")}`};if(t.validator)try{const i=t.validator(t,r);return i&&"object"==typeof i&&"isValid"in i?{isValid:i.isValid,message:i.isValid?"":i.message||t.message||"Validation failed"}:{isValid:!0,message:""}}catch(i){return{isValid:!1,message:t.message||i.message||"Validation failed"}}return{isValid:!0,message:""}}validateType(t,i){switch(t){case"email":return{isValid:d.EMAIL.test(i),message:"Please enter a valid email address"};case"url":return{isValid:d.URL.test(i),message:"Please enter a valid URL"};case"number":case"integer":return{isValid:!isNaN(Number(i))&&("number"===t||Number.isInteger(Number(i))),message:`Please enter a valid ${t}`};case"float":return{isValid:!isNaN(parseFloat(i)),message:"Please enter a valid number"};default:return{isValid:!0,message:""}}}isValueEmpty(t){return null==t||""===t}isSameRuleType(t,i){return t.type===i.type&&t.required===i.required&&!!t.pattern==!!i.pattern}setValidationResult(t,i,r){const n=this.stateController.isValid!==t||this.stateController.validationMessage!==i||this.stateController.validationState!==r;this.stateController.setValidationState(r),this.stateController.setValidationResult({isValid:t,errors:t?[]:[i],warnings:[],hasError:!t,hasWarning:!1,errorMessage:t?"":i,warningMessage:""}),n&&this.dispatchValidationEvent()}updateHostValidationState(){this.dispatchValidationEvent()}dispatchValidationEvent(){const t={isValid:this.stateController.isValid,validationMessage:this.stateController.validationMessage,validationState:this.stateController.validationState,errors:this.stateController.validationResult.errors,warnings:this.stateController.validationResult.warnings,validationResult:this.stateController.validationResult};this.dispatchEvent(new CustomEvent("nr-validation",{detail:t,bubbles:!0,composed:!0}))}getValidationClasses(){const t=this.host,i=this.host;return{valid:this.stateController.validationResult.isValid&&!this.stateController.validationResult.hasWarning,invalid:this.stateController.validationResult.hasError,warning:this.stateController.validationResult.hasWarning&&!this.stateController.validationResult.hasError,validating:this.stateController.isValidating,"has-feedback":i.hasFeedback||!1,touched:t.isTouched||!1,dirty:t.isDirty||!1,required:this.host.required||!1}}hasValidationFeedback(){const t=this.host;return!!t.hasFeedback&&(this.stateController.isValidating||this.stateController.validationResult.hasError||this.stateController.validationResult.hasWarning||this.stateController.validationResult.isValid&&t.value&&""!==t.value.trim()&&this.stateController.validationState!==k.Pristine)}renderValidationIcon(){const t=this.host;if(!t.hasFeedback)return"";let r="",n="";return this.stateController.isValidating?(r="hourglass-half",n="validation-loading"):this.stateController.validationResult.hasError?(r="exclamation-circle",n="validation-error"):this.stateController.validationResult.hasWarning?(r="exclamation-triangle",n="validation-warning"):this.stateController.validationResult.isValid&&t.value&&""!==t.value.trim()&&this.stateController.validationState!==k.Pristine&&(r="check-circle",n="validation-success"),r?i`
866
+ <nr-icon
867
+ name="${r}"
868
+ class="validation-icon ${n}"
869
+ part="validation-icon">
870
+ </nr-icon>
871
+ `:""}renderValidationMessage(){const t=this.stateController.validationResult.hasError,r=this.stateController.validationResult.hasWarning&&!t,n=t?this.stateController.validationResult.errorMessage:r?this.stateController.validationResult.warningMessage:"";return n?i`
872
+ <div class="validation-message ${t?"error":"warning"}"
873
+ part="validation-message"
874
+ role="alert"
875
+ aria-live="polite">
876
+ ${n}
877
+ </div>
878
+ `:""}clearDebounceTimer(){this.stateController.clearDebounceTimer()}getValidationRenderState(){return{classes:this.getValidationClasses(),hasValidationFeedback:this.hasValidationFeedback(),isValidating:this.stateController.isValidating,validationResult:this.stateController.validationResult,validationState:this.stateController.validationState}}}
39
879
  /**
40
880
  * @license
41
881
  * Copyright 2023 Nuraly, Laabidi Aymen
42
882
  * SPDX-License-Identifier: MIT
43
- */var S=function(t,r,i,n){return new(i||(i=Promise))((function(a,e){function o(t){try{l(n.next(t))}catch(t){e(t)}}function s(t){try{l(n.throw(t))}catch(t){e(t)}}function l(t){var r;t.done?a(t.value):(r=t.value,r instanceof i?r:new i((function(t){t(r)}))).then(o,s)}l((n=n.apply(t,r||[])).next())}))};class A extends x{constructor(){super(...arguments),this.handleKeyDown=t=>{!this.eventHost.readonly||this.isReadonlyKeyAllowed(t)?"Enter"!==t.key?"number"===this.eventHost.type&&this.handleNumericKeyDown(t):this.dispatchEnterEvent(t):t.preventDefault()},this.handleValueChange=t=>{if(this.eventHost.readonly)return void t.preventDefault();const r=t.target,i=r.value;if(this.eventHost.maxLength&&i.length>this.eventHost.maxLength)return void t.preventDefault();"number"===this.eventHost.type&&i&&this.validateNumericValue(i,t),this.eventHost.value=i;const n=this.eventHost;n.validationController&&"function"==typeof n.validationController.validateOnChange&&n.validationController.validateOnChange(),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:r,originalEvent:t})},this.handleFocus=t=>{var r;this.setFocusState(!0);const i=t.target;this.restoreCursorPosition(i);const n={focused:!0,cursorPosition:null!==(r=this.getCursorPosition())&&void 0!==r?r:void 0,selectedText:this.getSelectedText()};this.eventHost.dispatchFocusEvent("nr-focus",Object.assign({target:t.target,value:this.eventHost.value},n)),this.eventHost.dispatchFocusEvent("nr-focus-change",n)},this.handleBlur=t=>{var r;this.setFocusState(!1);const i={focused:!1,cursorPosition:null!==(r=this.getCursorPosition())&&void 0!==r?r:void 0,selectedText:this.getSelectedText()},n=this.eventHost;n.validationController&&"function"==typeof n.validationController.validateOnBlur&&n.validationController.validateOnBlur(),this.eventHost.dispatchFocusEvent("nr-blur",Object.assign({target:t.target,value:this.eventHost.value},i)),this.eventHost.dispatchFocusEvent("nr-focus-change",i)},this.handleIconKeydown=t=>{if(!this.isActivationKey(t))return;t.preventDefault();const r=t.target;switch(r.id){case"copy-icon":this.handleCopy();break;case"clear-icon":this.handleClear();break;case"password-icon":this.handleTogglePassword();break;default:r.closest("#number-icons")&&this.handleNumberIconAction(r)}},this.handleCopy=()=>S(this,void 0,void 0,(function*(){if(this.eventHost.withCopy&&!this.eventHost.disabled)try{const t=this.inputElement;if(!t)return;t.select(),yield navigator.clipboard.writeText(t.value),this.eventHost.dispatchActionEvent("nr-copy-success",{value:t.value,action:"copy"})}catch(t){this.handleError(t,"copy"),this.eventHost.dispatchActionEvent("nr-copy-error",{error:t,action:"copy"})}})),this.handleClear=()=>{if(this.eventHost.disabled||this.eventHost.readonly||!this.eventHost.allowClear)return;const t=this.eventHost.value;this.eventHost.value="";const r=this.inputElement;r&&(r.value="",r.focus()),this.eventHost.dispatchActionEvent("nr-clear",{previousValue:t,newValue:this.eventHost.value,target:r,action:"clear"}),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:r,action:"clear"})},this.handleTogglePassword=()=>{if("password"!==this.eventHost.type)return;const t="password"===this.eventHost.inputType?"text":"password";this.eventHost.inputType=t,this.requestUpdate(),this.eventHost.dispatchActionEvent("nr-password-toggle",{visible:"text"===t,action:"password-toggle"})},this.handleIncrement=()=>{"number"===this.eventHost.type&&this.eventHost.increment&&this.eventHost.increment()},this.handleDecrement=()=>{"number"===this.eventHost.type&&this.eventHost.decrement&&this.eventHost.decrement()}}get eventHost(){return this.host}get inputElement(){var t;return(null===(t=this.eventHost.shadowRoot)||void 0===t?void 0:t.querySelector("#input"))||null}handleNumericKeyDown(t){["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(t.key)||t.ctrlKey||t.metaKey||"."!==t.key&&"-"!==t.key&&(/^\d$/.test(t.key)||t.preventDefault())}handleNumberIconAction(t){const r=t.classList.contains("increment")||t.closest(".increment"),i=t.classList.contains("decrement")||t.closest(".decrement");r?this.handleIncrement():i&&this.handleDecrement()}dispatchEnterEvent(t){this.eventHost.dispatchInputEvent("nr-enter",{value:this.eventHost.value,target:t.target,originalEvent:t})}validateNumericValue(t,r){}restoreCursorPosition(t){if(t.dataset.restoreCursor){const r=parseInt(t.dataset.restoreCursor,10);isNaN(r)||t.setSelectionRange(r,r),delete t.dataset.restoreCursor}}setFocusState(t){this.eventHost.hasOwnProperty("focused")&&(this.eventHost.focused=t,this.requestUpdate())}getCursorPosition(){if(this.eventHost.getCursorPosition)return this.eventHost.getCursorPosition();const t=this.inputElement;return t?t.selectionStart:null}getSelectedText(){if(this.eventHost.getSelectedText)return this.eventHost.getSelectedText();const t=this.inputElement;return t&&null!==t.selectionStart&&null!==t.selectionEnd?t.value.substring(t.selectionStart,t.selectionEnd):""}isReadonlyKeyAllowed(t){if(this.eventHost.isReadonlyKeyAllowed)return this.eventHost.isReadonlyKeyAllowed(t);return t.ctrlKey||t.metaKey?["KeyA","KeyC"].includes(t.code):["Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(t.key)}isActivationKey(t){return this.eventHost.isActivationKey?this.eventHost.isActivationKey(t):"Enter"===t.key||" "===t.key}}
883
+ */var A=function(t,i,r,n){return new(r||(r=Promise))(function(e,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function s(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r(function(t){t(i)})).then(o,s)}l((n=n.apply(t,i||[])).next())})};class E extends x{constructor(){super(...arguments),this.debounceTimer=null,this.handleKeyDown=t=>{!this.eventHost.readonly||this.isReadonlyKeyAllowed(t)?"Enter"!==t.key?"number"===this.eventHost.type&&this.handleNumericKeyDown(t):this.dispatchEnterEvent(t):t.preventDefault()},this.handleValueChange=t=>{if(this.eventHost.readonly)return void t.preventDefault();const i=t.target,r=i.value;if(this.eventHost.maxLength&&r.length>this.eventHost.maxLength)return void t.preventDefault();"number"===this.eventHost.type&&r&&this.validateNumericValue(r,t),this.eventHost.value=r;const n=this.eventHost;n.validationController&&"function"==typeof n.validationController.validateOnChange&&n.validationController.validateOnChange();const e=this.eventHost.debounce||0;e>0?(this.clearDebounceTimer(),this.debounceTimer=setTimeout(()=>{this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:i,originalEvent:t})},e)):this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:i,originalEvent:t})},this.handleFocus=t=>{var i;this.setFocusState(!0);const r=t.target;this.restoreCursorPosition(r);const n={focused:!0,cursorPosition:null!==(i=this.getCursorPosition())&&void 0!==i?i:void 0,selectedText:this.getSelectedText()};this.eventHost.dispatchFocusEvent("nr-focus",Object.assign({target:t.target,value:this.eventHost.value},n)),this.eventHost.dispatchFocusEvent("nr-focus-change",n)},this.handleBlur=t=>{var i;this.setFocusState(!1);const r={focused:!1,cursorPosition:null!==(i=this.getCursorPosition())&&void 0!==i?i:void 0,selectedText:this.getSelectedText()},n=this.eventHost;n.validationController&&"function"==typeof n.validationController.validateOnBlur&&n.validationController.validateOnBlur(),this.eventHost.dispatchFocusEvent("nr-blur",Object.assign({target:t.target,value:this.eventHost.value},r)),this.eventHost.dispatchFocusEvent("nr-focus-change",r)},this.handleIconKeydown=t=>{if(!this.isActivationKey(t))return;t.preventDefault();const i=t.target;switch(i.id){case"copy-icon":this.handleCopy();break;case"clear-icon":this.handleClear();break;case"password-icon":this.handleTogglePassword();break;default:i.closest("#number-icons")&&this.handleNumberIconAction(i)}},this.handleCopy=()=>A(this,void 0,void 0,function*(){if(this.eventHost.withCopy&&!this.eventHost.disabled)try{const t=this.inputElement;if(!t)return;t.select(),yield navigator.clipboard.writeText(t.value),this.eventHost.dispatchActionEvent("nr-copy-success",{value:t.value,action:"copy"})}catch(t){this.handleError(t,"copy"),this.eventHost.dispatchActionEvent("nr-copy-error",{error:t,action:"copy"})}}),this.handleClear=()=>{if(this.eventHost.disabled||this.eventHost.readonly||!this.eventHost.allowClear)return;const t=this.eventHost.value;this.eventHost.value="";const i=this.inputElement;i&&(i.value="",i.focus()),this.eventHost.dispatchActionEvent("nr-clear",{previousValue:t,newValue:this.eventHost.value,target:i,action:"clear"}),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:i,action:"clear"})},this.handleTogglePassword=()=>{if("password"!==this.eventHost.type)return;const t="password"===this.eventHost.inputType?"text":"password";this.eventHost.inputType=t,this.requestUpdate(),this.eventHost.dispatchActionEvent("nr-password-toggle",{visible:"text"===t,action:"password-toggle"})},this.handleIncrement=()=>{"number"===this.eventHost.type&&this.eventHost.increment&&this.eventHost.increment()},this.handleDecrement=()=>{"number"===this.eventHost.type&&this.eventHost.decrement&&this.eventHost.decrement()}}get eventHost(){return this.host}get inputElement(){var t;return(null===(t=this.eventHost.shadowRoot)||void 0===t?void 0:t.querySelector("#input"))||null}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}handleNumericKeyDown(t){["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(t.key)||t.ctrlKey||t.metaKey||"."!==t.key&&"-"!==t.key&&(/^\d$/.test(t.key)||t.preventDefault())}handleNumberIconAction(t){const i=t.classList.contains("increment")||t.closest(".increment"),r=t.classList.contains("decrement")||t.closest(".decrement");i?this.handleIncrement():r&&this.handleDecrement()}dispatchEnterEvent(t){this.eventHost.dispatchInputEvent("nr-enter",{value:this.eventHost.value,target:t.target,originalEvent:t})}validateNumericValue(t,i){}restoreCursorPosition(t){if(t.dataset.restoreCursor){const i=parseInt(t.dataset.restoreCursor,10);isNaN(i)||t.setSelectionRange(i,i),delete t.dataset.restoreCursor}}setFocusState(t){this.eventHost.hasOwnProperty("focused")&&(this.eventHost.focused=t,this.requestUpdate())}getCursorPosition(){if(this.eventHost.getCursorPosition)return this.eventHost.getCursorPosition();const t=this.inputElement;return t?t.selectionStart:null}getSelectedText(){if(this.eventHost.getSelectedText)return this.eventHost.getSelectedText();const t=this.inputElement;return t&&null!==t.selectionStart&&null!==t.selectionEnd?t.value.substring(t.selectionStart,t.selectionEnd):""}isReadonlyKeyAllowed(t){if(this.eventHost.isReadonlyKeyAllowed)return this.eventHost.isReadonlyKeyAllowed(t);return t.ctrlKey||t.metaKey?["KeyA","KeyC"].includes(t.code):["Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(t.key)}isActivationKey(t){return this.eventHost.isActivationKey?this.eventHost.isActivationKey(t):"Enter"===t.key||" "===t.key}}
44
884
  /**
45
885
  * @license
46
886
  * Copyright 2023 Nuraly, Laabidi Aymen
47
887
  * SPDX-License-Identifier: MIT
48
- */var E=function(t,r,i,n){for(var a,e=arguments.length,o=e<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,i):n,s=t.length-1;s>=0;s--)(a=t[s])&&(o=(e<3?a(o):e>3?a(r,i,o):a(r,i))||o);return e>3&&o&&Object.defineProperty(r,i,o),o},N=function(t,r,i,n){return new(i||(i=Promise))((function(a,e){function o(t){try{l(n.next(t))}catch(t){e(t)}}function s(t){try{l(n.throw(t))}catch(t){e(t)}}function l(t){var r;t.done?a(t.value):(r=t.value,r instanceof i?r:new i((function(t){t(r)}))).then(o,s)}l((n=n.apply(t,r||[])).next())}))};let C=class extends(w(f(g(s(n))))){constructor(){super(...arguments),this.validationController=new z(this),this.eventController=new A(this),this.disabled=!1,this.readonly=!1,this.state="default",this.value="",this.size="medium",this.variant="underlined",this.type="text",this.placeholder="",this.autocomplete="off",this.withCopy=!1,this.allowClear=!1,this.showCount=!1,this.rules=[],this.validateOnChangeInput=!0,this.validateOnBlurInput=!0,this.hasFeedback=!1,this.allowWarnings=!1,this.validationTrigger="change",this.inputType="",this.hasAddonBefore=!1,this.hasAddonAfter=!1,this.focused=!1,this.requiredComponents=["nr-icon"],this._handleValidationEvent=t=>{const r=t.detail;this.validationMessage=r.validationMessage||"";let i="default";r.validationResult.hasError?i="error":r.validationResult.hasWarning&&this.allowWarnings?i="warning":r.validationResult.isValid&&this.value&&this.hasFeedback&&(i="success"),this.state!==i&&(this.state=i),this.requestUpdate()},this._handleKeyDown=t=>{this.eventController.handleKeyDown(t)},this._valueChange=t=>{this.eventController.handleValueChange(t)},this._focusEvent=t=>{this.eventController.handleFocus(t)},this._blurEvent=t=>{this.eventController.handleBlur(t)},this._handleIconKeydown=t=>{this.eventController.handleIconKeydown(t)}}get _input(){return this.shadowRoot.querySelector("#input")}get characterCountDisplay(){const t=this.value.length;return this.maxLength?`${t}/${this.maxLength}`:`${t}`}get isOverCharacterLimit(){return!!this.maxLength&&this.value.length>this.maxLength}get input(){return this._input}get inputElement(){return this._input}connectedCallback(){super.connectedCallback(),this.addEventListener("nr-validation",this._handleValidationEvent)}disconnectedCallback(){var t,r;super.disconnectedCallback(),this.removeEventListener("nr-validation",this._handleValidationEvent),null===(r=(t=this.validationController).clearDebounceTimer)||void 0===r||r.call(t)}willUpdate(t){super.willUpdate(t),!t.has("type")&&this.inputType||(this.inputType=this.type),(t.has("type")||t.has("min"))&&"number"===this.type&&this.min&&!this.value&&(this.value=this.min),(t.has("type")||t.has("min")||t.has("max")||t.has("step"))&&m.validateNumericProperties(this.type,this.min,this.max,this.step),(t.has("type")||t.has("required")||t.has("maxLength")||t.has("min")||t.has("max"))&&this.validationController.setupValidationRules()}updated(t){if(t.has("step")||t.has("min")||t.has("max")||t.has("maxLength")){const t=this.input;t&&(this.setStep(this.step),this.min?t.setAttribute("min",this.min):t.removeAttribute("min"),this.max?t.setAttribute("max",this.max):t.removeAttribute("max"),this.maxLength?t.setAttribute("maxlength",this.maxLength.toString()):t.removeAttribute("maxlength"))}}firstUpdated(){this._checkInitialSlotContent()}_checkInitialSlotContent(){const t=this.querySelectorAll('[slot="addon-before"]');this.hasAddonBefore=t.length>0;const r=this.querySelectorAll('[slot="addon-after"]');this.hasAddonAfter=r.length>0}_handleSlotChange(t){const r=t.target,i=r.name;"addon-before"===i?this.hasAddonBefore=r.assignedElements().length>0:"addon-after"===i&&(this.hasAddonAfter=r.assignedElements().length>0)}_onCopy(){return N(this,void 0,void 0,(function*(){yield this.eventController.handleCopy()}))}_onClear(){this.eventController.handleClear()}_increment(){this.eventController.handleIncrement()}_decrement(){this.eventController.handleDecrement()}_togglePasswordIcon(){this.eventController.handleTogglePassword()}_getAriaDescribedBy(){var t;const r=[],i=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector('slot[name="helper-text"]');return i&&i.assignedNodes().length>0&&r.push("helper-text"),r.join(" ")||""}validateValue(t){return this.validationController.validate()}addRule(t){this.validationController.addRule(t)}removeRule(t){this.validationController.removeRule(t)}clearRules(){this.validationController.clearRules()}getValidationStatus(){return this.validationController.getValidationStatus()}validateInput(){return N(this,void 0,void 0,(function*(){const t=this.validationController.validate();return this.validationController.isValidating?new Promise((t=>{const r=()=>{this.validationController.isValidating?setTimeout(r,50):t(this.validationController.isValid)};r()})):t}))}setValidationStatus(t){this.validationController.setValidationStatus(t)}getValidationClasses(){return this.validationController.getValidationClasses()}renderValidationIcon(){return this.validationController.renderValidationIcon()}renderValidationMessage(){return this.validationController.renderValidationMessage()}render(){const t=this.getValidationClasses(),i=this.validationController.getValidationRenderState();return r`<slot name="label"></slot><div class="input-wrapper ${Object.entries(t).filter((([,t])=>t)).map((([t])=>t)).join(" ")}" part="input-wrapper" data-theme="${this.currentTheme}" ?data-validating="${i.isValidating}">${y.renderAddonBefore(this.hasAddonBefore,(t=>this._handleSlotChange(t)))}<div data-size="${this.size}" id="input-container" part="input-container">${y.renderPrefix()} <input id="input" part="input" .disabled="${this.disabled}" .readOnly="${this.readonly}" .value="${this.value}" .placeholder="${this.placeholder}" .type="${this.inputType}" .autocomplete="${this.autocomplete}" aria-invalid="${i.validationResult.hasError?"true":"false"}" aria-describedby="${this._getAriaDescribedBy()}" @input="${this._valueChange}" @focus="${this._focusEvent}" @blur="${this._blurEvent}" @keydown="${this._handleKeyDown}"> ${y.renderSuffix()} ${y.renderCopyIcon(this.withCopy,this.disabled,this.readonly,(()=>this._onCopy()),(t=>this._handleIconKeydown(t)))} ${y.renderClearIcon(this.allowClear,this.value,this.disabled,this.readonly,(()=>this._onClear()),(t=>this._handleIconKeydown(t)))} ${i.hasValidationFeedback?this.renderValidationIcon():y.renderStateIcon(this.state)} ${y.renderCalendarIcon(this.state,this.type)} ${y.renderPasswordIcon(this.type,this.inputType,this.disabled,this.readonly,(()=>this._togglePasswordIcon()),(t=>this._handleIconKeydown(t)))} ${y.renderNumberIcons(this.type,this.state,this.disabled,this.readonly,(()=>this._increment()),(()=>this._decrement()),(t=>this._handleIconKeydown(t)))}</div>${y.renderAddonAfter(this.hasAddonAfter,(t=>this._handleSlotChange(t)))}</div><slot name="helper-text"></slot>${this.renderValidationMessage()} ${this.showCount?r`<div class="character-count" part="character-count" ?data-over-limit="${this.isOverCharacterLimit}">${this.characterCountDisplay}</div>`:""}`}};C.styles=l,E([a({type:Boolean,reflect:!0})],C.prototype,"disabled",void 0),E([a({type:Boolean,reflect:!0})],C.prototype,"readonly",void 0),E([a({type:String,reflect:!0})],C.prototype,"state",void 0),E([a({type:String})],C.prototype,"value",void 0),E([a({type:String})],C.prototype,"size",void 0),E([a({type:String,reflect:!0})],C.prototype,"variant",void 0),E([a({reflect:!0})],C.prototype,"type",void 0),E([a({type:String})],C.prototype,"step",void 0),E([a({type:String})],C.prototype,"min",void 0),E([a({type:String})],C.prototype,"max",void 0),E([a({type:String})],C.prototype,"placeholder",void 0),E([a({type:String})],C.prototype,"autocomplete",void 0),E([a({type:String})],C.prototype,"name",void 0),E([a({type:Boolean})],C.prototype,"required",void 0),E([a({type:Boolean,reflect:!0})],C.prototype,"withCopy",void 0),E([a({type:Boolean,reflect:!0})],C.prototype,"allowClear",void 0),E([a({type:Boolean,reflect:!0})],C.prototype,"showCount",void 0),E([a({type:Number})],C.prototype,"maxLength",void 0),E([a({type:Array})],C.prototype,"rules",void 0),E([a({type:Boolean,attribute:"validate-on-change"})],C.prototype,"validateOnChangeInput",void 0),E([a({type:Boolean,attribute:"validate-on-blur"})],C.prototype,"validateOnBlurInput",void 0),E([a({type:Boolean,attribute:"has-feedback"})],C.prototype,"hasFeedback",void 0),E([a({type:Boolean,attribute:"allow-warnings"})],C.prototype,"allowWarnings",void 0),E([a({type:String,attribute:"validation-trigger"})],C.prototype,"validationTrigger",void 0),E([a({type:Number,attribute:"validation-debounce"})],C.prototype,"validationDebounce",void 0),E([a({type:String})],C.prototype,"label",void 0),E([e()],C.prototype,"validationMessage",void 0),E([e()],C.prototype,"inputType",void 0),E([e()],C.prototype,"hasAddonBefore",void 0),E([e()],C.prototype,"hasAddonAfter",void 0),E([e()],C.prototype,"focused",void 0),C=E([o("nr-input")],C);var P=Object.freeze({__proto__:null,PORT:/^(?:[1-9]\d{0,4}|[1-5]\d{5}|6[0-4]\d{4}|65[0-4]\d{3}|655[0-2]\d{2}|6553[0-5])$/,NOT_EMPTY:/^.+$/});export{C as NrInputElement,P as Validations};
888
+ */var N=function(t,i,r,n){for(var e,a=arguments.length,o=a<3?i:null===n?n=Object.getOwnPropertyDescriptor(i,r):n,s=t.length-1;s>=0;s--)(e=t[s])&&(o=(a<3?e(o):a>3?e(i,r,o):e(i,r))||o);return a>3&&o&&Object.defineProperty(i,r,o),o},z=function(t,i,r,n){return new(r||(r=Promise))(function(e,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function s(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r(function(t){t(i)})).then(o,s)}l((n=n.apply(t,i||[])).next())})};let C=class extends(w(f(m(s(n))))){constructor(){super(...arguments),this.validationController=new $(this),this.eventController=new E(this),this.disabled=!1,this.readonly=!1,this.state="default",this.value="",this.size="medium",this.variant="outlined",this.type="text",this.placeholder="",this.autocomplete="off",this.withCopy=!1,this.allowClear=!1,this.showCount=!1,this.rules=[],this.validateOnChangeInput=!0,this.validateOnBlurInput=!0,this.hasFeedback=!1,this.allowWarnings=!1,this.validationTrigger="change",this.debounce=0,this.inputType="",this.hasAddonBefore=!1,this.hasAddonAfter=!1,this.focused=!1,this.requiredComponents=["nr-icon"],this._handleValidationEvent=t=>{const i=t.detail;this.validationMessage=i.validationMessage||"";let r="default";i.validationResult.hasError?r="error":i.validationResult.hasWarning&&this.allowWarnings?r="warning":i.validationResult.isValid&&this.value&&this.hasFeedback&&(r="success"),this.state!==r&&(this.state=r),this.requestUpdate()},this._handleKeyDown=t=>{this.eventController.handleKeyDown(t)},this._valueChange=t=>{this.eventController.handleValueChange(t)},this._focusEvent=t=>{this.eventController.handleFocus(t)},this._blurEvent=t=>{this.eventController.handleBlur(t)},this._handleIconKeydown=t=>{this.eventController.handleIconKeydown(t)}}get _input(){return this.shadowRoot.querySelector("#input")}get characterCountDisplay(){const t=this.value.length;return this.maxLength?`${t}/${this.maxLength}`:`${t}`}get isOverCharacterLimit(){return!!this.maxLength&&this.value.length>this.maxLength}get input(){return this._input}get inputElement(){return this._input}connectedCallback(){super.connectedCallback(),this.addEventListener("nr-validation",this._handleValidationEvent)}disconnectedCallback(){var t,i,r,n;super.disconnectedCallback(),this.removeEventListener("nr-validation",this._handleValidationEvent),null===(i=(t=this.validationController).clearDebounceTimer)||void 0===i||i.call(t),null===(n=(r=this.eventController).clearDebounceTimer)||void 0===n||n.call(r)}willUpdate(t){super.willUpdate(t),!t.has("type")&&this.inputType||(this.inputType=this.type),(t.has("type")||t.has("min"))&&"number"===this.type&&this.min&&!this.value&&(this.value=this.min),(t.has("type")||t.has("min")||t.has("max")||t.has("step"))&&y.validateNumericProperties(this.type,this.min,this.max,this.step),(t.has("type")||t.has("required")||t.has("maxLength")||t.has("min")||t.has("max"))&&this.validationController.setupValidationRules()}updated(t){if(t.has("step")||t.has("min")||t.has("max")||t.has("maxLength")){const t=this.input;t&&(this.setStep(this.step),this.min?t.setAttribute("min",this.min):t.removeAttribute("min"),this.max?t.setAttribute("max",this.max):t.removeAttribute("max"),this.maxLength?t.setAttribute("maxlength",this.maxLength.toString()):t.removeAttribute("maxlength"))}if(t.has("value")){const t=this.input;t&&t.value!==this.value&&(t.value=this.value)}}firstUpdated(){this._checkInitialSlotContent()}_checkInitialSlotContent(){const t=this.querySelectorAll('[slot="addon-before"]');this.hasAddonBefore=t.length>0;const i=this.querySelectorAll('[slot="addon-after"]');this.hasAddonAfter=i.length>0}_handleSlotChange(t){const i=t.target,r=i.name;"addon-before"===r?this.hasAddonBefore=i.assignedElements().length>0:"addon-after"===r&&(this.hasAddonAfter=i.assignedElements().length>0)}_onCopy(){return z(this,void 0,void 0,function*(){yield this.eventController.handleCopy()})}_onClear(){this.eventController.handleClear()}_increment(){this.eventController.handleIncrement()}_decrement(){this.eventController.handleDecrement()}_togglePasswordIcon(){this.eventController.handleTogglePassword()}_getAriaDescribedBy(){var t;const i=[],r=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector('slot[name="helper-text"]');return r&&r.assignedNodes().length>0&&i.push("helper-text"),i.join(" ")||""}validateValue(t){return this.validationController.validate()}addRule(t){this.validationController.addRule(t)}removeRule(t){this.validationController.removeRule(t)}clearRules(){this.validationController.clearRules()}getValidationStatus(){return this.validationController.getValidationStatus()}validateInput(){return z(this,void 0,void 0,function*(){const t=this.validationController.validate();return this.validationController.isValidating?new Promise(t=>{const i=()=>{this.validationController.isValidating?setTimeout(i,50):t(this.validationController.isValid)};i()}):t})}setValidationStatus(t){this.validationController.setValidationStatus(t)}getValidationClasses(){return this.validationController.getValidationClasses()}renderValidationIcon(){return this.validationController.renderValidationIcon()}renderValidationMessage(){return this.validationController.renderValidationMessage()}render(){const t=this.getValidationClasses(),r=this.validationController.getValidationRenderState();return i`
889
+ <slot name="label"></slot>
890
+ <div class="input-wrapper ${Object.entries(t).filter(([,t])=>t).map(([t])=>t).join(" ")}"
891
+ part="input-wrapper"
892
+ data-theme="${this.currentTheme}"
893
+ ?data-validating="${r.isValidating}">
894
+ ${b.renderAddonBefore(this.hasAddonBefore,t=>this._handleSlotChange(t))}
895
+ <div data-size=${this.size} id="input-container" part="input-container">
896
+ ${b.renderPrefix()}
897
+ <input
898
+ id="input"
899
+ part="input"
900
+ .disabled=${this.disabled}
901
+ .readOnly=${this.readonly}
902
+ .value=${this.value}
903
+ .placeholder=${this.placeholder}
904
+ .type="${this.inputType}"
905
+ .autocomplete=${this.autocomplete}
906
+ aria-invalid=${r.validationResult.hasError?"true":"false"}
907
+ aria-describedby=${this._getAriaDescribedBy()}
908
+ @input=${this._valueChange}
909
+ @focus=${this._focusEvent}
910
+ @blur=${this._blurEvent}
911
+ @keydown=${this._handleKeyDown}
912
+ />
913
+ ${b.renderSuffix()}
914
+ ${b.renderCopyIcon(this.withCopy,this.disabled,this.readonly,()=>this._onCopy(),t=>this._handleIconKeydown(t))}
915
+ ${b.renderClearIcon(this.allowClear,this.value,this.disabled,this.readonly,()=>this._onClear(),t=>this._handleIconKeydown(t))}
916
+ ${r.hasValidationFeedback?this.renderValidationIcon():b.renderStateIcon(this.state)}
917
+ ${b.renderCalendarIcon(this.state,this.type)}
918
+ ${b.renderPasswordIcon(this.type,this.inputType,this.disabled,this.readonly,()=>this._togglePasswordIcon(),t=>this._handleIconKeydown(t))}
919
+ ${b.renderNumberIcons(this.type,this.state,this.disabled,this.readonly,()=>this._increment(),()=>this._decrement(),t=>this._handleIconKeydown(t))}
920
+ </div>
921
+ ${b.renderAddonAfter(this.hasAddonAfter,t=>this._handleSlotChange(t))}
922
+ </div>
923
+ <slot name="helper-text"></slot>
924
+ ${this.renderValidationMessage()}
925
+ ${this.showCount?i`
926
+ <div class="character-count" part="character-count" ?data-over-limit=${this.isOverCharacterLimit}>
927
+ ${this.characterCountDisplay}
928
+ </div>
929
+ `:""}
930
+ `}};C.styles=l,N([e({type:Boolean,reflect:!0})],C.prototype,"disabled",void 0),N([e({type:Boolean,reflect:!0})],C.prototype,"readonly",void 0),N([e({type:String,reflect:!0})],C.prototype,"state",void 0),N([e({type:String,reflect:!0})],C.prototype,"value",void 0),N([e({type:String})],C.prototype,"size",void 0),N([e({type:String,reflect:!0})],C.prototype,"variant",void 0),N([e({reflect:!0})],C.prototype,"type",void 0),N([e({type:String})],C.prototype,"step",void 0),N([e({type:String})],C.prototype,"min",void 0),N([e({type:String})],C.prototype,"max",void 0),N([e({type:String})],C.prototype,"placeholder",void 0),N([e({type:String})],C.prototype,"autocomplete",void 0),N([e({type:String})],C.prototype,"name",void 0),N([e({type:Boolean})],C.prototype,"required",void 0),N([e({type:Boolean,reflect:!0})],C.prototype,"withCopy",void 0),N([e({type:Boolean,reflect:!0})],C.prototype,"allowClear",void 0),N([e({type:Boolean,reflect:!0})],C.prototype,"showCount",void 0),N([e({type:Number})],C.prototype,"maxLength",void 0),N([e({type:Array})],C.prototype,"rules",void 0),N([e({type:Boolean,attribute:"validate-on-change"})],C.prototype,"validateOnChangeInput",void 0),N([e({type:Boolean,attribute:"validate-on-blur"})],C.prototype,"validateOnBlurInput",void 0),N([e({type:Boolean,attribute:"has-feedback"})],C.prototype,"hasFeedback",void 0),N([e({type:Boolean,attribute:"allow-warnings"})],C.prototype,"allowWarnings",void 0),N([e({type:String,attribute:"validation-trigger"})],C.prototype,"validationTrigger",void 0),N([e({type:Number,attribute:"validation-debounce"})],C.prototype,"validationDebounce",void 0),N([e({type:String})],C.prototype,"label",void 0),N([e({type:Number})],C.prototype,"debounce",void 0),N([a()],C.prototype,"validationMessage",void 0),N([a()],C.prototype,"inputType",void 0),N([a()],C.prototype,"hasAddonBefore",void 0),N([a()],C.prototype,"hasAddonAfter",void 0),N([a()],C.prototype,"focused",void 0),C=N([o("nr-input")],C);var I=Object.freeze({__proto__:null,PORT:/^(?:[1-9]\d{0,4}|[1-5]\d{5}|6[0-4]\d{4}|65[0-4]\d{3}|655[0-2]\d{2}|6553[0-5])$/,NOT_EMPTY:/^.+$/});export{C as NrInputElement,I as Validations};