@sky.ui/core 0.0.38 → 0.0.40

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.
Files changed (94) hide show
  1. package/dist/custom-elements.json +2399 -2312
  2. package/dist/helper/controllers/animation-controller.d.ts +4 -4
  3. package/dist/helper/controllers/animation-controller.js.map +1 -1
  4. package/dist/helper/controllers/popover-controller.d.ts +11 -11
  5. package/dist/helper/controllers/popover-controller.js.map +1 -1
  6. package/dist/helper/iconify-offline.js.map +1 -1
  7. package/dist/helper/index.js +1 -1
  8. package/dist/helper/internals/form-control-base.d.ts +4 -4
  9. package/dist/helper/internals/form-control-base.js.map +1 -1
  10. package/dist/helper/utils/color-resolver.d.ts +9 -1
  11. package/dist/helper/utils/color-resolver.js +1 -1
  12. package/dist/helper/utils/color-resolver.js.map +1 -1
  13. package/dist/helper/utils/contrast-color.d.ts +128 -0
  14. package/dist/helper/utils/contrast-color.js +2 -0
  15. package/dist/helper/utils/contrast-color.js.map +1 -0
  16. package/dist/helper/utils/index.d.ts +1 -0
  17. package/dist/helper/utils/index.js +1 -1
  18. package/dist/helper/utils/size-resolver.js.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/sky-alert/sky-alert.d.ts +5 -5
  21. package/dist/sky-alert/sky-alert.js +28 -16
  22. package/dist/sky-alert/sky-alert.js.map +1 -1
  23. package/dist/sky-appbar/sky-appbar.d.ts +2 -2
  24. package/dist/sky-appbar/sky-appbar.js +20 -27
  25. package/dist/sky-appbar/sky-appbar.js.map +1 -1
  26. package/dist/sky-avatar/sky-avatar.d.ts +3 -3
  27. package/dist/sky-avatar/sky-avatar.js +8 -11
  28. package/dist/sky-avatar/sky-avatar.js.map +1 -1
  29. package/dist/sky-badge/sky-badge.d.ts +5 -5
  30. package/dist/sky-badge/sky-badge.js +22 -14
  31. package/dist/sky-badge/sky-badge.js.map +1 -1
  32. package/dist/sky-button/sky-button.d.ts +5 -5
  33. package/dist/sky-button/sky-button.js +38 -26
  34. package/dist/sky-button/sky-button.js.map +1 -1
  35. package/dist/sky-card/sky-card.d.ts +5 -5
  36. package/dist/sky-card/sky-card.js +20 -20
  37. package/dist/sky-card/sky-card.js.map +1 -1
  38. package/dist/sky-checkbox/sky-checkbox.d.ts +2 -2
  39. package/dist/sky-checkbox/sky-checkbox.js +78 -68
  40. package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
  41. package/dist/sky-chip/sky-chip.d.ts +3 -3
  42. package/dist/sky-chip/sky-chip.js +48 -36
  43. package/dist/sky-chip/sky-chip.js.map +1 -1
  44. package/dist/sky-col/sky-col.d.ts +4 -4
  45. package/dist/sky-col/sky-col.js +8 -3
  46. package/dist/sky-col/sky-col.js.map +1 -1
  47. package/dist/sky-combobox/sky-combobox.d.ts +22 -9
  48. package/dist/sky-combobox/sky-combobox.js +792 -336
  49. package/dist/sky-combobox/sky-combobox.js.map +1 -1
  50. package/dist/sky-dialog/sky-dialog.d.ts +4 -4
  51. package/dist/sky-dialog/sky-dialog.js +17 -19
  52. package/dist/sky-dialog/sky-dialog.js.map +1 -1
  53. package/dist/sky-divider/sky-divider.d.ts +3 -3
  54. package/dist/sky-divider/sky-divider.js.map +1 -1
  55. package/dist/sky-flexbox/sky-flexbox.d.ts +7 -7
  56. package/dist/sky-flexbox/sky-flexbox.js +2 -2
  57. package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
  58. package/dist/sky-flexcol/sky-flexcol.d.ts +3 -3
  59. package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
  60. package/dist/sky-form/sky-form.d.ts +12 -12
  61. package/dist/sky-form/sky-form.js +12 -12
  62. package/dist/sky-form/sky-form.js.map +1 -1
  63. package/dist/sky-grid/sky-grid.d.ts +2 -2
  64. package/dist/sky-grid/sky-grid.js.map +1 -1
  65. package/dist/sky-icon/sky-icon.d.ts +1 -1
  66. package/dist/sky-icon/sky-icon.js +1 -1
  67. package/dist/sky-icon/sky-icon.js.map +1 -1
  68. package/dist/sky-image/sky-image.d.ts +5 -5
  69. package/dist/sky-image/sky-image.js.map +1 -1
  70. package/dist/sky-image/srcset-utils.js.map +1 -1
  71. package/dist/sky-input/sky-input.d.ts +8 -7
  72. package/dist/sky-input/sky-input.js +489 -202
  73. package/dist/sky-input/sky-input.js.map +1 -1
  74. package/dist/sky-list/sky-list.d.ts +4 -4
  75. package/dist/sky-list/sky-list.js +1 -3
  76. package/dist/sky-list/sky-list.js.map +1 -1
  77. package/dist/sky-listitem/sky-listitem.d.ts +2 -2
  78. package/dist/sky-listitem/sky-listitem.js +4 -7
  79. package/dist/sky-listitem/sky-listitem.js.map +1 -1
  80. package/dist/sky-radio/sky-radio.d.ts +5 -3
  81. package/dist/sky-radio/sky-radio.js +33 -15
  82. package/dist/sky-radio/sky-radio.js.map +1 -1
  83. package/dist/sky-row/sky-row.d.ts +2 -2
  84. package/dist/sky-row/sky-row.js.map +1 -1
  85. package/dist/sky-sheet/sky-sheet.d.ts +6 -6
  86. package/dist/sky-sheet/sky-sheet.js +21 -21
  87. package/dist/sky-sheet/sky-sheet.js.map +1 -1
  88. package/dist/sky-simple-table/sky-simple-table.d.ts +4 -4
  89. package/dist/sky-simple-table/sky-simple-table.js +4 -1
  90. package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
  91. package/dist/sky-theme-provider/sky-theme-provider.d.ts +27 -27
  92. package/dist/sky-theme-provider/sky-theme-provider.js +1 -1
  93. package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
  94. package/package.json +2 -2
@@ -1,79 +1,96 @@
1
- import{css as t,LitElement as e,html as i}from"lit";import{property as s,state as o,query as r,queryAll as a,queryAssignedElements as n,customElement as l}from"lit/decorators.js";import{unsafeHTML as h}from"lit/directives/unsafe-html.js";import{when as c}from"lit/directives/when.js";import{repeat as d}from"lit/directives/repeat.js";import{classMap as p}from"lit/directives/class-map.js";import{resolveColor as y}from"../helper/utils/color-resolver.js";import{PopoverController as u}from"../helper/controllers/popover-controller.js";import{FormControlBase as v}from"../helper/internals/form-control-base.js";import{SkyIcon as m}from"../sky-icon/sky-icon.js";import{SkyCheckbox as g}from"../sky-checkbox/sky-checkbox.js";var f=Object.defineProperty,b=Object.getOwnPropertyDescriptor,k=(t,e,i,s)=>{for(var o,r=s>1?void 0:s?b(e,i):e,a=t.length-1;a>=0;a--)(o=t[a])&&(r=(s?o(e,i,r):o(r))||r);return s&&r&&f(e,i,r),r};let x=class extends v{constructor(){super(),this.value="",this.placeholder="Select An Option",this.searchPlaceholder="Search...",this.label="",this._options=[],this.chipSize=20,this.color="primary",this.clearable=!1,this.loading=!1,this.compact=!1,this.disabled=!1,this.searchable=!1,this.multiSelect=!1,this.visibleChips=2,this.selectAll=!1,this._validations=[],this.showErrors=!1,this.errorDisplayMode="single",this.required=!1,this.emitFullObject=!1,this.emittedKey="value",this.displayKey="",this.addOption=!1,this.validationArrayFormat=!1,this.prefix="",this.suffix="",this.prefixColor="",this.suffixColor="",this.justify="flex-start",this.zIndex=11,this.height="200px",this.requiredMessage="Selection is required.",this.readonly=!1,this.enforceMinOneSelection=!1,this.openAbove=!1,this.validationActive=!1,this.invalid=!1,this.variant="default",this.searchQuery="",this.filteredOptions=[],this.focused=!1,this.open=!1,this.selectedItems=[],this.hiddenChipsOpen=!1,this.activeIndex=-1,this.validationErrors=[],this.validationStatus=[],this.hasLeftIcon=!1,this.hasRightIcon=!1,this.optionSlotSet=new Set,this._searchDebounceId=null,this.dropdownPopover=new u(this,{getAnchor:()=>this.inputWrapperEl,getPopover:()=>this.dropdownEl,cssVarLeft:"--sky-dd-left",cssVarTop:"--sky-dd-top",cssVarWidth:"--sky-dd-width",getPlacement:()=>"bottom",getAlign:()=>"start",getGap:()=>6,getPadding:()=>8,getMatchAnchorWidth:()=>!0,getMaxWidthToViewport:()=>!0,getMaxWidthMode:()=>"cap",getFlip:()=>!0,getFlipOrder:()=>[],getAnimateReposition:()=>!0,getRepositionMs:()=>160,getCloseOnEscape:()=>!0,getCloseOnOutside:()=>!0,getRestoreFocusOnClose:()=>!0,onOpenChange:(t,e)=>{this.open=t,t?(this.validationActive=!0,this.filterOptions(),requestAnimationFrame(()=>this.focusOnOpen())):(this.activeIndex=-1,this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions(),this.hiddenChipsOpen=!1,this.hiddenPopover.closePopover("api"))}}),this.hiddenPopover=new u(this,{getAnchor:()=>this.overflowChipEl,getPopover:()=>this.hiddenDropdownEl,cssVarLeft:"--sky-hc-left",cssVarTop:"--sky-hc-top",cssVarWidth:"--sky-hc-width",getPlacement:()=>"bottom",getAlign:()=>"center",getGap:()=>4,getPadding:()=>8,getMatchAnchorWidth:()=>!1,getMaxWidthToViewport:()=>!0,getMaxWidthMode:()=>"cap",getFlip:()=>!0,getFlipOrder:()=>[],getAnimateReposition:()=>!0,getRepositionMs:()=>120,getCloseOnEscape:()=>!0,getCloseOnOutside:()=>!0,getRestoreFocusOnClose:()=>!1,onOpenChange:t=>{this.hiddenChipsOpen=t,t&&this.open&&this.dropdownPopover.closePopover("api")}}),this.refreshOptionSlots=()=>{const t=new Set;this.querySelectorAll('[slot^="option-"]').forEach(e=>{const i=e.slot;i&&t.add(i)}),this.optionSlotSet=t},this.onSearchKeydown=t=>{const{key:e,shiftKey:i}=t;if("Enter"===e)return t.preventDefault(),t.stopPropagation(),void this.commitDropdownEnter();if("ArrowDown"===e||"ArrowUp"===e||"Tab"===e){t.preventDefault(),t.stopPropagation();const i=this.searchable||this.addOption,s=this.multiSelect&&this.selectAll?i?1:0:this.headerRows,o=this.headerRows+Math.max(0,this.filteredOptions.length)-1,r="ArrowUp"===e||"Tab"===e&&t.shiftKey?-1:1;this.activeIndex<s?this.activeIndex=s:this.activeIndex=this.activeIndex+r<s?o:this.activeIndex+r>o?s:this.activeIndex+r,this.scrollActiveItemIntoView()}return"Escape"===e?(t.preventDefault(),t.stopPropagation(),void this.dropdownPopover.closePopover("escape")):void 0},this.handleAddaddOption=t=>{if(t.stopPropagation(),this.disabled||this.readonly)return;if(!this.canAddaddOption())return;const e=this.searchQuery.trim();this.dispatchEvent(new CustomEvent("add-new-option",{detail:{value:e},bubbles:!0,composed:!0})),this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions()},this.onIconSlotChange=()=>{this.hasLeftIcon=(this.iconLeftEls?.length??0)>0,this.hasRightIcon=(this.iconRightEls?.length??0)>0},this.captureDefaultValue("")}get options(){return this._options}set options(t){const e=this._options;this._options=Array.isArray(t)?t:[],this.requestUpdate("options",e)}get validations(){return this._validations}set validations(t){const e=this._validations;this._validations=Array.isArray(t)?t:[],this.requestUpdate("validations",e)}connectedCallback(){super.connectedCallback(),this.hasAttribute("tabindex")||(this.tabIndex=this.disabled?-1:0),this.refreshOptionSlots()}firstUpdated(){this.dropdownPopover.refreshTargets(),this.hiddenPopover.refreshTargets()}getFormValue(){if(this.disabled||!this.name)return null;if(this.multiSelect){const t=new FormData;return this.selectedItems.forEach(e=>{const i=this.emitFullObject?JSON.stringify(e):String(this.getOptionValue(e));t.append(this.name,i)}),0===this.selectedItems.length&&this.required&&t.append(this.name,""),t}{if(0===this.selectedItems.length)return"";const t=this.selectedItems[0];return this.emitFullObject?JSON.stringify(t):String(this.getOptionValue(t))}}setValueFromFormState(t){if(null===t||""===t)return this.value=this.multiSelect?[]:"",void(this.selectedItems=[]);if(this.multiSelect){let e=[];if(t instanceof FormData)e=t.getAll(this.name);else if(Array.isArray(t))e=t;else if("string"==typeof t)try{const i=JSON.parse(t);e=Array.isArray(i)?i:[t]}catch{e=[t]}this.setValueFromArray(e)}else{let e="";"string"==typeof t?e=t:t instanceof FormData?e=t.get(this.name)?.toString()||"":Array.isArray(t)&&t.length>0&&(e=t[0].toString()),this.value=e,this.syncSelectedItemsWithValue()}}syncFormValue(){if(!this.name||this.disabled)return void this.internals.setFormValue(null);const t=this.getFormValue();if(null!==t)if(this.multiSelect&&Array.isArray(t)){const e=new FormData;t.forEach(t=>{null!=t&&""!==t&&e.append(this.name,String(t))}),this.internals.setFormValue(e)}else this.internals.setFormValue(t);else this.internals.setFormValue(null)}setValueFromArray(t){const e=Array.isArray(this.options)?this.options:[];this.selectedItems=e.filter(e=>{const i=this.getOptionValue(e),s=this.emitFullObject?JSON.stringify(e):String(i);return t.some(t=>{const e=String(t);if(!this.emitFullObject)return e===s;try{const t=JSON.parse(e);return JSON.stringify(t)===s}catch{return e===s}})}),this.value=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t))}getValidityAnchor(){return this}isEmpty(){return this.multiSelect?0===this.selectedItems.length:0===this.selectedItems.length||!this.value}getNativeControl(){return this.inputWrapperEl||null}getCustomErrorMessage(){return this.validationErrors?.[0]||""}onFormReset(){super.onFormReset(),this.searchQuery="",this.emitSearchQueryChanged(),this.open=!1,this.invalid=!1,this.validationErrors=[],this.validationActive=!1}onFormDisabled(t){this.disabled=t}onFormStateRestore(t){this.setValueFromFormState(t)}toggleSelectAll(){if(this.disabled||this.readonly)return;const t=t=>String(this.getOptionValue(t));if(this.isAllFilteredSelected()){const e=new Set(this.filteredOptions.map(t=>String(this.getOptionValue(t.original)))),i=this.selectedItems.filter(i=>!e.has(t(i)));if(this.enforceMinOneSelection&&0===i.length)return;this.selectedItems=i}else{const e=new Set(this.selectedItems.map(e=>t(e))),i=this.filteredOptions.map(t=>t.original).filter(i=>!e.has(t(i)));this.selectedItems=[...this.selectedItems,...i]}const e=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t));this.value=e,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:e,selectedItems:[...this.selectedItems],emittedValues:e,isFilteredSelection:!!this.searchQuery.trim()},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity(),this.requestUpdate()}isAllFilteredSelected(){if(0===this.filteredOptions.length)return!1;return this.filteredOptions.map(t=>this.getOptionValue(t.original)).every(t=>this.selectedItems.some(e=>this.getOptionValue(e)===t))}truncateText(t,e){return t.length>e?t.slice(0,e)+"...":t}validateInput(){if(!this.validationActive)return;this.validationErrors=[];const t=this.validationArrayFormat?this.selectedItems:this.value;if(this.required&&this.isEmpty())this.validationErrors.push(this.requiredMessage||"Selection is required.");else if(Array.isArray(this.validations)&&this.validations.length)for(const e of this.validations){const i=e(t);!0!==i&&this.validationErrors.push(String(i||"Invalid value."))}this.invalid=this.validationErrors.length>0,this.dispatchEvent(new CustomEvent(this.invalid?"validation-error":"validation-success",{detail:this.invalid?{errors:this.validationErrors}:{value:this.selectedItems},bubbles:!0,composed:!0})),this.syncValidity(),this.requestUpdate()}validateForForm(){if(this.disabled)return"";const t=this.validationArrayFormat?this.selectedItems:this.value;if(Array.isArray(this.validations)&&this.validations.length)for(const e of this.validations){const i=e(t);if(!0!==i)return String(i||"Invalid value.")}return this.enforceMinOneSelection&&this.isEmpty()?this.requiredMessage||"At least one selection is required.":this.required&&this.isEmpty()?this.requiredMessage||"Selection is required.":""}focus(t){super.focus(t),this.searchInputEl?this.searchInputEl.focus(t):this.inputWrapperEl&&this.inputWrapperEl.focus(t)}blur(){this.open&&this.dropdownPopover.closePopover("light-dismiss"),super.blur()}handleFocus(){this.focused=!0,this.validationActive||(this.validationActive=!0)}reset(){this.value=this.multiSelect?[]:"",this.selectedItems=[],this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions(),this.validationErrors=[],this.validationActive=!1,this.open=!1,this.invalid=!1,this.syncFormValue(),this.syncValidity(),this.requestUpdate()}openDropdown(){this.disabled||this.readonly||this.dropdownPopover.openPopover()}closeDropdown(){this.dropdownPopover.closePopover("api")}clearSelection(){this.handleClear()}handleBlur(){this.focused=!1,this.validationActive&&this.validateInput()}updated(t){t.has("color")&&this.style.setProperty("--sky-dropdown-color",y(this.color)),t.has("height")&&this.style.setProperty("--sky-scroll-height",this.height)}willUpdate(t){t.has("value")&&(this.syncSelectedItemsWithValue(),this.syncFormValue(),this.syncValidity()),t.has("options")&&(Array.isArray(this.options)||(this.options=[]),this.syncSelectedItemsWithValue(),this.filterOptions(),this.syncFormValue(),this.syncValidity()),t.has("searchable")&&this.filterOptions(),t.has("searchQuery")&&this.filterOptions(),t.has("validationErrors")&&this.requestUpdate()}syncSelectedItemsWithValue(){const t=Array.isArray(this.options)?this.options:[],e=this.multiSelect&&Array.isArray(this.value)&&0===this.value.length;if(null==this.value||""===this.value||e)return this.selectedItems=[],void(this.value=this.multiSelect?[]:"");if(this.multiSelect&&"string"==typeof this.value)try{const t=JSON.parse(this.value);Array.isArray(t)&&(this.value=t)}catch(t){}const i=t=>{const e=this.getOptionValue(t);return"object"==typeof e?JSON.stringify(e):String(e)};if(this.multiSelect){const e=Array.isArray(this.value)?this.value:[this.value],s=new Set(e.map(t=>this.emitFullObject&&"object"==typeof t?JSON.stringify(t):String(t)));this.selectedItems=t.filter(t=>{const e=this.emitFullObject?JSON.stringify(t):i(t);return s.has(e)}),this.value=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t))}else{const e=this.emitFullObject&&"object"==typeof this.value?JSON.stringify(this.value):String(this.value),s=t.find(t=>(this.emitFullObject?JSON.stringify(t):i(t))===e);this.selectedItems=s?[s]:[],this.value=s?this.emitFullObject?s:this.getOptionValue(s):""}}filterOptions(){const t=Array.isArray(this.options)?this.options:[],e=(t,e)=>{const i=this.getOptionLabel(t);return{original:t,_idx:e,label:i,highlighted:i}};if(!this.searchable||!this.searchQuery.trim())return void(this.filteredOptions=t.map(e));const i=this.searchQuery.toLowerCase();this.filteredOptions=t.map(e).filter(t=>String(t.label).toLowerCase().includes(i)).map(t=>{const e=new RegExp(`(${i})`,"gi");return{...t,highlighted:String(t.label).replace(e,t=>`<span class="highlight">${t}</span>`)}})}emitSearchQueryChanged(){this.dispatchEvent(new CustomEvent("search-query-changed",{detail:{searchQuery:this.searchQuery},bubbles:!0,composed:!0}))}handleInput(t){if(this.disabled||this.readonly)return;this.searchQuery=t.target.value;const e=Array.isArray(this.options)?this.options.length:0,i=this.searchable&&e>x._SEARCH_DEBOUNCE_OPTIONS_THRESHOLD,s=()=>{this.filterOptions(),this.emitSearchQueryChanged()};i?(null!=this._searchDebounceId&&clearTimeout(this._searchDebounceId),this._searchDebounceId=setTimeout(()=>{this._searchDebounceId=null,s()},x._SEARCH_DEBOUNCE_MS)):s()}disconnectedCallback(){super.disconnectedCallback(),null!=this._searchDebounceId&&(clearTimeout(this._searchDebounceId),this._searchDebounceId=null)}handleClear(){if(this.disabled||this.readonly)return;const t=this.multiSelect?this.selectedItems.length>0:!!this.value;this.enforceMinOneSelection&&t||(this.value=this.multiSelect?[]:"",this.selectedItems=[],this.searchQuery="",this.emitSearchQueryChanged(),this.open=!1,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:[],isFilteredSelection:!1},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity())}selectOption(t){if(this.disabled||this.readonly)return;const e=t=>this.emitFullObject?t:this.getOptionValue(t),i=t=>{const e=this.getOptionValue(t);return"object"==typeof e?JSON.stringify(e):String(e)},s=""!==this.searchQuery.trim();if(!this.multiSelect){const o=this.selectedItems.length&&i(this.selectedItems[0])===i(t);return o&&this.enforceMinOneSelection?void(this.open=!1):(o?(this.selectedItems=[],this.value=""):(this.selectedItems=[t],this.value=e(t)),this.validateInput(),this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:this.selectedItems,emittedValues:this.selectedItems.map(e),isFilteredSelection:s},bubbles:!0,composed:!0})),this.searchQuery="",this.emitSearchQueryChanged(),this.dropdownPopover.closePopover("api"),this.syncFormValue(),this.syncValidity(),void this.requestUpdate())}const o=this.selectedItems.findIndex(e=>i(e)===i(t));let r;r=o>-1?[...this.selectedItems.slice(0,o),...this.selectedItems.slice(o+1)]:[...this.selectedItems,t],this.enforceMinOneSelection&&0===r.length||(this.selectedItems=r,this.value=r.map(e),this.validateInput(),this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:this.selectedItems,emittedValues:this.value,isFilteredSelection:s},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity(),this.open=!0,this.requestUpdate())}toggleHiddenChips(t){t.stopPropagation(),t.preventDefault(),this.disabled||this.readonly||(this.open&&this.dropdownPopover.closePopover("api"),this.hiddenPopover.toggle())}renderHiddenChipsDropdown(){return i`
2
- <div
3
- class="hidden-chips-dropdown"
4
- part="hidden-chips-dropdown"
5
- popover="manual"
6
- @toggle=${this.hiddenPopover.onToggle}
7
- @click=${t=>t.stopPropagation()}
8
- style="
1
+ import{unsafeCSS as t,css as e,LitElement as i,html as s,nothing as o}from"lit";import{property as r,state as n,query as a,queryAll as l,queryAssignedElements as h,customElement as d}from"lit/decorators.js";import{unsafeHTML as p}from"lit/directives/unsafe-html.js";import{when as c}from"lit/directives/when.js";import{repeat as u}from"lit/directives/repeat.js";import{classMap as y}from"lit/directives/class-map.js";import{resolveColor as v}from"../helper/utils/color-resolver.js";import{cssOnFillEnhance as m}from"../helper/utils/contrast-color.js";import{PopoverController as g}from"../helper/controllers/popover-controller.js";import{FormControlBase as f}from"../helper/internals/form-control-base.js";import{SkyIcon as b}from"../sky-icon/sky-icon.js";import{SkyCheckbox as k}from"../sky-checkbox/sky-checkbox.js";var w=Object.defineProperty,x=Object.getOwnPropertyDescriptor,I=(t,e,i,s)=>{for(var o,r=s>1?void 0:s?x(e,i):e,n=t.length-1;n>=0;n--)(o=t[n])&&(r=(s?o(e,i,r):o(r))||r);return s&&r&&w(e,i,r),r};let S=class extends f{constructor(){super(),this.value="",this.placeholder="Select An Option",this.searchPlaceholder="Search...",this.label="",this._options=[],this.chipSize=20,this.color="primary",this.clearable=!1,this.loading=!1,this.compact=!1,this.disabled=!1,this.searchable=!1,this.multiSelect=!1,this.visibleChips=2,this.selectAll=!1,this._validations=[],this.showErrors=!1,this.errorDisplayMode="single",this.required=!1,this.emitFullObject=!1,this.emittedKey="value",this.displayKey="",this.addOption=!1,this.validationArrayFormat=!1,this.prefix="",this.suffix="",this.prefixColor="",this.suffixColor="",this.justify="flex-start",this.zIndex=11,this.height="200px",this.requiredMessage="Selection is required.",this.readonly=!1,this.enforceMinOneSelection=!1,this.openAbove=!1,this.validationActive=!1,this.invalid=!1,this.variant="default",this.multiDisplay="chips",this.searchQuery="",this.filteredOptions=[],this.focused=!1,this.open=!1,this.selectedItems=[],this.hiddenChipsOpen=!1,this.activeIndex=-1,this.validationErrors=[],this.validationStatus=[],this.hasLeftIcon=!1,this.hasRightIcon=!1,this.optionSlotSet=new Set,this._searchDebounceId=null,this._closeResetId=null,this.dropdownPopover=new g(this,{getAnchor:()=>this.inputWrapperEl,getPopover:()=>this.dropdownEl,cssVarLeft:"--sky-dd-left",cssVarTop:"--sky-dd-top",cssVarWidth:"--sky-dd-width",getPlacement:()=>"bottom",getAlign:()=>"start",getGap:()=>6,getPadding:()=>8,getMatchAnchorWidth:()=>!0,getMaxWidthToViewport:()=>!0,getMaxWidthMode:()=>"cap",getFlip:()=>!0,getFlipOrder:()=>[],getAnimateReposition:()=>!0,getRepositionMs:()=>160,getCloseOnEscape:()=>!0,getCloseOnOutside:()=>!0,getRestoreFocusOnClose:()=>!0,onOpenChange:(t,e)=>{this.open=t,t?(this.focused=!0,null!=this._closeResetId&&(clearTimeout(this._closeResetId),this._closeResetId=null),this.validationActive=!0,this.filterOptions(),requestAnimationFrame(()=>this.focusOnOpen())):(this.activeIndex=-1,null!=this._closeResetId&&clearTimeout(this._closeResetId),this._closeResetId=setTimeout(()=>{this._closeResetId=null,this.open||(this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions())},S._CLOSE_RESET_MS),this.hiddenChipsOpen=!1,this.hiddenPopover.closePopover("api"))}}),this.hiddenPopover=new g(this,{getAnchor:()=>this.overflowChipEl,getPopover:()=>this.hiddenDropdownEl,cssVarLeft:"--sky-hc-left",cssVarTop:"--sky-hc-top",cssVarWidth:"--sky-hc-width",getPlacement:()=>"bottom",getAlign:()=>"center",getGap:()=>4,getPadding:()=>8,getMatchAnchorWidth:()=>!1,getMaxWidthToViewport:()=>!0,getMaxWidthMode:()=>"cap",getFlip:()=>!0,getFlipOrder:()=>[],getAnimateReposition:()=>!0,getRepositionMs:()=>120,getCloseOnEscape:()=>!0,getCloseOnOutside:()=>!0,getRestoreFocusOnClose:()=>!1,onOpenChange:t=>{this.hiddenChipsOpen=t,t&&this.open&&this.dropdownPopover.closePopover("api")}}),this.refreshOptionSlots=()=>{const t=new Set;this.querySelectorAll('[slot^="option-"]').forEach(e=>{const i=e.slot;i&&t.add(i)}),this.optionSlotSet=t},this.onSearchKeydown=t=>{const{key:e,shiftKey:i}=t;if("Enter"===e)return t.preventDefault(),t.stopPropagation(),void this.commitDropdownEnter();if("ArrowDown"===e||"ArrowUp"===e||"Tab"===e){t.preventDefault(),t.stopPropagation();const i=this.searchable||this.addOption,s=this.multiSelect&&this.selectAll?i?1:0:this.headerRows,o=this.headerRows+Math.max(0,this.filteredOptions.length)-1,r="ArrowUp"===e||"Tab"===e&&t.shiftKey?-1:1;this.activeIndex<s?this.activeIndex=s:this.activeIndex=this.activeIndex+r<s?o:this.activeIndex+r>o?s:this.activeIndex+r,this.scrollActiveItemIntoView()}return"Escape"===e?(t.preventDefault(),t.stopPropagation(),void this.dropdownPopover.closePopover("escape")):void 0},this.handleAddaddOption=t=>{if(t.stopPropagation(),this.disabled||this.readonly)return;if(!this.canAddaddOption())return;const e=this.searchQuery.trim();this.dispatchEvent(new CustomEvent("add-new-option",{detail:{value:e},bubbles:!0,composed:!0})),this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions()},this.onIconSlotChange=()=>{this.hasLeftIcon=(this.iconLeftEls?.length??0)>0,this.hasRightIcon=(this.iconRightEls?.length??0)>0},this.captureDefaultValue("")}get options(){return this._options}set options(t){const e=this._options;this._options=Array.isArray(t)?t:[],this.requestUpdate("options",e)}get validations(){return this._validations}set validations(t){const e=this._validations;this._validations=Array.isArray(t)?t:[],this.requestUpdate("validations",e)}connectedCallback(){super.connectedCallback(),this.hasAttribute("tabindex")||(this.tabIndex=this.disabled?-1:0),this.refreshOptionSlots()}firstUpdated(){this.dropdownPopover.refreshTargets(),this.hiddenPopover.refreshTargets()}getFormValue(){if(this.disabled||!this.name)return null;if(this.multiSelect){const t=new FormData;return this.selectedItems.forEach(e=>{const i=this.emitFullObject?JSON.stringify(e):String(this.getOptionValue(e));t.append(this.name,i)}),0===this.selectedItems.length&&this.required&&t.append(this.name,""),t}{if(0===this.selectedItems.length)return"";const t=this.selectedItems[0];return this.emitFullObject?JSON.stringify(t):String(this.getOptionValue(t))}}setValueFromFormState(t){if(null===t||""===t)return this.value=this.multiSelect?[]:"",void(this.selectedItems=[]);if(this.multiSelect){let e=[];if(t instanceof FormData)e=t.getAll(this.name);else if(Array.isArray(t))e=t;else if("string"==typeof t)try{const i=JSON.parse(t);e=Array.isArray(i)?i:[t]}catch{e=[t]}this.setValueFromArray(e)}else{let e="";"string"==typeof t?e=t:t instanceof FormData?e=t.get(this.name)?.toString()||"":Array.isArray(t)&&t.length>0&&(e=t[0].toString()),this.value=e,this.syncSelectedItemsWithValue()}}syncFormValue(){if(!this.name||this.disabled)return void this.internals.setFormValue(null);const t=this.getFormValue();if(null!==t)if(this.multiSelect&&Array.isArray(t)){const e=new FormData;t.forEach(t=>{null!=t&&""!==t&&e.append(this.name,String(t))}),this.internals.setFormValue(e)}else this.internals.setFormValue(t);else this.internals.setFormValue(null)}setValueFromArray(t){const e=Array.isArray(this.options)?this.options:[];this.selectedItems=e.filter(e=>{const i=this.getOptionValue(e),s=this.emitFullObject?JSON.stringify(e):String(i);return t.some(t=>{const e=String(t);if(!this.emitFullObject)return e===s;try{const t=JSON.parse(e);return JSON.stringify(t)===s}catch{return e===s}})}),this.value=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t))}getValidityAnchor(){return this}isEmpty(){return this.multiSelect?0===this.selectedItems.length:0===this.selectedItems.length||!this.value}getNativeControl(){return this.inputWrapperEl||null}getCustomErrorMessage(){return this.validationErrors?.[0]||""}onFormReset(){super.onFormReset(),this.searchQuery="",this.emitSearchQueryChanged(),this.open=!1,this.invalid=!1,this.validationErrors=[],this.validationActive=!1}onFormDisabled(t){this.disabled=t}onFormStateRestore(t){this.setValueFromFormState(t)}toggleSelectAll(){if(this.disabled||this.readonly)return;const t=t=>String(this.getOptionValue(t));if(this.isAllFilteredSelected()){const e=new Set(this.filteredOptions.map(t=>String(this.getOptionValue(t.original)))),i=this.selectedItems.filter(i=>!e.has(t(i)));if(this.enforceMinOneSelection&&0===i.length)return;this.selectedItems=i}else{const e=new Set(this.selectedItems.map(e=>t(e))),i=this.filteredOptions.map(t=>t.original).filter(i=>!e.has(t(i)));this.selectedItems=[...this.selectedItems,...i]}const e=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t));this.value=e,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:e,selectedItems:[...this.selectedItems],emittedValues:e,isFilteredSelection:!!this.searchQuery.trim()},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity(),this.requestUpdate()}isAllFilteredSelected(){if(0===this.filteredOptions.length)return!1;return this.filteredOptions.map(t=>this.getOptionValue(t.original)).every(t=>this.selectedItems.some(e=>this.getOptionValue(e)===t))}truncateText(t,e){return t.length>e?t.slice(0,e)+"...":t}validateInput(){if(!this.validationActive)return;this.validationErrors=[];const t=this.validationArrayFormat?this.selectedItems:this.value;if(this.required&&this.isEmpty())this.validationErrors.push(this.requiredMessage||"Selection is required.");else if(Array.isArray(this.validations)&&this.validations.length)for(const e of this.validations){const i=e(t);!0!==i&&this.validationErrors.push(String(i||"Invalid value."))}this.invalid=this.validationErrors.length>0,this.dispatchEvent(new CustomEvent(this.invalid?"validation-error":"validation-success",{detail:this.invalid?{errors:this.validationErrors}:{value:this.selectedItems},bubbles:!0,composed:!0})),this.syncValidity(),this.requestUpdate()}validateForForm(){if(this.disabled)return"";const t=this.validationArrayFormat?this.selectedItems:this.value;if(Array.isArray(this.validations)&&this.validations.length)for(const e of this.validations){const i=e(t);if(!0!==i)return String(i||"Invalid value.")}return this.enforceMinOneSelection&&this.isEmpty()?this.requiredMessage||"At least one selection is required.":this.required&&this.isEmpty()?this.requiredMessage||"Selection is required.":""}focus(t){super.focus(t),this.searchInputEl?this.searchInputEl.focus(t):this.inputWrapperEl&&this.inputWrapperEl.focus(t)}blur(){this.open&&this.dropdownPopover.closePopover("light-dismiss"),super.blur()}handleFocus(){this.focused=!0,this.validationActive||(this.validationActive=!0)}reset(){this.value=this.multiSelect?[]:"",this.selectedItems=[],this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions(),this.validationErrors=[],this.validationActive=!1,this.open=!1,this.invalid=!1,this.syncFormValue(),this.syncValidity(),this.requestUpdate()}openDropdown(){this.disabled||this.readonly||this.dropdownPopover.openPopover()}closeDropdown(){this.dropdownPopover.closePopover("api")}clearSelection(){this.handleClear()}handleBlur(){this.open||(this.focused=!1,this.validationActive&&this.validateInput())}updated(t){t.has("color")&&this.style.setProperty("--sky-dropdown-color",v(this.color)),t.has("height")&&this.style.setProperty("--sky-scroll-height",this.height)}willUpdate(t){t.has("value")&&(this.syncSelectedItemsWithValue(),this.syncFormValue(),this.syncValidity()),t.has("options")&&(Array.isArray(this.options)||(this.options=[]),this.syncSelectedItemsWithValue(),this.filterOptions(),this.syncFormValue(),this.syncValidity()),t.has("searchable")&&this.filterOptions(),t.has("searchQuery")&&this.filterOptions(),t.has("validationErrors")&&this.requestUpdate()}syncSelectedItemsWithValue(){const t=Array.isArray(this.options)?this.options:[],e=this.multiSelect&&Array.isArray(this.value)&&0===this.value.length;if(null==this.value||""===this.value||e)return this.selectedItems=[],void(this.value=this.multiSelect?[]:"");if(this.multiSelect&&"string"==typeof this.value)try{const t=JSON.parse(this.value);Array.isArray(t)&&(this.value=t)}catch(t){}const i=t=>{const e=this.getOptionValue(t);return"object"==typeof e?JSON.stringify(e):String(e)};if(this.multiSelect){const e=Array.isArray(this.value)?this.value:[this.value],s=new Set(e.map(t=>this.emitFullObject&&"object"==typeof t?JSON.stringify(t):String(t)));this.selectedItems=t.filter(t=>{const e=this.emitFullObject?JSON.stringify(t):i(t);return s.has(e)}),this.value=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t))}else{const e=this.emitFullObject&&"object"==typeof this.value?JSON.stringify(this.value):String(this.value),s=t.find(t=>(this.emitFullObject?JSON.stringify(t):i(t))===e);this.selectedItems=s?[s]:[],this.value=s?this.emitFullObject?s:this.getOptionValue(s):""}}filterOptions(){const t=Array.isArray(this.options)?this.options:[],e=(t,e)=>{const i=this.getOptionLabel(t);return{original:t,_idx:e,label:i,highlighted:i}};if(!this.searchable||!this.searchQuery.trim())return void(this.filteredOptions=t.map(e));const i=this.searchQuery.toLowerCase();this.filteredOptions=t.map(e).filter(t=>String(t.label).toLowerCase().includes(i)).map(t=>{const e=new RegExp(`(${i})`,"gi");return{...t,highlighted:String(t.label).replace(e,t=>`<span class="highlight">${t}</span>`)}})}emitSearchQueryChanged(){this.dispatchEvent(new CustomEvent("search-query-changed",{detail:{searchQuery:this.searchQuery},bubbles:!0,composed:!0}))}handleInput(t){if(this.disabled||this.readonly)return;this.searchQuery=t.target.value;const e=Array.isArray(this.options)?this.options.length:0,i=this.searchable&&e>S._SEARCH_DEBOUNCE_OPTIONS_THRESHOLD,s=()=>{this.filterOptions(),this.emitSearchQueryChanged()};i?(null!=this._searchDebounceId&&clearTimeout(this._searchDebounceId),this._searchDebounceId=setTimeout(()=>{this._searchDebounceId=null,s()},S._SEARCH_DEBOUNCE_MS)):s()}disconnectedCallback(){super.disconnectedCallback(),null!=this._searchDebounceId&&(clearTimeout(this._searchDebounceId),this._searchDebounceId=null),null!=this._closeResetId&&(clearTimeout(this._closeResetId),this._closeResetId=null)}handleClear(){if(this.disabled||this.readonly)return;const t=this.multiSelect?this.selectedItems.length>0:!!this.value;this.enforceMinOneSelection&&t||(this.value=this.multiSelect?[]:"",this.selectedItems=[],this.searchQuery="",this.emitSearchQueryChanged(),this.open=!1,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:[],isFilteredSelection:!1},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity())}selectOption(t){if(this.disabled||this.readonly)return;const e=t=>this.emitFullObject?t:this.getOptionValue(t),i=t=>{const e=this.getOptionValue(t);return"object"==typeof e?JSON.stringify(e):String(e)},s=""!==this.searchQuery.trim();if(!this.multiSelect){const o=this.selectedItems.length&&i(this.selectedItems[0])===i(t);return o&&this.enforceMinOneSelection?void(this.open=!1):(o?(this.selectedItems=[],this.value=""):(this.selectedItems=[t],this.value=e(t)),this.validateInput(),this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:this.selectedItems,emittedValues:this.selectedItems.map(e),isFilteredSelection:s},bubbles:!0,composed:!0})),this.dropdownPopover.closePopover("api"),this.syncFormValue(),this.syncValidity(),void this.requestUpdate())}const o=this.selectedItems.findIndex(e=>i(e)===i(t));let r;r=o>-1?[...this.selectedItems.slice(0,o),...this.selectedItems.slice(o+1)]:[...this.selectedItems,t],this.enforceMinOneSelection&&0===r.length||(this.selectedItems=r,this.value=r.map(e),this.validateInput(),this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:this.selectedItems,emittedValues:this.value,isFilteredSelection:s},bubbles:!0,composed:!0})),this.syncFormValue(),this.syncValidity(),this.open=!0,this.requestUpdate())}toggleHiddenChips(t){t.stopPropagation(),t.preventDefault(),this.disabled||this.readonly||(this.open&&this.dropdownPopover.closePopover("api"),this.hiddenPopover.toggle())}renderHiddenChipsDropdown(){return s`
2
+ <div
3
+ class="hidden-chips-dropdown"
4
+ part="hidden-chips-dropdown"
5
+ popover="manual"
6
+ @toggle=${this.hiddenPopover.onToggle}
7
+ @click=${t=>t.stopPropagation()}
8
+ style="
9
9
  left: var(--sky-hc-left, 0px);
10
10
  top: var(--sky-hc-top, 0px);
11
11
  width: var(--sky-hc-width, max-content);
12
12
  z-index: ${this.zIndex};
13
13
  "
14
- >
15
- ${d(this.selectedItems.slice(this.visibleChips),t=>String(this.getOptionValue(t)),t=>i`
16
- <div class="hidden-chip-inner" part="hidden-chip-inner">
17
- <span part="hidden-chip-label">
18
- ${this.truncateText(String(this.getOptionLabel(t)),this.chipSize)}
19
- </span>
20
- <sky-icon
21
- part="remove-chip-icon"
22
- class="remove-chip-inner"
23
- icon="ion:close"
24
- @click=${e=>{e.stopPropagation(),this.removeChip(t)}}
25
- ></sky-icon>
26
- </div>
27
- `)}
28
- </div>
29
- `}removeChip(t){if(this.disabled||this.readonly)return;const e=t=>String(this.getOptionValue(t)),i=this.selectedItems.filter(i=>e(i)!==e(t));if(!this.enforceMinOneSelection||0!==i.length){if(this.selectedItems=i,this.selectedItems.length<=this.visibleChips&&this.hiddenPopover.closePopover("api"),this.multiSelect){const t=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t));this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:t,selectedItems:[...this.selectedItems],emittedValues:t,isFilteredSelection:!1},bubbles:!0,composed:!0}))}else this.value="",this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:[],isFilteredSelection:!1},bubbles:!0,composed:!0}));this.syncFormValue(),this.syncValidity(),this.validateInput(),this.requestUpdate()}}renderChips(){if(!this.multiSelect&&this.selectedItems.length)return i`
30
- <span class="chip" single-select part="single-select-chip">
31
- <span class="chip-label" part="chip-label"
32
- >${this.getOptionLabel(this.selectedItems[0])}</span
33
- >
34
- </span>
35
- `;const t=Array.isArray(this.selectedItems)?this.selectedItems.slice(0,this.visibleChips):[],e=this.selectedItems.length-this.visibleChips;return i`
36
- ${d(t,t=>String(this.getOptionValue(t)),t=>i`
14
+ >
15
+ ${u(this.selectedItems.slice(this.visibleChips),t=>String(this.getOptionValue(t)),t=>s`
16
+ <div class="hidden-chip-inner" part="hidden-chip-inner">
17
+ <span part="hidden-chip-label">
18
+ ${this.truncateText(String(this.getOptionLabel(t)),this.chipSize)}
19
+ </span>
20
+ <sky-icon
21
+ part="remove-chip-icon"
22
+ class="remove-chip-inner"
23
+ icon="ion:close"
24
+ @click=${e=>{e.stopPropagation(),this.removeChip(t)}}
25
+ ></sky-icon>
26
+ </div>
27
+ `)}
28
+ </div>
29
+ `}removeChip(t){if(this.disabled||this.readonly)return;const e=t=>String(this.getOptionValue(t)),i=this.selectedItems.filter(i=>e(i)!==e(t));if(!this.enforceMinOneSelection||0!==i.length){if(this.selectedItems=i,this.selectedItems.length<=this.visibleChips&&this.hiddenPopover.closePopover("api"),this.multiSelect){const t=this.selectedItems.map(t=>this.emitFullObject?t:this.getOptionValue(t));this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:t,selectedItems:[...this.selectedItems],emittedValues:t,isFilteredSelection:!1},bubbles:!0,composed:!0}))}else this.value="",this.dispatchEvent(new CustomEvent("value-changed",{detail:{value:this.value,selectedItems:[],isFilteredSelection:!1},bubbles:!0,composed:!0}));this.syncFormValue(),this.syncValidity(),this.validateInput(),this.requestUpdate()}}renderChips(){const t=Array.isArray(this.selectedItems)?this.selectedItems.slice(0,this.visibleChips):[],e=this.selectedItems.length-this.visibleChips;return s`
30
+ ${u(t,t=>String(this.getOptionValue(t)),t=>s`
37
31
  <span class="chip" ?compact=${this.compact} part="chip">
38
32
  <span class="chip-label" part="chip-label"
39
33
  >${this.truncateText(String(this.getOptionLabel(t)),this.chipSize)}</span
40
34
  >
41
- ${c(this.multiSelect,()=>i`
42
- <sky-icon
43
- class="remove-chip"
44
- part="remove-chip-icon"
45
- ?compact=${this.compact}
46
- @click=${e=>{e.stopPropagation(),this.removeChip(t)}}
47
- icon="ion:close"
48
- ></sky-icon>
49
- `)}
35
+ ${c(this.multiSelect,()=>s`
36
+ <sky-icon
37
+ class="remove-chip"
38
+ part="remove-chip-icon"
39
+ ?compact=${this.compact}
40
+ @click=${e=>{e.stopPropagation(),this.removeChip(t)}}
41
+ icon="ion:close"
42
+ ></sky-icon>
43
+ `)}
50
44
  </span>
51
45
  `)}
52
- ${c(e>0,()=>i`
53
- <span
54
- class="chip overflow-chip"
55
- part="overflow-chip"
56
- style="cursor:pointer"
57
- ?compact=${this.compact}
58
- @click=${this.toggleHiddenChips}
59
- >
60
- + ${e}
61
- </span>
62
- `)}
63
- `}handleKeydown(t){if(t.target?.closest(".search-container"))return;const{key:e,shiftKey:i}=t;if(!this.open&&("ArrowDown"===e||"ArrowUp"===e||"Enter"===e))return this.dropdownPopover.openPopover(),void t.preventDefault();if(!this.open)return;const s=this.searchable||this.addOption,o=this.multiSelect&&this.selectAll?s?1:0:this.headerRows,r=this.headerRows+Math.max(0,this.filteredOptions.length)-1;if(this.activeIndex<o&&(this.activeIndex=o),"ArrowDown"===e){const e=this.activeIndex<o?o:this.activeIndex;return this.activeIndex=e>=r?o:e+1,this.scrollActiveItemIntoView(),void t.preventDefault()}if("ArrowUp"===e){const e=this.activeIndex<o?o:this.activeIndex;return this.activeIndex=e<=o?r:e-1,this.scrollActiveItemIntoView(),void t.preventDefault()}if("Tab"===e){if(i){const t=this.activeIndex<o?o:this.activeIndex;this.activeIndex=t<=o?r:t-1}else{const t=this.activeIndex<o?o:this.activeIndex;this.activeIndex=t>=r?o:t+1}return this.scrollActiveItemIntoView(),void t.preventDefault()}return"Enter"===e?(t.preventDefault(),t.stopPropagation(),void this.commitDropdownEnter()):this.readonly?void("Escape"===e&&(this.open=!1,t.preventDefault())):"Home"===e?(this.activeIndex=o,this.scrollActiveItemIntoView(),void t.preventDefault()):"End"===e?(this.activeIndex=Math.max(o,r),this.scrollActiveItemIntoView(),void t.preventDefault()):void 0}get headerRows(){let t=0;return(this.searchable||this.addOption)&&(t+=1),this.multiSelect&&this.selectAll&&(t+=1),t}getOptionByActiveIndex(){if(!this.open)return null;const t=this.activeIndex;if(t<0)return null;if((this.searchable||this.addOption)&&0===t)return{kind:"search"};const e=this.searchable||this.addOption?1:0;if(this.multiSelect&&this.selectAll&&t===e)return{kind:"select-all"};const i=t-this.headerRows;return i>=0&&i<this.filteredOptions.length?{kind:"option",optionIndex:i}:null}commitDropdownEnter(){const t=this.getOptionByActiveIndex();if(t)if("search"!==t.kind)if("select-all"!==t.kind){if("option"===t.kind&&"number"==typeof t.optionIndex){const e=this.filteredOptions[t.optionIndex].original;this.selectOption(e),this.searchQuery="",this.emitSearchQueryChanged()}}else this.toggleSelectAll();else this.addOption&&this.canAddaddOption()?(this.dispatchEvent(new CustomEvent("add-new-option",{detail:{value:this.searchQuery.trim()},bubbles:!0,composed:!0})),this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions()):this.filteredOptions.length>0&&(this.selectOption(this.filteredOptions[0].original),this.searchQuery="",this.emitSearchQueryChanged())}focusOnOpen(){const t=this.searchInputEl;if(t)return document.activeElement!==t&&requestAnimationFrame(()=>t.focus()),this.activeIndex=0,void this.scrollActiveItemIntoView();let e=0;if(this.selectedItems.length>0){const t=this.getOptionValue(this.selectedItems[0]),i=this.filteredOptions.findIndex(e=>this.getOptionValue(e.original)===t);i>=0&&(e=i)}this.activeIndex=this.headerRows+e,this.scrollActiveItemIntoView()}canAddaddOption(){if(!this.addOption)return!1;const t=this.searchQuery.trim();if(!t)return!1;return!(Array.isArray(this.options)?this.options:[]).some(e=>{const i=String(this.getOptionLabel(e)||"").toLowerCase(),s=(this.getOptionValue(e)??"").toString().toLowerCase();return i===t.toLowerCase()||s===t.toLowerCase()})}scrollActiveItemIntoView(){const t=Array.from(this.rowEls).find(t=>Number(t.dataset.rowIndex)===this.activeIndex);t?.scrollIntoView({block:"nearest",behavior:"smooth"})}toggleDropdown(t){t.stopPropagation(),this.disabled||this.readonly||(this.hiddenChipsOpen&&this.hiddenPopover.closePopover("api"),this.validationActive=!0,this.dropdownPopover.toggle())}renderDropdown(){return i`
64
- <div
65
- class="dropdown"
66
- part="dropdown"
67
- popover="manual"
68
- @toggle=${this.dropdownPopover.onToggle}
69
- @click=${t=>t.stopPropagation()}
70
- style="
46
+ ${c(e>0,()=>s`
47
+ <span
48
+ class="chip overflow-chip"
49
+ part="overflow-chip"
50
+ style="cursor:pointer"
51
+ ?compact=${this.compact}
52
+ @click=${this.toggleHiddenChips}
53
+ >
54
+ + ${e}
55
+ </span>
56
+ `)}
57
+ `}resolveMultiDisplay(){const t=this.multiDisplay;return"text"===t||"count"===t||"chips"===t?t:"chips"}renderSelectedValue(){if(!this.selectedItems.length)return null;if(!this.multiSelect){const t=String(this.getOptionLabel(this.selectedItems[0]));return s`
58
+ <span
59
+ class="value-summary"
60
+ part="value-summary single-select-chip"
61
+ title=${t}
62
+ >${t}</span
63
+ >
64
+ `}const t=this.resolveMultiDisplay();if("text"===t){const t=this.selectedItems.map(t=>String(this.getOptionLabel(t))).join(", ");return s`
65
+ <span class="value-summary" part="value-summary" title=${t}
66
+ >${t}</span
67
+ >
68
+ `}if("count"===t){const t=this.selectedItems.length,e=String(this.getOptionLabel(this.selectedItems[0])),i=1===t?e:`${e} +${t-1}`,o=this.selectedItems.map(t=>String(this.getOptionLabel(t))).join(", ");return s`
69
+ <span class="value-summary" part="value-summary" title=${o}
70
+ >${i}</span
71
+ >
72
+ `}return s`
73
+ <div
74
+ class="chip-container"
75
+ part="chip-container"
76
+ ?compact=${this.compact}
77
+ >
78
+ ${this.renderChips()}
79
+ </div>
80
+ `}handleKeydown(t){if(t.target?.closest(".search-container"))return;const{key:e,shiftKey:i}=t;if(!this.open&&("ArrowDown"===e||"ArrowUp"===e||"Enter"===e))return this.dropdownPopover.openPopover(),void t.preventDefault();if(!this.open)return;const s=this.searchable||this.addOption,o=this.multiSelect&&this.selectAll?s?1:0:this.headerRows,r=this.headerRows+Math.max(0,this.filteredOptions.length)-1;if(this.activeIndex<o&&(this.activeIndex=o),"ArrowDown"===e){const e=this.activeIndex<o?o:this.activeIndex;return this.activeIndex=e>=r?o:e+1,this.scrollActiveItemIntoView(),void t.preventDefault()}if("ArrowUp"===e){const e=this.activeIndex<o?o:this.activeIndex;return this.activeIndex=e<=o?r:e-1,this.scrollActiveItemIntoView(),void t.preventDefault()}if("Tab"===e){if(i){const t=this.activeIndex<o?o:this.activeIndex;this.activeIndex=t<=o?r:t-1}else{const t=this.activeIndex<o?o:this.activeIndex;this.activeIndex=t>=r?o:t+1}return this.scrollActiveItemIntoView(),void t.preventDefault()}return"Enter"===e?(t.preventDefault(),t.stopPropagation(),void this.commitDropdownEnter()):this.readonly?void("Escape"===e&&(this.open=!1,t.preventDefault())):"Home"===e?(this.activeIndex=o,this.scrollActiveItemIntoView(),void t.preventDefault()):"End"===e?(this.activeIndex=Math.max(o,r),this.scrollActiveItemIntoView(),void t.preventDefault()):void 0}get headerRows(){let t=0;return(this.searchable||this.addOption)&&(t+=1),this.multiSelect&&this.selectAll&&(t+=1),t}getOptionByActiveIndex(){if(!this.open)return null;const t=this.activeIndex;if(t<0)return null;if((this.searchable||this.addOption)&&0===t)return{kind:"search"};const e=this.searchable||this.addOption?1:0;if(this.multiSelect&&this.selectAll&&t===e)return{kind:"select-all"};const i=t-this.headerRows;return i>=0&&i<this.filteredOptions.length?{kind:"option",optionIndex:i}:null}commitDropdownEnter(){const t=this.getOptionByActiveIndex();if(t)if("search"!==t.kind)if("select-all"!==t.kind){if("option"===t.kind&&"number"==typeof t.optionIndex){const e=this.filteredOptions[t.optionIndex].original;this.selectOption(e)}}else this.toggleSelectAll();else this.addOption&&this.canAddaddOption()?(this.dispatchEvent(new CustomEvent("add-new-option",{detail:{value:this.searchQuery.trim()},bubbles:!0,composed:!0})),this.searchQuery="",this.emitSearchQueryChanged(),this.filterOptions()):this.filteredOptions.length>0&&this.selectOption(this.filteredOptions[0].original)}focusOnOpen(){const t=this.searchInputEl;if(t&&document.activeElement!==t&&requestAnimationFrame(()=>t.focus()),this.filteredOptions.length>0){let t=0;if(this.selectedItems.length>0){const e=this.getOptionValue(this.selectedItems[0]),i=this.filteredOptions.findIndex(t=>this.getOptionValue(t.original)===e);i>=0&&(t=i)}return this.activeIndex=this.headerRows+t,void this.scrollActiveItemIntoView()}this.activeIndex=this.searchable||this.addOption?0:-1}canAddaddOption(){if(!this.addOption)return!1;const t=this.searchQuery.trim();if(!t)return!1;return!(Array.isArray(this.options)?this.options:[]).some(e=>{const i=String(this.getOptionLabel(e)||"").toLowerCase(),s=(this.getOptionValue(e)??"").toString().toLowerCase();return i===t.toLowerCase()||s===t.toLowerCase()})}scrollActiveItemIntoView(){const t=Array.from(this.rowEls).find(t=>Number(t.dataset.rowIndex)===this.activeIndex);t?.scrollIntoView({block:"nearest",behavior:"smooth"})}toggleDropdown(t){t.stopPropagation(),this.disabled||this.readonly||(this.hiddenChipsOpen&&this.hiddenPopover.closePopover("api"),this.validationActive=!0,this.dropdownPopover.toggle())}renderDropdown(){return s`
81
+ <div
82
+ class="dropdown"
83
+ part="dropdown"
84
+ popover="manual"
85
+ @toggle=${this.dropdownPopover.onToggle}
86
+ @click=${t=>t.stopPropagation()}
87
+ style="
71
88
  left: var(--sky-dd-left, 0px);
72
89
  top: var(--sky-dd-top, 0px);
73
90
  min-width: var(--sky-dd-width, 100%);
74
91
  "
75
- >
76
- ${c(this.searchable||this.addOption,()=>i`
92
+ >
93
+ ${c(this.searchable||this.addOption,()=>s`
77
94
  <div
78
95
  class="search-container"
79
96
  data-row-index="0"
@@ -96,22 +113,21 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
96
113
  class="input"
97
114
  />
98
115
 
99
- ${c(this.addOption,()=>i`
100
- <sky-icon
101
- class="new-option-btn"
102
- icon="ion:add"
103
- part="add-option-icon"
104
- title="Add as new option"
105
- aria-label="Add as new option"
106
- @click=${this.handleAddaddOption}
107
- ></sky-icon>
108
- `)}
116
+ ${c(this.addOption,()=>s`
117
+ <sky-icon
118
+ class="new-option-btn"
119
+ icon="ion:add"
120
+ part="add-option-icon"
121
+ title="Add as new option"
122
+ aria-label="Add as new option"
123
+ @click=${this.handleAddaddOption}
124
+ ></sky-icon>
125
+ `)}
109
126
  </div>
110
127
  `)}
111
128
 
112
- <div class="dropdown-scroller">
113
- ${c(this.open,()=>i`
114
- ${c(this.multiSelect&&this.selectAll&&this.filteredOptions.length,()=>{const t=this.searchable||this.addOption?1:0,e=p({"dropdown-item":!0,active:this.activeIndex===t,selected:this.isAllFilteredSelected()});return i`
129
+ <div class="dropdown-scroller">
130
+ ${c(this.multiSelect&&this.selectAll&&this.filteredOptions.length,()=>{const t=this.searchable||this.addOption?1:0,e=y({"dropdown-item":!0,active:this.activeIndex===t,selected:this.isAllFilteredSelected()});return s`
115
131
  <div
116
132
  class=${e}
117
133
  data-row-index=${t}
@@ -126,125 +142,198 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
126
142
  Select All
127
143
  </div>
128
144
  `})}
129
- ${c(this.filteredOptions.length>0,()=>d(this.filteredOptions,({original:t,_idx:e})=>`${e}-${String(this.getOptionValue(t))}`,({original:t,highlighted:e,_idx:s},o)=>{const r=`option-${s}`,a=this.optionSlotSet.has(r),n=t=>String(this.getOptionValue(t.original??t)),l=Array.isArray(this.selectedItems)&&this.selectedItems.some(e=>n(e)===n(t)),d=this.headerRows+o,y=d===this.activeIndex,u=p({"dropdown-item":!0,active:y,selected:l});return i`
130
- <div
131
- class=${u}
132
- data-row-index=${d}
133
- style="justify-content: ${this.justify};"
134
- part="option"
135
- @click=${()=>this.selectOption(t)}
136
- ?compact=${this.compact}
137
- >
138
- ${c(this.multiSelect,()=>i` <sky-checkbox
139
- .checked=${l}
140
- readonly
141
- ></sky-checkbox>`)}
142
- ${c(a,()=>i`
145
+ ${c(this.filteredOptions.length>0,()=>u(this.filteredOptions,({original:t,_idx:e})=>`${e}-${String(this.getOptionValue(t))}`,({original:t,highlighted:e,_idx:i},o)=>{const r=`option-${i}`,n=this.optionSlotSet.has(r),a=t=>String(this.getOptionValue(t.original??t)),l=Array.isArray(this.selectedItems)&&this.selectedItems.some(e=>a(e)===a(t)),h=this.headerRows+o,d=h===this.activeIndex,u=y({"dropdown-item":!0,active:d,selected:l});return s`
146
+ <div
147
+ class=${u}
148
+ data-row-index=${h}
149
+ style="justify-content: ${this.justify};"
150
+ part="option"
151
+ @click=${()=>this.selectOption(t)}
152
+ @pointerenter=${()=>{this.activeIndex=h}}
153
+ ?compact=${this.compact}
154
+ >
155
+ ${c(this.multiSelect,()=>s` <sky-checkbox
156
+ .checked=${l}
157
+ readonly
158
+ ></sky-checkbox>`)}
159
+ ${c(n,()=>s`
143
160
  <div style="display: flex; gap: 8px;width:100%">
144
161
  <slot name=${r}>
145
162
  <span
146
163
  class="highlighted-text"
147
164
  part="highlighted-text"
148
- >${h(e)}</span
165
+ >${p(e)}</span
149
166
  >
150
167
  </slot>
151
168
  </div>
152
- `,()=>i`<span
153
- class="highlighted-text"
154
- part="highlighted-text"
155
- >${h(e)}</span
156
- >`)}
157
- </div>
158
- `}),()=>i`<div
169
+ `,()=>s`<span
170
+ class="highlighted-text"
171
+ part="highlighted-text"
172
+ >${p(e)}</span
173
+ >`)}
174
+ </div>
175
+ `}),()=>s`<div
159
176
  class="dropdown-item"
160
177
  part="no-options"
161
178
  data-row-index=${this.headerRows}
162
179
  >
163
180
  No options found
164
181
  </div>`)}
165
- `)}
182
+ </div>
166
183
  </div>
167
- </div>
168
- `}getOptionValue(t){return this.emitFullObject?t:"object"==typeof t&&null!==t?this.emittedKey in t?t[this.emittedKey]:"value"in t?t.value:t:t}getOptionLabel(t){if(!t)return"";if(!Array.isArray(this.options)||this.options,this.displayKey&&"object"==typeof t&&t[this.displayKey])return String(t[this.displayKey]);if("object"==typeof t){const e=Object.values(t).filter(t=>"string"==typeof t);return e.length>0?e[0]:JSON.stringify(t)}return String(t)}renderValidationErrors(){if(!this.showErrors||!this.validationActive)return null;const t=this.getErrorMessages();if(!t.length)return null;const e=`${this.id||"sky-combobox"}-errors`;return i`
184
+ `}getOptionValue(t){return this.emitFullObject?t:"object"==typeof t&&null!==t?this.emittedKey in t?t[this.emittedKey]:"value"in t?t.value:t:t}getOptionLabel(t){if(!t)return"";if(!Array.isArray(this.options)||this.options,this.displayKey&&"object"==typeof t&&t[this.displayKey])return String(t[this.displayKey]);if("object"==typeof t){const e=Object.values(t).filter(t=>"string"==typeof t);return e.length>0?e[0]:JSON.stringify(t)}return String(t)}renderValidationErrors(){if(!this.showErrors||!this.validationActive)return null;const t=this.getErrorMessages();if(!t.length)return null;const e=`${this.id||"sky-combobox"}-errors`;return s`
169
185
  <div class="progress-message">
170
186
  <ul id=${e} class="error-list" part="error-list">
171
- ${d(t,t=>t,t=>i`<li class="error" part="error-item">${t}</li>`)}
187
+ ${u(t,t=>t,t=>s`<li class="error" part="error-item">${t}</li>`)}
172
188
  </ul>
173
189
  </div>
174
- `}getErrorMessages(){const t=Array.isArray(this.validationErrors)?this.validationErrors:[];switch(this.errorDisplayMode){case"single":return t.slice(0,1);case"all":return t;default:return[]}}handleIconClick(t,e){this.dispatchEvent(new CustomEvent("icon-click",{detail:{position:t,event:e},bubbles:!0,composed:!0}))}render(){const t=p({"icon-slot":!0,left:!0,focused:this.focused}),e=p({"icon-slot":!0,right:!0,focused:this.focused}),s=p({"placeholder-label":!0,active:this.selectedItems.length>0});return i`
175
- <div class="combo-box-container" part="combo-box-container">
176
- ${c(this.label,()=>i`<div class="label" part="label">${this.label}</div>`)}
177
- <div
178
- class="input-wrapper"
179
- tabindex="0"
180
- part="input-wrapper"
181
- ?disabled=${this.disabled}
190
+ `}getErrorMessages(){const t=Array.isArray(this.validationErrors)?this.validationErrors:[];switch(this.errorDisplayMode){case"single":return t.slice(0,1);case"all":return t;default:return[]}}handleIconClick(t,e){this.dispatchEvent(new CustomEvent("icon-click",{detail:{position:t,event:e},bubbles:!0,composed:!0}))}render(){const t=y({"icon-slot":!0,left:!0,focused:this.focused}),e=y({"icon-slot":!0,right:!0,focused:this.focused}),i=y({"placeholder-label":!0,active:this.selectedItems.length>0}),r="fieldset"===this.variant,n="inside"===this.variant,a=this.label?r?s`<legend class="label" part="label">${this.label}</legend>`:s`<div class="label" part="label">${this.label}</div>`:null,l=s`
191
+ <div
192
+ class=${t}
193
+ part="icon-slot"
194
+ ?filled=${this.hasLeftIcon}
195
+ @click=${t=>this.handleIconClick("left",t)}
196
+ >
197
+ <slot name="icon-left" @slotchange=${this.onIconSlotChange}></slot>
198
+ </div>
199
+ `,h=c(this.selectedItems.length>0,()=>this.renderSelectedValue(),()=>s`<label
200
+ class=${i}
201
+ part="placeholder-label"
182
202
  ?compact=${this.compact}
183
- ?loading=${this.loading}
184
- ?open=${this.open}
185
- ?invalid=${this.invalid}
186
- @click=${t=>{this.disabled||this.readonly||this.toggleDropdown(t)}}
187
- @keydown=${this.handleKeydown}
188
203
  >
189
- <!-- Left Icon or Loading Indicator -->
190
- <div
191
- class=${t}
192
- part="icon-slot"
193
- ?filled=${this.hasLeftIcon}
194
- @click=${t=>this.handleIconClick("left",t)}
204
+ <span style="color:${this.prefixColor}">${this.prefix}</span
205
+ >${this.placeholder}<span style="color:${this.suffixColor}"
206
+ >${this.suffix}</span
195
207
  >
196
- <slot name="icon-left" @slotchange=${this.onIconSlotChange}></slot>
197
- </div>
198
- ${c(this.selectedItems.length>0,()=>i`
199
- <div
200
- class="chip-container"
201
- part="chip-container"
202
- ?compact=${this.compact}
203
- >
204
- ${this.renderChips()}
205
- </div>
206
- `,()=>i`<label
207
- class=${s}
208
- part="placeholder-label"
209
- ?compact=${this.compact}
210
- >
211
- <span style="color:${this.prefixColor}">${this.prefix}</span
212
- >${this.placeholder}<span style="color:${this.suffixColor}"
213
- >${this.suffix}</span
208
+ </label>`),d=s`
209
+ <div class="field-trailing" part="field-trailing">
210
+ ${c(this.clearable&&!this.enforceMinOneSelection&&(this.value||this.selectedItems.length),()=>s`<sky-icon
211
+ class="clear-button"
212
+ part="clear-button"
213
+ ?compact=${this.compact}
214
+ @click=${t=>{t.stopPropagation(),this.handleClear()}}
215
+ ?loading=${this.loading}
216
+ icon="ion:close"
217
+ ></sky-icon>`)}
218
+ ${c(this.loading,()=>s`<div class="loading-indicator right"></div>`,()=>this.hasRightIcon?s`<div
219
+ part="icon-slot"
220
+ class=${e}
221
+ ?filled=${!0}
222
+ @click=${t=>this.handleIconClick("right",t)}
214
223
  >
215
- </label>`)}
216
- ${c(this.clearable&&!this.enforceMinOneSelection&&(this.value||this.selectedItems.length),()=>i`<sky-icon
217
- class="clear-button"
218
- part="clear-button"
219
- @click=${this.handleClear}
220
- ?loading=${this.loading}
221
- icon="ion:close"
222
- ></sky-icon>`)}
223
- ${c(this.loading,()=>i`<div class="loading-indicator right"></div>`,()=>i`<div
224
- part="icon-slot"
225
- class=${e}
226
- ?filled=${this.hasRightIcon}
227
- @click=${t=>this.handleIconClick("right",t)}
228
- >
229
- <slot name="icon-right" @slotchange=${this.onIconSlotChange}></slot>
230
- </div>`)}
231
- <sky-icon
232
- class="dropdown-button"
233
- part="dropdown-button"
234
- @click=${t=>{this.disabled||this.readonly||this.toggleDropdown(t)}}
235
- icon=${this.open?"ion:ios-arrow-up":"ion:chevron-down"}
236
- >
237
- </sky-icon>
224
+ <slot
225
+ name="icon-right"
226
+ @slotchange=${this.onIconSlotChange}
227
+ ></slot>
228
+ </div>`:s`<slot
229
+ name="icon-right"
230
+ style="display:none"
231
+ @slotchange=${this.onIconSlotChange}
232
+ ></slot>`)}
233
+ <sky-icon
234
+ class="dropdown-button"
235
+ part="dropdown-button"
236
+ ?compact=${this.compact}
237
+ @click=${t=>{t.stopPropagation(),this.disabled||this.readonly||this.toggleDropdown(t)}}
238
+ icon=${this.open?"ion:ios-arrow-up":"ion:chevron-down"}
239
+ >
240
+ </sky-icon>
241
+ </div>
242
+ `,p=s`
243
+ ${l}
244
+ <div class="field-main" part="field-main">${h}</div>
245
+ ${this.readonly?o:d}
246
+ `,u=s`
247
+ ${l}
248
+ <div class="input-inside-main">
249
+ ${a}
250
+ <div class="input-inside-row">
251
+ <div class="field-main" part="field-main">${h}</div>
238
252
  </div>
253
+ </div>
254
+ ${this.readonly?o:d}
255
+ `,v=n?u:p,m=t=>{this.disabled||this.readonly||this.toggleDropdown(t)},g=this.handleKeydown,f=r?s`
256
+ <fieldset
257
+ class="input-wrapper"
258
+ tabindex="0"
259
+ part="input-wrapper"
260
+ ?disabled=${this.disabled}
261
+ ?compact=${this.compact}
262
+ ?loading=${this.loading}
263
+ ?open=${this.open}
264
+ ?invalid=${this.invalid}
265
+ @click=${m}
266
+ @keydown=${g}
267
+ >
268
+ ${a}
269
+ <div class="input-fieldset-body">${v}</div>
270
+ </fieldset>
271
+ `:s`
272
+ <div
273
+ class="input-wrapper"
274
+ tabindex="0"
275
+ part="input-wrapper"
276
+ ?disabled=${this.disabled}
277
+ ?compact=${this.compact}
278
+ ?loading=${this.loading}
279
+ ?open=${this.open}
280
+ ?invalid=${this.invalid}
281
+ @click=${m}
282
+ @keydown=${g}
283
+ >
284
+ ${v}
285
+ </div>
286
+ `;return s`
287
+ <div class="combo-box-container" part="combo-box-container">
288
+ ${r||n?o:a} ${f}
239
289
  ${this.renderHiddenChipsDropdown()} ${this.renderDropdown()}
240
290
  ${this.renderValidationErrors()}
241
- <slot style="display:none" @slotchange=${this.refreshOptionSlots}></slot>
291
+ <slot
292
+ style="display:none"
293
+ @slotchange=${this.refreshOptionSlots}
294
+ ></slot>
242
295
  </div>
243
- `}};x.dependencies={"sky-icon":m,"sky-checkbox":g},x._SEARCH_DEBOUNCE_MS=150,x._SEARCH_DEBOUNCE_OPTIONS_THRESHOLD=30,x.styles=t`
296
+ `}};S.dependencies={"sky-icon":b,"sky-checkbox":k},S._SEARCH_DEBOUNCE_MS=150,S._SEARCH_DEBOUNCE_OPTIONS_THRESHOLD=30,S._CLOSE_RESET_MS=250,S.styles=e`
244
297
  :host {
245
298
  display: block;
246
299
  font-family: var(--sky-font);
247
300
  width: 100%;
301
+ --sky-input-height: 36px;
302
+ --sky-input-height-compact: 28px;
303
+ --sky-input-border-width: 1px;
304
+ --sky-input-pad-x: var(--sky-space-3, 12px);
305
+ --sky-input-pad-x-sm: var(--sky-space-1, 4px);
306
+ --sky-input-pad-x-xs: 0px;
307
+ --sky-input-pad-y: var(--sky-space-1, 4px);
308
+ --sky-input-pad-y-sm: 0px;
309
+ --sky-input-gap: var(--sky-space-1, 4px);
310
+ --sky-input-icon-width: 2rem;
311
+ }
312
+
313
+ :host([compact]) {
314
+ --sky-input-pad-x: var(--sky-space-2, 8px);
315
+ --sky-input-pad-x-sm: var(--sky-space-1, 4px);
316
+ --sky-input-icon-width: 1.75rem;
317
+ }
318
+
319
+ :host([compact]) .combo-box-container > .label {
320
+ font-size: var(--sky-font-size-xs);
321
+ margin-bottom: var(--sky-space-1, 4px);
322
+ line-height: 1.2;
323
+ }
324
+
325
+ :host([compact]) .placeholder-label,
326
+ :host([compact]) .chip[single-select] {
327
+ font-size: var(--sky-font-size-sm);
328
+ }
329
+
330
+ :host([compact]) .icon-slot {
331
+ font-size: var(--sky-font-size-lg);
332
+ }
333
+
334
+ :host([compact]) .clear-button,
335
+ :host([compact]) .dropdown-button {
336
+ font-size: var(--sky-font-size-md);
248
337
  }
249
338
 
250
339
  :host([disabled]) {
@@ -256,30 +345,289 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
256
345
  cursor: default;
257
346
  }
258
347
 
259
- :host([variant="highlight"]) {
260
- .label{
261
- color: var(--sky-dropdown-color);
262
- }
348
+ :host([variant='highlight']) .label {
349
+ color: var(--sky-dropdown-color);
350
+ }
351
+
352
+ /* Fieldset / legend */
353
+ :host([variant='fieldset']) {
354
+ overflow: visible;
355
+ padding-block-start: 0;
356
+ }
357
+
358
+ :host([variant='fieldset']) .combo-box-container {
359
+ overflow: visible;
360
+ }
361
+
362
+ :host([variant='fieldset']) fieldset.input-wrapper {
363
+ display: block;
364
+ height: auto;
365
+ margin: 0;
366
+ min-inline-size: 0;
367
+ min-width: 0;
368
+ padding: 0;
369
+ overflow: visible;
370
+ background: var(--sky-glass-solid);
371
+ box-shadow: none;
372
+ }
373
+
374
+ :host([variant='fieldset']) fieldset.input-wrapper[compact] {
375
+ height: auto;
376
+ }
377
+
378
+ :host([variant='fieldset']) .input-fieldset-body {
379
+ display: flex;
380
+ width: 100%;
381
+ align-items: center;
382
+ box-sizing: border-box;
383
+ height: calc(var(--sky-input-height) - 2 * var(--sky-input-border-width));
384
+ min-height: calc(
385
+ var(--sky-input-height) - 2 * var(--sky-input-border-width)
386
+ );
387
+ background: transparent;
388
+ border-radius: inherit;
389
+ flex-wrap: nowrap;
390
+ min-width: 0;
391
+ overflow: hidden;
392
+ }
393
+
394
+ :host([variant='fieldset'])
395
+ fieldset.input-wrapper[compact]
396
+ .input-fieldset-body {
397
+ height: calc(
398
+ var(--sky-input-height-compact) - 2 * var(--sky-input-border-width)
399
+ );
400
+ min-height: calc(
401
+ var(--sky-input-height-compact) - 2 * var(--sky-input-border-width)
402
+ );
403
+ }
404
+
405
+ /* Multi chips stay single-line; do not grow taller than sky-input */
406
+ :host([variant='fieldset'])
407
+ .input-fieldset-body:has(.chip:not([single-select])) {
408
+ height: calc(var(--sky-input-height) - 2 * var(--sky-input-border-width));
409
+ min-height: calc(
410
+ var(--sky-input-height) - 2 * var(--sky-input-border-width)
411
+ );
412
+ padding-block: 0;
413
+ }
414
+
415
+ :host([variant='fieldset'][compact])
416
+ .input-fieldset-body:has(.chip:not([single-select])) {
417
+ height: calc(
418
+ var(--sky-input-height-compact) - 2 * var(--sky-input-border-width)
419
+ );
420
+ min-height: calc(
421
+ var(--sky-input-height-compact) - 2 * var(--sky-input-border-width)
422
+ );
423
+ padding-block: 0;
424
+ }
425
+
426
+ :host([variant='fieldset']) legend.label {
427
+ float: unset;
428
+ width: auto;
429
+ max-width: calc(100% - 2 * var(--sky-input-pad-x));
430
+ margin-inline-start: var(--sky-input-pad-x);
431
+ margin-bottom: 0;
432
+ padding-inline: var(--sky-input-pad-x-sm);
433
+ padding-block: 2px;
434
+ border: none;
435
+ background: transparent;
436
+ background-color: transparent;
437
+ color: var(--sky-text-secondary);
438
+ font-size: var(--sky-font-size-xs);
439
+ line-height: 1.4;
440
+ overflow: visible;
441
+ text-overflow: ellipsis;
442
+ white-space: nowrap;
443
+ pointer-events: none;
263
444
  }
264
445
 
265
- .combo-box-container:focus-within .label {
446
+ :host([variant='fieldset']) .combo-box-container:focus-within legend.label,
447
+ :host([variant='fieldset']) .input-wrapper[open] legend.label {
266
448
  color: var(--sky-dropdown-color);
267
- font-size: var(--sky-font-size-sm);
268
- transition: all 0.3s ease;
449
+ font-size: var(--sky-font-size-xs);
450
+ }
451
+
452
+ :host([variant='fieldset']) .input-wrapper::after {
453
+ content: none;
454
+ display: none;
455
+ }
456
+
457
+ :host([variant='fieldset']) .input-wrapper[open],
458
+ :host([variant='fieldset']) .input-wrapper:focus-visible {
459
+ border-color: var(--sky-dropdown-color);
460
+ }
461
+
462
+ :host([variant='fieldset'][validationActive]:invalid) .input-wrapper {
463
+ border-color: var(--sky-danger-primary);
464
+ }
465
+
466
+ :host([variant='fieldset'][validationActive]:invalid) legend.label {
467
+ color: var(--sky-danger-primary);
468
+ }
469
+
470
+ :host([variant='fieldset'][compact]) legend.label,
471
+ :host([variant='fieldset'][compact])
472
+ .combo-box-container:focus-within
473
+ legend.label,
474
+ :host([variant='fieldset'][compact]) .input-wrapper[open] legend.label {
475
+ font-size: var(--sky-font-size-xs);
476
+ line-height: 1.4;
477
+ }
478
+
479
+ /* Inside: label in the wrapper above value row — keep tokens in sync with sky-input */
480
+ :host([variant='inside']) {
481
+ --sky-input-height-inside: 44px;
482
+ --sky-input-height-inside-compact: 40px;
483
+ --sky-input-inside-label-block: 0.15rem;
484
+ --sky-input-inside-value-min: 1.375rem;
485
+ }
486
+
487
+ :host([variant='inside']) .input-wrapper {
488
+ height: auto;
489
+ min-height: var(--sky-input-height-inside);
490
+ align-items: center;
491
+ padding-block: var(--sky-input-pad-y-sm, 0px);
492
+ overflow: hidden;
493
+ }
494
+
495
+ :host([variant='inside']) .input-wrapper[compact] {
496
+ height: auto;
497
+ min-height: var(--sky-input-height-inside-compact);
498
+ padding-block: var(--sky-input-pad-y-sm, 0px);
499
+ }
500
+
501
+ :host([variant='inside']) .input-inside-main {
502
+ flex: 1 1 0%;
503
+ min-width: 0;
504
+ display: flex;
505
+ flex-direction: column;
506
+ justify-content: center;
507
+ gap: 0.15rem;
508
+ padding-block: var(--sky-input-inside-label-block);
509
+ padding-inline: 0;
510
+ overflow: hidden;
269
511
  }
512
+
513
+ :host([variant='inside']) .input-inside-main > .label {
514
+ margin: 0;
515
+ padding-inline: var(--sky-input-pad-x);
516
+ font-size: var(--sky-font-size-xs);
517
+ line-height: 1.3;
518
+ min-height: calc(var(--sky-font-size-xs) * 1.3);
519
+ color: var(--sky-text-secondary);
520
+ pointer-events: none;
521
+ overflow: hidden;
522
+ text-overflow: ellipsis;
523
+ white-space: nowrap;
524
+ flex: 0 0 auto;
525
+ }
526
+
527
+ :host([variant='inside'][compact]) .input-inside-main > .label {
528
+ font-size: 0.6875rem;
529
+ line-height: 1.3;
530
+ min-height: calc(0.6875rem * 1.3);
531
+ }
532
+
533
+ :host([variant='inside'])
534
+ .combo-box-container:focus-within
535
+ .input-inside-main
536
+ > .label,
537
+ :host([variant='inside']) .input-wrapper[open] .input-inside-main > .label {
538
+ color: var(--sky-dropdown-color);
539
+ font-size: var(--sky-font-size-xs);
540
+ }
541
+
542
+ :host([variant='inside'][compact])
543
+ .combo-box-container:focus-within
544
+ .input-inside-main
545
+ > .label,
546
+ :host([variant='inside'][compact])
547
+ .input-wrapper[open]
548
+ .input-inside-main
549
+ > .label {
550
+ font-size: 0.6875rem;
551
+ }
552
+
553
+ :host([variant='inside'][validationActive]:invalid)
554
+ .input-inside-main
555
+ > .label {
556
+ color: var(--sky-danger-primary);
557
+ }
558
+
559
+ :host([variant='inside']) .input-inside-row {
560
+ display: flex;
561
+ align-items: center;
562
+ min-width: 0;
563
+ width: 100%;
564
+ min-height: var(--sky-input-inside-value-min);
565
+ gap: 0;
566
+ overflow: hidden;
567
+ flex: 0 0 auto;
568
+ }
569
+
570
+ /* Match sky-input: label + value share pad-x; zero start when left icon present */
571
+ :host([variant='inside']) .input-inside-main > .label,
572
+ :host([variant='inside']) .chip-container,
573
+ :host([variant='inside']) .value-summary,
574
+ :host([variant='inside']) .placeholder-label {
575
+ padding-inline-start: var(--sky-input-pad-x);
576
+ padding-inline-end: var(--sky-input-pad-x);
577
+ }
578
+
579
+ :host([variant='inside'])
580
+ .input-wrapper:has(.icon-slot[filled].left)
581
+ .input-inside-main
582
+ > .label,
583
+ :host([variant='inside'])
584
+ .input-wrapper:has(.icon-slot[filled].left)
585
+ .chip-container,
586
+ :host([variant='inside'])
587
+ .input-wrapper:has(.icon-slot[filled].left)
588
+ .value-summary,
589
+ :host([variant='inside'])
590
+ .input-wrapper:has(.icon-slot[filled].left)
591
+ .placeholder-label {
592
+ padding-inline-start: 0;
593
+ }
594
+
595
+ /* Left icon / trailing chrome centered to label+value column (like sky-input) */
596
+ :host([variant='inside']) .icon-slot,
597
+ :host([variant='inside']) .icon-slot[filled] {
598
+ align-self: center;
599
+ height: auto;
600
+ max-height: none;
601
+ align-items: center;
602
+ justify-content: center;
603
+ }
604
+
605
+ :host([variant='inside']) .field-trailing {
606
+ align-self: center;
607
+ padding-inline-start: 0;
608
+ }
609
+
610
+ /* Outside labels — keep accent while dropdown is open (focus may leave into popover) */
611
+ .combo-box-container:focus-within > .label,
612
+ .combo-box-container:has(.input-wrapper[open]) > .label {
613
+ color: var(--sky-dropdown-color);
614
+ transition: color 0.3s ease;
615
+ }
616
+
617
+ :host([compact]) .combo-box-container:focus-within > .label,
618
+ :host([compact]) .combo-box-container:has(.input-wrapper[open]) > .label {
619
+ font-size: var(--sky-font-size-xs);
620
+ }
621
+
270
622
  .label {
271
623
  font-size: var(--sky-font-size-sm);
272
- margin-bottom: 5px;
624
+ margin-bottom: var(--sky-space-1, 4px);
273
625
  text-align: start;
274
626
  white-space: nowrap;
275
627
  overflow: hidden;
276
628
  text-overflow: ellipsis;
277
629
  font-family: var(--sky-font);
278
- }
279
-
280
- .combo-box-container:focus-within[compact] .label {
281
- font-size: var(--sky-font-size-xs);
282
- color: var(--sky-dropdown-color);
630
+ line-height: 1.35;
283
631
  }
284
632
 
285
633
  .combo-box-container {
@@ -366,16 +714,19 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
366
714
  -webkit-backdrop-filter: none;
367
715
  box-sizing: border-box;
368
716
  border-radius: var(--sky-radius-secondary);
369
- height: 38px;
717
+ height: var(--sky-input-height);
718
+ min-height: var(--sky-input-height);
370
719
  width: 100%;
371
720
  flex-wrap: nowrap;
372
721
  position: relative;
722
+ overflow: hidden;
373
723
  border: var(--sky-border-primary);
374
724
  box-shadow: var(--sky-box-shadow-primary);
375
- transition: border-color 0.3s ease, box-shadow 0.3s ease;
725
+ transition:
726
+ border-color var(--sky-transition-normal, 200ms ease),
727
+ box-shadow var(--sky-transition-normal, 200ms ease);
376
728
  flex: 1 1 auto;
377
729
  min-width: 0;
378
-
379
730
  }
380
731
 
381
732
  .input-wrapper:focus-visible {
@@ -384,7 +735,7 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
384
735
  }
385
736
 
386
737
  .input-wrapper::after {
387
- content: "";
738
+ content: '';
388
739
  position: absolute;
389
740
  top: -1px;
390
741
  left: -1px;
@@ -409,7 +760,8 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
409
760
  opacity: 1;
410
761
  border-bottom-color: var(--sky-danger-primary);
411
762
  }
412
- :host([validationActive]:invalid) .label {
763
+
764
+ :host([validationActive]:invalid) .label {
413
765
  color: var(--sky-danger-primary);
414
766
  }
415
767
 
@@ -420,14 +772,43 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
420
772
  .placeholder-label.active[compact] {
421
773
  top: 10px;
422
774
  background-color: var(--sky-dropdown-color);
423
- color: white;
775
+ color: var(--sky-on-color-fallback-light, var(--sky-text-white));
424
776
  font-size: var(--sky-font-size-xs);
425
777
  padding: 0 5px;
426
778
  border-radius: 4px;
427
779
  }
428
780
 
429
781
  .input-wrapper[compact] {
430
- height: 30px;
782
+ height: var(--sky-input-height-compact);
783
+ min-height: var(--sky-input-height-compact);
784
+ border-radius: var(--sky-radius-primary);
785
+ }
786
+
787
+ /* Multi chips stay single-line; do not grow taller than sky-input.
788
+ Exempt inside variant — it needs two rows (label + value). */
789
+ .input-wrapper:has(.chip:not([single-select])) {
790
+ height: var(--sky-input-height);
791
+ min-height: var(--sky-input-height);
792
+ padding-block: 0;
793
+ }
794
+
795
+ .input-wrapper[compact]:has(.chip:not([single-select])) {
796
+ height: var(--sky-input-height-compact);
797
+ min-height: var(--sky-input-height-compact);
798
+ padding-block: 0;
799
+ }
800
+
801
+ :host([variant='inside']) .input-wrapper,
802
+ :host([variant='inside']) .input-wrapper:has(.chip),
803
+ :host([variant='inside']) .input-wrapper[compact]:has(.chip) {
804
+ height: auto;
805
+ min-height: var(--sky-input-height-inside);
806
+ padding-block: var(--sky-input-pad-y-sm, 0px);
807
+ }
808
+
809
+ :host([variant='inside'][compact]) .input-wrapper,
810
+ :host([variant='inside'][compact]) .input-wrapper:has(.chip) {
811
+ min-height: var(--sky-input-height-inside-compact);
431
812
  }
432
813
 
433
814
  :host([compact]) .placeholder-label {
@@ -435,23 +816,71 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
435
816
  }
436
817
 
437
818
  sky-icon {
438
- display: inline-block;
819
+ display: inline-flex;
820
+ align-items: center;
821
+ justify-content: center;
439
822
  width: 1em;
440
823
  height: 1em;
824
+ flex-shrink: 0;
825
+ }
826
+
827
+ /* Value column: takes remaining width; never paints under trailing actions */
828
+ .field-main {
829
+ flex: 1 1 0%;
830
+ min-width: 0;
831
+ max-width: 100%;
832
+ overflow: hidden;
833
+ display: flex;
834
+ align-items: center;
835
+ align-self: stretch;
836
+ position: relative;
837
+ z-index: 0;
441
838
  }
442
839
 
443
840
  .chip-container {
444
- margin-left: 5px;
445
841
  display: flex;
446
- gap: 8px;
447
- flex: 1 1 auto;
842
+ gap: var(--sky-input-gap);
843
+ flex: 1 1 0%;
844
+ width: 100%;
448
845
  min-width: 0;
846
+ max-width: 100%;
449
847
  flex-wrap: nowrap;
848
+ align-items: center;
849
+ overflow: hidden;
850
+ box-sizing: border-box;
851
+ margin: 0;
852
+ padding-inline: var(--sky-input-pad-x) var(--sky-input-pad-x-sm);
450
853
  }
451
854
 
452
- :dir(rtl).chip-container {
453
- margin-right: 5px;
454
- margin-left: 0px;
855
+ .input-wrapper:has(.icon-slot[filled].left) .chip-container {
856
+ padding-inline-start: var(--sky-input-pad-x-sm);
857
+ }
858
+
859
+ .value-summary {
860
+ display: block;
861
+ flex: 1 1 0%;
862
+ width: 100%;
863
+ min-width: 0;
864
+ max-width: 100%;
865
+ box-sizing: border-box;
866
+ margin: 0;
867
+ padding-inline: var(--sky-input-pad-x) var(--sky-input-pad-x-sm);
868
+ overflow: hidden;
869
+ text-overflow: ellipsis;
870
+ white-space: nowrap;
871
+ font-size: var(--sky-font-size-md);
872
+ color: var(--sky-text-primary);
873
+ font-family: var(--sky-font);
874
+ line-height: 1.25;
875
+ text-align: start;
876
+ }
877
+
878
+ .input-wrapper:has(.icon-slot[filled].left) .value-summary {
879
+ padding-inline-start: var(--sky-input-pad-x-sm);
880
+ }
881
+
882
+ :host([compact]) .value-summary {
883
+ font-size: var(--sky-font-size-sm);
455
884
  }
456
885
 
457
886
  .chip-container::-webkit-scrollbar {
@@ -465,15 +894,22 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
465
894
  .chip {
466
895
  background-color: var(--sky-glass-primary);
467
896
  border-radius: var(--sky-radius-primary);
468
- padding: 4px 8px;
897
+ padding: 0 6px;
898
+ height: 1.25rem;
899
+ max-height: calc(var(--sky-input-height) - 10px);
469
900
  font-size: var(--sky-font-size-sm);
470
- display: flex;
901
+ line-height: 1;
902
+ display: inline-flex;
471
903
  align-items: center;
472
- gap: 6px;
473
- flex-shrink: 0;
904
+ gap: 4px;
905
+ flex: 0 1 auto;
906
+ max-width: 100%;
474
907
  min-width: 0;
475
908
  border: var(--sky-border-primary);
476
909
  font-family: var(--sky-font);
910
+ text-align: start;
911
+ box-sizing: border-box;
912
+ white-space: nowrap;
477
913
  }
478
914
 
479
915
  .chip .chip-label {
@@ -482,33 +918,20 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
482
918
  overflow: hidden;
483
919
  text-overflow: ellipsis;
484
920
  white-space: nowrap;
921
+ line-height: 1;
485
922
  }
486
923
 
487
- .chip[single-select] {
488
- background-color: transparent;
489
- box-shadow: none;
490
- border: none;
491
- font-size: var(--sky-font-size-md);
492
- padding: 4px;
493
- gap: 0;
494
- overflow: hidden;
495
- text-overflow: ellipsis;
924
+ .chip.overflow-chip {
925
+ flex: 0 0 auto;
496
926
  white-space: nowrap;
497
- min-width: 0;
498
- width:100%;
499
- }
500
-
501
- .chip[single-select] .chip-label {
502
- flex: 1 1 auto;
503
- min-width: 0;
927
+ max-width: none;
504
928
  }
505
929
 
506
- :host([icon-left]) .chip[single-select] {
507
- padding:4px 0;
508
- }
509
-
510
- .chip[single-select] .remove-chip {
511
- display: none;
930
+ :host([compact]) .chip {
931
+ height: 1.125rem;
932
+ max-height: calc(var(--sky-input-height-compact) - 8px);
933
+ padding: 0 4px;
934
+ font-size: var(--sky-font-size-xs);
512
935
  }
513
936
 
514
937
  .chip .remove-chip[compact] {
@@ -521,7 +944,9 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
521
944
  border-radius: var(--sky-radius-full);
522
945
  border: none;
523
946
  cursor: pointer;
524
- transition: color 0.2s ease, background-color 0.2s ease;
947
+ transition:
948
+ color 0.2s ease,
949
+ background-color 0.2s ease;
525
950
  }
526
951
  .remove-chip-inner:hover {
527
952
  color: var(--sky-danger-primary);
@@ -540,7 +965,9 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
540
965
  border-radius: var(--sky-radius-full);
541
966
  cursor: pointer;
542
967
  border: none;
543
- transition: color 0.2s ease, background-color 0.2s ease;
968
+ transition:
969
+ color 0.2s ease,
970
+ background-color 0.2s ease;
544
971
  }
545
972
 
546
973
  .input {
@@ -585,15 +1012,11 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
585
1012
  -webkit-backdrop-filter: var(--sky-blur-tertiary)
586
1013
  var(--sky-brightness-tertiary) var(--sky-saturation-tertiary);
587
1014
  border-radius: var(--sky-radius-secondary);
588
- box-shadow:
589
- var(--sky-box-shadow-inset),
590
- var(--sky-box-shadow-tertiary);
1015
+ box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-tertiary);
591
1016
  box-sizing: border-box;
592
- pointer-events: auto;
593
- margin: 0;
594
-
1017
+ pointer-events: auto;
1018
+ margin: 0;
595
1019
  border: var(--sky-border-tertiary);
596
-
597
1020
  }
598
1021
 
599
1022
  .dropdown-scroller {
@@ -628,17 +1051,6 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
628
1051
  background-color: transparent;
629
1052
  }
630
1053
 
631
- .dropdown-item.active {
632
- background-color: var(--sky-hover-primary);
633
- }
634
- .dropdown-item.selected {
635
- color: var(--sky-dropdown-color, var(--sky-active-primary));
636
- }
637
-
638
- .dropdown-item.active.selected {
639
- background-color: var(--sky-active-g0);
640
- }
641
-
642
1054
  .dropdown-item {
643
1055
  display: flex;
644
1056
  align-items: center;
@@ -649,12 +1061,34 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
649
1061
  text-align: left;
650
1062
  font-size: var(--sky-font-size-sm);
651
1063
  color: var(--sky-text-primary);
652
- transition: all 0.2s ease-in-out;
1064
+ transition:
1065
+ background-color 0.15s ease,
1066
+ color 0.15s ease;
653
1067
  box-sizing: border-box;
654
1068
  margin: 2px 0;
655
1069
  font-family: var(--sky-font);
656
1070
  }
657
1071
 
1072
+ .dropdown-item:hover {
1073
+ background-color: var(--sky-hover-primary);
1074
+ }
1075
+
1076
+ .dropdown-item.active {
1077
+ background-color: var(--sky-hover-primary);
1078
+ }
1079
+
1080
+ .dropdown-item.selected {
1081
+ color: var(--sky-dropdown-color, var(--sky-active-primary));
1082
+ background-color: var(--sky-active-g0, var(--sky-hover-primary));
1083
+ font-weight: var(--sky-font-weight-medium, 500);
1084
+ }
1085
+
1086
+ .dropdown-item.active.selected,
1087
+ .dropdown-item.selected:hover {
1088
+ background-color: var(--sky-active-g0, var(--sky-hover-primary));
1089
+ color: var(--sky-dropdown-color, var(--sky-active-primary));
1090
+ }
1091
+
658
1092
  :host([compact]) .dropdown-item {
659
1093
  font-size: var(--sky-font-size-sm);
660
1094
  padding: 5px 8px;
@@ -666,47 +1100,44 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
666
1100
  justify-content: center;
667
1101
  font-size: var(--sky-font-size-xl);
668
1102
  align-items: center;
669
- border-radius: var(--sky-radius-secondary);
670
- height: inherit;
1103
+ align-self: center;
1104
+ color: var(--sky-text-primary);
1105
+ height: 100%;
671
1106
  max-height: 100%;
672
1107
  box-sizing: border-box;
673
- min-width: 36px;
674
- background: var(--sky-glass-solid);
675
- color: var(--sky-text-primary);
676
- backdrop-filter: none;
677
- -webkit-backdrop-filter: none;
678
-
1108
+ flex: 0 0 var(--sky-input-icon-width);
1109
+ width: var(--sky-input-icon-width);
1110
+ min-width: var(--sky-input-icon-width);
1111
+ padding: 0;
1112
+ background: none;
1113
+ border: none;
1114
+ transition: color var(--sky-transition-normal, 200ms ease);
1115
+ }
1116
+
1117
+ .hidden-chips-dropdown {
1118
+ position: fixed; /* important: popover top layer */
1119
+ background: var(--sky-glass-tertiary);
1120
+ background-image: var(--sky-glass-surface);
1121
+ backdrop-filter: var(--sky-blur-tertiary) var(--sky-brightness-tertiary)
1122
+ var(--sky-saturation-tertiary);
1123
+ -webkit-backdrop-filter: var(--sky-blur-tertiary)
1124
+ var(--sky-brightness-tertiary) var(--sky-saturation-tertiary);
1125
+ box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-tertiary);
1126
+ border-radius: var(--sky-radius-secondary);
1127
+ border: var(--sky-border-tertiary);
1128
+ width: max-content;
1129
+ opacity: 0;
1130
+ transform: scale(0.98);
679
1131
  transition:
680
- transform 0.3s ease,
681
- color 0.3s ease;
682
- }
683
-
684
- .hidden-chips-dropdown {
685
- position: fixed; /* important: popover top layer */
686
- background: var(--sky-glass-tertiary);
687
- background-image: var(--sky-glass-surface);
688
- backdrop-filter: var(--sky-blur-tertiary) var(--sky-brightness-tertiary)
689
- var(--sky-saturation-tertiary);
690
- -webkit-backdrop-filter: var(--sky-blur-tertiary)
691
- var(--sky-brightness-tertiary) var(--sky-saturation-tertiary);
692
- box-shadow:
693
- var(--sky-box-shadow-inset),
694
- var(--sky-box-shadow-tertiary);
695
- border-radius: var(--sky-radius-secondary);
696
- border: var(--sky-border-tertiary);
697
- width: max-content;
698
-
699
- opacity: 0;
700
- transform: scale(0.98);
701
- transition: opacity 0.15s ease, transform 0.15s ease;
702
- margin: 0;
703
- }
704
-
705
- .hidden-chips-dropdown:popover-open {
706
- opacity: 1;
707
- transform: scale(1);
708
- }
1132
+ opacity 0.15s ease,
1133
+ transform 0.15s ease;
1134
+ margin: 0;
1135
+ }
709
1136
 
1137
+ .hidden-chips-dropdown:popover-open {
1138
+ opacity: 1;
1139
+ transform: scale(1);
1140
+ }
710
1141
 
711
1142
  .hidden-chip-inner {
712
1143
  padding: 4px 8px;
@@ -726,112 +1157,131 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
726
1157
 
727
1158
  .icon-slot[filled] {
728
1159
  display: flex;
1160
+ flex-shrink: 0;
729
1161
  cursor: pointer;
730
1162
  }
731
- .icon-slot.left {
732
- border-right: var(--sky-border-primary);
733
- }
734
-
735
- :dir(rtl) .icon-slot.left {
736
- border-left: var(--sky-border-primary);
737
- border-right: unset;
738
- }
739
-
740
- .icon-slot.right {
741
- border-left: var(--sky-border-primary);
742
- }
743
-
744
- :dir(rtl) .icon-slot.right {
745
- border-right: var(--sky-border-primary);
746
- border-left: unset;
747
- }
748
1163
 
749
- .input-wrapper[open] .icon-slot {
750
- transform: translate(-5px, -5px);
751
- border: var(--sky-border-primary) !important;
1164
+ .icon-slot[filled]:hover,
1165
+ .icon-slot[filled]:active,
1166
+ .icon-slot.focused,
1167
+ .input-wrapper[open] .icon-slot[filled] {
752
1168
  color: var(--sky-dropdown-color);
753
- background-color: var(--sky-glass-solid);
754
- }
755
-
756
- :dir(rtl) .input-wrapper[open] .icon-slot {
757
- transform: translate(5px, -5px);
758
- }
759
-
760
- .input-wrapper[open] .icon-slot.right {
761
- transform: translate(5px, -5px);
762
- }
763
-
764
- :dir(rtl) .input-wrapper[open] .icon-slot.right {
765
- transform: translate(-5px, -5px);
766
1169
  }
767
1170
 
768
1171
  .placeholder-label {
769
1172
  white-space: nowrap;
770
- padding: 0 8px;
1173
+ box-sizing: border-box;
1174
+ padding-inline: var(--sky-input-pad-x);
771
1175
  flex: 1 1 0%;
1176
+ width: 100%;
1177
+ min-width: 0;
772
1178
  text-align: start;
773
1179
  font-size: var(--sky-font-size-md);
1180
+ line-height: 1.25;
774
1181
  color: var(--sky-text-tertiary);
775
- transition: all 0.3s ease;
1182
+ transition: color var(--sky-transition-normal, 200ms ease);
776
1183
  pointer-events: none;
777
1184
  overflow: hidden;
778
1185
  text-overflow: ellipsis;
779
1186
  font-family: var(--sky-font);
1187
+ display: flex;
1188
+ align-items: center;
1189
+ align-self: stretch;
1190
+ }
1191
+
1192
+ .input-wrapper:has(.icon-slot[filled].left) .placeholder-label {
1193
+ padding-inline-start: var(--sky-input-pad-x-sm);
780
1194
  }
781
1195
 
782
1196
  .placeholder-label.active {
783
1197
  display: none;
784
1198
  }
785
1199
 
786
- .dropdown-item:hover {
787
- background-color: var(--sky-hover-primary);
1200
+ .field-trailing {
1201
+ display: flex;
1202
+ flex: 0 0 auto;
1203
+ flex-shrink: 0;
1204
+ align-items: center;
1205
+ justify-content: flex-end;
1206
+ align-self: stretch;
1207
+ gap: var(--sky-input-pad-x-sm);
1208
+ padding-inline-end: var(--sky-input-pad-x-sm);
1209
+ padding-inline-start: var(--sky-input-pad-x-sm);
1210
+ box-sizing: border-box;
1211
+ position: relative;
1212
+ z-index: 1;
1213
+ /* Opaque rail so value text never shows through behind clear */
1214
+ background: var(--sky-glass-solid);
1215
+ isolation: isolate;
788
1216
  }
789
1217
 
790
- .clear-button {
791
- flex-shrink: 0;
792
- margin-inline-end: var(--sky-space-1, 4px);
1218
+ sky-icon.clear-button {
1219
+ box-sizing: border-box;
1220
+ flex: 0 0 auto;
1221
+ width: 1.125rem;
1222
+ height: 1.125rem;
1223
+ min-width: 1.125rem;
1224
+ min-height: 1.125rem;
1225
+ margin: 0;
1226
+ padding: 0;
793
1227
  border: none;
794
- font-size: var(--sky-font-size-xl);
1228
+ font-size: 0.75rem;
1229
+ line-height: 1;
795
1230
  color: var(--sky-dropdown-color);
796
1231
  background-color: var(--sky-hover-primary);
797
1232
  border-radius: var(--sky-radius-full);
798
1233
  backdrop-filter: none;
799
1234
  -webkit-backdrop-filter: none;
800
1235
  cursor: pointer;
801
- transition: color 0.3s ease;
1236
+ transition: color var(--sky-transition-normal, 200ms ease);
802
1237
  }
803
1238
 
804
- .clear-button[compact] {
805
- font-size: var(--sky-font-size-md);
1239
+ sky-icon.clear-button[compact] {
1240
+ width: 1rem;
1241
+ height: 1rem;
1242
+ min-width: 1rem;
1243
+ min-height: 1rem;
1244
+ font-size: 0.6875rem;
806
1245
  }
807
1246
 
808
- .clear-button:hover {
1247
+ sky-icon.clear-button:hover {
809
1248
  color: var(--sky-danger-primary);
810
1249
  }
811
1250
 
812
- .dropdown-button {
813
- flex-shrink: 0;
814
- color: var(--sky-text-primary);
815
- height: 100%;
816
- width: auto;
817
- aspect-ratio: 1;
818
- display: flex;
1251
+ sky-icon.dropdown-button {
1252
+ box-sizing: border-box;
1253
+ flex: 0 0 auto;
1254
+ width: var(--sky-input-icon-width);
1255
+ height: auto;
1256
+ min-width: calc(var(--sky-input-icon-width) - 0.25rem);
1257
+ margin: 0;
1258
+ padding: 0;
819
1259
  border: none;
820
1260
  font-size: var(--sky-font-size-sm);
1261
+ color: var(--sky-text-primary);
1262
+ display: inline-flex;
1263
+ align-items: center;
1264
+ justify-content: center;
821
1265
  cursor: pointer;
822
- transition: color 0.3s ease;
1266
+ transition: color var(--sky-transition-normal, 200ms ease);
1267
+ background: none;
823
1268
  }
824
1269
 
825
- .dropdown-button[compact] {
1270
+ sky-icon.dropdown-button:hover,
1271
+ .input-wrapper[open] sky-icon.dropdown-button {
1272
+ color: var(--sky-dropdown-color);
1273
+ }
1274
+
1275
+ sky-icon.dropdown-button[compact] {
826
1276
  font-size: var(--sky-font-size-md);
827
1277
  }
828
1278
 
829
1279
  .loading-indicator {
830
1280
  flex-shrink: 0;
831
- margin-inline-end: var(--sky-space-1, 4px);
1281
+ margin-inline-end: var(--sky-input-pad-x-sm);
832
1282
  width: 16px;
833
1283
  height: 16px;
834
- border: 2px solid var(--sky-text-white);
1284
+ border: 2px solid var(--sky-border-light, var(--sky-text-tertiary));
835
1285
  border-top: 2px solid var(--sky-dropdown-color, var(--sky-active-primary));
836
1286
  border-radius: var(--sky-radius-full);
837
1287
  animation: spin 1s linear infinite;
@@ -872,13 +1322,13 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
872
1322
  white-space: nowrap;
873
1323
  text-overflow: ellipsis;
874
1324
  font-size: var(--sky-font-size-sm);
875
- margin-left: 5px;
1325
+ margin-inline-start: var(--sky-input-pad-x-sm);
876
1326
  font-family: var(--sky-font);
877
1327
  }
878
1328
 
879
1329
  :dir(rtl) .progress-message {
880
- margin-left: unset;
881
- margin-right: 5px;
1330
+ margin-inline-start: unset;
1331
+ margin-inline-end: var(--sky-input-pad-x-sm);
882
1332
  }
883
1333
 
884
1334
  .error-list {
@@ -931,10 +1381,11 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
931
1381
  }
932
1382
 
933
1383
  .sky-checkbox::after {
934
- content: "";
1384
+ content: '';
935
1385
  width: 8px;
936
1386
  height: 4px;
937
- border: 2px solid var(--sky-text-white);
1387
+ border: 2px solid
1388
+ var(--sky-on-color-fallback-light, var(--sky-text-white));
938
1389
  border-top: none;
939
1390
  border-right: none;
940
1391
  position: absolute;
@@ -955,7 +1406,10 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
955
1406
  .sky-checkbox.indeterminate::after {
956
1407
  width: 8px;
957
1408
  height: 2px;
958
- background-color: var(--sky-text-white);
1409
+ background-color: var(
1410
+ --sky-on-color-fallback-light,
1411
+ var(--sky-text-white)
1412
+ );
959
1413
  border: none;
960
1414
  top: 50%;
961
1415
  left: 50%;
@@ -972,5 +1426,7 @@ import{css as t,LitElement as e,html as i}from"lit";import{property as s,state a
972
1426
  opacity: 0.6;
973
1427
  cursor: not-allowed;
974
1428
  }
975
- `,x.shadowRootOptions={...e.shadowRootOptions,delegatesFocus:!0},k([s()],x.prototype,"value",2),k([s({type:String})],x.prototype,"placeholder",2),k([s({type:String})],x.prototype,"searchPlaceholder",2),k([s({type:String})],x.prototype,"label",2),k([s({type:Array})],x.prototype,"options",1),k([s({type:Number})],x.prototype,"chipSize",2),k([s({type:String})],x.prototype,"color",2),k([s({type:Boolean,reflect:!0})],x.prototype,"clearable",2),k([s({type:Boolean,reflect:!0})],x.prototype,"loading",2),k([s({type:Boolean,reflect:!0})],x.prototype,"compact",2),k([s({type:Boolean,reflect:!0})],x.prototype,"disabled",2),k([s({type:Boolean,reflect:!0})],x.prototype,"searchable",2),k([s({type:Boolean,reflect:!0})],x.prototype,"multiSelect",2),k([s({type:Number,reflect:!0})],x.prototype,"visibleChips",2),k([s({type:Boolean,reflect:!0})],x.prototype,"selectAll",2),k([s({type:Array})],x.prototype,"validations",1),k([s({type:Boolean})],x.prototype,"showErrors",2),k([s({type:String})],x.prototype,"errorDisplayMode",2),k([s({type:Boolean,reflect:!0})],x.prototype,"required",2),k([s({type:Boolean,reflect:!0})],x.prototype,"emitFullObject",2),k([s({type:String})],x.prototype,"emittedKey",2),k([s({type:String})],x.prototype,"displayKey",2),k([s({type:Boolean})],x.prototype,"addOption",2),k([s({type:Boolean})],x.prototype,"validationArrayFormat",2),k([s({type:String})],x.prototype,"prefix",2),k([s({type:String})],x.prototype,"suffix",2),k([s({type:String})],x.prototype,"prefixColor",2),k([s({type:String})],x.prototype,"suffixColor",2),k([s({type:String})],x.prototype,"justify",2),k([s({type:Number})],x.prototype,"zIndex",2),k([s({type:String})],x.prototype,"height",2),k([s({type:String})],x.prototype,"requiredMessage",2),k([s({type:Boolean,reflect:!0})],x.prototype,"readonly",2),k([s({type:Boolean})],x.prototype,"enforceMinOneSelection",2),k([s({type:Boolean})],x.prototype,"openAbove",2),k([s({type:Boolean,reflect:!0})],x.prototype,"validationActive",2),k([s({type:Boolean,reflect:!0})],x.prototype,"invalid",2),k([s({type:String,reflect:!0})],x.prototype,"variant",2),k([s({type:String,attribute:!1})],x.prototype,"searchQuery",2),k([o()],x.prototype,"filteredOptions",2),k([o()],x.prototype,"focused",2),k([o()],x.prototype,"open",2),k([o()],x.prototype,"selectedItems",2),k([o()],x.prototype,"hiddenChipsOpen",2),k([o()],x.prototype,"activeIndex",2),k([o()],x.prototype,"validationErrors",2),k([o()],x.prototype,"validationStatus",2),k([o()],x.prototype,"hasLeftIcon",2),k([o()],x.prototype,"hasRightIcon",2),k([o()],x.prototype,"optionSlotSet",2),k([r(".input-wrapper")],x.prototype,"inputWrapperEl",2),k([r(".dropdown")],x.prototype,"dropdownEl",2),k([r(".hidden-chips-dropdown")],x.prototype,"hiddenDropdownEl",2),k([r(".search-container .input")],x.prototype,"searchInputEl",2),k([r(".overflow-chip")],x.prototype,"overflowChipEl",2),k([r(".combo-box-container")],x.prototype,"comboContainerEl",2),k([a("[data-row-index]")],x.prototype,"rowEls",2),k([n({slot:"icon-left"})],x.prototype,"iconLeftEls",2),k([n({slot:"icon-right"})],x.prototype,"iconRightEls",2),x=k([l("sky-combobox")],x);export{x as SkyCombobox};
1429
+
1430
+ ${t(m([{selector:".placeholder-label.active[compact]",fillVar:"--sky-dropdown-color"},{selector:".sky-checkbox:checked::after",fillVar:"--sky-active-primary",property:"border-color"},{selector:".sky-checkbox.indeterminate::after",fillVar:"--sky-active-primary",property:"background-color"}]))}
1431
+ `,S.shadowRootOptions={...i.shadowRootOptions,delegatesFocus:!0},I([r()],S.prototype,"value",2),I([r({type:String})],S.prototype,"placeholder",2),I([r({type:String})],S.prototype,"searchPlaceholder",2),I([r({type:String})],S.prototype,"label",2),I([r({type:Array})],S.prototype,"options",1),I([r({type:Number})],S.prototype,"chipSize",2),I([r({type:String})],S.prototype,"color",2),I([r({type:Boolean,reflect:!0})],S.prototype,"clearable",2),I([r({type:Boolean,reflect:!0})],S.prototype,"loading",2),I([r({type:Boolean,reflect:!0})],S.prototype,"compact",2),I([r({type:Boolean,reflect:!0})],S.prototype,"disabled",2),I([r({type:Boolean,reflect:!0})],S.prototype,"searchable",2),I([r({type:Boolean,reflect:!0})],S.prototype,"multiSelect",2),I([r({type:Number,reflect:!0})],S.prototype,"visibleChips",2),I([r({type:Boolean,reflect:!0})],S.prototype,"selectAll",2),I([r({type:Array})],S.prototype,"validations",1),I([r({type:Boolean})],S.prototype,"showErrors",2),I([r({type:String})],S.prototype,"errorDisplayMode",2),I([r({type:Boolean,reflect:!0})],S.prototype,"required",2),I([r({type:Boolean,reflect:!0})],S.prototype,"emitFullObject",2),I([r({type:String})],S.prototype,"emittedKey",2),I([r({type:String})],S.prototype,"displayKey",2),I([r({type:Boolean})],S.prototype,"addOption",2),I([r({type:Boolean})],S.prototype,"validationArrayFormat",2),I([r({type:String})],S.prototype,"prefix",2),I([r({type:String})],S.prototype,"suffix",2),I([r({type:String})],S.prototype,"prefixColor",2),I([r({type:String})],S.prototype,"suffixColor",2),I([r({type:String})],S.prototype,"justify",2),I([r({type:Number})],S.prototype,"zIndex",2),I([r({type:String})],S.prototype,"height",2),I([r({type:String})],S.prototype,"requiredMessage",2),I([r({type:Boolean,reflect:!0})],S.prototype,"readonly",2),I([r({type:Boolean})],S.prototype,"enforceMinOneSelection",2),I([r({type:Boolean})],S.prototype,"openAbove",2),I([r({type:Boolean,reflect:!0})],S.prototype,"validationActive",2),I([r({type:Boolean,reflect:!0})],S.prototype,"invalid",2),I([r({type:String,reflect:!0})],S.prototype,"variant",2),I([r({type:String,reflect:!0,attribute:"multi-display"})],S.prototype,"multiDisplay",2),I([r({type:String,attribute:!1})],S.prototype,"searchQuery",2),I([n()],S.prototype,"filteredOptions",2),I([n()],S.prototype,"focused",2),I([n()],S.prototype,"open",2),I([n()],S.prototype,"selectedItems",2),I([n()],S.prototype,"hiddenChipsOpen",2),I([n()],S.prototype,"activeIndex",2),I([n()],S.prototype,"validationErrors",2),I([n()],S.prototype,"validationStatus",2),I([n()],S.prototype,"hasLeftIcon",2),I([n()],S.prototype,"hasRightIcon",2),I([n()],S.prototype,"optionSlotSet",2),I([a(".input-wrapper")],S.prototype,"inputWrapperEl",2),I([a(".dropdown")],S.prototype,"dropdownEl",2),I([a(".hidden-chips-dropdown")],S.prototype,"hiddenDropdownEl",2),I([a(".search-container .input")],S.prototype,"searchInputEl",2),I([a(".overflow-chip")],S.prototype,"overflowChipEl",2),I([a(".combo-box-container")],S.prototype,"comboContainerEl",2),I([l("[data-row-index]")],S.prototype,"rowEls",2),I([h({slot:"icon-left"})],S.prototype,"iconLeftEls",2),I([h({slot:"icon-right"})],S.prototype,"iconRightEls",2),S=I([d("sky-combobox")],S);export{S as SkyCombobox};
976
1432
  //# sourceMappingURL=sky-combobox.js.map