@nuralyui/iconpicker 0.0.1 → 0.0.2

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
@@ -76,9 +76,7 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
76
76
  }
77
77
 
78
78
  .dropdown__panel {
79
- position: absolute;
80
- top: 100%;
81
- left: 0;
79
+ position: fixed;
82
80
  z-index: var(--nuraly-dropdown-z-index, 9999);
83
81
  background: var(--nuraly-color-dropdown-background, #ffffff);
84
82
  border: var(--nuraly-dropdown-border-width, 1px) solid var(--nuraly-color-dropdown-border, #e0e0e0);
@@ -88,40 +86,47 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
88
86
  max-width: var(--nuraly-dropdown-max-width, 20rem);
89
87
  max-height: var(--nuraly-dropdown-max-height, 200px);
90
88
  overflow: auto;
89
+ /* Use display none to fully hide when closed */
90
+ display: none;
91
91
  /* Use opacity and visibility for smooth animations */
92
92
  opacity: 0;
93
93
  visibility: hidden;
94
94
  transform: translateY(-8px);
95
- transition: all var(--nuraly-dropdown-animation-duration, 0.15s) var(--nuraly-dropdown-animation-timing, ease);
95
+ transition: opacity var(--nuraly-dropdown-animation-duration, 0.15s) var(--nuraly-dropdown-animation-timing, ease),
96
+ visibility var(--nuraly-dropdown-animation-duration, 0.15s) var(--nuraly-dropdown-animation-timing, ease),
97
+ transform var(--nuraly-dropdown-animation-duration, 0.15s) var(--nuraly-dropdown-animation-timing, ease);
96
98
  /* Ensure proper containment */
97
99
  box-sizing: border-box;
98
100
  /* Create new stacking context to prevent layering issues */
99
101
  isolation: isolate;
100
102
  /* Force above other elements */
101
103
  transform-origin: top center;
104
+ /* Prevent clipping by overflow containers */
105
+ pointer-events: none;
102
106
  }
103
107
 
104
108
  .dropdown__panel--open {
109
+ display: block;
105
110
  opacity: 1;
106
111
  visibility: visible;
107
112
  transform: translateY(0);
113
+ pointer-events: auto;
108
114
  }
109
115
 
110
116
  /* Alternative attribute-based selector (like select component) */
111
117
  :host([open]) .dropdown__panel {
118
+ display: block;
112
119
  opacity: 1;
113
120
  visibility: visible;
114
121
  transform: translateY(0);
122
+ pointer-events: auto;
115
123
  }
116
124
 
117
- /* Placement variants */
125
+ /* Placement variants - transform origin adjustments */
118
126
  .dropdown__panel--top,
119
127
  .dropdown__panel--top-start,
120
128
  .dropdown__panel--top-end {
121
- top: auto;
122
- bottom: 100%;
123
- margin-bottom: 1px;
124
- margin-top: 0;
129
+ transform-origin: bottom center;
125
130
  transform: translateY(8px);
126
131
  }
127
132
 
@@ -131,27 +136,10 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
131
136
  transform: translateY(0);
132
137
  }
133
138
 
134
- .dropdown__panel--bottom-end,
135
- .dropdown__panel--top-end {
136
- left: auto;
137
- right: 0;
138
- }
139
-
139
+ .dropdown__panel--bottom,
140
140
  .dropdown__panel--bottom-start,
141
- .dropdown__panel--top-start {
142
- left: 0;
143
- right: auto;
144
- }
145
-
146
- /* Horizontal alignment for viewport edge handling */
147
- .dropdown__panel--right-aligned {
148
- left: auto;
149
- right: 0;
150
- }
151
-
152
- .dropdown__panel--left-aligned {
153
- left: 0;
154
- right: auto;
141
+ .dropdown__panel--bottom-end {
142
+ transform-origin: top center;
155
143
  }
156
144
 
157
145
  /* Size variants */
@@ -511,19 +499,19 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
511
499
  display: none !important;
512
500
  }
513
501
 
514
- `;class O{constructor(a){this._host=a,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdate(){}hostUpdated(){}requestUpdate(){this._host.requestUpdate()}dispatchEvent(a){return this._host.dispatchEvent(a)}handleError(a,t){console.error(`Dropdown Controller Error in ${t}:`,a)}findElement(a){var t;return null===(t=this._host.shadowRoot)||void 0===t?void 0:t.querySelector(a)}findElements(a){var t;return null===(t=this._host.shadowRoot)||void 0===t?void 0:t.querySelectorAll(a)}}class Z extends O{constructor(a){super(a),this._isOpen=!1,this._position={top:0,left:0,width:0,placement:"bottom"},this._triggerElement=null,this._dropdownElement=null,this._outsideClickHandler=null,this._keydownHandler=null,this._hoverTimer=null,this._triggerClickHandler=null,this._triggerHoverHandler=null,this._triggerLeaveHandler=null,this._triggerFocusHandler=null,this._triggerBlurHandler=null,this._scrollHandler=null,this._resizeHandler=null,this._isOpen=a.open}get isOpen(){return this._isOpen}get position(){return Object.assign({},this._position)}hostConnected(){}hostUpdated(){this._isOpen!==this.host.open&&(this._isOpen=this.host.open),this._triggerElement||this.setupTriggerListeners()}hostDisconnected(){this.cleanup()}open(){try{this._isOpen||this.host.disabled||(this._isOpen=!0,this.host.open=!0,this.requestUpdate(),setTimeout(()=>{this.calculatePosition(),this.setupEventListeners()},10),this.dispatchEvent(new CustomEvent("nr-dropdown-open",{bubbles:!0,composed:!0,detail:{dropdown:this.host}})))}catch(a){this.handleError(a,"open")}}close(){try{this._isOpen&&(this.removeEventListeners(),this._isOpen=!1,this.host.open=!1,this.requestUpdate(),this.dispatchEvent(new CustomEvent("nr-dropdown-close",{bubbles:!0,composed:!0,detail:{dropdown:this.host}})))}catch(a){this.handleError(a,"close")}}toggle(){try{this._isOpen?this.close():this.open()}catch(a){this.handleError(a,"toggle")}}removeTriggerListeners(){this._triggerElement&&(this._triggerClickHandler&&(this._triggerElement.removeEventListener("click",this._triggerClickHandler),this._triggerClickHandler=null),this._triggerHoverHandler&&(this._triggerElement.removeEventListener("mouseenter",this._triggerHoverHandler),this._triggerHoverHandler=null),this._triggerLeaveHandler&&(this._triggerElement.removeEventListener("mouseleave",this._triggerLeaveHandler),this._triggerLeaveHandler=null),this._triggerFocusHandler&&(this._triggerElement.removeEventListener("focusin",this._triggerFocusHandler),this._triggerFocusHandler=null),this._triggerBlurHandler&&(this._triggerElement.removeEventListener("focusout",this._triggerBlurHandler),this._triggerBlurHandler=null))}findDropdownElements(){this._dropdownElement=this.findElement(".dropdown__panel"),this._triggerElement=this.findElement(".dropdown__trigger")}setupTriggerListeners(){if(this.findDropdownElements(),this._triggerElement)switch(this.removeTriggerListeners(),this.host.trigger){case"click":this._triggerClickHandler=this.handleTriggerClick.bind(this),this._triggerElement.addEventListener("click",this._triggerClickHandler);break;case"hover":this._triggerHoverHandler=this.handleTriggerHover.bind(this),this._triggerLeaveHandler=this.handleTriggerLeave.bind(this),this._triggerElement.addEventListener("mouseenter",this._triggerHoverHandler),this._triggerElement.addEventListener("mouseleave",this._triggerLeaveHandler);break;case"focus":this._triggerFocusHandler=this.handleTriggerFocus.bind(this),this._triggerBlurHandler=this.handleTriggerBlur.bind(this),this._triggerElement.addEventListener("focusin",this._triggerFocusHandler),this._triggerElement.addEventListener("focusout",this._triggerBlurHandler)}}setupEventListeners(){this.host.closeOnOutsideClick&&(this._outsideClickHandler=this.handleOutsideClick.bind(this),document.addEventListener("click",this._outsideClickHandler,!0)),this.host.closeOnEscape&&(this._keydownHandler=this.handleKeydown.bind(this),document.addEventListener("keydown",this._keydownHandler)),this._scrollHandler=this.handleScroll.bind(this),this._resizeHandler=this.handleResize.bind(this),window.addEventListener("scroll",this._scrollHandler,!0),window.addEventListener("resize",this._resizeHandler)}removeEventListeners(){this._outsideClickHandler&&(document.removeEventListener("click",this._outsideClickHandler,!0),this._outsideClickHandler=null),this._keydownHandler&&(document.removeEventListener("keydown",this._keydownHandler),this._keydownHandler=null),this._scrollHandler&&(window.removeEventListener("scroll",this._scrollHandler,!0),this._scrollHandler=null),this._resizeHandler&&(window.removeEventListener("resize",this._resizeHandler),this._resizeHandler=null)}handleTriggerClick(){this.host.disabled||this.toggle()}handleTriggerHover(){this.host.disabled||(this._hoverTimer&&clearTimeout(this._hoverTimer),this._hoverTimer=window.setTimeout(()=>{this.open()},this.host.delay))}handleTriggerLeave(){this._hoverTimer&&(clearTimeout(this._hoverTimer),this._hoverTimer=null),setTimeout(()=>{this.isHoveringDropdown()||this.close()},100)}handleTriggerFocus(){this.host.disabled||this.open()}handleTriggerBlur(){setTimeout(()=>{this.isDropdownFocused()||this.close()},100)}handleOutsideClick(a){var t,h,e,r;if(!this.host.closeOnOutsideClick)return;const i=a.target;if(null===(t=this._triggerElement)||void 0===t?void 0:t.contains(i))return;if(null===(h=this._dropdownElement)||void 0===h?void 0:h.contains(i))return;const d=a.composedPath();for(const a of d){if(a===this._dropdownElement)return;if(a instanceof Element&&(null===(e=this._dropdownElement)||void 0===e?void 0:e.contains(a)))return}let o=i;for(;o;){const a=o.getRootNode();if(!(a instanceof ShadowRoot&&a.host))break;if(null===(r=this._dropdownElement)||void 0===r?void 0:r.contains(a.host))return;o=a.host}this.close()}handleKeydown(a){"Escape"===a.key&&this.close()}handleScroll(){this._isOpen&&this.calculatePosition()}handleResize(){this._isOpen&&this.calculatePosition()}calculatePosition(){var a,t;try{if(this._dropdownElement&&this._triggerElement||this.findDropdownElements(),!this._dropdownElement||!this._triggerElement)return;const h=this._triggerElement.getBoundingClientRect(),e=this._dropdownElement.getBoundingClientRect(),r=(null===(a=window.visualViewport)||void 0===a?void 0:a.height)||window.innerHeight,i=(null===(t=window.visualViewport)||void 0===t?void 0:t.width)||window.innerWidth,d=r-h.bottom,o=h.top,p=i-h.right,n=h.left,l=200,c=e.width||300,s=this.determineOptimalPlacement(l,o,d),M=this.determineHorizontalPlacement(c,n,p);this.applyPlacement(s,M)}catch(a){this.handleError(a,"calculatePosition")}}determineOptimalPlacement(a,t,h){return h>=a?"bottom":t>=a||t>h?"top":"bottom"}determineHorizontalPlacement(a,t,h){const e=this.host.placement;if(e.includes("left")||e.includes("right")){if(e.includes("left")&&t>=a)return"left";if(e.includes("right")&&h>=a)return"right"}return h>=a?"right":t>=a?"left":h>t?"right":"left"}applyPlacement(a,t){this._dropdownElement&&(this._dropdownElement.classList.remove("dropdown__panel--top","dropdown__panel--bottom","dropdown__panel--left-aligned","dropdown__panel--right-aligned"),this._dropdownElement.classList.add(`dropdown__panel--${a}`),"left"===t?this._dropdownElement.classList.add("dropdown__panel--right-aligned"):"right"===t&&this._dropdownElement.classList.add("dropdown__panel--left-aligned"),this._position.placement=a)}isHoveringDropdown(){var a;return(null===(a=this._dropdownElement)||void 0===a?void 0:a.matches(":hover"))||!1}isDropdownFocused(){var a;const t=document.activeElement;if(!t)return!1;if(null===(a=this._dropdownElement)||void 0===a?void 0:a.contains(t))return!0;if(t.closest(".dropdown__custom-content"))return!0;if(["INPUT","BUTTON","TEXTAREA","SELECT","A"].includes(t.tagName)){if(t.closest(".dropdown__panel"))return!0}return!1}handleItemClick(a){this.dispatchEvent(new CustomEvent("nr-dropdown-item-click",{bubbles:!0,composed:!0,detail:{item:a,dropdown:this.host}})),this.host.autoClose&&this.close()}cleanup(){this.removeEventListeners(),this.removeTriggerListeners(),this._hoverTimer&&(clearTimeout(this._hoverTimer),this._hoverTimer=null)}}
502
+ `;class O{constructor(a){this._host=a,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdate(){}hostUpdated(){}requestUpdate(){this._host.requestUpdate()}dispatchEvent(a){return this._host.dispatchEvent(a)}handleError(a,t){console.error(`Dropdown Controller Error in ${t}:`,a)}findElement(a){var t;return null===(t=this._host.shadowRoot)||void 0===t?void 0:t.querySelector(a)}findElements(a){var t;return null===(t=this._host.shadowRoot)||void 0===t?void 0:t.querySelectorAll(a)}}class Z extends O{constructor(a){super(a),this._isOpen=!1,this._position={top:0,left:0,width:0,placement:"bottom"},this._triggerElement=null,this._dropdownElement=null,this._outsideClickHandler=null,this._keydownHandler=null,this._hoverTimer=null,this._triggerClickHandler=null,this._triggerHoverHandler=null,this._triggerLeaveHandler=null,this._triggerFocusHandler=null,this._triggerBlurHandler=null,this._scrollHandler=null,this._resizeHandler=null,this._isOpen=a.open}get isOpen(){return this._isOpen}get position(){return Object.assign({},this._position)}hostConnected(){}hostUpdated(){this._isOpen!==this.host.open&&(this._isOpen=this.host.open),this._triggerElement||this.setupTriggerListeners()}hostDisconnected(){this.cleanup()}open(){try{this._isOpen||this.host.disabled||(this._isOpen=!0,this.host.open=!0,this.requestUpdate(),setTimeout(()=>{this.calculatePosition(),this.setupEventListeners()},10),this.dispatchEvent(new CustomEvent("nr-dropdown-open",{bubbles:!0,composed:!0,detail:{dropdown:this.host}})))}catch(a){this.handleError(a,"open")}}close(){try{this._isOpen&&(this.removeEventListeners(),this._isOpen=!1,this.host.open=!1,this.requestUpdate(),this.dispatchEvent(new CustomEvent("nr-dropdown-close",{bubbles:!0,composed:!0,detail:{dropdown:this.host}})))}catch(a){this.handleError(a,"close")}}toggle(){try{this._isOpen?this.close():this.open()}catch(a){this.handleError(a,"toggle")}}removeTriggerListeners(){this._triggerElement&&(this._triggerClickHandler&&(this._triggerElement.removeEventListener("click",this._triggerClickHandler),this._triggerClickHandler=null),this._triggerHoverHandler&&(this._triggerElement.removeEventListener("mouseenter",this._triggerHoverHandler),this._triggerHoverHandler=null),this._triggerLeaveHandler&&(this._triggerElement.removeEventListener("mouseleave",this._triggerLeaveHandler),this._triggerLeaveHandler=null),this._triggerFocusHandler&&(this._triggerElement.removeEventListener("focusin",this._triggerFocusHandler),this._triggerFocusHandler=null),this._triggerBlurHandler&&(this._triggerElement.removeEventListener("focusout",this._triggerBlurHandler),this._triggerBlurHandler=null))}findDropdownElements(){this._dropdownElement=this.findElement(".dropdown__panel"),this._triggerElement=this.findElement(".dropdown__trigger")}setupTriggerListeners(){if(this.findDropdownElements(),this._triggerElement)switch(this.removeTriggerListeners(),this.host.trigger){case"click":this._triggerClickHandler=this.handleTriggerClick.bind(this),this._triggerElement.addEventListener("click",this._triggerClickHandler);break;case"hover":this._triggerHoverHandler=this.handleTriggerHover.bind(this),this._triggerLeaveHandler=this.handleTriggerLeave.bind(this),this._triggerElement.addEventListener("mouseenter",this._triggerHoverHandler),this._triggerElement.addEventListener("mouseleave",this._triggerLeaveHandler);break;case"focus":this._triggerFocusHandler=this.handleTriggerFocus.bind(this),this._triggerBlurHandler=this.handleTriggerBlur.bind(this),this._triggerElement.addEventListener("focusin",this._triggerFocusHandler),this._triggerElement.addEventListener("focusout",this._triggerBlurHandler)}}setupEventListeners(){this.host.closeOnOutsideClick&&(this._outsideClickHandler=this.handleOutsideClick.bind(this),document.addEventListener("click",this._outsideClickHandler,!0)),this.host.closeOnEscape&&(this._keydownHandler=this.handleKeydown.bind(this),document.addEventListener("keydown",this._keydownHandler)),this._scrollHandler=this.handleScroll.bind(this),this._resizeHandler=this.handleResize.bind(this),window.addEventListener("scroll",this._scrollHandler,!0),window.addEventListener("resize",this._resizeHandler)}removeEventListeners(){this._outsideClickHandler&&(document.removeEventListener("click",this._outsideClickHandler,!0),this._outsideClickHandler=null),this._keydownHandler&&(document.removeEventListener("keydown",this._keydownHandler),this._keydownHandler=null),this._scrollHandler&&(window.removeEventListener("scroll",this._scrollHandler,!0),this._scrollHandler=null),this._resizeHandler&&(window.removeEventListener("resize",this._resizeHandler),this._resizeHandler=null)}handleTriggerClick(){this.host.disabled||this.toggle()}handleTriggerHover(){this.host.disabled||(this._hoverTimer&&clearTimeout(this._hoverTimer),this._hoverTimer=window.setTimeout(()=>{this.open()},this.host.delay))}handleTriggerLeave(){this._hoverTimer&&(clearTimeout(this._hoverTimer),this._hoverTimer=null),setTimeout(()=>{this.isHoveringDropdown()||this.close()},100)}handleTriggerFocus(){this.host.disabled||this.open()}handleTriggerBlur(){setTimeout(()=>{this.isDropdownFocused()||this.close()},100)}handleOutsideClick(a){var t,h,e,r;if(!this.host.closeOnOutsideClick)return;const i=a.target;if(null===(t=this._triggerElement)||void 0===t?void 0:t.contains(i))return;if(null===(h=this._dropdownElement)||void 0===h?void 0:h.contains(i))return;const d=a.composedPath();for(const a of d){if(a===this._dropdownElement)return;if(a instanceof Element&&(null===(e=this._dropdownElement)||void 0===e?void 0:e.contains(a)))return}let o=i;for(;o;){const a=o.getRootNode();if(!(a instanceof ShadowRoot&&a.host))break;if(null===(r=this._dropdownElement)||void 0===r?void 0:r.contains(a.host))return;o=a.host}this.close()}handleKeydown(a){"Escape"===a.key&&this.close()}handleScroll(){this._isOpen&&this.calculatePosition()}handleResize(){this._isOpen&&this.calculatePosition()}calculatePosition(){var a,t;try{if(this._dropdownElement&&this._triggerElement||this.findDropdownElements(),!this._dropdownElement||!this._triggerElement)return;const h=this._triggerElement.getBoundingClientRect(),e=this._dropdownElement.getBoundingClientRect(),r=(null===(a=window.visualViewport)||void 0===a?void 0:a.height)||window.innerHeight,i=(null===(t=window.visualViewport)||void 0===t?void 0:t.width)||window.innerWidth,d=r-h.bottom,o=h.top,p=i-h.right,n=h.left,l=e.height||200,c=e.width||300,s=this.determineOptimalPlacement(l,o,d),M=this.determineHorizontalPlacement(c,n,p);let u,v;u="bottom"===s?h.bottom+this.host.offset:h.top-l-this.host.offset,v="left"===M?h.right-c:h.left,v=Math.max(8,Math.min(v,i-c-8)),u=Math.max(8,Math.min(u,r-l-8)),this._dropdownElement.style.top=`${u}px`,this._dropdownElement.style.left=`${v}px`,this.applyPlacement(s,M)}catch(a){this.handleError(a,"calculatePosition")}}determineOptimalPlacement(a,t,h){return h>=a?"bottom":t>=a||t>h?"top":"bottom"}determineHorizontalPlacement(a,t,h){const e=this.host.placement;if(e.includes("left")||e.includes("right")){if(e.includes("left")&&t>=a)return"left";if(e.includes("right")&&h>=a)return"right"}return h>=a?"right":t>=a?"left":h>t?"right":"left"}applyPlacement(a,t){this._dropdownElement&&(this._dropdownElement.classList.remove("dropdown__panel--top","dropdown__panel--bottom","dropdown__panel--left-aligned","dropdown__panel--right-aligned"),this._dropdownElement.classList.add(`dropdown__panel--${a}`),"left"===t?this._dropdownElement.classList.add("dropdown__panel--right-aligned"):"right"===t&&this._dropdownElement.classList.add("dropdown__panel--left-aligned"),this._position.placement=a)}isHoveringDropdown(){var a;return(null===(a=this._dropdownElement)||void 0===a?void 0:a.matches(":hover"))||!1}isDropdownFocused(){var a;const t=document.activeElement;if(!t)return!1;if(null===(a=this._dropdownElement)||void 0===a?void 0:a.contains(t))return!0;if(t.closest(".dropdown__custom-content"))return!0;if(["INPUT","BUTTON","TEXTAREA","SELECT","A"].includes(t.tagName)){if(t.closest(".dropdown__panel"))return!0}return!1}handleItemClick(a,t){this.dispatchEvent(new CustomEvent("nr-dropdown-item-click",{bubbles:!0,composed:!0,detail:{item:a,dropdown:this.host,originalEvent:t}})),this.host.autoClose&&this.close()}cleanup(){this.removeEventListeners(),this.removeTriggerListeners(),this._hoverTimer&&(clearTimeout(this._hoverTimer),this._hoverTimer=null)}}
515
503
  /**
516
504
  * @license
517
505
  * Copyright 2023 Nuraly, Laabidi Aymen
518
506
  * SPDX-License-Identifier: MIT
519
- */var U=function(a,t,h,e){for(var r,i=arguments.length,d=i<3?t:null===e?e=Object.getOwnPropertyDescriptor(t,h):e,o=a.length-1;o>=0;o--)(r=a[o])&&(d=(i<3?r(d):i>3?r(t,h,d):r(t,h))||d);return i>3&&d&&Object.defineProperty(t,h,d),d};let N=class extends(l(h)){constructor(){super(...arguments),this.requiredComponents=["nr-icon"],this.items=[],this.open=!1,this.placement="bottom",this.trigger="hover",this.size="medium",this.animation="fade",this.disabled=!1,this.arrow=!1,this.autoClose=!1,this.closeOnOutsideClick=!0,this.closeOnEscape=!0,this.offset=4,this.delay=50,this.maxHeight="300px",this.minWidth="auto",this.cascadeDirection="auto",this.cascadeDelay=50,this.cascadeOnHover=!0,this.dropdownController=new Z(this),this.openSubmenus=new Set,this.submenuTimers=new Map,this.handleDropdownPanelClick=a=>{a.stopPropagation()},this.handleItemClick=a=>{a.disabled||(a.options&&a.options.length>0||a.customContent?this.toggleSubmenu(a.id):this.dropdownController.handleItemClick(a))},this.handleItemHover=a=>{var t;if(((null===(t=a.options)||void 0===t?void 0:t.length)||a.customContent)&&(this.clearSubmenuTimer(a.id),this.cascadeOnHover)){const t=window.setTimeout(()=>{this.showSubmenu(a.id)},this.cascadeDelay);this.submenuTimers.set(a.id,t)}},this.handleItemLeave=a=>{var t;if(!(null===(t=a.options)||void 0===t?void 0:t.length)&&!a.customContent)return;this.clearSubmenuTimer(a.id);const h=window.setTimeout(()=>{this.hideSubmenu(a.id)},100);this.submenuTimers.set(`hide-${a.id}`,h)},this.handleSubmenuEnter=a=>{this.clearSubmenuTimer(`hide-${a}`)},this.handleSubmenuLeave=a=>{const t=window.setTimeout(()=>{this.hideSubmenu(a)},100);this.submenuTimers.set(`hide-${a}`,t)}}connectedCallback(){super.connectedCallback(),this.updateCascadingAttribute()}updated(a){super.updated(a),a.has("items")&&this.updateCascadingAttribute()}disconnectedCallback(){super.disconnectedCallback()}firstUpdated(){}updateCascadingAttribute(){this.items.some(a=>a.options&&a.options.length>0||!!a.customContent)?this.setAttribute("has-cascading",""):this.removeAttribute("has-cascading")}clearSubmenuTimer(a){const t=this.submenuTimers.get(a);t&&(clearTimeout(t),this.submenuTimers.delete(a))}toggleSubmenu(a){this.openSubmenus.has(a)?this.hideSubmenu(a):this.showSubmenu(a)}showSubmenu(a){this.openSubmenus.add(a),this.requestUpdate()}hideSubmenu(a){this.openSubmenus.delete(a),this.requestUpdate()}show(){this.dropdownController.open()}hide(){this.dropdownController.close()}toggle(){this.dropdownController.toggle()}renderItems(){return this.items.length?t`
507
+ */var U=function(a,t,h,e){for(var r,i=arguments.length,d=i<3?t:null===e?e=Object.getOwnPropertyDescriptor(t,h):e,o=a.length-1;o>=0;o--)(r=a[o])&&(d=(i<3?r(d):i>3?r(t,h,d):r(t,h))||d);return i>3&&d&&Object.defineProperty(t,h,d),d};let N=class extends(l(h)){constructor(){super(...arguments),this.requiredComponents=["nr-icon"],this.items=[],this.open=!1,this.placement="bottom",this.trigger="hover",this.size="medium",this.animation="fade",this.disabled=!1,this.arrow=!1,this.autoClose=!1,this.closeOnOutsideClick=!0,this.closeOnEscape=!0,this.offset=4,this.delay=50,this.maxHeight="300px",this.minWidth="auto",this.cascadeDirection="auto",this.cascadeDelay=50,this.cascadeOnHover=!0,this.dropdownController=new Z(this),this.openSubmenus=new Set,this.submenuTimers=new Map,this.handleDropdownPanelClick=a=>{a.stopPropagation()},this.handleItemClick=(a,t)=>{a.disabled||(a.options&&a.options.length>0||a.customContent?this.toggleSubmenu(a.id):this.dropdownController.handleItemClick(a,t))},this.handleItemHover=a=>{var t;if(((null===(t=a.options)||void 0===t?void 0:t.length)||a.customContent)&&(this.clearSubmenuTimer(a.id),this.cascadeOnHover)){const t=window.setTimeout(()=>{this.showSubmenu(a.id)},this.cascadeDelay);this.submenuTimers.set(a.id,t)}},this.handleItemLeave=a=>{var t;if(!(null===(t=a.options)||void 0===t?void 0:t.length)&&!a.customContent)return;this.clearSubmenuTimer(a.id);const h=window.setTimeout(()=>{this.hideSubmenu(a.id)},100);this.submenuTimers.set(`hide-${a.id}`,h)},this.handleSubmenuEnter=a=>{this.clearSubmenuTimer(`hide-${a}`)},this.handleSubmenuLeave=a=>{const t=window.setTimeout(()=>{this.hideSubmenu(a)},100);this.submenuTimers.set(`hide-${a}`,t)}}connectedCallback(){super.connectedCallback(),this.updateCascadingAttribute()}updated(a){super.updated(a),a.has("items")&&this.updateCascadingAttribute()}disconnectedCallback(){super.disconnectedCallback()}firstUpdated(){}updateCascadingAttribute(){this.items.some(a=>a.options&&a.options.length>0||!!a.customContent)?this.setAttribute("has-cascading",""):this.removeAttribute("has-cascading")}clearSubmenuTimer(a){const t=this.submenuTimers.get(a);t&&(clearTimeout(t),this.submenuTimers.delete(a))}toggleSubmenu(a){this.openSubmenus.has(a)?this.hideSubmenu(a):this.showSubmenu(a)}showSubmenu(a){this.openSubmenus.add(a),this.requestUpdate()}hideSubmenu(a){this.openSubmenus.delete(a),this.requestUpdate()}show(){this.dropdownController.open()}hide(){this.dropdownController.close()}toggle(){this.dropdownController.toggle()}renderItems(){return this.items.length?t`
520
508
  <div class="dropdown__items">
521
509
  ${this.items.map(a=>{if(a.divider)return t`<div class="dropdown__divider"></div>`;const h=!!(a.options&&a.options.length>0)||!!a.customContent,e=h&&this.openSubmenus.has(a.id);return t`
522
510
  <div class="dropdown__item-container ${n({"dropdown__item-container--has-submenu":h})}">
523
511
  <button
524
512
  class="dropdown__item ${n({"dropdown__item--disabled":!!a.disabled,"dropdown__item--has-submenu":h})}"
525
513
  ?disabled="${a.disabled}"
526
- @click="${()=>this.handleItemClick(a)}"
514
+ @click="${t=>this.handleItemClick(a,t)}"
527
515
  @mouseenter="${()=>h&&this.handleItemHover(a)}"
528
516
  @mouseleave="${()=>h&&this.handleItemLeave(a)}"
529
517
  >
@@ -546,7 +534,7 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
546
534
  <button
547
535
  class="dropdown__item ${n({"dropdown__item--disabled":!!a.disabled})}"
548
536
  ?disabled="${a.disabled}"
549
- @click="${()=>this.handleItemClick(a)}"
537
+ @click="${t=>this.handleItemClick(a,t)}"
550
538
  >
551
539
  ${a.icon?t`<nr-icon name="${a.icon}" class="dropdown__item-icon"></nr-icon>`:r}
552
540
  <span class="dropdown__item-label">${a.label}</span>
@@ -901,7 +889,8 @@ customElements.define("lit-virtualizer",q);class D{_getDefaultConfig(){return{di
901
889
  }
902
890
 
903
891
  :host([variant='outlined']:not([state='error'])) #input-container:focus-within {
904
- border: var(--nuraly-input-outlined-focus-border, var(--nuraly-outlined-focus-border, 2px solid #3b82f6));
892
+ border-color: var(--nuraly-color-input-border-focus, #3b82f6);
893
+ box-shadow: var(--nuraly-shadow-input-focus, 0 0 0 1px #3b82f6);
905
894
  }
906
895
 
907
896
  /*
@@ -1444,7 +1433,7 @@ class ia{constructor(a){this._host=a,this._host.addController(this)}get host(){r
1444
1433
  * @license
1445
1434
  * Copyright 2023 Nuraly, Laabidi Aymen
1446
1435
  * SPDX-License-Identifier: MIT
1447
- */var pa=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};class na extends ia{get validationHost(){return this._host}constructor(a){super(a),this.stateController=new oa(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 a=[],t=this.validationHost;"email"===t.type&&a.push(X()),"url"===t.type&&a.push(K()),t.required&&a.push(W(t.label?`${t.label} is required`:void 0)),t.maxLength&&a.push(Y(t.maxLength)),"number"===t.type&&(void 0!==t.min&&a.push(J(Number(t.min))),void 0!==t.max&&a.push(Q(Number(t.max))));const h=t.rules||[],e=[...a.filter(a=>!h.some(t=>this.isSameRuleType(a,t))),...h];JSON.stringify(t.rules)!==JSON.stringify(e)&&(t.rules=e,this.requestUpdate())}validate(){try{this.stateController.setValidationState(da.Pending),this.stateController.setValidating(!0),this.dispatchValidationEvent();if(this.hasAsyncValidators())return this.performAsyncValidation(this.validationHost.value),!0;const a=this.performDetailedValidation(this.validationHost.value);return this.stateController.setValidationResult(a),a.hasError?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):a.hasWarning&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):this.setValidationResult(!0,"",da.Valid),this.stateController.setValidating(!1),this.updateHostValidationState(),a.isValid}catch(a){return this.handleError(a,"validate"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Validation error occurred",da.Invalid),this.updateHostValidationState(),!1}}validateOnChange(){this.stateController.shouldValidateOnChange()&&this.stateController.debounceValidation(()=>{this.validate()})}validateOnBlur(){this.stateController.shouldValidateOnBlur()&&(this.stateController.clearDebounceTimer(),this.validate())}addRule(a){const t=this.validationHost.rules||[];this.validationHost.rules=[...t,a],this.requestUpdate()}removeRule(a){const t=this.validationHost.rules||[];this.validationHost.rules=t.filter(t=>!a(t)),this.requestUpdate()}clearRules(){this.validationHost.rules=[],this.reset()}hasAsyncValidators(){return(this.validationHost.rules||[]).some(a=>a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))}isValidatorAsync(a){const t=a.toString();return t.includes("Promise")||t.includes("async")||t.includes("setTimeout")||t.includes("new Promise")}performAsyncValidation(a){return pa(this,void 0,void 0,function*(){try{this.stateController.setValidating(!0),this.updateHostValidationState();const t=[],h=[],e=this.validationHost.rules||[];for(const r of e)if(!(r.asyncValidator||r.validator&&this.isValidatorAsync(r.validator))){const e=this.validateRule(r,a);e.isValid||(r.warningOnly&&this.validationHost.allowWarnings?h.push(e.message):t.push(e.message))}if(t.length>0)return this.stateController.setValidationResult({isValid:!1,errors:t,warnings:h,hasError:!0,hasWarning:h.length>0,errorMessage:t[0],warningMessage:h[0]}),this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid),this.stateController.setValidating(!1),void this.updateHostValidationState();for(const r of e)if(r.asyncValidator||r.validator&&this.isValidatorAsync(r.validator))try{yield this.validateAsyncRule(r,a)}catch(a){const e=a.message||r.message||"Validation failed";r.warningOnly&&this.validationHost.allowWarnings?h.push(e):t.push(e)}const r=t.length>0,i=h.length>0;this.stateController.setValidationResult({isValid:!r,errors:t,warnings:h,hasError:r,hasWarning:i,errorMessage:t[0],warningMessage:h[0]}),r?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):i&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):this.setValidationResult(!0,"",da.Valid),this.stateController.setValidating(!1),this.updateHostValidationState()}catch(a){this.handleError(a,"performAsyncValidation"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Async validation error occurred",da.Invalid),this.updateHostValidationState()}})}validateAsyncRule(a,t){return pa(this,void 0,void 0,function*(){if(a.asyncValidator)yield a.asyncValidator(a,t);else if(a.validator){const h=a.validator(a,t);h&&"object"==typeof h&&"then"in h&&(yield h)}})}reset(){this.stateController.setValidationResult({isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1}),this.stateController.setValidationState(da.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(a){this.stateController.setValidationResult(a),a.hasError?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):a.hasWarning?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):a.isValid?this.setValidationResult(!0,"",da.Valid):this.setValidationResult(!0,"",da.Pristine),this.updateHostValidationState()}performDetailedValidation(a){const t=[],h=[],e=this.validationHost.rules||[];for(const r of e){const e=this.validateRule(r,a);e.isValid||(r.warningOnly&&this.validationHost.allowWarnings?h.push(e.message):t.push(e.message))}const r=t.length>0;return{isValid:!r,errors:t,warnings:h,hasError:r,hasWarning:h.length>0,errorMessage:t[0],warningMessage:h[0]}}validateRule(a,t){if(a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))return{isValid:!0,message:""};const h=a.transform?a.transform(t):t;if(a.required&&this.isValueEmpty(t))return{isValid:!1,message:a.message||`${this.validationHost.label||"This field"} is required`};if(this.isValueEmpty(t)&&!a.required)return{isValid:!0,message:""};if(a.type){const t=this.validateType(a.type,h);if(!t.isValid)return{isValid:!1,message:a.message||t.message}}if(a.pattern&&!a.pattern.test(h))return{isValid:!1,message:a.message||"Invalid format"};if(void 0!==a.minLength&&h.length<a.minLength)return{isValid:!1,message:a.message||`Minimum length is ${a.minLength} characters`};if(void 0!==a.maxLength&&h.length>a.maxLength)return{isValid:!1,message:a.message||`Maximum length is ${a.maxLength} characters`};if("number"===a.type||"number"===this.validationHost.type){const t=Number(h);if(void 0!==a.min&&t<a.min)return{isValid:!1,message:a.message||`Minimum value is ${a.min}`};if(void 0!==a.max&&t>a.max)return{isValid:!1,message:a.message||`Maximum value is ${a.max}`}}if(a.enum&&!a.enum.includes(h))return{isValid:!1,message:a.message||`Value must be one of: ${a.enum.join(", ")}`};if(a.validator)try{const t=a.validator(a,h);return t&&"object"==typeof t&&"isValid"in t?{isValid:t.isValid,message:t.isValid?"":t.message||a.message||"Validation failed"}:{isValid:!0,message:""}}catch(t){return{isValid:!1,message:a.message||t.message||"Validation failed"}}return{isValid:!0,message:""}}validateType(a,t){switch(a){case"email":return{isValid:j.EMAIL.test(t),message:"Please enter a valid email address"};case"url":return{isValid:j.URL.test(t),message:"Please enter a valid URL"};case"number":case"integer":return{isValid:!isNaN(Number(t))&&("number"===a||Number.isInteger(Number(t))),message:`Please enter a valid ${a}`};case"float":return{isValid:!isNaN(parseFloat(t)),message:"Please enter a valid number"};default:return{isValid:!0,message:""}}}isValueEmpty(a){return null==a||""===a}isSameRuleType(a,t){return a.type===t.type&&a.required===t.required&&!!a.pattern==!!t.pattern}setValidationResult(a,t,h){const e=this.stateController.isValid!==a||this.stateController.validationMessage!==t||this.stateController.validationState!==h;this.stateController.setValidationState(h),this.stateController.setValidationResult({isValid:a,errors:a?[]:[t],warnings:[],hasError:!a,hasWarning:!1,errorMessage:a?"":t,warningMessage:""}),e&&this.dispatchValidationEvent()}updateHostValidationState(){this.dispatchValidationEvent()}dispatchValidationEvent(){const a={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:a,bubbles:!0,composed:!0}))}getValidationClasses(){const a=this.host,t=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":t.hasFeedback||!1,touched:a.isTouched||!1,dirty:a.isDirty||!1,required:this.host.required||!1}}hasValidationFeedback(){const a=this.host;return!!a.hasFeedback&&(this.stateController.isValidating||this.stateController.validationResult.hasError||this.stateController.validationResult.hasWarning||this.stateController.validationResult.isValid&&a.value&&""!==a.value.trim()&&this.stateController.validationState!==da.Pristine)}renderValidationIcon(){const a=this.host;if(!a.hasFeedback)return"";let h="",e="";return this.stateController.isValidating?(h="hourglass-half",e="validation-loading"):this.stateController.validationResult.hasError?(h="exclamation-circle",e="validation-error"):this.stateController.validationResult.hasWarning?(h="exclamation-triangle",e="validation-warning"):this.stateController.validationResult.isValid&&a.value&&""!==a.value.trim()&&this.stateController.validationState!==da.Pristine&&(h="check-circle",e="validation-success"),h?t`
1436
+ */var pa=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};class na extends ia{constructor(a){super(a),this.stateController=new oa(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 a=[],t=this.validationHost;"email"===t.type&&a.push(X()),"url"===t.type&&a.push(K()),t.required&&a.push(W(t.label?`${t.label} is required`:void 0)),t.maxLength&&a.push(Y(t.maxLength)),"number"===t.type&&(void 0!==t.min&&a.push(J(Number(t.min))),void 0!==t.max&&a.push(Q(Number(t.max))));const h=t.rules||[],e=[...a.filter(a=>!h.some(t=>this.isSameRuleType(a,t))),...h];JSON.stringify(t.rules)!==JSON.stringify(e)&&(t.rules=e,this.requestUpdate())}validate(){try{this.stateController.setValidationState(da.Pending),this.stateController.setValidating(!0),this.dispatchValidationEvent();if(this.hasAsyncValidators())return this.performAsyncValidation(this.validationHost.value),!0;const a=this.performDetailedValidation(this.validationHost.value);return this.stateController.setValidationResult(a),a.hasError?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):a.hasWarning&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):this.setValidationResult(!0,"",da.Valid),this.stateController.setValidating(!1),this.updateHostValidationState(),a.isValid}catch(a){return this.handleError(a,"validate"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Validation error occurred",da.Invalid),this.updateHostValidationState(),!1}}validateOnChange(){this.stateController.shouldValidateOnChange()&&this.stateController.debounceValidation(()=>{this.validate()})}validateOnBlur(){this.stateController.shouldValidateOnBlur()&&(this.stateController.clearDebounceTimer(),this.validate())}addRule(a){const t=this.validationHost.rules||[];this.validationHost.rules=[...t,a],this.requestUpdate()}removeRule(a){const t=this.validationHost.rules||[];this.validationHost.rules=t.filter(t=>!a(t)),this.requestUpdate()}clearRules(){this.validationHost.rules=[],this.reset()}hasAsyncValidators(){return(this.validationHost.rules||[]).some(a=>a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))}isValidatorAsync(a){const t=a.toString();return t.includes("Promise")||t.includes("async")||t.includes("setTimeout")||t.includes("new Promise")}performAsyncValidation(a){return pa(this,void 0,void 0,function*(){try{this.stateController.setValidating(!0),this.updateHostValidationState();const t=[],h=[],e=this.validationHost.rules||[];for(const r of e)if(!(r.asyncValidator||r.validator&&this.isValidatorAsync(r.validator))){const e=this.validateRule(r,a);e.isValid||(r.warningOnly&&this.validationHost.allowWarnings?h.push(e.message):t.push(e.message))}if(t.length>0)return this.stateController.setValidationResult({isValid:!1,errors:t,warnings:h,hasError:!0,hasWarning:h.length>0,errorMessage:t[0],warningMessage:h[0]}),this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid),this.stateController.setValidating(!1),void this.updateHostValidationState();for(const r of e)if(r.asyncValidator||r.validator&&this.isValidatorAsync(r.validator))try{yield this.validateAsyncRule(r,a)}catch(a){const e=a.message||r.message||"Validation failed";r.warningOnly&&this.validationHost.allowWarnings?h.push(e):t.push(e)}const r=t.length>0,i=h.length>0;this.stateController.setValidationResult({isValid:!r,errors:t,warnings:h,hasError:r,hasWarning:i,errorMessage:t[0],warningMessage:h[0]}),r?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):i&&this.validationHost.allowWarnings?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):this.setValidationResult(!0,"",da.Valid),this.stateController.setValidating(!1),this.updateHostValidationState()}catch(a){this.handleError(a,"performAsyncValidation"),this.stateController.setValidating(!1),this.setValidationResult(!1,"Async validation error occurred",da.Invalid),this.updateHostValidationState()}})}validateAsyncRule(a,t){return pa(this,void 0,void 0,function*(){if(a.asyncValidator)yield a.asyncValidator(a,t);else if(a.validator){const h=a.validator(a,t);h&&"object"==typeof h&&"then"in h&&(yield h)}})}reset(){this.stateController.setValidationResult({isValid:!0,errors:[],warnings:[],hasError:!1,hasWarning:!1}),this.stateController.setValidationState(da.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(a){this.stateController.setValidationResult(a),a.hasError?this.setValidationResult(!1,this.stateController.validationMessage,da.Invalid):a.hasWarning?this.setValidationResult(!0,this.stateController.validationMessage,da.Warning):a.isValid?this.setValidationResult(!0,"",da.Valid):this.setValidationResult(!0,"",da.Pristine),this.updateHostValidationState()}performDetailedValidation(a){const t=[],h=[],e=this.validationHost.rules||[];for(const r of e){const e=this.validateRule(r,a);e.isValid||(r.warningOnly&&this.validationHost.allowWarnings?h.push(e.message):t.push(e.message))}const r=t.length>0;return{isValid:!r,errors:t,warnings:h,hasError:r,hasWarning:h.length>0,errorMessage:t[0],warningMessage:h[0]}}validateRule(a,t){if(a.asyncValidator||a.validator&&this.isValidatorAsync(a.validator))return{isValid:!0,message:""};const h=a.transform?a.transform(t):t;if(a.required&&this.isValueEmpty(t))return{isValid:!1,message:a.message||`${this.validationHost.label||"This field"} is required`};if(this.isValueEmpty(t)&&!a.required)return{isValid:!0,message:""};if(a.type){const t=this.validateType(a.type,h);if(!t.isValid)return{isValid:!1,message:a.message||t.message}}if(a.pattern&&!a.pattern.test(h))return{isValid:!1,message:a.message||"Invalid format"};if(void 0!==a.minLength&&h.length<a.minLength)return{isValid:!1,message:a.message||`Minimum length is ${a.minLength} characters`};if(void 0!==a.maxLength&&h.length>a.maxLength)return{isValid:!1,message:a.message||`Maximum length is ${a.maxLength} characters`};if("number"===a.type||"number"===this.validationHost.type){const t=Number(h);if(void 0!==a.min&&t<a.min)return{isValid:!1,message:a.message||`Minimum value is ${a.min}`};if(void 0!==a.max&&t>a.max)return{isValid:!1,message:a.message||`Maximum value is ${a.max}`}}if(a.enum&&!a.enum.includes(h))return{isValid:!1,message:a.message||`Value must be one of: ${a.enum.join(", ")}`};if(a.validator)try{const t=a.validator(a,h);return t&&"object"==typeof t&&"isValid"in t?{isValid:t.isValid,message:t.isValid?"":t.message||a.message||"Validation failed"}:{isValid:!0,message:""}}catch(t){return{isValid:!1,message:a.message||t.message||"Validation failed"}}return{isValid:!0,message:""}}validateType(a,t){switch(a){case"email":return{isValid:j.EMAIL.test(t),message:"Please enter a valid email address"};case"url":return{isValid:j.URL.test(t),message:"Please enter a valid URL"};case"number":case"integer":return{isValid:!isNaN(Number(t))&&("number"===a||Number.isInteger(Number(t))),message:`Please enter a valid ${a}`};case"float":return{isValid:!isNaN(parseFloat(t)),message:"Please enter a valid number"};default:return{isValid:!0,message:""}}}isValueEmpty(a){return null==a||""===a}isSameRuleType(a,t){return a.type===t.type&&a.required===t.required&&!!a.pattern==!!t.pattern}setValidationResult(a,t,h){const e=this.stateController.isValid!==a||this.stateController.validationMessage!==t||this.stateController.validationState!==h;this.stateController.setValidationState(h),this.stateController.setValidationResult({isValid:a,errors:a?[]:[t],warnings:[],hasError:!a,hasWarning:!1,errorMessage:a?"":t,warningMessage:""}),e&&this.dispatchValidationEvent()}updateHostValidationState(){this.dispatchValidationEvent()}dispatchValidationEvent(){const a={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:a,bubbles:!0,composed:!0}))}getValidationClasses(){const a=this.host,t=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":t.hasFeedback||!1,touched:a.isTouched||!1,dirty:a.isDirty||!1,required:this.host.required||!1}}hasValidationFeedback(){const a=this.host;return!!a.hasFeedback&&(this.stateController.isValidating||this.stateController.validationResult.hasError||this.stateController.validationResult.hasWarning||this.stateController.validationResult.isValid&&a.value&&""!==a.value.trim()&&this.stateController.validationState!==da.Pristine)}renderValidationIcon(){const a=this.host;if(!a.hasFeedback)return"";let h="",e="";return this.stateController.isValidating?(h="hourglass-half",e="validation-loading"):this.stateController.validationResult.hasError?(h="exclamation-circle",e="validation-error"):this.stateController.validationResult.hasWarning?(h="exclamation-triangle",e="validation-warning"):this.stateController.validationResult.isValid&&a.value&&""!==a.value.trim()&&this.stateController.validationState!==da.Pristine&&(h="check-circle",e="validation-success"),h?t`
1448
1437
  <nr-icon
1449
1438
  name="${h}"
1450
1439
  class="validation-icon ${e}"
@@ -1462,12 +1451,12 @@ class ia{constructor(a){this._host=a,this._host.addController(this)}get host(){r
1462
1451
  * @license
1463
1452
  * Copyright 2023 Nuraly, Laabidi Aymen
1464
1453
  * SPDX-License-Identifier: MIT
1465
- */var la=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};class ca extends ia{constructor(){super(...arguments),this.handleKeyDown=a=>{!this.eventHost.readonly||this.isReadonlyKeyAllowed(a)?"Enter"!==a.key?"number"===this.eventHost.type&&this.handleNumericKeyDown(a):this.dispatchEnterEvent(a):a.preventDefault()},this.handleValueChange=a=>{if(this.eventHost.readonly)return void a.preventDefault();const t=a.target,h=t.value;if(this.eventHost.maxLength&&h.length>this.eventHost.maxLength)return void a.preventDefault();"number"===this.eventHost.type&&h&&this.validateNumericValue(h,a),this.eventHost.value=h;const e=this.eventHost;e.validationController&&"function"==typeof e.validationController.validateOnChange&&e.validationController.validateOnChange(),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:t,originalEvent:a})},this.handleFocus=a=>{var t;this.setFocusState(!0);const h=a.target;this.restoreCursorPosition(h);const e={focused:!0,cursorPosition:null!==(t=this.getCursorPosition())&&void 0!==t?t:void 0,selectedText:this.getSelectedText()};this.eventHost.dispatchFocusEvent("nr-focus",Object.assign({target:a.target,value:this.eventHost.value},e)),this.eventHost.dispatchFocusEvent("nr-focus-change",e)},this.handleBlur=a=>{var t;this.setFocusState(!1);const h={focused:!1,cursorPosition:null!==(t=this.getCursorPosition())&&void 0!==t?t:void 0,selectedText:this.getSelectedText()},e=this.eventHost;e.validationController&&"function"==typeof e.validationController.validateOnBlur&&e.validationController.validateOnBlur(),this.eventHost.dispatchFocusEvent("nr-blur",Object.assign({target:a.target,value:this.eventHost.value},h)),this.eventHost.dispatchFocusEvent("nr-focus-change",h)},this.handleIconKeydown=a=>{if(!this.isActivationKey(a))return;a.preventDefault();const t=a.target;switch(t.id){case"copy-icon":this.handleCopy();break;case"clear-icon":this.handleClear();break;case"password-icon":this.handleTogglePassword();break;default:t.closest("#number-icons")&&this.handleNumberIconAction(t)}},this.handleCopy=()=>la(this,void 0,void 0,function*(){if(this.eventHost.withCopy&&!this.eventHost.disabled)try{const a=this.inputElement;if(!a)return;a.select(),yield navigator.clipboard.writeText(a.value),this.eventHost.dispatchActionEvent("nr-copy-success",{value:a.value,action:"copy"})}catch(a){this.handleError(a,"copy"),this.eventHost.dispatchActionEvent("nr-copy-error",{error:a,action:"copy"})}}),this.handleClear=()=>{if(this.eventHost.disabled||this.eventHost.readonly||!this.eventHost.allowClear)return;const a=this.eventHost.value;this.eventHost.value="";const t=this.inputElement;t&&(t.value="",t.focus()),this.eventHost.dispatchActionEvent("nr-clear",{previousValue:a,newValue:this.eventHost.value,target:t,action:"clear"}),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:t,action:"clear"})},this.handleTogglePassword=()=>{if("password"!==this.eventHost.type)return;const a="password"===this.eventHost.inputType?"text":"password";this.eventHost.inputType=a,this.requestUpdate(),this.eventHost.dispatchActionEvent("nr-password-toggle",{visible:"text"===a,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 a;return(null===(a=this.eventHost.shadowRoot)||void 0===a?void 0:a.querySelector("#input"))||null}handleNumericKeyDown(a){["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(a.key)||a.ctrlKey||a.metaKey||"."!==a.key&&"-"!==a.key&&(/^\d$/.test(a.key)||a.preventDefault())}handleNumberIconAction(a){const t=a.classList.contains("increment")||a.closest(".increment"),h=a.classList.contains("decrement")||a.closest(".decrement");t?this.handleIncrement():h&&this.handleDecrement()}dispatchEnterEvent(a){this.eventHost.dispatchInputEvent("nr-enter",{value:this.eventHost.value,target:a.target,originalEvent:a})}validateNumericValue(a,t){}restoreCursorPosition(a){if(a.dataset.restoreCursor){const t=parseInt(a.dataset.restoreCursor,10);isNaN(t)||a.setSelectionRange(t,t),delete a.dataset.restoreCursor}}setFocusState(a){this.eventHost.hasOwnProperty("focused")&&(this.eventHost.focused=a,this.requestUpdate())}getCursorPosition(){if(this.eventHost.getCursorPosition)return this.eventHost.getCursorPosition();const a=this.inputElement;return a?a.selectionStart:null}getSelectedText(){if(this.eventHost.getSelectedText)return this.eventHost.getSelectedText();const a=this.inputElement;return a&&null!==a.selectionStart&&null!==a.selectionEnd?a.value.substring(a.selectionStart,a.selectionEnd):""}isReadonlyKeyAllowed(a){if(this.eventHost.isReadonlyKeyAllowed)return this.eventHost.isReadonlyKeyAllowed(a);return a.ctrlKey||a.metaKey?["KeyA","KeyC"].includes(a.code):["Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(a.key)}isActivationKey(a){return this.eventHost.isActivationKey?this.eventHost.isActivationKey(a):"Enter"===a.key||" "===a.key}}
1454
+ */var la=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};class ca extends ia{constructor(){super(...arguments),this.debounceTimer=null,this.handleKeyDown=a=>{!this.eventHost.readonly||this.isReadonlyKeyAllowed(a)?"Enter"!==a.key?"number"===this.eventHost.type&&this.handleNumericKeyDown(a):this.dispatchEnterEvent(a):a.preventDefault()},this.handleValueChange=a=>{if(this.eventHost.readonly)return void a.preventDefault();const t=a.target,h=t.value;if(this.eventHost.maxLength&&h.length>this.eventHost.maxLength)return void a.preventDefault();"number"===this.eventHost.type&&h&&this.validateNumericValue(h,a),this.eventHost.value=h;const e=this.eventHost;e.validationController&&"function"==typeof e.validationController.validateOnChange&&e.validationController.validateOnChange();const r=this.eventHost.debounce||0;r>0?(this.clearDebounceTimer(),this.debounceTimer=setTimeout(()=>{this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:t,originalEvent:a})},r)):this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:t,originalEvent:a})},this.handleFocus=a=>{var t;this.setFocusState(!0);const h=a.target;this.restoreCursorPosition(h);const e={focused:!0,cursorPosition:null!==(t=this.getCursorPosition())&&void 0!==t?t:void 0,selectedText:this.getSelectedText()};this.eventHost.dispatchFocusEvent("nr-focus",Object.assign({target:a.target,value:this.eventHost.value},e)),this.eventHost.dispatchFocusEvent("nr-focus-change",e)},this.handleBlur=a=>{var t;this.setFocusState(!1);const h={focused:!1,cursorPosition:null!==(t=this.getCursorPosition())&&void 0!==t?t:void 0,selectedText:this.getSelectedText()},e=this.eventHost;e.validationController&&"function"==typeof e.validationController.validateOnBlur&&e.validationController.validateOnBlur(),this.eventHost.dispatchFocusEvent("nr-blur",Object.assign({target:a.target,value:this.eventHost.value},h)),this.eventHost.dispatchFocusEvent("nr-focus-change",h)},this.handleIconKeydown=a=>{if(!this.isActivationKey(a))return;a.preventDefault();const t=a.target;switch(t.id){case"copy-icon":this.handleCopy();break;case"clear-icon":this.handleClear();break;case"password-icon":this.handleTogglePassword();break;default:t.closest("#number-icons")&&this.handleNumberIconAction(t)}},this.handleCopy=()=>la(this,void 0,void 0,function*(){if(this.eventHost.withCopy&&!this.eventHost.disabled)try{const a=this.inputElement;if(!a)return;a.select(),yield navigator.clipboard.writeText(a.value),this.eventHost.dispatchActionEvent("nr-copy-success",{value:a.value,action:"copy"})}catch(a){this.handleError(a,"copy"),this.eventHost.dispatchActionEvent("nr-copy-error",{error:a,action:"copy"})}}),this.handleClear=()=>{if(this.eventHost.disabled||this.eventHost.readonly||!this.eventHost.allowClear)return;const a=this.eventHost.value;this.eventHost.value="";const t=this.inputElement;t&&(t.value="",t.focus()),this.eventHost.dispatchActionEvent("nr-clear",{previousValue:a,newValue:this.eventHost.value,target:t,action:"clear"}),this.eventHost.dispatchInputEvent("nr-input",{value:this.eventHost.value,target:t,action:"clear"})},this.handleTogglePassword=()=>{if("password"!==this.eventHost.type)return;const a="password"===this.eventHost.inputType?"text":"password";this.eventHost.inputType=a,this.requestUpdate(),this.eventHost.dispatchActionEvent("nr-password-toggle",{visible:"text"===a,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 a;return(null===(a=this.eventHost.shadowRoot)||void 0===a?void 0:a.querySelector("#input"))||null}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}handleNumericKeyDown(a){["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(a.key)||a.ctrlKey||a.metaKey||"."!==a.key&&"-"!==a.key&&(/^\d$/.test(a.key)||a.preventDefault())}handleNumberIconAction(a){const t=a.classList.contains("increment")||a.closest(".increment"),h=a.classList.contains("decrement")||a.closest(".decrement");t?this.handleIncrement():h&&this.handleDecrement()}dispatchEnterEvent(a){this.eventHost.dispatchInputEvent("nr-enter",{value:this.eventHost.value,target:a.target,originalEvent:a})}validateNumericValue(a,t){}restoreCursorPosition(a){if(a.dataset.restoreCursor){const t=parseInt(a.dataset.restoreCursor,10);isNaN(t)||a.setSelectionRange(t,t),delete a.dataset.restoreCursor}}setFocusState(a){this.eventHost.hasOwnProperty("focused")&&(this.eventHost.focused=a,this.requestUpdate())}getCursorPosition(){if(this.eventHost.getCursorPosition)return this.eventHost.getCursorPosition();const a=this.inputElement;return a?a.selectionStart:null}getSelectedText(){if(this.eventHost.getSelectedText)return this.eventHost.getSelectedText();const a=this.inputElement;return a&&null!==a.selectionStart&&null!==a.selectionEnd?a.value.substring(a.selectionStart,a.selectionEnd):""}isReadonlyKeyAllowed(a){if(this.eventHost.isReadonlyKeyAllowed)return this.eventHost.isReadonlyKeyAllowed(a);return a.ctrlKey||a.metaKey?["KeyA","KeyC"].includes(a.code):["Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(a.key)}isActivationKey(a){return this.eventHost.isActivationKey?this.eventHost.isActivationKey(a):"Enter"===a.key||" "===a.key}}
1466
1455
  /**
1467
1456
  * @license
1468
1457
  * Copyright 2023 Nuraly, Laabidi Aymen
1469
1458
  * SPDX-License-Identifier: MIT
1470
- */var sa=function(a,t,h,e){for(var r,i=arguments.length,d=i<3?t:null===e?e=Object.getOwnPropertyDescriptor(t,h):e,o=a.length-1;o>=0;o--)(r=a[o])&&(d=(i<3?r(d):i>3?r(t,h,d):r(t,h))||d);return i>3&&d&&Object.defineProperty(t,h,d),d},Ma=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};let ua=class extends(ra(ea(ha(l(h))))){constructor(){super(...arguments),this.validationController=new na(this),this.eventController=new ca(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.inputType="",this.hasAddonBefore=!1,this.hasAddonAfter=!1,this.focused=!1,this.requiredComponents=["nr-icon"],this._handleValidationEvent=a=>{const t=a.detail;this.validationMessage=t.validationMessage||"";let h="default";t.validationResult.hasError?h="error":t.validationResult.hasWarning&&this.allowWarnings?h="warning":t.validationResult.isValid&&this.value&&this.hasFeedback&&(h="success"),this.state!==h&&(this.state=h),this.requestUpdate()},this._handleKeyDown=a=>{this.eventController.handleKeyDown(a)},this._valueChange=a=>{this.eventController.handleValueChange(a)},this._focusEvent=a=>{this.eventController.handleFocus(a)},this._blurEvent=a=>{this.eventController.handleBlur(a)},this._handleIconKeydown=a=>{this.eventController.handleIconKeydown(a)}}get _input(){return this.shadowRoot.querySelector("#input")}get characterCountDisplay(){const a=this.value.length;return this.maxLength?`${a}/${this.maxLength}`:`${a}`}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 a,t;super.disconnectedCallback(),this.removeEventListener("nr-validation",this._handleValidationEvent),null===(t=(a=this.validationController).clearDebounceTimer)||void 0===t||t.call(a)}willUpdate(a){super.willUpdate(a),!a.has("type")&&this.inputType||(this.inputType=this.type),(a.has("type")||a.has("min"))&&"number"===this.type&&this.min&&!this.value&&(this.value=this.min),(a.has("type")||a.has("min")||a.has("max")||a.has("step"))&&aa.validateNumericProperties(this.type,this.min,this.max,this.step),(a.has("type")||a.has("required")||a.has("maxLength")||a.has("min")||a.has("max"))&&this.validationController.setupValidationRules()}updated(a){if(a.has("step")||a.has("min")||a.has("max")||a.has("maxLength")){const a=this.input;a&&(this.setStep(this.step),this.min?a.setAttribute("min",this.min):a.removeAttribute("min"),this.max?a.setAttribute("max",this.max):a.removeAttribute("max"),this.maxLength?a.setAttribute("maxlength",this.maxLength.toString()):a.removeAttribute("maxlength"))}if(a.has("value")){const a=this.input;a&&a.value!==this.value&&(a.value=this.value)}}firstUpdated(){this._checkInitialSlotContent()}_checkInitialSlotContent(){const a=this.querySelectorAll('[slot="addon-before"]');this.hasAddonBefore=a.length>0;const t=this.querySelectorAll('[slot="addon-after"]');this.hasAddonAfter=t.length>0}_handleSlotChange(a){const t=a.target,h=t.name;"addon-before"===h?this.hasAddonBefore=t.assignedElements().length>0:"addon-after"===h&&(this.hasAddonAfter=t.assignedElements().length>0)}_onCopy(){return Ma(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 a;const t=[],h=null===(a=this.shadowRoot)||void 0===a?void 0:a.querySelector('slot[name="helper-text"]');return h&&h.assignedNodes().length>0&&t.push("helper-text"),t.join(" ")||""}validateValue(a){return this.validationController.validate()}addRule(a){this.validationController.addRule(a)}removeRule(a){this.validationController.removeRule(a)}clearRules(){this.validationController.clearRules()}getValidationStatus(){return this.validationController.getValidationStatus()}validateInput(){return Ma(this,void 0,void 0,function*(){const a=this.validationController.validate();return this.validationController.isValidating?new Promise(a=>{const t=()=>{this.validationController.isValidating?setTimeout(t,50):a(this.validationController.isValid)};t()}):a})}setValidationStatus(a){this.validationController.setValidationStatus(a)}getValidationClasses(){return this.validationController.getValidationClasses()}renderValidationIcon(){return this.validationController.renderValidationIcon()}renderValidationMessage(){return this.validationController.renderValidationMessage()}render(){const a=this.getValidationClasses(),h=this.validationController.getValidationRenderState();return t`
1459
+ */var sa=function(a,t,h,e){for(var r,i=arguments.length,d=i<3?t:null===e?e=Object.getOwnPropertyDescriptor(t,h):e,o=a.length-1;o>=0;o--)(r=a[o])&&(d=(i<3?r(d):i>3?r(t,h,d):r(t,h))||d);return i>3&&d&&Object.defineProperty(t,h,d),d},Ma=function(a,t,h,e){return new(h||(h=Promise))(function(r,i){function d(a){try{p(e.next(a))}catch(a){i(a)}}function o(a){try{p(e.throw(a))}catch(a){i(a)}}function p(a){var t;a.done?r(a.value):(t=a.value,t instanceof h?t:new h(function(a){a(t)})).then(d,o)}p((e=e.apply(a,t||[])).next())})};let ua=class extends(ra(ea(ha(l(h))))){constructor(){super(...arguments),this.validationController=new na(this),this.eventController=new ca(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=a=>{const t=a.detail;this.validationMessage=t.validationMessage||"";let h="default";t.validationResult.hasError?h="error":t.validationResult.hasWarning&&this.allowWarnings?h="warning":t.validationResult.isValid&&this.value&&this.hasFeedback&&(h="success"),this.state!==h&&(this.state=h),this.requestUpdate()},this._handleKeyDown=a=>{this.eventController.handleKeyDown(a)},this._valueChange=a=>{this.eventController.handleValueChange(a)},this._focusEvent=a=>{this.eventController.handleFocus(a)},this._blurEvent=a=>{this.eventController.handleBlur(a)},this._handleIconKeydown=a=>{this.eventController.handleIconKeydown(a)}}get _input(){return this.shadowRoot.querySelector("#input")}get characterCountDisplay(){const a=this.value.length;return this.maxLength?`${a}/${this.maxLength}`:`${a}`}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 a,t,h,e;super.disconnectedCallback(),this.removeEventListener("nr-validation",this._handleValidationEvent),null===(t=(a=this.validationController).clearDebounceTimer)||void 0===t||t.call(a),null===(e=(h=this.eventController).clearDebounceTimer)||void 0===e||e.call(h)}willUpdate(a){super.willUpdate(a),!a.has("type")&&this.inputType||(this.inputType=this.type),(a.has("type")||a.has("min"))&&"number"===this.type&&this.min&&!this.value&&(this.value=this.min),(a.has("type")||a.has("min")||a.has("max")||a.has("step"))&&aa.validateNumericProperties(this.type,this.min,this.max,this.step),(a.has("type")||a.has("required")||a.has("maxLength")||a.has("min")||a.has("max"))&&this.validationController.setupValidationRules()}updated(a){if(a.has("step")||a.has("min")||a.has("max")||a.has("maxLength")){const a=this.input;a&&(this.setStep(this.step),this.min?a.setAttribute("min",this.min):a.removeAttribute("min"),this.max?a.setAttribute("max",this.max):a.removeAttribute("max"),this.maxLength?a.setAttribute("maxlength",this.maxLength.toString()):a.removeAttribute("maxlength"))}if(a.has("value")){const a=this.input;a&&a.value!==this.value&&(a.value=this.value)}}firstUpdated(){this._checkInitialSlotContent()}_checkInitialSlotContent(){const a=this.querySelectorAll('[slot="addon-before"]');this.hasAddonBefore=a.length>0;const t=this.querySelectorAll('[slot="addon-after"]');this.hasAddonAfter=t.length>0}_handleSlotChange(a){const t=a.target,h=t.name;"addon-before"===h?this.hasAddonBefore=t.assignedElements().length>0:"addon-after"===h&&(this.hasAddonAfter=t.assignedElements().length>0)}_onCopy(){return Ma(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 a;const t=[],h=null===(a=this.shadowRoot)||void 0===a?void 0:a.querySelector('slot[name="helper-text"]');return h&&h.assignedNodes().length>0&&t.push("helper-text"),t.join(" ")||""}validateValue(a){return this.validationController.validate()}addRule(a){this.validationController.addRule(a)}removeRule(a){this.validationController.removeRule(a)}clearRules(){this.validationController.clearRules()}getValidationStatus(){return this.validationController.getValidationStatus()}validateInput(){return Ma(this,void 0,void 0,function*(){const a=this.validationController.validate();return this.validationController.isValidating?new Promise(a=>{const t=()=>{this.validationController.isValidating?setTimeout(t,50):a(this.validationController.isValid)};t()}):a})}setValidationStatus(a){this.validationController.setValidationStatus(a)}getValidationClasses(){return this.validationController.getValidationClasses()}renderValidationIcon(){return this.validationController.renderValidationIcon()}renderValidationMessage(){return this.validationController.renderValidationMessage()}render(){const a=this.getValidationClasses(),h=this.validationController.getValidationRenderState();return t`
1471
1460
  <slot name="label"></slot>
1472
1461
  <div class="input-wrapper ${Object.entries(a).filter(([,a])=>a).map(([a])=>a).join(" ")}"
1473
1462
  part="input-wrapper"
@@ -1509,7 +1498,7 @@ class ia{constructor(a){this._host=a,this._host.addController(this)}get host(){r
1509
1498
  ${this.characterCountDisplay}
1510
1499
  </div>
1511
1500
  `:""}
1512
- `}};ua.styles=G,sa([i({type:Boolean,reflect:!0})],ua.prototype,"disabled",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"readonly",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"state",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"value",void 0),sa([i({type:String})],ua.prototype,"size",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"variant",void 0),sa([i({reflect:!0})],ua.prototype,"type",void 0),sa([i({type:String})],ua.prototype,"step",void 0),sa([i({type:String})],ua.prototype,"min",void 0),sa([i({type:String})],ua.prototype,"max",void 0),sa([i({type:String})],ua.prototype,"placeholder",void 0),sa([i({type:String})],ua.prototype,"autocomplete",void 0),sa([i({type:String})],ua.prototype,"name",void 0),sa([i({type:Boolean})],ua.prototype,"required",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"withCopy",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"allowClear",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"showCount",void 0),sa([i({type:Number})],ua.prototype,"maxLength",void 0),sa([i({type:Array})],ua.prototype,"rules",void 0),sa([i({type:Boolean,attribute:"validate-on-change"})],ua.prototype,"validateOnChangeInput",void 0),sa([i({type:Boolean,attribute:"validate-on-blur"})],ua.prototype,"validateOnBlurInput",void 0),sa([i({type:Boolean,attribute:"has-feedback"})],ua.prototype,"hasFeedback",void 0),sa([i({type:Boolean,attribute:"allow-warnings"})],ua.prototype,"allowWarnings",void 0),sa([i({type:String,attribute:"validation-trigger"})],ua.prototype,"validationTrigger",void 0),sa([i({type:Number,attribute:"validation-debounce"})],ua.prototype,"validationDebounce",void 0),sa([i({type:String})],ua.prototype,"label",void 0),sa([o()],ua.prototype,"validationMessage",void 0),sa([o()],ua.prototype,"inputType",void 0),sa([o()],ua.prototype,"hasAddonBefore",void 0),sa([o()],ua.prototype,"hasAddonAfter",void 0),sa([o()],ua.prototype,"focused",void 0),ua=sa([d("nr-input")],ua);
1501
+ `}};ua.styles=G,sa([i({type:Boolean,reflect:!0})],ua.prototype,"disabled",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"readonly",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"state",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"value",void 0),sa([i({type:String})],ua.prototype,"size",void 0),sa([i({type:String,reflect:!0})],ua.prototype,"variant",void 0),sa([i({reflect:!0})],ua.prototype,"type",void 0),sa([i({type:String})],ua.prototype,"step",void 0),sa([i({type:String})],ua.prototype,"min",void 0),sa([i({type:String})],ua.prototype,"max",void 0),sa([i({type:String})],ua.prototype,"placeholder",void 0),sa([i({type:String})],ua.prototype,"autocomplete",void 0),sa([i({type:String})],ua.prototype,"name",void 0),sa([i({type:Boolean})],ua.prototype,"required",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"withCopy",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"allowClear",void 0),sa([i({type:Boolean,reflect:!0})],ua.prototype,"showCount",void 0),sa([i({type:Number})],ua.prototype,"maxLength",void 0),sa([i({type:Array})],ua.prototype,"rules",void 0),sa([i({type:Boolean,attribute:"validate-on-change"})],ua.prototype,"validateOnChangeInput",void 0),sa([i({type:Boolean,attribute:"validate-on-blur"})],ua.prototype,"validateOnBlurInput",void 0),sa([i({type:Boolean,attribute:"has-feedback"})],ua.prototype,"hasFeedback",void 0),sa([i({type:Boolean,attribute:"allow-warnings"})],ua.prototype,"allowWarnings",void 0),sa([i({type:String,attribute:"validation-trigger"})],ua.prototype,"validationTrigger",void 0),sa([i({type:Number,attribute:"validation-debounce"})],ua.prototype,"validationDebounce",void 0),sa([i({type:String})],ua.prototype,"label",void 0),sa([i({type:Number})],ua.prototype,"debounce",void 0),sa([o()],ua.prototype,"validationMessage",void 0),sa([o()],ua.prototype,"inputType",void 0),sa([o()],ua.prototype,"hasAddonBefore",void 0),sa([o()],ua.prototype,"hasAddonAfter",void 0),sa([o()],ua.prototype,"focused",void 0),ua=sa([d("nr-input")],ua);
1513
1502
  /**
1514
1503
  * @license lucide v0.552.0 - ISC
1515
1504
  *
package/bundle.js.gz CHANGED
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"search.controller.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/controllers/search.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASpD,MAAM,OAAO,0BAA0B;IAKrC,YAAY,IAAgB,EAAE,aAAa,GAAG,GAAG;QAHzC,kBAAa,GAAkB,IAAI,CAAC;QACpC,kBAAa,GAAG,GAAG,CAAC;QAG1B,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,aAAa;QACX,iBAAiB;IACnB,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa,EAAE,OAAiC;QACrD,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAE9B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAa,EAAE,OAAiC;QAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,aAAa,CACrD,KAAK,EACL,IAAI,CAAC,IAAI,CAAC,QAAQ,EAClB,OAAO,CACR,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { IconFilterUtils } from '../utils/index.js';\nimport type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';\n\ninterface SearchHost extends ReactiveControllerHost {\n allIcons: IconPickerIcon[];\n filteredIcons: IconPickerIcon[];\n searchQuery: string;\n}\n\nexport class IconPickerSearchController implements ReactiveController {\n host: SearchHost;\n private debounceTimer: number | null = null;\n private debounceDelay = 300;\n\n constructor(host: SearchHost, debounceDelay = 300) {\n (this.host = host).addController(this);\n this.debounceDelay = debounceDelay;\n }\n\n hostConnected() {\n // Initialization\n }\n\n hostDisconnected() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n }\n\n /**\n * Perform search with debouncing\n */\n search(query: string, options?: IconPickerSearchOptions): void {\n this.host.searchQuery = query;\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = window.setTimeout(() => {\n this.performSearch(query, options);\n }, this.debounceDelay);\n }\n\n /**\n * Perform immediate search without debounce\n */\n performSearch(query: string, options?: IconPickerSearchOptions): void {\n if (!query || query.trim() === '') {\n this.host.filteredIcons = [...this.host.allIcons];\n } else {\n this.host.filteredIcons = IconFilterUtils.searchAndRank(\n query,\n this.host.allIcons,\n options\n );\n }\n this.host.requestUpdate();\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.host.searchQuery = '';\n this.host.filteredIcons = [...this.host.allIcons];\n this.host.requestUpdate();\n }\n}\n"]}
1
+ {"version":3,"file":"search.controller.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/controllers/search.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASpD,MAAM,OAAO,0BAA0B;IAKrC,YAAY,IAAgB,EAAE,aAAa,GAAG,GAAG;QAHzC,kBAAa,GAAkB,IAAI,CAAC;QACpC,kBAAa,GAAG,GAAG,CAAC;QAG1B,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,aAAa;QACX,iBAAiB;IACnB,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAClC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa,EAAE,OAAiC;QACrD,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAE9B,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAClC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAa,EAAE,OAAiC;QAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,aAAa,CACrD,KAAK,EACL,IAAI,CAAC,IAAI,CAAC,QAAQ,EAClB,OAAO,CACR,CAAC;SACH;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { IconFilterUtils } from '../utils/index.js';\nimport type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';\n\ninterface SearchHost extends ReactiveControllerHost {\n allIcons: IconPickerIcon[];\n filteredIcons: IconPickerIcon[];\n searchQuery: string;\n}\n\nexport class IconPickerSearchController implements ReactiveController {\n host: SearchHost;\n private debounceTimer: number | null = null;\n private debounceDelay = 300;\n\n constructor(host: SearchHost, debounceDelay = 300) {\n (this.host = host).addController(this);\n this.debounceDelay = debounceDelay;\n }\n\n hostConnected() {\n // Initialization\n }\n\n hostDisconnected() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n }\n\n /**\n * Perform search with debouncing\n */\n search(query: string, options?: IconPickerSearchOptions): void {\n this.host.searchQuery = query;\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = window.setTimeout(() => {\n this.performSearch(query, options);\n }, this.debounceDelay);\n }\n\n /**\n * Perform immediate search without debounce\n */\n performSearch(query: string, options?: IconPickerSearchOptions): void {\n if (!query || query.trim() === '') {\n this.host.filteredIcons = [...this.host.allIcons];\n } else {\n this.host.filteredIcons = IconFilterUtils.searchAndRank(\n query,\n this.host.allIcons,\n options\n );\n }\n this.host.requestUpdate();\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.host.searchQuery = '';\n this.host.filteredIcons = [...this.host.allIcons];\n this.host.requestUpdate();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"icon-picker.component.js","sourceRoot":"","sources":["../../../../src/components/iconpicker/icon-picker.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport '@lit-labs/virtualizer';\nimport { grid } from '@lit-labs/virtualizer/layouts/grid.js';\n\n// Import required components\nimport '../dropdown/dropdown.component.js';\nimport '../input/input.component.js';\nimport '../icon/icon.component.js';\nimport '../button/button.component.js';\n\n// Import styles and types\nimport styles from './icon-picker.style.js';\nimport {\n IconPickerSize,\n IconPickerPlacement,\n IconPickerTrigger,\n IconType,\n EMPTY_STRING\n} from './icon-picker.types.js';\nimport type { IconPickerIcon } from './icon-picker.types.js';\nimport {\n DEFAULT_PLACEHOLDER,\n DEFAULT_SEARCH_PLACEHOLDER,\n DEFAULT_EMPTY_MESSAGE,\n SEARCH_DEBOUNCE_DELAY\n} from './icon-picker.constant.js';\n\n// Import controllers\nimport {\n IconPickerSelectionController,\n IconPickerSearchController,\n IconPickerEventController\n} from './controllers/index.js';\n\n// Import utilities\nimport { IconLoaderUtils } from './utils/index.js';\n\n// Import interfaces\nimport type { IconPickerHost } from './interfaces/index.js';\n\n/**\n * Advanced icon picker component with search, virtual scrolling, and accessibility.\n * \n * Uses Lucide icons (1500+ beautiful icons) and provides an intuitive selection interface with\n * search filtering, keyboard navigation, and multiple display options.\n * \n * @example\n * ```html\n * <!-- Basic usage -->\n * <nr-icon-picker></nr-icon-picker>\n * \n * <!-- With value -->\n * <nr-icon-picker value=\"heart\"></nr-icon-picker>\n * \n * <!-- Custom configuration -->\n * <nr-icon-picker\n * value=\"star\"\n * size=\"large\"\n * placement=\"top\"\n * show-search\n * show-clear>\n * </nr-icon-picker>\n * ```\n * \n * @fires nr-icon-picker-change - Icon selection changed\n * @fires nr-icon-picker-open - Dropdown opened\n * @fires nr-icon-picker-close - Dropdown closed\n * @fires nr-icon-picker-search - Search query changed\n * @fires nr-icon-picker-clear - Selection cleared\n * \n * @cssproperty --icon-picker-dropdown-width - Width of dropdown\n * @cssproperty --icon-picker-icon-size - Size of icon items\n * @cssproperty --icon-picker-selected-bg - Selected icon background\n * @cssproperty --icon-picker-selected-border - Selected icon border\n */\n@customElement('nr-icon-picker')\nexport class NrIconPickerElement extends NuralyUIBaseMixin(LitElement) implements IconPickerHost {\n static override styles = styles;\n\n override requiredComponents = ['nr-dropdown', 'nr-input', 'nr-icon', 'nr-button'];\n\n // Controllers\n private selectionController = new IconPickerSelectionController(this);\n private searchController = new IconPickerSearchController(this, SEARCH_DEBOUNCE_DELAY);\n private eventController = new IconPickerEventController(this);\n\n // Public properties\n @property({ type: String, reflect: true }) value = EMPTY_STRING;\n @property({ type: String, reflect: true }) size = IconPickerSize.Small;\n @property({ type: String }) placement: string = IconPickerPlacement.Auto;\n @property({ type: String }) trigger: string = IconPickerTrigger.Manual;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) placeholder = DEFAULT_PLACEHOLDER;\n @property({ type: Array }) iconTypes: IconType[] = [IconType.Solid];\n @property({ type: Boolean, attribute: 'show-search' }) showSearch = true;\n @property({ type: Boolean, attribute: 'show-clear' }) showClear = true;\n @property({ type: Number, attribute: 'max-visible' }) maxVisible = 500;\n\n // Internal state\n @state() dropdownOpen = false;\n @state() allIcons: IconPickerIcon[] = [];\n @state() filteredIcons: IconPickerIcon[] = [];\n @state() searchQuery = EMPTY_STRING;\n @state() selectedIcon: IconPickerIcon | null = null;\n @state() isLoading = false;\n\n override connectedCallback() {\n super.connectedCallback();\n this.loadIcons();\n }\n\n /**\n * Load icons from Lucide library\n */\n private loadIcons(): void {\n this.isLoading = true;\n try {\n this.allIcons = IconLoaderUtils.loadIcons(this.iconTypes);\n this.filteredIcons = [...this.allIcons];\n \n // Set selected icon if value is provided\n if (this.value) {\n this.selectedIcon = this.allIcons.find(icon => icon.name === this.value) || null;\n }\n } catch (error) {\n console.error('Failed to load icons:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Handle icon selection\n */\n handleIconSelect(icon: IconPickerIcon): void {\n this.selectionController.selectIcon(icon);\n this.eventController.dispatchChangeEvent(icon.name, icon);\n this.dropdownOpen = false;\n }\n\n /**\n * Handle search input\n */\n private handleSearchInput(e: CustomEvent): void {\n const query = e.detail.value;\n this.searchController.search(query);\n this.eventController.dispatchSearchEvent(query);\n }\n\n /**\n * Handle clear button\n */\n private handleClear(e: Event): void {\n e.stopPropagation();\n this.selectionController.clearSelection();\n this.eventController.dispatchClearEvent();\n this.eventController.dispatchChangeEvent(EMPTY_STRING, null);\n }\n\n /**\n * Handle dropdown open\n */\n private handleDropdownOpen(): void {\n this.dropdownOpen = true;\n this.eventController.dispatchOpenEvent();\n }\n\n /**\n * Handle dropdown close\n */\n private handleDropdownClose(): void {\n this.dropdownOpen = false;\n this.searchController.clearSearch();\n this.eventController.dispatchCloseEvent();\n }\n\n /**\n * Toggle dropdown\n */\n private toggleDropdown(): void {\n this.dropdownOpen = !this.dropdownOpen;\n }\n\n /**\n * Render trigger button\n */\n private renderTrigger() {\n return html`\n <nr-button\n class=\"trigger-button\"\n .disabled=${this.disabled}\n size=${this.size}\n @click=${this.toggleDropdown}\n >\n ${this.selectedIcon\n ? html`\n <nr-icon class=\"icon-preview\" .name=${this.selectedIcon.name}></nr-icon>\n <span class=\"icon-name\">${this.selectedIcon.name}</span>\n `\n : html`<span class=\"placeholder\">${this.placeholder}</span>`\n }\n ${this.showClear && this.selectedIcon\n ? html`\n <nr-icon\n name=\"times\"\n @click=${this.handleClear}\n style=\"margin-left: auto; cursor: pointer;\"\n ></nr-icon>\n `\n : nothing\n }\n </nr-button>\n `;\n }\n\n /**\n * Render icon grid\n */\n private renderIconGrid() {\n if (this.isLoading) {\n return html`\n <div class=\"loading-state\">\n <nr-icon name=\"spinner\"></nr-icon>\n <div class=\"empty-message\">Loading icons...</div>\n </div>\n `;\n }\n\n if (this.filteredIcons.length === 0) {\n return html`\n <div class=\"empty-state\">\n <nr-icon name=\"search\"></nr-icon>\n <div class=\"empty-message\">${DEFAULT_EMPTY_MESSAGE}</div>\n </div>\n `;\n }\n\n // Limit visible icons for performance\n const visibleIcons = this.filteredIcons.slice(0, this.maxVisible);\n\n return html`\n <div class=\"dropdown-content\">\n ${this.showSearch\n ? html`\n <div class=\"search-container\">\n <nr-input\n size=\"small\"\n .placeholder=${DEFAULT_SEARCH_PLACEHOLDER}\n .value=${this.searchQuery}\n @nr-input=${this.handleSearchInput}\n autocomplete=\"off\"\n >\n <nr-icon slot=\"addon-before\" name=\"search\"></nr-icon>\n </nr-input>\n </div>\n `\n : nothing\n }\n <div class=\"icons-grid-container\">\n <lit-virtualizer\n .items=${visibleIcons}\n .layout=${grid({ itemSize: '40px' })}\n .renderItem=${((icon: IconPickerIcon) => html`\n <div\n class=${classMap({\n 'icon-item': true,\n 'selected': this.selectionController.isSelected(icon)\n })}\n @click=${() => this.handleIconSelect(icon)}\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Select ${icon.name} icon\"\n >\n <nr-icon .name=${icon.name}></nr-icon>\n </div>\n `) as any}\n ></lit-virtualizer>\n </div>\n </div>\n `;\n }\n\n override render() {\n return html`\n <nr-dropdown\n .open=${this.dropdownOpen}\n trigger=\"manual\"\n .placement=${this.placement as any}\n .closeOnOutsideClick=${true}\n .closeOnEscape=${true}\n @nr-dropdown-open=${this.handleDropdownOpen}\n @nr-dropdown-close=${this.handleDropdownClose}\n style=${styleMap({\n '--dropdown-width': 'var(--icon-picker-dropdown-width)',\n '--dropdown-max-height': 'var(--icon-picker-dropdown-max-height)'\n })}\n >\n <div slot=\"trigger\" class=\"trigger-container\">\n ${this.renderTrigger()}\n </div>\n <div slot=\"content\">\n ${this.renderIconGrid()}\n </div>\n </nr-dropdown>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nr-icon-picker': NrIconPickerElement;\n }\n}\n"]}
1
+ {"version":3,"file":"icon-picker.component.js","sourceRoot":"","sources":["../../../../src/components/iconpicker/icon-picker.component.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAE7D,6BAA6B;AAC7B,OAAO,mCAAmC,CAAC;AAC3C,OAAO,6BAA6B,CAAC;AACrC,OAAO,2BAA2B,CAAC;AACnC,OAAO,+BAA+B,CAAC;AAEvC,0BAA0B;AAC1B,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAKH,YAAY,EACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,2BAA2B,CAAC;AAEnC,qBAAqB;AACrB,OAAO,EACH,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,IAAa,mBAAmB,GAAhC,MAAa,mBAAoB,SAAQ,iBAAiB,CAAC,UAAU,CAAC;IAAtE;;QAGW,uBAAkB,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAElF,cAAc;QACN,wBAAmB,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC9D,qBAAgB,GAAG,IAAI,0BAA0B,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAC/E,oBAAe,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAE9D,oBAAoB;QACuB,UAAK,GAAG,YAAY,CAAC;QACrB,SAAI,sCAAwB;QAC3C,cAAS,yCAAoC;QAC7C,YAAO,2CAAoC;QAC3B,aAAQ,GAAG,KAAK,CAAC;QAChC,aAAQ,GAAG,KAAK,CAAC;QAClB,gBAAW,GAAG,mBAAmB,CAAC;QACnC,cAAS,GAAe,8BAAgB,CAAC;QACb,eAAU,GAAG,IAAI,CAAC;QACnB,cAAS,GAAG,IAAI,CAAC;QACjB,eAAU,GAAG,GAAG,CAAC;QAEvE,iBAAiB;QACR,iBAAY,GAAG,KAAK,CAAC;QACrB,aAAQ,GAAqB,EAAE,CAAC;QAChC,kBAAa,GAAqB,EAAE,CAAC;QACrC,gBAAW,GAAG,YAAY,CAAC;QAC3B,iBAAY,GAA0B,IAAI,CAAC;QAC3C,cAAS,GAAG,KAAK,CAAC;IA0M7B,CAAC;IAxMU,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,SAAS;QACf,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI;YACF,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAExC,yCAAyC;YACzC,IAAI,IAAI,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;aAClF;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;SAC/C;gBAAS;YACR,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;SACxB;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAoB;QACnC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,CAAc;QACtC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,CAAQ;QAC1B,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,OAAO,IAAI,CAAA;;;oBAGK,IAAI,CAAC,QAAQ;eAClB,IAAI,CAAC,IAAI;iBACP,IAAI,CAAC,cAAc;;UAE1B,IAAI,CAAC,YAAY;YACjB,CAAC,CAAC,IAAI,CAAA;oDACoC,IAAI,CAAC,YAAY,CAAC,IAAI;wCAClC,IAAI,CAAC,YAAY,CAAC,IAAI;aACjD;YACH,CAAC,CAAC,IAAI,CAAA,6BAA6B,IAAI,CAAC,WAAW,SACrD;UACE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY;YACnC,CAAC,CAAC,IAAI,CAAA;;;yBAGS,IAAI,CAAC,WAAW;;;aAG5B;YACH,CAAC,CAAC,OACJ;;KAEH,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,OAAO,IAAI,CAAA;;;;;OAKV,CAAC;SACH;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YACnC,OAAO,IAAI,CAAA;;;uCAGsB,qBAAqB;;OAErD,CAAC;SACH;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAElE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,UAAU;YACf,CAAC,CAAC,IAAI,CAAA;;;;iCAIiB,0BAA0B;2BAChC,IAAI,CAAC,WAAW;8BACb,IAAI,CAAC,iBAAiB;;;;;;aAMvC;YACH,CAAC,CAAC,OACJ;;;qBAGa,YAAY;sBACX,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;0BACtB,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAEjC,QAAQ,CAAC;YACf,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;SACtD,CAAC;yBACO,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;;qCAGrB,IAAI,CAAC,IAAI;;iCAEb,IAAI,CAAC,IAAI;;aAE7B,CAAQ;;;;KAIhB,CAAC;IACJ,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA;;gBAEC,IAAI,CAAC,YAAY;;qBAEZ,IAAI,CAAC,SAAgB;+BACX,IAAI;yBACV,IAAI;4BACD,IAAI,CAAC,kBAAkB;6BACtB,IAAI,CAAC,mBAAmB;gBACrC,QAAQ,CAAC;YACf,kBAAkB,EAAE,mCAAmC;YACvD,uBAAuB,EAAE,wCAAwC;SAClE,CAAC;;;YAGE,IAAI,CAAC,aAAa,EAAE;;;YAGpB,IAAI,CAAC,cAAc,EAAE;;;KAG5B,CAAC;IACJ,CAAC;CACF,CAAA;AAtOiB,0BAAM,GAAG,MAAO,CAAA;AAUW;IAA1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kDAAsB;AACrB;IAA1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iDAA6B;AAC3C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA8C;AAC7C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAA4C;AAC3B;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;qDAAkB;AAChC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;qDAAkB;AAClB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAmC;AACnC;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;sDAA0C;AACb;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;uDAAmB;AACnB;IAArD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;sDAAkB;AACjB;IAArD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;uDAAkB;AAG9D;IAAR,KAAK,EAAE;yDAAsB;AACrB;IAAR,KAAK,EAAE;qDAAiC;AAChC;IAAR,KAAK,EAAE;0DAAsC;AACrC;IAAR,KAAK,EAAE;wDAA4B;AAC3B;IAAR,KAAK,EAAE;yDAA4C;AAC3C;IAAR,KAAK,EAAE;sDAAmB;AA7BhB,mBAAmB;IAD/B,aAAa,CAAC,gBAAgB,CAAC;GACnB,mBAAmB,CAuO/B;SAvOY,mBAAmB","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport '@lit-labs/virtualizer';\nimport { grid } from '@lit-labs/virtualizer/layouts/grid.js';\n\n// Import required components\nimport '../dropdown/dropdown.component.js';\nimport '../input/input.component.js';\nimport '../icon/icon.component.js';\nimport '../button/button.component.js';\n\n// Import styles and types\nimport styles from './icon-picker.style.js';\nimport {\n IconPickerSize,\n IconPickerPlacement,\n IconPickerTrigger,\n IconType,\n EMPTY_STRING\n} from './icon-picker.types.js';\nimport type { IconPickerIcon } from './icon-picker.types.js';\nimport {\n DEFAULT_PLACEHOLDER,\n DEFAULT_SEARCH_PLACEHOLDER,\n DEFAULT_EMPTY_MESSAGE,\n SEARCH_DEBOUNCE_DELAY\n} from './icon-picker.constant.js';\n\n// Import controllers\nimport {\n IconPickerSelectionController,\n IconPickerSearchController,\n IconPickerEventController\n} from './controllers/index.js';\n\n// Import utilities\nimport { IconLoaderUtils } from './utils/index.js';\n\n// Import interfaces\nimport type { IconPickerHost } from './interfaces/index.js';\n\n/**\n * Advanced icon picker component with search, virtual scrolling, and accessibility.\n * \n * Uses Lucide icons (1500+ beautiful icons) and provides an intuitive selection interface with\n * search filtering, keyboard navigation, and multiple display options.\n * \n * @example\n * ```html\n * <!-- Basic usage -->\n * <nr-icon-picker></nr-icon-picker>\n * \n * <!-- With value -->\n * <nr-icon-picker value=\"heart\"></nr-icon-picker>\n * \n * <!-- Custom configuration -->\n * <nr-icon-picker\n * value=\"star\"\n * size=\"large\"\n * placement=\"top\"\n * show-search\n * show-clear>\n * </nr-icon-picker>\n * ```\n * \n * @fires nr-icon-picker-change - Icon selection changed\n * @fires nr-icon-picker-open - Dropdown opened\n * @fires nr-icon-picker-close - Dropdown closed\n * @fires nr-icon-picker-search - Search query changed\n * @fires nr-icon-picker-clear - Selection cleared\n * \n * @cssproperty --icon-picker-dropdown-width - Width of dropdown\n * @cssproperty --icon-picker-icon-size - Size of icon items\n * @cssproperty --icon-picker-selected-bg - Selected icon background\n * @cssproperty --icon-picker-selected-border - Selected icon border\n */\n@customElement('nr-icon-picker')\nexport class NrIconPickerElement extends NuralyUIBaseMixin(LitElement) implements IconPickerHost {\n static override styles = styles;\n\n override requiredComponents = ['nr-dropdown', 'nr-input', 'nr-icon', 'nr-button'];\n\n // Controllers\n private selectionController = new IconPickerSelectionController(this);\n private searchController = new IconPickerSearchController(this, SEARCH_DEBOUNCE_DELAY);\n private eventController = new IconPickerEventController(this);\n\n // Public properties\n @property({ type: String, reflect: true }) value = EMPTY_STRING;\n @property({ type: String, reflect: true }) size = IconPickerSize.Small;\n @property({ type: String }) placement: string = IconPickerPlacement.Auto;\n @property({ type: String }) trigger: string = IconPickerTrigger.Manual;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: String }) placeholder = DEFAULT_PLACEHOLDER;\n @property({ type: Array }) iconTypes: IconType[] = [IconType.Solid];\n @property({ type: Boolean, attribute: 'show-search' }) showSearch = true;\n @property({ type: Boolean, attribute: 'show-clear' }) showClear = true;\n @property({ type: Number, attribute: 'max-visible' }) maxVisible = 500;\n\n // Internal state\n @state() dropdownOpen = false;\n @state() allIcons: IconPickerIcon[] = [];\n @state() filteredIcons: IconPickerIcon[] = [];\n @state() searchQuery = EMPTY_STRING;\n @state() selectedIcon: IconPickerIcon | null = null;\n @state() isLoading = false;\n\n override connectedCallback() {\n super.connectedCallback();\n this.loadIcons();\n }\n\n /**\n * Load icons from Lucide library\n */\n private loadIcons(): void {\n this.isLoading = true;\n try {\n this.allIcons = IconLoaderUtils.loadIcons(this.iconTypes);\n this.filteredIcons = [...this.allIcons];\n \n // Set selected icon if value is provided\n if (this.value) {\n this.selectedIcon = this.allIcons.find(icon => icon.name === this.value) || null;\n }\n } catch (error) {\n console.error('Failed to load icons:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Handle icon selection\n */\n handleIconSelect(icon: IconPickerIcon): void {\n this.selectionController.selectIcon(icon);\n this.eventController.dispatchChangeEvent(icon.name, icon);\n this.dropdownOpen = false;\n }\n\n /**\n * Handle search input\n */\n private handleSearchInput(e: CustomEvent): void {\n const query = e.detail.value;\n this.searchController.search(query);\n this.eventController.dispatchSearchEvent(query);\n }\n\n /**\n * Handle clear button\n */\n private handleClear(e: Event): void {\n e.stopPropagation();\n this.selectionController.clearSelection();\n this.eventController.dispatchClearEvent();\n this.eventController.dispatchChangeEvent(EMPTY_STRING, null);\n }\n\n /**\n * Handle dropdown open\n */\n private handleDropdownOpen(): void {\n this.dropdownOpen = true;\n this.eventController.dispatchOpenEvent();\n }\n\n /**\n * Handle dropdown close\n */\n private handleDropdownClose(): void {\n this.dropdownOpen = false;\n this.searchController.clearSearch();\n this.eventController.dispatchCloseEvent();\n }\n\n /**\n * Toggle dropdown\n */\n private toggleDropdown(): void {\n this.dropdownOpen = !this.dropdownOpen;\n }\n\n /**\n * Render trigger button\n */\n private renderTrigger() {\n return html`\n <nr-button\n class=\"trigger-button\"\n .disabled=${this.disabled}\n size=${this.size}\n @click=${this.toggleDropdown}\n >\n ${this.selectedIcon\n ? html`\n <nr-icon class=\"icon-preview\" .name=${this.selectedIcon.name}></nr-icon>\n <span class=\"icon-name\">${this.selectedIcon.name}</span>\n `\n : html`<span class=\"placeholder\">${this.placeholder}</span>`\n }\n ${this.showClear && this.selectedIcon\n ? html`\n <nr-icon\n name=\"times\"\n @click=${this.handleClear}\n style=\"margin-left: auto; cursor: pointer;\"\n ></nr-icon>\n `\n : nothing\n }\n </nr-button>\n `;\n }\n\n /**\n * Render icon grid\n */\n private renderIconGrid() {\n if (this.isLoading) {\n return html`\n <div class=\"loading-state\">\n <nr-icon name=\"spinner\"></nr-icon>\n <div class=\"empty-message\">Loading icons...</div>\n </div>\n `;\n }\n\n if (this.filteredIcons.length === 0) {\n return html`\n <div class=\"empty-state\">\n <nr-icon name=\"search\"></nr-icon>\n <div class=\"empty-message\">${DEFAULT_EMPTY_MESSAGE}</div>\n </div>\n `;\n }\n\n // Limit visible icons for performance\n const visibleIcons = this.filteredIcons.slice(0, this.maxVisible);\n\n return html`\n <div class=\"dropdown-content\">\n ${this.showSearch\n ? html`\n <div class=\"search-container\">\n <nr-input\n size=\"small\"\n .placeholder=${DEFAULT_SEARCH_PLACEHOLDER}\n .value=${this.searchQuery}\n @nr-input=${this.handleSearchInput}\n autocomplete=\"off\"\n >\n <nr-icon slot=\"addon-before\" name=\"search\"></nr-icon>\n </nr-input>\n </div>\n `\n : nothing\n }\n <div class=\"icons-grid-container\">\n <lit-virtualizer\n .items=${visibleIcons}\n .layout=${grid({ itemSize: '40px' })}\n .renderItem=${((icon: IconPickerIcon) => html`\n <div\n class=${classMap({\n 'icon-item': true,\n 'selected': this.selectionController.isSelected(icon)\n })}\n @click=${() => this.handleIconSelect(icon)}\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Select ${icon.name} icon\"\n >\n <nr-icon .name=${icon.name}></nr-icon>\n </div>\n `) as any}\n ></lit-virtualizer>\n </div>\n </div>\n `;\n }\n\n override render() {\n return html`\n <nr-dropdown\n .open=${this.dropdownOpen}\n trigger=\"manual\"\n .placement=${this.placement as any}\n .closeOnOutsideClick=${true}\n .closeOnEscape=${true}\n @nr-dropdown-open=${this.handleDropdownOpen}\n @nr-dropdown-close=${this.handleDropdownClose}\n style=${styleMap({\n '--dropdown-width': 'var(--icon-picker-dropdown-width)',\n '--dropdown-max-height': 'var(--icon-picker-dropdown-max-height)'\n })}\n >\n <div slot=\"trigger\" class=\"trigger-container\">\n ${this.renderTrigger()}\n </div>\n <div slot=\"content\">\n ${this.renderIconGrid()}\n </div>\n </nr-dropdown>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nr-icon-picker': NrIconPickerElement;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuralyui/iconpicker",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Icon picker component for Nuraly UI - Select icons from Lucide icon library",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -1 +1 @@
1
- {"version":3,"file":"icon-filter.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-filter.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';\n\nexport class IconFilterUtils {\n /**\n * Filter icons by search query\n */\n static filterByName(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = options.caseSensitive ? query : query.toLowerCase();\n const matchMode = options.matchMode || 'contains';\n\n return icons.filter(icon => {\n const iconName = options.caseSensitive ? icon.name : icon.name.toLowerCase();\n\n switch (matchMode) {\n case 'exact':\n return iconName === searchTerm;\n case 'startsWith':\n return iconName.startsWith(searchTerm);\n case 'contains':\n default:\n return iconName.includes(searchTerm);\n }\n });\n }\n\n /**\n * Filter icons by category\n */\n static filterByCategory(category: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!category || category === 'all') {\n return icons;\n }\n\n return icons.filter(icon => icon.category === category);\n }\n\n /**\n * Rank search results by relevance\n */\n static rankResults(query: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = query.toLowerCase();\n\n return icons\n .map(icon => ({\n icon,\n score: this.calculateRelevanceScore(searchTerm, icon)\n }))\n .sort((a, b) => b.score - a.score)\n .map(item => item.icon);\n }\n\n /**\n * Calculate relevance score for ranking\n */\n private static calculateRelevanceScore(query: string, icon: IconPickerIcon): number {\n const iconName = icon.name.toLowerCase();\n let score = 0;\n\n // Exact match gets highest score\n if (iconName === query) {\n score += 100;\n }\n // Starts with query gets high score\n else if (iconName.startsWith(query)) {\n score += 50;\n }\n // Contains query gets medium score\n else if (iconName.includes(query)) {\n score += 25;\n }\n\n // Keyword matches\n if (icon.keywords) {\n icon.keywords.forEach(keyword => {\n const keywordLower = keyword.toLowerCase();\n if (keywordLower === query) {\n score += 30;\n } else if (keywordLower.includes(query)) {\n score += 10;\n }\n });\n }\n\n // Penalize longer names (shorter names are often more relevant)\n score -= iconName.length * 0.1;\n\n return score;\n }\n\n /**\n * Combined filter and rank\n */\n static searchAndRank(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n const filtered = this.filterByName(query, icons, options);\n return this.rankResults(query, filtered);\n }\n}\n"]}
1
+ {"version":3,"file":"icon-filter.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-filter.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';\n\nexport class IconFilterUtils {\n /**\n * Filter icons by search query\n */\n static filterByName(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = options.caseSensitive ? query : query.toLowerCase();\n const matchMode = options.matchMode || 'contains';\n\n return icons.filter(icon => {\n const iconName = options.caseSensitive ? icon.name : icon.name.toLowerCase();\n\n switch (matchMode) {\n case 'exact':\n return iconName === searchTerm;\n case 'startsWith':\n return iconName.startsWith(searchTerm);\n case 'contains':\n default:\n return iconName.includes(searchTerm);\n }\n });\n }\n\n /**\n * Filter icons by category\n */\n static filterByCategory(category: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!category || category === 'all') {\n return icons;\n }\n\n return icons.filter(icon => icon.category === category);\n }\n\n /**\n * Rank search results by relevance\n */\n static rankResults(query: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = query.toLowerCase();\n\n return icons\n .map(icon => ({\n icon,\n score: this.calculateRelevanceScore(searchTerm, icon)\n }))\n .sort((a, b) => b.score - a.score)\n .map(item => item.icon);\n }\n\n /**\n * Calculate relevance score for ranking\n */\n private static calculateRelevanceScore(query: string, icon: IconPickerIcon): number {\n const iconName = icon.name.toLowerCase();\n let score = 0;\n\n // Exact match gets highest score\n if (iconName === query) {\n score += 100;\n }\n // Starts with query gets high score\n else if (iconName.startsWith(query)) {\n score += 50;\n }\n // Contains query gets medium score\n else if (iconName.includes(query)) {\n score += 25;\n }\n\n // Keyword matches\n if (icon.keywords) {\n icon.keywords.forEach(keyword => {\n const keywordLower = keyword.toLowerCase();\n if (keywordLower === query) {\n score += 30;\n } else if (keywordLower.includes(query)) {\n score += 10;\n }\n });\n }\n\n // Penalize longer names (shorter names are often more relevant)\n score -= iconName.length * 0.1;\n\n return score;\n }\n\n /**\n * Combined filter and rank\n */\n static searchAndRank(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n const filtered = this.filterByName(query, icons, options);\n return this.rankResults(query, filtered);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"icon-loader.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-loader.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon } from '../icon-picker.types.js';\nimport { IconType } from '../icon-picker.types.js';\nimport { lucideIcons } from './lucide-icons.js';\n\nexport class IconLoaderUtils {\n private static iconCache: Map<IconType, IconPickerIcon[]> = new Map();\n\n /**\n * Load icons from Lucide library\n */\n static loadIcons(types: IconType[] = [IconType.Solid]): IconPickerIcon[] {\n const allIcons: IconPickerIcon[] = [];\n\n types.forEach(type => {\n if (this.iconCache.has(type)) {\n allIcons.push(...this.iconCache.get(type)!);\n } else {\n const icons = this.loadIconsByType(type);\n this.iconCache.set(type, icons);\n allIcons.push(...icons);\n }\n });\n\n return allIcons;\n }\n\n /**\n * Load icons of specific type\n */\n private static loadIconsByType(type: IconType): IconPickerIcon[] {\n // Lucide icons are all one style, so we use Solid type\n return this.extractLucideIcons(type);\n }\n\n /**\n * Extract icon data from Lucide icon names\n */\n private static extractLucideIcons(type: IconType): IconPickerIcon[] {\n return lucideIcons.map((iconName: string) => ({\n name: iconName,\n type,\n iconName,\n keywords: this.generateKeywords(iconName),\n category: this.categorizeIcon(iconName)\n }));\n }\n\n /**\n * Generate keywords from icon name for better searchability\n */\n private static generateKeywords(iconName: string): string[] {\n // Split camelCase or kebab-case into words\n const words = iconName\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/-/g, ' ')\n .toLowerCase()\n .split(' ')\n .filter(Boolean);\n \n return [...new Set(words)];\n }\n\n /**\n * Categorize icon based on name patterns\n */\n private static categorizeIcon(iconName: string): string {\n const name = iconName.toLowerCase();\n \n if (name.includes('arrow') || name.includes('chevron') || name.includes('corner') || name.includes('move')) {\n return 'arrow';\n }\n if (name.includes('mail') || name.includes('message') || name.includes('phone') || name.includes('chat')) {\n return 'communication';\n }\n if (name.includes('file') || name.includes('document') || name.includes('folder')) {\n return 'file';\n }\n if (name.includes('menu') || name.includes('grid') || name.includes('layout') || name.includes('panel')) {\n return 'interface';\n }\n if (name.includes('video') || name.includes('audio') || name.includes('play') || name.includes('music')) {\n return 'media';\n }\n if (name.includes('facebook') || name.includes('twitter') || name.includes('linkedin') || name.includes('github')) {\n return 'social';\n }\n if (name.includes('text') || name.includes('type') || name.includes('font')) {\n return 'text';\n }\n if (name.includes('briefcase') || name.includes('building') || name.includes('calendar') || name.includes('chart')) {\n return 'business';\n }\n if (name.includes('pen') || name.includes('brush') || name.includes('palette') || name.includes('edit')) {\n return 'design';\n }\n if (name.includes('circle') || name.includes('square') || name.includes('triangle') || name.includes('hexagon')) {\n return 'shapes';\n }\n \n return 'all';\n }\n\n /**\n * Get unique icon names (removes duplicates)\n */\n static getUniqueIcons(icons: IconPickerIcon[]): IconPickerIcon[] {\n const seen = new Set<string>();\n return icons.filter(icon => {\n if (seen.has(icon.name)) {\n return false;\n }\n seen.add(icon.name);\n return true;\n });\n }\n\n /**\n * Clear icon cache\n */\n static clearCache(): void {\n this.iconCache.clear();\n }\n}\n"]}
1
+ {"version":3,"file":"icon-loader.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-loader.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon } from '../icon-picker.types.js';\nimport { IconType } from '../icon-picker.types.js';\nimport { lucideIcons } from './lucide-icons.js';\n\nexport class IconLoaderUtils {\n private static iconCache: Map<IconType, IconPickerIcon[]> = new Map();\n\n /**\n * Load icons from Lucide library\n */\n static loadIcons(types: IconType[] = [IconType.Solid]): IconPickerIcon[] {\n const allIcons: IconPickerIcon[] = [];\n\n types.forEach(type => {\n if (this.iconCache.has(type)) {\n allIcons.push(...this.iconCache.get(type)!);\n } else {\n const icons = this.loadIconsByType(type);\n this.iconCache.set(type, icons);\n allIcons.push(...icons);\n }\n });\n\n return allIcons;\n }\n\n /**\n * Load icons of specific type\n */\n private static loadIconsByType(type: IconType): IconPickerIcon[] {\n // Lucide icons are all one style, so we use Solid type\n return this.extractLucideIcons(type);\n }\n\n /**\n * Extract icon data from Lucide icon names\n */\n private static extractLucideIcons(type: IconType): IconPickerIcon[] {\n return lucideIcons.map((iconName: string) => ({\n name: iconName,\n type,\n iconName,\n keywords: this.generateKeywords(iconName),\n category: this.categorizeIcon(iconName)\n }));\n }\n\n /**\n * Generate keywords from icon name for better searchability\n */\n private static generateKeywords(iconName: string): string[] {\n // Split camelCase or kebab-case into words\n const words = iconName\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/-/g, ' ')\n .toLowerCase()\n .split(' ')\n .filter(Boolean);\n \n return [...new Set(words)];\n }\n\n /**\n * Categorize icon based on name patterns\n */\n private static categorizeIcon(iconName: string): string {\n const name = iconName.toLowerCase();\n \n if (name.includes('arrow') || name.includes('chevron') || name.includes('corner') || name.includes('move')) {\n return 'arrow';\n }\n if (name.includes('mail') || name.includes('message') || name.includes('phone') || name.includes('chat')) {\n return 'communication';\n }\n if (name.includes('file') || name.includes('document') || name.includes('folder')) {\n return 'file';\n }\n if (name.includes('menu') || name.includes('grid') || name.includes('layout') || name.includes('panel')) {\n return 'interface';\n }\n if (name.includes('video') || name.includes('audio') || name.includes('play') || name.includes('music')) {\n return 'media';\n }\n if (name.includes('facebook') || name.includes('twitter') || name.includes('linkedin') || name.includes('github')) {\n return 'social';\n }\n if (name.includes('text') || name.includes('type') || name.includes('font')) {\n return 'text';\n }\n if (name.includes('briefcase') || name.includes('building') || name.includes('calendar') || name.includes('chart')) {\n return 'business';\n }\n if (name.includes('pen') || name.includes('brush') || name.includes('palette') || name.includes('edit')) {\n return 'design';\n }\n if (name.includes('circle') || name.includes('square') || name.includes('triangle') || name.includes('hexagon')) {\n return 'shapes';\n }\n \n return 'all';\n }\n\n /**\n * Get unique icon names (removes duplicates)\n */\n static getUniqueIcons(icons: IconPickerIcon[]): IconPickerIcon[] {\n const seen = new Set<string>();\n return icons.filter(icon => {\n if (seen.has(icon.name)) {\n return false;\n }\n seen.add(icon.name);\n return true;\n });\n }\n\n /**\n * Clear icon cache\n */\n static clearCache(): void {\n this.iconCache.clear();\n }\n}\n"]}