@vielzeug/refine 2.3.0 → 2.4.0

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 (193) hide show
  1. package/dist/accordion-item.cjs +1 -1
  2. package/dist/accordion-item.cjs.map +1 -1
  3. package/dist/accordion-item.js +1 -1
  4. package/dist/accordion-item.js.map +1 -1
  5. package/dist/card.cjs +1 -1
  6. package/dist/card.cjs.map +1 -1
  7. package/dist/card.js +1 -1
  8. package/dist/card.js.map +1 -1
  9. package/dist/chat-message.cjs +1 -1
  10. package/dist/chat-message.cjs.map +1 -1
  11. package/dist/chat-message.js +1 -1
  12. package/dist/chat-message.js.map +1 -1
  13. package/dist/combobox.cjs +9 -7
  14. package/dist/combobox.cjs.map +1 -1
  15. package/dist/combobox.js +55 -48
  16. package/dist/combobox.js.map +1 -1
  17. package/dist/content/index.d.ts +2 -0
  18. package/dist/content/index.d.ts.map +1 -1
  19. package/dist/content/list/list-item.css.cjs +1 -1
  20. package/dist/content/list/list-item.css.cjs.map +1 -1
  21. package/dist/content/list/list-item.css.js +1 -1
  22. package/dist/content/list/list-item.css.js.map +1 -1
  23. package/dist/content/list/list-item.d.ts +9 -0
  24. package/dist/content/list/list-item.d.ts.map +1 -1
  25. package/dist/content/stats/stats.css.cjs +2 -0
  26. package/dist/content/stats/stats.css.cjs.map +1 -0
  27. package/dist/content/stats/stats.css.js +6 -0
  28. package/dist/content/stats/stats.css.js.map +1 -0
  29. package/dist/content/stats/stats.d.ts +72 -0
  30. package/dist/content/stats/stats.d.ts.map +1 -0
  31. package/dist/core/auto-resize.cjs +1 -1
  32. package/dist/core/auto-resize.cjs.map +1 -1
  33. package/dist/core/auto-resize.js +1 -1
  34. package/dist/core/auto-resize.js.map +1 -1
  35. package/dist/custom-elements.json +5087 -4791
  36. package/dist/datagrid.cjs +199 -179
  37. package/dist/datagrid.cjs.map +1 -1
  38. package/dist/datagrid.js +435 -321
  39. package/dist/datagrid.js.map +1 -1
  40. package/dist/disclosure/tab-item/tab-item.css.cjs +1 -1
  41. package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
  42. package/dist/disclosure/tab-item/tab-item.css.js +1 -1
  43. package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
  44. package/dist/disclosure/tab-item/tab-item.d.ts +3 -0
  45. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  46. package/dist/disclosure/tabs/tabs.css.cjs +1 -1
  47. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
  48. package/dist/disclosure/tabs/tabs.css.js +1 -1
  49. package/dist/disclosure/tabs/tabs.css.js.map +1 -1
  50. package/dist/disclosure/tabs/tabs.d.ts +4 -0
  51. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  52. package/dist/frameworks/elements.d.ts +2 -1
  53. package/dist/icon.cjs +1 -1
  54. package/dist/icon.cjs.map +1 -1
  55. package/dist/icon.js +1 -1
  56. package/dist/icon.js.map +1 -1
  57. package/dist/input.cjs +5 -4
  58. package/dist/input.cjs.map +1 -1
  59. package/dist/input.js +14 -8
  60. package/dist/input.js.map +1 -1
  61. package/dist/inputs/combobox/combobox-options.cjs +1 -1
  62. package/dist/inputs/combobox/combobox-options.cjs.map +1 -1
  63. package/dist/inputs/combobox/combobox-options.d.ts.map +1 -1
  64. package/dist/inputs/combobox/combobox-options.js +1 -0
  65. package/dist/inputs/combobox/combobox-options.js.map +1 -1
  66. package/dist/inputs/combobox/combobox.css.cjs +1 -1
  67. package/dist/inputs/combobox/combobox.css.cjs.map +1 -1
  68. package/dist/inputs/combobox/combobox.css.js +1 -1
  69. package/dist/inputs/combobox/combobox.css.js.map +1 -1
  70. package/dist/inputs/combobox/combobox.d.ts +1 -0
  71. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  72. package/dist/inputs/combobox/combobox.types.d.ts +7 -0
  73. package/dist/inputs/combobox/combobox.types.d.ts.map +1 -1
  74. package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
  75. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
  76. package/dist/inputs/datagrid/datagrid-model.d.ts +17 -3
  77. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
  78. package/dist/inputs/datagrid/datagrid-model.js +93 -70
  79. package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
  80. package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
  81. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
  82. package/dist/inputs/datagrid/datagrid.css.js +1 -1
  83. package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
  84. package/dist/inputs/datagrid/datagrid.d.ts +54 -4
  85. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  86. package/dist/inputs/index.d.ts +1 -1
  87. package/dist/inputs/index.d.ts.map +1 -1
  88. package/dist/inputs/input/input.css.cjs +1 -1
  89. package/dist/inputs/input/input.css.cjs.map +1 -1
  90. package/dist/inputs/input/input.css.js +1 -1
  91. package/dist/inputs/input/input.css.js.map +1 -1
  92. package/dist/inputs/input/input.d.ts +3 -0
  93. package/dist/inputs/input/input.d.ts.map +1 -1
  94. package/dist/inputs/select/select.css.cjs +1 -1
  95. package/dist/inputs/select/select.css.cjs.map +1 -1
  96. package/dist/inputs/select/select.css.js +1 -1
  97. package/dist/inputs/select/select.css.js.map +1 -1
  98. package/dist/inputs/select/select.d.ts +5 -0
  99. package/dist/inputs/select/select.d.ts.map +1 -1
  100. package/dist/layout/navbar/navbar.d.ts +2 -0
  101. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  102. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  103. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  104. package/dist/layout/sidebar/sidebar.css.js +1 -1
  105. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  106. package/dist/layout/sidebar/sidebar.d.ts +8 -0
  107. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  108. package/dist/list-item.cjs +6 -5
  109. package/dist/list-item.cjs.map +1 -1
  110. package/dist/list-item.js +23 -17
  111. package/dist/list-item.js.map +1 -1
  112. package/dist/list.cjs +1 -1
  113. package/dist/list.cjs.map +1 -1
  114. package/dist/list.js +1 -1
  115. package/dist/list.js.map +1 -1
  116. package/dist/menu.cjs +1 -1
  117. package/dist/menu.cjs.map +1 -1
  118. package/dist/menu.js +1 -1
  119. package/dist/menu.js.map +1 -1
  120. package/dist/navbar.cjs +2 -2
  121. package/dist/navbar.cjs.map +1 -1
  122. package/dist/navbar.js +7 -5
  123. package/dist/navbar.js.map +1 -1
  124. package/dist/navigation-menu.cjs +1 -1
  125. package/dist/navigation-menu.cjs.map +1 -1
  126. package/dist/navigation-menu.js +1 -1
  127. package/dist/navigation-menu.js.map +1 -1
  128. package/dist/overlay/popover/popover.css.cjs +1 -1
  129. package/dist/overlay/popover/popover.css.cjs.map +1 -1
  130. package/dist/overlay/popover/popover.css.js +1 -1
  131. package/dist/overlay/popover/popover.css.js.map +1 -1
  132. package/dist/overlay/popover/popover.d.ts +1 -0
  133. package/dist/overlay/popover/popover.d.ts.map +1 -1
  134. package/dist/overlay/shared/use-dialog.cjs +1 -1
  135. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  136. package/dist/overlay/shared/use-dialog.js +1 -1
  137. package/dist/overlay/shared/use-dialog.js.map +1 -1
  138. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  139. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  140. package/dist/overlay/shared/use-floating-trigger.js +1 -1
  141. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  142. package/dist/popover.cjs.map +1 -1
  143. package/dist/popover.js.map +1 -1
  144. package/dist/radio.cjs +1 -1
  145. package/dist/radio.cjs.map +1 -1
  146. package/dist/radio.js +10 -8
  147. package/dist/radio.js.map +1 -1
  148. package/dist/rating.cjs +1 -1
  149. package/dist/rating.cjs.map +1 -1
  150. package/dist/rating.js +1 -1
  151. package/dist/rating.js.map +1 -1
  152. package/dist/refine.cjs +372 -323
  153. package/dist/refine.cjs.map +1 -1
  154. package/dist/refine.iife.js +372 -323
  155. package/dist/refine.iife.js.map +1 -1
  156. package/dist/refine.js +402 -353
  157. package/dist/refine.js.map +1 -1
  158. package/dist/select.cjs +16 -14
  159. package/dist/select.cjs.map +1 -1
  160. package/dist/select.js +118 -112
  161. package/dist/select.js.map +1 -1
  162. package/dist/sidebar.cjs +28 -23
  163. package/dist/sidebar.cjs.map +1 -1
  164. package/dist/sidebar.js +112 -77
  165. package/dist/sidebar.js.map +1 -1
  166. package/dist/slider.cjs +1 -1
  167. package/dist/slider.cjs.map +1 -1
  168. package/dist/slider.js +1 -1
  169. package/dist/slider.js.map +1 -1
  170. package/dist/stats.cjs +18 -0
  171. package/dist/stats.cjs.map +1 -0
  172. package/dist/stats.js +88 -0
  173. package/dist/stats.js.map +1 -0
  174. package/dist/stepper.cjs +1 -1
  175. package/dist/stepper.cjs.map +1 -1
  176. package/dist/stepper.js +1 -1
  177. package/dist/stepper.js.map +1 -1
  178. package/dist/styles/mixins/animation.css.cjs +2 -0
  179. package/dist/styles/mixins/animation.css.cjs.map +1 -1
  180. package/dist/styles/mixins/animation.css.d.ts.map +1 -1
  181. package/dist/styles/mixins/animation.css.js +2 -0
  182. package/dist/styles/mixins/animation.css.js.map +1 -1
  183. package/dist/tab-item.cjs +1 -1
  184. package/dist/tab-item.cjs.map +1 -1
  185. package/dist/tab-item.js +3 -2
  186. package/dist/tab-item.js.map +1 -1
  187. package/dist/tabs.cjs +1 -1
  188. package/dist/tabs.cjs.map +1 -1
  189. package/dist/tabs.js +3 -1
  190. package/dist/tabs.js.map +1 -1
  191. package/dist/toast.cjs.map +1 -1
  192. package/dist/toast.js.map +1 -1
  193. package/package.json +64 -56
package/dist/combobox.cjs CHANGED
@@ -1,10 +1,11 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./styles/mixins/shape.css.cjs"),n=require("./styles/mixins/theme.css.cjs"),r=require("./core/keyboard.cjs"),i=require("./core/choice-field.cjs"),a=require("./core/ore.cjs"),ee=require("./core/option-list.cjs"),o=require("./inputs/shared/native-field-event.cjs"),s=require("./inputs/combobox/combobox-options.cjs"),c=require("./inputs/combobox/combobox.css.cjs");let l=require("@vielzeug/ore"),u=require("@vielzeug/ripple");var d=`ore-combobox`;(0,l.define)(d,{formAssociated:!0,props:{autoclose:l.prop.bool(!1),color:l.prop.string(),creatable:l.prop.bool(!1),disabled:l.prop.bool(!1),error:l.prop.string(),fullwidth:l.prop.bool(!1),helper:l.prop.string(),label:l.prop.string(),"label-placement":l.prop.oneOf([`inset`,`outside`],`inset`),loading:l.prop.bool(!1),multiple:l.prop.bool(!1),name:l.prop.string(),"no-filter":l.prop.bool(!1),options:l.prop.data(),placeholder:l.prop.string(`Select...`),required:l.prop.bool(!1),rounded:l.prop.string(),size:l.prop.string(),success:l.prop.bool(!1),value:l.prop.string(),variant:l.prop.string()},setup(e){let t=(0,l.getHost)(),n=(0,l.useEmit)(),c=l.watchEffect,d=(0,u.signal)(``),f=null,p=null,m=null,h=null,g=(0,l.ref)(),_=a.lifecycleSignal(l.onCleanup),v=i.createChoiceField({disabled:e.disabled,error:e.error,helper:e.helper,label:e.label,labelPlacement:e[`label-placement`],multiple:e.multiple,prefix:`combobox`,required:e.required,signal:_,value:e.value}),y=(0,u.signal)([]),b=ee.createListboxDropdown({getBoundary:()=>t,getFocusedOptionElement:()=>m?.querySelector(`[data-focused]`)??null,getItems:()=>y.value,getOptionId:e=>`${v.fieldId}-opt-${e}`,getPanel:()=>m,getReference:()=>p,getTrigger:()=>f,isDisabled:()=>v.disabled.value,isItemDisabled:e=>e.disabled,onClose:e=>{n(`open-change`,{open:!1,reason:e}),_.aborted||oe(),v.triggerValidation(`blur`)},onOpen:e=>n(`open-change`,{open:!0,reason:e}),restoreFocus:!1,signal:_}),{disabled:x,fieldId:S,selectedValues:C,triggerValidation:w}=v;v.attachFormField((0,l.useField)({disabled:v.disabled,onReset:v.reset,toFormValue:e=>e,validationMessage:v.validationMessage,validity:v.validity,value:v.formValue}));let{focusedIndex:T,isOpen:E,scrollFocusedIntoView:te,updatePosition:ne}=b,D=()=>!!e.multiple.value,O=()=>!!e.creatable.value,k=()=>!!e[`no-filter`].value;(0,l.bind)({attr:{open:()=>E.value?!0:void 0,size:e.size,variant:e.variant}});let A=null,j=!1,M=(0,u.computed)(()=>C.value[0]??``);Object.defineProperty(t,"value",{configurable:!0,get:()=>v.formValue.value,set:e=>{let t=e;if(Array.isArray(t)){v.setValues(t.map(e=>String(e??``)));return}if(t==null||t===``){v.clear();return}v.setValues(D()?String(t).split(`,`):[String(t)])}});let re=()=>C.value.length>0;function N(){f?.focus()}let P=(0,u.signal)([]),F=(0,u.signal)([]),ie=()=>!!e.loading.value;function I(e){return{disabled:!!e.disabled,iconEl:e.iconEl??null,label:e.label??e.value,value:e.value}}let L=(0,u.computed)(()=>{let t=e.options.value,n=Array.isArray(t)?t.map(I):P.value;return F.value.length===0?n:[...n,...F.value]}),R={clear:()=>{v.clear()},remove:e=>{v.removeValue(e)},select:e=>{v.selectValue(e)},toggle:e=>{v.toggleValue(e)}};function z(e=Array.from(t.children)){if(P.value=s.parseSlottedOptions(e),!D()){let e=L.value.find(e=>e.value===M.value);d.value=e?.label??M.value}}z(),c(()=>{let e=s.filterOptions(L.value,d.value,k());y.value=D()?e.filter(e=>!C.value.includes(e.value)):e});let B=(0,u.computed)(()=>s.getCreatableLabel(d.value,O(),y.value)),V=()=>D()&&C.value.length>0?``:e.placeholder.value||``;function H(){o.dispatchNativeFieldEvent(t,`input`),o.dispatchNativeFieldEvent(t,`change`)}function ae(e){e.stopPropagation();let t=e.detail?.value;t!==void 0&&(R.remove(t),H(),w(`change`))}function oe(){if(!D()){let e=L.value.find(e=>e.value===M.value);j=!0,d.value=e?.label??``,Promise.resolve().then(()=>{j=!1});return}d.value=``}c(()=>{if(E.value&&!D()&&M.value&&T.value===-1&&d.value===``){let e=y.value.findIndex(e=>e.value===M.value);e>=0&&b.set(e)}});function U(e=!0,t=`programmatic`){if(e&&(A=d.value,d.value=``),!D()&&M.value){let e=s.filterOptions(L.value,``,k()).findIndex(e=>e.value===M.value);e>=0&&b.set(e)}b.open(t),!D()&&M.value&&T.value>=0&&requestAnimationFrame(()=>{te()})}function W(e=`programmatic`){b.close(e)}let se=r.createInteraction({disabled:x,onPress:()=>{E.value||U(!0,`click`),N()}}),ce=r.createInteraction({disabled:x,keys:[`Enter`],onPress:e=>{let t=y.value;E.value&&T.value>=0&&T.value<t.length?G(t[T.value],e):E.value&&T.value===-1&&B.value?X(d.value,e):E.value||U(!0,`keyboard`)}});function G(t,n){t.disabled||(D()?(R.toggle(t.value),d.value=``,H(),w(`change`),e.autoclose.value&&W(),N(),requestAnimationFrame(()=>N())):(R.select(t.value),d.value=t.label,H(),w(`change`),W(),N()))}function K(e){let t=e.getAttribute(`data-option-index`),n=t?Number(t):-1;if(Number.isInteger(n)&&n>=0&&n<y.value.length)return y.value[n]??null;let r=e.getAttribute(`data-option-value`);if(r){let e=y.value.find(e=>e.value===r);if(e)return e}let i=e.querySelector(`span`)?.textContent?.trim()??e.textContent?.trim()??``;return i?y.value.find(e=>e.label===i||e.value===i)??null:null}function le(e){e.stopPropagation(),R.clear(),d.value=``,H(),w(`change`),N()}function q(e){let t=e.target,r=t.value;if(!j&&r!==d.value){if(d.value=r,!D()){let e=C.value[0],t=e?L.value.find(t=>t.value===e)?.label??e:``;r===``&&A===t&&(A=null)}b.navigate(`first`),E.value||U(!1,`keyboard`),n(`search`,{query:t.value})}}function J(){}function Y(e){if(!x.value&&!b.handleKeydown(e))switch(e.key){case`ArrowDown`:e.preventDefault(),E.value?b.navigate(`next`):(U(!0,`keyboard`),b.navigate(`first`));break;case`ArrowUp`:e.preventDefault(),E.value?b.navigate(`prev`):U(!0,`keyboard`);break;case`Backspace`:D()&&!d.value&&C.value.length>0&&(v.removeValue(C.value[C.value.length-1]??``),H(),w(`change`));break;case`Enter`:ce.handleKeydown(e);break;case`Tab`:W(`programmatic`)}}function X(e,t){let n=e.trim();if(!n)return;let r={disabled:!1,iconEl:null,label:n,value:s.makeCreatableValue(n)};F.value=[...F.value,r],G(r,t)}let ue=(()=>{let e=new MutationObserver(()=>{z()});return e.observe(t,{attributeFilter:[`disabled`,`label`,`value`],attributes:!0,childList:!0,subtree:!0}),()=>e.disconnect()})(),Z=e=>{let t=e=>{let t=e.target;if(!(t instanceof Element))return;if(t.closest(`.no-results-create`)){e.preventDefault(),e.stopPropagation(),X(d.value,e);return}let n=t.closest(`.option`);if(!n)return;e.preventDefault(),e.stopPropagation();let r=K(n);!r||r.disabled||G(r,e)},n=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`.option`);if(!n)return;let r=K(n);if(!r)return;let i=y.value.findIndex(e=>e.value===r.value);i>=0&&b.set(i)};return e.addEventListener(`click`,t),e.addEventListener(`pointermove`,n),()=>{e.removeEventListener(`click`,t),e.removeEventListener(`pointermove`,n)}},Q=null,$=null,de=e=>{h=e,$!==e&&(Q?.(),Q=null,$=null,e&&(Q=Z(e),$=e))},fe=()=>{h&&($===h&&Q||(Q?.(),Q=Z(h),$=h))};return c(()=>{fe(),E.value?(m&&`showPopover`in m&&!m.matches(`:popover-open`)&&m.showPopover(),ne()):m&&`hidePopover`in m&&m.matches(`:popover-open`)&&m.hidePopover()}),(0,l.onElement)(g,e=>{p=e;let t=e.shadowRoot?.querySelector(`input`)??null;if(!t)return;f=t,t.setAttribute(`role`,`combobox`),t.setAttribute(`autocomplete`,`off`),t.setAttribute(`aria-autocomplete`,`list`),t.setAttribute(`aria-haspopup`,`listbox`),t.setAttribute(`spellcheck`,`false`),t.setAttribute(`aria-controls`,`${S}-listbox`);let n=()=>{E.value||U(!0,`click`),N()};return t.addEventListener(`input`,q),t.addEventListener(`keydown`,Y),t.addEventListener(`focus`,J),t.addEventListener(`click`,n),()=>{f=null,p=null,t.removeEventListener(`input`,q),t.removeEventListener(`keydown`,Y),t.removeEventListener(`focus`,J),t.removeEventListener(`click`,n)}}),c(()=>{if(!g.value)return;let t=f;t&&(t.setAttribute(`aria-expanded`,String(E.value)),x.value?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`),e.error.value?(t.setAttribute(`aria-invalid`,`true`),t.setAttribute(`aria-errormessage`,`${S}-error`)):(t.removeAttribute(`aria-invalid`),t.removeAttribute(`aria-errormessage`)))}),c(()=>{if(!g.value)return;let e=f;e&&e.value!==d.value&&(e.value=d.value)}),(0,l.onCleanup)(()=>{Q?.(),Q=null,$=null,ue()}),l.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./styles/mixins/shape.css.cjs"),n=require("./styles/mixins/theme.css.cjs"),r=require("./core/keyboard.cjs"),i=require("./core/choice-field.cjs"),a=require("./core/ore.cjs"),ee=require("./core/option-list.cjs"),o=require("./inputs/shared/native-field-event.cjs"),s=require("./inputs/combobox/combobox-options.cjs"),c=require("./inputs/combobox/combobox.css.cjs");let l=require("@vielzeug/ore"),u=require("@vielzeug/ripple");var d=`ore-combobox`;(0,l.define)(d,{formAssociated:!0,props:{autoclose:l.prop.bool(!1),color:l.prop.string(),creatable:l.prop.bool(!1),disabled:l.prop.bool(!1),error:l.prop.string(),fullwidth:l.prop.bool(!1),helper:l.prop.string(),"hide-label":l.prop.bool(!1),label:l.prop.string(),"label-placement":l.prop.oneOf([`inset`,`outside`],`inset`),loading:l.prop.bool(!1),multiple:l.prop.bool(!1),name:l.prop.string(),"no-filter":l.prop.bool(!1),options:l.prop.data(),placeholder:l.prop.string(`Select...`),required:l.prop.bool(!1),rounded:l.prop.string(),size:l.prop.string(),success:l.prop.bool(!1),value:l.prop.string(),variant:l.prop.string()},setup(e){let t=(0,l.getHost)(),n=(0,l.useEmit)(),c=l.watchEffect,d=(0,u.signal)(``),f=null,p=null,m=null,h=null,g=(0,l.ref)(),_=a.lifecycleSignal(l.onCleanup),v=i.createChoiceField({disabled:e.disabled,error:e.error,helper:e.helper,label:e.label,labelPlacement:e[`label-placement`],multiple:e.multiple,prefix:`combobox`,required:e.required,signal:_,value:e.value}),y=(0,u.signal)([]),b=ee.createListboxDropdown({getBoundary:()=>t,getFocusedOptionElement:()=>m?.querySelector(`[data-focused]`)??null,getItems:()=>y.value,getOptionId:e=>`${v.fieldId}-opt-${e}`,getPanel:()=>m,getReference:()=>p,getTrigger:()=>f,isDisabled:()=>v.disabled.value,isItemDisabled:e=>e.disabled,onClose:e=>{n(`open-change`,{open:!1,reason:e}),_.aborted||se(),v.triggerValidation(`blur`)},onOpen:e=>n(`open-change`,{open:!0,reason:e}),restoreFocus:!1,signal:_}),{disabled:x,fieldId:S,selectedValues:C,triggerValidation:w}=v;v.attachFormField((0,l.useField)({disabled:v.disabled,onReset:v.reset,toFormValue:e=>e,validationMessage:v.validationMessage,validity:v.validity,value:v.formValue}));let{focusedIndex:T,isOpen:E,scrollFocusedIntoView:te,updatePosition:ne}=b,D=()=>!!e.multiple.value,O=()=>!!e.creatable.value,k=()=>!!e[`no-filter`].value;(0,l.bind)({attr:{open:()=>E.value?!0:void 0,size:e.size,variant:e.variant}});let A=null,j=!1,M=(0,u.computed)(()=>C.value[0]??``);Object.defineProperty(t,"value",{configurable:!0,get:()=>v.formValue.value,set:e=>{let t=e;if(Array.isArray(t)){v.setValues(t.map(e=>String(e??``)));return}if(t==null||t===``){v.clear();return}v.setValues(D()?String(t).split(`,`):[String(t)])}});let re=()=>C.value.length>0;function N(){f?.focus()}let P=(0,u.signal)([]),F=(0,u.signal)([]),ie=()=>!!e.loading.value;function I(e){return{disabled:!!e.disabled,disabledReason:e.disabledReason,iconEl:e.iconEl??null,label:e.label??e.value,value:e.value}}let L=(0,u.computed)(()=>{let t=e.options.value,n=Array.isArray(t)?t.map(I):P.value;return F.value.length===0?n:[...n,...F.value]}),R={clear:()=>{v.clear()},remove:e=>{v.removeValue(e)},select:e=>{v.selectValue(e)},toggle:e=>{v.toggleValue(e)}};function z(e=Array.from(t.children)){if(P.value=s.parseSlottedOptions(e),!D()){let e=L.value.find(e=>e.value===M.value);d.value=e?.label??M.value}}z(),c(()=>{let e=s.filterOptions(L.value,d.value,k());y.value=D()?e.filter(e=>!C.value.includes(e.value)):e});let B=(0,u.computed)(()=>s.getCreatableLabel(d.value,O(),y.value)),ae=()=>D()&&C.value.length>0?``:e.placeholder.value||``;function V(){o.dispatchNativeFieldEvent(t,`input`),o.dispatchNativeFieldEvent(t,`change`)}function oe(e){e.stopPropagation();let t=e.detail?.value;t!==void 0&&(R.remove(t),V(),w(`change`))}function se(){if(!D()){let e=L.value.find(e=>e.value===M.value);j=!0,d.value=e?.label??``,Promise.resolve().then(()=>{j=!1});return}d.value=``}c(()=>{if(E.value&&!D()&&M.value&&T.value===-1&&d.value===``){let e=y.value.findIndex(e=>e.value===M.value);e>=0&&b.set(e)}});function H(e=!0,t=`programmatic`){if(e&&(A=d.value,d.value=``),!D()&&M.value){let e=s.filterOptions(L.value,``,k()).findIndex(e=>e.value===M.value);e>=0&&b.set(e)}b.open(t),!D()&&M.value&&T.value>=0&&requestAnimationFrame(()=>{te()})}function U(e=`programmatic`){b.close(e)}let ce=r.createInteraction({disabled:x,onPress:()=>{E.value||H(!0,`click`),N()}}),le=r.createInteraction({disabled:x,keys:[`Enter`],onPress:e=>{let t=y.value;E.value&&T.value>=0&&T.value<t.length?W(t[T.value],e):E.value&&T.value===-1&&B.value?Y(d.value,e):E.value||H(!0,`keyboard`)}});function W(t,n){t.disabled||(D()?(R.toggle(t.value),d.value=``,V(),w(`change`),e.autoclose.value&&U(),N(),requestAnimationFrame(()=>N())):(R.select(t.value),d.value=t.label,V(),w(`change`),U(),N()))}function G(e){let t=e.getAttribute(`data-option-index`),n=t?Number(t):-1;if(Number.isInteger(n)&&n>=0&&n<y.value.length)return y.value[n]??null;let r=e.getAttribute(`data-option-value`);if(r){let e=y.value.find(e=>e.value===r);if(e)return e}let i=e.querySelector(`span`)?.textContent?.trim()??e.textContent?.trim()??``;return i?y.value.find(e=>e.label===i||e.value===i)??null:null}function ue(e){e.stopPropagation(),R.clear(),d.value=``,V(),w(`change`),N()}function K(e){let t=e.target,r=t.value;if(!j&&r!==d.value){if(d.value=r,!D()){let e=C.value[0],t=e?L.value.find(t=>t.value===e)?.label??e:``;r===``&&A===t&&(A=null)}b.navigate(`first`),E.value||H(!1,`keyboard`),n(`search`,{query:t.value})}}function q(){}function J(e){if(!x.value&&!b.handleKeydown(e))switch(e.key){case`ArrowDown`:e.preventDefault(),E.value?b.navigate(`next`):(H(!0,`keyboard`),b.navigate(`first`));break;case`ArrowUp`:e.preventDefault(),E.value?b.navigate(`prev`):H(!0,`keyboard`);break;case`Backspace`:D()&&!d.value&&C.value.length>0&&(v.removeValue(C.value[C.value.length-1]??``),V(),w(`change`));break;case`Enter`:le.handleKeydown(e);break;case`Tab`:U(`programmatic`)}}function Y(e,t){let n=e.trim();if(!n)return;let r={disabled:!1,iconEl:null,label:n,value:s.makeCreatableValue(n)};F.value=[...F.value,r],W(r,t)}let de=(()=>{let e=new MutationObserver(()=>{z()});return e.observe(t,{attributeFilter:[`disabled`,`disabled-reason`,`label`,`value`],attributes:!0,childList:!0,subtree:!0}),()=>e.disconnect()})(),X=e=>{let t=e=>{let t=e.target;if(!(t instanceof Element))return;if(t.closest(`.no-results-create`)){e.preventDefault(),e.stopPropagation(),Y(d.value,e);return}let n=t.closest(`.option`);if(!n)return;e.preventDefault(),e.stopPropagation();let r=G(n);r&&!r.disabled&&W(r,e)},n=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`.option`);if(!n)return;let r=G(n);if(!r)return;let i=y.value.findIndex(e=>e.value===r.value);i>=0&&b.set(i)};return e.addEventListener(`click`,t),e.addEventListener(`pointermove`,n),()=>{e.removeEventListener(`click`,t),e.removeEventListener(`pointermove`,n)}},Z=null,Q=null,fe=e=>{h=e,Q!==e&&(Z?.(),Z=null,Q=null,e&&(Z=X(e),Q=e))},pe=()=>{h&&(Q===h&&Z||(Z?.(),Z=X(h),Q=h))};c(()=>{pe(),E.value?(m&&`showPopover`in m&&!m.matches(`:popover-open`)&&m.showPopover(),ne()):m&&`hidePopover`in m&&m.matches(`:popover-open`)&&m.hidePopover()}),(0,l.onElement)(g,e=>{p=e;let t=e.shadowRoot?.querySelector(`input`)??null;if(!t)return;f=t,t.setAttribute(`role`,`combobox`),t.setAttribute(`autocomplete`,`off`),t.setAttribute(`aria-autocomplete`,`list`),t.setAttribute(`aria-haspopup`,`listbox`),t.setAttribute(`spellcheck`,`false`),t.setAttribute(`aria-controls`,`${S}-listbox`);let n=()=>{E.value||H(!0,`click`),N()};return t.addEventListener(`input`,K),t.addEventListener(`keydown`,J),t.addEventListener(`focus`,q),t.addEventListener(`click`,n),()=>{f=null,p=null,t.removeEventListener(`input`,K),t.removeEventListener(`keydown`,J),t.removeEventListener(`focus`,q),t.removeEventListener(`click`,n)}}),c(()=>{if(!g.value)return;let t=f;t&&(t.setAttribute(`aria-expanded`,String(E.value)),x.value?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`),e.error.value?(t.setAttribute(`aria-invalid`,`true`),t.setAttribute(`aria-errormessage`,`${S}-error`)):(t.removeAttribute(`aria-invalid`),t.removeAttribute(`aria-errormessage`)))}),c(()=>{if(!g.value)return;let e=f;e&&e.value!==d.value&&(e.value=d.value)}),(0,l.onCleanup)(()=>{Z?.(),Z=null,Q=null,de()});let $=()=>e[`hide-label`].value;return l.html`
2
2
  <slot></slot>
3
3
  <ore-input
4
4
  class="trigger"
5
5
  ref=${g}
6
- label="${()=>e.label.value??``}"
7
- placeholder="${V}"
6
+ aria-label="${()=>$()?e.label.value??``:null}"
7
+ label="${()=>$()?``:e.label.value??``}"
8
+ placeholder="${ae}"
8
9
  label-placement="${()=>e[`label-placement`].value??`inset`}"
9
10
  color="${()=>e.color?.value??void 0}"
10
11
  size="${()=>e.size?.value??void 0}"
@@ -17,7 +18,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
17
18
  ?fullwidth="${()=>e.fullwidth.value?!0:void 0}"
18
19
  ?success="${()=>e.success.value}"
19
20
  name="${()=>e.name.value??``}"
20
- @click="${e=>{se.handleClick(e)}}"
21
+ @click="${e=>{ce.handleClick(e)}}"
21
22
  part="wrapper">
22
23
  <div slot="prefix" class="chips-row">
23
24
  <!-- Keep chip list diffing isolated so input node identity stays stable. -->
@@ -30,7 +31,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
30
31
  variant="flat"
31
32
  size="sm"
32
33
  color="${e.color}"
33
- @remove=${ae}>
34
+ @remove=${oe}>
34
35
  ${L.value.find(e=>e.value===t)?.label??t}
35
36
  </ore-chip>
36
37
  `)}
@@ -44,7 +45,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
44
45
  aria-label="Clear"
45
46
  tabindex="-1"
46
47
  ?hidden=${()=>!re()}
47
- @click="${le}">
48
+ @click="${ue}">
48
49
  <ore-icon name="x" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
49
50
  </button>
50
51
  <span class="combobox-suffix-end">
@@ -75,7 +76,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
75
76
  id="${()=>`${S}-listbox`}"
76
77
  style="${()=>E.value&&y.value.length>0?`height:${y.value.length*36}px;`:``}"
77
78
  aria-label="${()=>e.label.value||e.placeholder.value||`Options`}"
78
- ref=${e=>{de(e)}}>
79
+ ref=${e=>{fe(e)}}>
79
80
  ${()=>E.value?ie()?l.html`
80
81
  <div class="dropdown-loading">Loading...</div>
81
82
  `:y.value.length===0?B.value?l.html`
@@ -98,6 +99,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
98
99
  ?data-selected=${()=>D()?C.value.includes(e.value):M.value===e.value}
99
100
  ?data-disabled=${e.disabled}>
100
101
  <span>${e.label}</span>
102
+ ${e.disabled&&e.disabledReason?l.html`<small class="disabled-reason" title="${e.disabledReason}">${e.disabledReason}</small>`:l.html``}
101
103
  <span class="option-check" aria-hidden="true">
102
104
  <ore-icon name="check" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
103
105
  </span>
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.cjs","names":[],"sources":["../src/inputs/combobox/combobox.ts"],"sourcesContent":["import {\n bind,\n define,\n getHost,\n html,\n onCleanup,\n onElement,\n prop,\n ref,\n useEmit,\n useField,\n watchEffect,\n} from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport {\n createChoiceField,\n createInteraction,\n createListboxDropdown,\n type DropdownCloseReason,\n lifecycleSignal,\n type OverlayOpenReason,\n} from '../../core';\nimport { colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin } from '../../styles';\nimport type { AddEventListeners, ComponentSize, RoundedSize, ThemeColor } from '../../types';\nimport { dispatchNativeFieldEvent } from '../shared/native-field-event';\nimport type { ComboboxOptionInput, ComboboxOptionItem, OreComboboxEvents, OreComboboxProps } from './combobox.types';\nimport { filterOptions, getCreatableLabel, makeCreatableValue, parseSlottedOptions } from './combobox-options';\nimport '../../feedback/chip/chip';\nimport '../input/input';\nimport componentStyles from './combobox.css?inline';\n\nexport type { OreComboboxEvents, OreComboboxProps } from './combobox.types';\n\n/**\n * A searchable select field with multiple selection, custom option creation, and large-list support.\n *\n * @element ore-combobox\n *\n * @attr {string} value - Selected value(s). Use comma-separated for multiple.\n * @attr {boolean} multiple - Enable multiple selection\n * @attr {boolean} creatable - Allow users to create custom options from search query\n * @attr {boolean} no-filter - Disable client-side filtering (useful for server-side search)\n * @attr {string} placeholder - Placeholder text\n * @attr {boolean} required - Require a non-blank selection for native form validation\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n *\n * @fires input - Emitted when the selection changes.\n * @fires change - Emitted when the selection changes.\n * @fires open-change - Emitted when the dropdown state changes. detail: { open, reason }\n * @fires {CustomEvent} search - Emitted when user types. detail: { query: string }\n *\n * @slot - Slotted combobox options and option groups\n * @cssprop --combobox-dropdown-bg - Dropdown panel background color\n * @cssprop --combobox-dropdown-border-color - Dropdown panel border color\n * @cssprop --combobox-option-hover-bg - Option background on hover\n * @cssprop --combobox-option-focus-bg - Option background when keyboard-focused\n * @cssprop --combobox-option-selected-bg - Option background when selected\n * @cssprop --combobox-option-selected-focus-bg - Option background when selected and focused\n * @cssprop --input-bg - Field background (passed through to ore-input)\n * @cssprop --input-border-color - Field border color (passed through to ore-input)\n *\n * @part wrapper - Root wrapper around the entire field\n * @part label - Label element shown inside or outside the field\n * @part field - Field container that holds the trigger input and clear button\n * @part input - Search input used to filter and select options\n * @part clear-btn - Button that clears the current selection/query\n * @part dropdown - Popup list container for options\n * @part helper-text - Helper text displayed below the field\n * @example\n * ```html\n * <ore-combobox label=\"Country\" name=\"country\">\n * <ore-combobox-option value=\"us\">United States</ore-combobox-option>\n * <ore-combobox-option value=\"gb\">United Kingdom</ore-combobox-option>\n * <ore-combobox-option value=\"de\" disabled>Germany</ore-combobox-option>\n * </ore-combobox>\n * ```\n */\nexport const COMBOBOX_TAG = 'ore-combobox' as const;\ndefine<OreComboboxProps>(COMBOBOX_TAG, {\n formAssociated: true,\n props: {\n autoclose: prop.bool(false),\n color: prop.string<ThemeColor>(),\n creatable: prop.bool(false),\n disabled: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n multiple: prop.bool(false),\n name: prop.string(),\n 'no-filter': prop.bool(false),\n options: prop.data<ComboboxOptionInput[]>(),\n placeholder: prop.string('Select...'),\n required: prop.bool(false),\n rounded: prop.string<RoundedSize>(),\n size: prop.string<ComponentSize>(),\n success: prop.bool(false),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreComboboxEvents>();\n const watch = watchEffect;\n\n const query = signal('');\n\n // Element refs needed by the listbox dropdown.\n let inputEl: HTMLInputElement | null = null;\n let fieldEl: HTMLElement | null = null; // set to the ore-input host once it mounts\n let dropdownEl: HTMLElement | null = null;\n let listboxEl: HTMLElement | null = null;\n\n // Ref to the ore-input host; resolved when the template renders.\n const bitInputRef = ref<HTMLElement>();\n\n const abortSignal = lifecycleSignal(onCleanup);\n const choice = createChoiceField({\n disabled: props.disabled,\n error: props.error,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n multiple: props.multiple,\n prefix: 'combobox',\n required: props.required,\n signal: abortSignal,\n value: props.value,\n });\n\n // filteredOptions signal declared before optionList so the getItems getter\n // captures the live signal reference rather than needing a factory indirection.\n const filteredOptions = signal<ComboboxOptionItem[]>([]);\n\n const optionList = createListboxDropdown<ComboboxOptionItem>({\n getBoundary: () => el,\n getFocusedOptionElement: () => dropdownEl?.querySelector<HTMLElement>('[data-focused]') ?? null,\n getItems: () => filteredOptions.value,\n getOptionId: (index) => `${choice.fieldId}-opt-${index}`,\n getPanel: () => dropdownEl,\n getReference: () => fieldEl,\n getTrigger: () => inputEl,\n isDisabled: () => choice.disabled.value,\n isItemDisabled: (option) => option.disabled,\n onClose: (reason) => {\n emit('open-change', { open: false, reason });\n\n if (!abortSignal.aborted) restoreQueryFromSelection();\n\n choice.triggerValidation('blur');\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n restoreFocus: false,\n signal: abortSignal,\n });\n\n const { disabled: isDisabled, fieldId: comboId, selectedValues, triggerValidation } = choice;\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const { focusedIndex, isOpen, scrollFocusedIntoView, updatePosition } = optionList;\n // ── State ────────────────────────────────────────────────────────────────\n const isMultiple = () => Boolean(props.multiple.value);\n const isCreatable = () => Boolean(props.creatable.value);\n const isNoFilter = () => Boolean(props['no-filter'].value);\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n size: props.size,\n variant: props.variant,\n },\n });\n\n let lastQueryBeforeClear: string | null = null;\n let isRestoringQuery = false;\n\n const selectedValue = computed(() => selectedValues.value[0] ?? '');\n\n // Expose a native-like, string-valued `.value` property on the host.\n Object.defineProperty(el, 'value', {\n configurable: true,\n get: () => choice.formValue.value,\n set: (val: unknown) => {\n const v = val as string | string[] | null | undefined;\n\n if (Array.isArray(v)) {\n choice.setValues(v.map((entry) => String(entry ?? '')));\n\n return;\n }\n\n if (v == null || v === '') {\n choice.clear();\n\n return;\n }\n\n choice.setValues(isMultiple() ? String(v).split(',') : [String(v)]);\n },\n });\n\n const hasValue = () => selectedValues.value.length > 0;\n\n function focusLiveInput() {\n inputEl?.focus();\n }\n\n // ── Options ──────────────────────────────────────────────────────────────\n const slottedOptions = signal<ComboboxOptionItem[]>([]);\n const createdOptions = signal<ComboboxOptionItem[]>([]);\n const isLoading = () => Boolean(props.loading.value);\n\n function normalizeOption(option: ComboboxOptionInput): ComboboxOptionItem {\n return {\n disabled: Boolean(option.disabled),\n iconEl: option.iconEl ?? null,\n label: option.label ?? option.value,\n value: option.value,\n };\n }\n\n // Merged options: explicit prop value overrides slotted options.\n const allOptions = computed<ComboboxOptionItem[]>(() => {\n const optionsProp = props.options.value;\n const base = Array.isArray(optionsProp) ? optionsProp.map(normalizeOption) : slottedOptions.value;\n\n if (createdOptions.value.length === 0) return base;\n\n return [...base, ...createdOptions.value];\n });\n\n const selectionController = {\n clear: () => {\n choice.clear();\n },\n remove: (key: string) => {\n choice.removeValue(key);\n },\n select: (key: string) => {\n choice.selectValue(key);\n },\n toggle: (key: string) => {\n choice.toggleValue(key);\n },\n };\n\n function readOptions(elements: Element[] = Array.from(el.children)) {\n slottedOptions.value = parseSlottedOptions(elements);\n\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n query.value = match?.label ?? selectedValue.value;\n }\n }\n\n // Initialize from light DOM immediately; onMounted/observer keep this in sync afterwards.\n readOptions();\n\n watch(() => {\n const nextOptions = filterOptions(allOptions.value, query.value, isNoFilter());\n\n filteredOptions.value = isMultiple()\n ? nextOptions.filter((option) => !selectedValues.value.includes(option.value))\n : nextOptions;\n });\n\n // \"Create\" option shown when creatable + query doesn't match any existing option\n const creatableLabel = computed(() => {\n return getCreatableLabel(query.value, isCreatable(), filteredOptions.value);\n });\n const inputPlaceholder = () =>\n isMultiple() && selectedValues.value.length > 0 ? '' : props.placeholder.value || '';\n\n function emitChange() {\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectionController.remove(value);\n emitChange();\n triggerValidation('change');\n }\n\n function restoreQueryFromSelection() {\n // Keep input text and selected value in sync whenever the popup closes.\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n isRestoringQuery = true;\n query.value = match?.label ?? '';\n Promise.resolve().then(() => {\n isRestoringQuery = false;\n });\n\n return;\n }\n\n query.value = '';\n }\n\n watch(() => {\n if (isOpen.value && !isMultiple() && selectedValue.value && focusedIndex.value === -1 && query.value === '') {\n const selectedIndex = filteredOptions.value.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n });\n\n // ── Open / Close ─────────────────────────────────────────────────────────\n function openPopup(clearFilter = true, reason: OverlayOpenReason = 'programmatic') {\n if (clearFilter) {\n lastQueryBeforeClear = query.value;\n query.value = '';\n }\n\n // Pre-compute focused index BEFORE opening so the first render has it set\n if (!isMultiple() && selectedValue.value) {\n const freshOptions = filterOptions(allOptions.value, '', isNoFilter());\n const selectedIndex = freshOptions.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n\n optionList.open(reason);\n\n if (!isMultiple() && selectedValue.value && focusedIndex.value >= 0) {\n requestAnimationFrame(() => {\n scrollFocusedIntoView();\n });\n }\n }\n\n function closePopup(reason: DropdownCloseReason = 'programmatic') {\n optionList.close(reason);\n }\n\n const fieldPress = createInteraction({\n disabled: isDisabled,\n onPress: () => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n },\n });\n\n const enterPress = createInteraction({\n disabled: isDisabled,\n keys: ['Enter'],\n onPress: (originalEvent: Event) => {\n const opts = filteredOptions.value;\n\n if (isOpen.value && focusedIndex.value >= 0 && focusedIndex.value < opts.length) {\n selectOption(opts[focusedIndex.value], originalEvent);\n } else if (isOpen.value && focusedIndex.value === -1 && creatableLabel.value) {\n // Focused on the \"create\" item\n createOption(query.value, originalEvent);\n } else if (!isOpen.value) {\n openPopup(true, 'keyboard');\n }\n },\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectOption(opt: ComboboxOptionItem, _originalEvent?: Event) {\n if (opt.disabled) return;\n\n if (isMultiple()) {\n selectionController.toggle(opt.value);\n query.value = '';\n emitChange();\n triggerValidation('change');\n\n if (props.autoclose.value) {\n closePopup();\n }\n\n // Keep dropdown open in multiple mode (unless autoclose is true)\n focusLiveInput();\n requestAnimationFrame(() => focusLiveInput());\n } else {\n selectionController.select(opt.value);\n query.value = opt.label;\n emitChange();\n triggerValidation('change');\n closePopup();\n focusLiveInput();\n }\n }\n function resolveOptionFromElement(optionEl: HTMLElement): ComboboxOptionItem | null {\n const indexAttr = optionEl.getAttribute('data-option-index');\n const index = indexAttr ? Number(indexAttr) : -1;\n\n if (Number.isInteger(index) && index >= 0 && index < filteredOptions.value.length) {\n return filteredOptions.value[index] ?? null;\n }\n\n const valueAttr = optionEl.getAttribute('data-option-value');\n\n if (valueAttr) {\n const byValue = filteredOptions.value.find((option) => option.value === valueAttr);\n\n if (byValue) return byValue;\n }\n\n const labelText = optionEl.querySelector('span')?.textContent?.trim() ?? optionEl.textContent?.trim() ?? '';\n\n if (!labelText) return null;\n\n return filteredOptions.value.find((option) => option.label === labelText || option.value === labelText) ?? null;\n }\n function clearValue(e: Event) {\n e.stopPropagation();\n selectionController.clear();\n query.value = '';\n emitChange();\n triggerValidation('change');\n focusLiveInput();\n }\n function handleInput(e: InputEvent) {\n const target = e.target as HTMLInputElement;\n const newValue = target.value;\n\n // Skip all input processing if we're in the middle of restoring the query\n // This prevents the clearing logic from firing during close/restore\n if (isRestoringQuery) {\n return;\n }\n\n if (newValue === query.value) return;\n\n query.value = newValue;\n\n if (!isMultiple()) {\n const currentItem = selectedValues.value[0];\n const currentLabel = currentItem\n ? (allOptions.value.find((o) => o.value === currentItem)?.label ?? currentItem)\n : '';\n\n // Preserve the current selection while typing. Selection should only\n // change when a new option is committed or when the user explicitly clears.\n const isJustOpening = newValue === '' && lastQueryBeforeClear === currentLabel;\n\n if (isJustOpening) {\n lastQueryBeforeClear = null;\n }\n }\n\n optionList.navigate('first');\n\n if (!isOpen.value) openPopup(false, 'keyboard');\n\n emit('search', { query: target.value });\n }\n function handleFocus() {\n // Intentionally no-op: open only on explicit click or keyboard.\n // Opening on every focus surprises users tabbing through a form.\n }\n\n // ── Keyboard Navigation ──────────────────────────────────────────────────\n function handleKeydown(e: KeyboardEvent) {\n if (isDisabled.value) return;\n\n if (optionList.handleKeydown(e)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n optionList.navigate('first');\n } else {\n optionList.navigate('next');\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n } else {\n optionList.navigate('prev');\n }\n\n break;\n case 'Backspace':\n // In multiple mode, remove the last chip when the input is empty\n if (isMultiple() && !query.value && selectedValues.value.length > 0) {\n choice.removeValue(selectedValues.value[selectedValues.value.length - 1] ?? '');\n emitChange();\n triggerValidation('change');\n }\n\n break;\n case 'Enter':\n enterPress.handleKeydown(e);\n\n break;\n case 'Tab':\n closePopup('programmatic');\n break;\n default:\n break;\n }\n }\n\n // ── Create option ────────────────────────────────────────────────────────\n function createOption(rawQuery: string, originalEvent?: Event) {\n const actualLabel = rawQuery.trim();\n\n if (!actualLabel) return;\n\n const value = makeCreatableValue(actualLabel);\n const newOpt: ComboboxOptionItem = { disabled: false, iconEl: null, label: actualLabel, value };\n\n createdOptions.value = [...createdOptions.value, newOpt];\n selectOption(newOpt, originalEvent);\n }\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n const observeLightDomOptions = (): (() => void) => {\n const observer = new MutationObserver(() => {\n readOptions();\n });\n\n observer.observe(el, {\n attributeFilter: ['disabled', 'label', 'value'],\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n };\n\n const stopObserving = observeLightDomOptions();\n\n const createListboxListeners = (listEl: HTMLElement): (() => void) => {\n const handleActivate = (event: Event) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const createRow = target.closest<HTMLElement>('.no-results-create');\n\n if (createRow) {\n event.preventDefault();\n event.stopPropagation();\n createOption(query.value, event);\n\n return;\n }\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option || option.disabled) return;\n\n selectOption(option, event);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n\n listEl.addEventListener('click', handleActivate);\n listEl.addEventListener('pointermove', handlePointerMove);\n\n return () => {\n listEl.removeEventListener('click', handleActivate);\n listEl.removeEventListener('pointermove', handlePointerMove);\n };\n };\n\n let stopListboxListeners: (() => void) | null = null;\n let listboxListenersTarget: HTMLElement | null = null;\n\n const setListboxElement = (el: HTMLElement | null): void => {\n listboxEl = el;\n\n if (listboxListenersTarget === el) return;\n\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n\n if (!el) return;\n\n stopListboxListeners = createListboxListeners(el);\n listboxListenersTarget = el;\n };\n\n const ensureListboxListeners = (): void => {\n if (!listboxEl) return;\n\n if (listboxListenersTarget === listboxEl && stopListboxListeners) return;\n\n stopListboxListeners?.();\n stopListboxListeners = createListboxListeners(listboxEl);\n listboxListenersTarget = listboxEl;\n };\n\n watch(() => {\n ensureListboxListeners();\n\n if (isOpen.value) {\n if (dropdownEl && 'showPopover' in dropdownEl && !dropdownEl.matches(':popover-open')) dropdownEl.showPopover();\n\n updatePosition();\n } else {\n if (dropdownEl && 'hidePopover' in dropdownEl && dropdownEl.matches(':popover-open')) dropdownEl.hidePopover();\n }\n });\n\n // Once ore-input is in the DOM, grab its inner <input> from its shadow root\n // and attach all combobox-specific ARIA + event handlers imperatively.\n // MUST be registered before the ARIA effects below so inputEl is set first\n // when bitInputRef fires (effects run in registration order).\n onElement(bitInputRef, (bitInputEl) => {\n fieldEl = bitInputEl;\n\n const rawInput = bitInputEl.shadowRoot?.querySelector<HTMLInputElement>('input') ?? null;\n\n if (!rawInput) return;\n\n inputEl = rawInput;\n\n rawInput.setAttribute('role', 'combobox');\n rawInput.setAttribute('autocomplete', 'off');\n rawInput.setAttribute('aria-autocomplete', 'list');\n rawInput.setAttribute('aria-haspopup', 'listbox');\n rawInput.setAttribute('spellcheck', 'false');\n rawInput.setAttribute('aria-controls', `${comboId}-listbox`);\n\n const handleInputClick = (): void => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n };\n\n rawInput.addEventListener('input', handleInput as EventListener);\n rawInput.addEventListener('keydown', handleKeydown as EventListener);\n rawInput.addEventListener('focus', handleFocus);\n rawInput.addEventListener('click', handleInputClick);\n\n return () => {\n inputEl = null;\n fieldEl = null;\n rawInput.removeEventListener('input', handleInput as EventListener);\n rawInput.removeEventListener('keydown', handleKeydown as EventListener);\n rawInput.removeEventListener('focus', handleFocus);\n rawInput.removeEventListener('click', handleInputClick);\n };\n });\n\n // Reactively sync combobox-specific ARIA attrs that ore-input doesn't manage.\n // Uses bitInputRef (a signal) as the gate so the effect re-runs when the\n // inner input mounts — inputEl is a plain variable and would not trigger re-runs.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n el.setAttribute('aria-expanded', String(isOpen.value));\n\n if (isDisabled.value) {\n el.setAttribute('aria-disabled', 'true');\n } else {\n el.removeAttribute('aria-disabled');\n }\n\n if (props.error.value) {\n el.setAttribute('aria-invalid', 'true');\n el.setAttribute('aria-errormessage', `${comboId}-error`);\n } else {\n el.removeAttribute('aria-invalid');\n el.removeAttribute('aria-errormessage');\n }\n });\n\n // Reactively sync the query signal into the raw input value.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n if (el.value !== query.value) el.value = query.value;\n });\n\n onCleanup(() => {\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n stopObserving();\n });\n\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => props.size?.value ?? undefined;\n const inputVariant = () => props.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <slot></slot>\n <ore-input\n class=\"trigger\"\n ref=${bitInputRef}\n label=\"${() => props.label.value ?? ''}\"\n placeholder=\"${inputPlaceholder}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n color=\"${inputColor}\"\n size=\"${inputSize}\"\n variant=\"${inputVariant}\"\n rounded=\"${inputRounded}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n ?disabled=\"${isDisabled}\"\n ?required=\"${() => false}\"\n ?fullwidth=\"${inputFullwidth}\"\n ?success=\"${() => props.success.value}\"\n name=\"${() => props.name.value ?? ''}\"\n @click=\"${(e: MouseEvent) => {\n fieldPress.handleClick(e);\n }}\"\n part=\"wrapper\">\n <div slot=\"prefix\" class=\"chips-row\">\n <!-- Keep chip list diffing isolated so input node identity stays stable. -->\n <span class=\"chips-list\">\n ${() =>\n (isMultiple() ? selectedValues.value : []).map(\n (value) => html`\n <ore-chip\n value=${value}\n label=${allOptions.value.find((option) => option.value === value)?.label ?? value}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=\"${props.color}\"\n @remove=${removeChip}>\n ${allOptions.value.find((option) => option.value === value)?.label ?? value}\n </ore-chip>\n `,\n )}\n </span>\n </div>\n <span slot=\"suffix\" class=\"combobox-suffix\" aria-hidden=\"true\">\n <button\n class=\"clear-btn\"\n part=\"clear-btn\"\n type=\"button\"\n aria-label=\"Clear\"\n tabindex=\"-1\"\n ?hidden=${() => !hasValue()}\n @click=\"${clearValue}\">\n <ore-icon name=\"x\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <span class=\"combobox-suffix-end\">\n <span class=\"loader\"></span>\n <span class=\"chevron\">\n <ore-icon name=\"chevron-down\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>\n </span>\n </span>\n </span>\n </ore-input>\n <span\n class=\"sr-only\"\n id=\"${() => `${comboId}-error`}\"\n role=\"alert\"\n aria-live=\"assertive\"\n ?hidden=\"${() => !props.error.value}\">\n ${() => props.error.value ?? ''}\n </span>\n <div\n class=\"dropdown\"\n part=\"dropdown\"\n id=\"${() => `${comboId}-dropdown`}\"\n popover=\"manual\"\n ?data-open=${() => isOpen.value}\n ref=${(el: HTMLElement | null) => {\n dropdownEl = el;\n }}>\n <div\n role=\"listbox\"\n id=\"${() => `${comboId}-listbox`}\"\n style=\"${() =>\n isOpen.value && filteredOptions.value.length > 0 ? `height:${filteredOptions.value.length * 36}px;` : ''}\"\n aria-label=\"${() => props.label.value || props.placeholder.value || 'Options'}\"\n ref=${(el: HTMLElement | null) => {\n setListboxElement(el);\n }}>\n ${() => {\n if (!isOpen.value) return '';\n\n if (isLoading()) {\n return html`\n <div class=\"dropdown-loading\">Loading...</div>\n `;\n }\n\n if (filteredOptions.value.length === 0) {\n if (creatableLabel.value) {\n return html`\n <button type=\"button\" class=\"no-results-create\" ?data-focused=${() => focusedIndex.value === -1}>\n ${creatableLabel.value}\n </button>\n `;\n }\n\n return html`\n <div class=\"no-results\" role=\"presentation\">No results found</div>\n `;\n }\n\n return filteredOptions.value.map((option, index) => {\n return html`\n <div\n class=\"option\"\n role=\"option\"\n id=\"${`${comboId}-opt-${index}`}\"\n data-option-index=\"${index}\"\n data-option-value=\"${option.value}\"\n aria-selected=\"${() =>\n String(\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value,\n )}\"\n aria-disabled=\"${String(option.disabled)}\"\n style=\"${`position:absolute;top:0;left:0;right:0;transform:translateY(${index * 36}px);`}\"\n ?data-focused=${() => focusedIndex.value === index}\n ?data-selected=${() =>\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value}\n ?data-disabled=${option.disabled}>\n <span>${option.label}</span>\n <span class=\"option-check\" aria-hidden=\"true\">\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </span>\n </div>\n `;\n });\n }}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin, componentStyles],\n}) as unknown as AddEventListeners<OreComboboxEvents>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"combobox.cjs","names":[],"sources":["../src/inputs/combobox/combobox.ts"],"sourcesContent":["import {\n bind,\n define,\n getHost,\n html,\n onCleanup,\n onElement,\n prop,\n ref,\n useEmit,\n useField,\n watchEffect,\n} from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport {\n createChoiceField,\n createInteraction,\n createListboxDropdown,\n type DropdownCloseReason,\n lifecycleSignal,\n type OverlayOpenReason,\n} from '../../core';\nimport { colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin } from '../../styles';\nimport type { AddEventListeners, ComponentSize, RoundedSize, ThemeColor } from '../../types';\nimport { dispatchNativeFieldEvent } from '../shared/native-field-event';\nimport type { ComboboxOptionInput, ComboboxOptionItem, OreComboboxEvents, OreComboboxProps } from './combobox.types';\nimport { filterOptions, getCreatableLabel, makeCreatableValue, parseSlottedOptions } from './combobox-options';\nimport '../../feedback/chip/chip';\nimport '../input/input';\nimport componentStyles from './combobox.css?inline';\n\nexport type { OreComboboxEvents, OreComboboxProps } from './combobox.types';\n\n/**\n * A searchable select field with multiple selection, custom option creation, and large-list support.\n *\n * @element ore-combobox\n *\n * @attr {string} value - Selected value(s). Use comma-separated for multiple.\n * @attr {boolean} multiple - Enable multiple selection\n * @attr {boolean} creatable - Allow users to create custom options from search query\n * @attr {boolean} no-filter - Disable client-side filtering (useful for server-side search)\n * @attr {boolean} hide-label - Hide the visible label while retaining its accessible name\n * @attr {string} placeholder - Placeholder text\n * @attr {boolean} required - Require a non-blank selection for native form validation\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n *\n * @fires input - Emitted when the selection changes.\n * @fires change - Emitted when the selection changes.\n * @fires open-change - Emitted when the dropdown state changes. detail: { open, reason }\n * @fires {CustomEvent} search - Emitted when user types. detail: { query: string }\n *\n * @slot - Slotted combobox options and option groups\n * @cssprop --combobox-dropdown-bg - Dropdown panel background color\n * @cssprop --combobox-dropdown-border-color - Dropdown panel border color\n * @cssprop --combobox-option-hover-bg - Option background on hover\n * @cssprop --combobox-option-focus-bg - Option background when keyboard-focused\n * @cssprop --combobox-option-selected-bg - Option background when selected\n * @cssprop --combobox-option-selected-focus-bg - Option background when selected and focused\n * @cssprop --input-bg - Field background (passed through to ore-input)\n * @cssprop --input-border-color - Field border color (passed through to ore-input)\n *\n * @part wrapper - Root wrapper around the entire field\n * @part label - Label element shown inside or outside the field\n * @part field - Field container that holds the trigger input and clear button\n * @part input - Search input used to filter and select options\n * @part clear-btn - Button that clears the current selection/query\n * @part dropdown - Popup list container for options\n * @part helper-text - Helper text displayed below the field\n * @example\n * ```html\n * <ore-combobox label=\"Country\" name=\"country\">\n * <ore-combobox-option value=\"us\">United States</ore-combobox-option>\n * <ore-combobox-option value=\"gb\">United Kingdom</ore-combobox-option>\n * <ore-combobox-option value=\"de\" disabled>Germany</ore-combobox-option>\n * </ore-combobox>\n * ```\n */\nexport const COMBOBOX_TAG = 'ore-combobox' as const;\ndefine<OreComboboxProps>(COMBOBOX_TAG, {\n formAssociated: true,\n props: {\n autoclose: prop.bool(false),\n color: prop.string<ThemeColor>(),\n creatable: prop.bool(false),\n disabled: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n 'hide-label': prop.bool(false),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n multiple: prop.bool(false),\n name: prop.string(),\n 'no-filter': prop.bool(false),\n options: prop.data<ComboboxOptionInput[]>(),\n placeholder: prop.string('Select...'),\n required: prop.bool(false),\n rounded: prop.string<RoundedSize>(),\n size: prop.string<ComponentSize>(),\n success: prop.bool(false),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreComboboxEvents>();\n const watch = watchEffect;\n\n const query = signal('');\n\n // Element refs needed by the listbox dropdown.\n let inputEl: HTMLInputElement | null = null;\n let fieldEl: HTMLElement | null = null; // set to the ore-input host once it mounts\n let dropdownEl: HTMLElement | null = null;\n let listboxEl: HTMLElement | null = null;\n\n // Ref to the ore-input host; resolved when the template renders.\n const bitInputRef = ref<HTMLElement>();\n\n const abortSignal = lifecycleSignal(onCleanup);\n const choice = createChoiceField({\n disabled: props.disabled,\n error: props.error,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n multiple: props.multiple,\n prefix: 'combobox',\n required: props.required,\n signal: abortSignal,\n value: props.value,\n });\n\n // filteredOptions signal declared before optionList so the getItems getter\n // captures the live signal reference rather than needing a factory indirection.\n const filteredOptions = signal<ComboboxOptionItem[]>([]);\n\n const optionList = createListboxDropdown<ComboboxOptionItem>({\n getBoundary: () => el,\n getFocusedOptionElement: () => dropdownEl?.querySelector<HTMLElement>('[data-focused]') ?? null,\n getItems: () => filteredOptions.value,\n getOptionId: (index) => `${choice.fieldId}-opt-${index}`,\n getPanel: () => dropdownEl,\n getReference: () => fieldEl,\n getTrigger: () => inputEl,\n isDisabled: () => choice.disabled.value,\n isItemDisabled: (option) => option.disabled,\n onClose: (reason) => {\n emit('open-change', { open: false, reason });\n\n if (!abortSignal.aborted) restoreQueryFromSelection();\n\n choice.triggerValidation('blur');\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n restoreFocus: false,\n signal: abortSignal,\n });\n\n const { disabled: isDisabled, fieldId: comboId, selectedValues, triggerValidation } = choice;\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const { focusedIndex, isOpen, scrollFocusedIntoView, updatePosition } = optionList;\n // ── State ────────────────────────────────────────────────────────────────\n const isMultiple = () => Boolean(props.multiple.value);\n const isCreatable = () => Boolean(props.creatable.value);\n const isNoFilter = () => Boolean(props['no-filter'].value);\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n size: props.size,\n variant: props.variant,\n },\n });\n\n let lastQueryBeforeClear: string | null = null;\n let isRestoringQuery = false;\n\n const selectedValue = computed(() => selectedValues.value[0] ?? '');\n\n // Expose a native-like, string-valued `.value` property on the host.\n Object.defineProperty(el, 'value', {\n configurable: true,\n get: () => choice.formValue.value,\n set: (val: unknown) => {\n const v = val as string | string[] | null | undefined;\n\n if (Array.isArray(v)) {\n choice.setValues(v.map((entry) => String(entry ?? '')));\n\n return;\n }\n\n if (v == null || v === '') {\n choice.clear();\n\n return;\n }\n\n choice.setValues(isMultiple() ? String(v).split(',') : [String(v)]);\n },\n });\n\n const hasValue = () => selectedValues.value.length > 0;\n\n function focusLiveInput() {\n inputEl?.focus();\n }\n\n // ── Options ──────────────────────────────────────────────────────────────\n const slottedOptions = signal<ComboboxOptionItem[]>([]);\n const createdOptions = signal<ComboboxOptionItem[]>([]);\n const isLoading = () => Boolean(props.loading.value);\n\n function normalizeOption(option: ComboboxOptionInput): ComboboxOptionItem {\n return {\n disabled: Boolean(option.disabled),\n disabledReason: option.disabledReason,\n iconEl: option.iconEl ?? null,\n label: option.label ?? option.value,\n value: option.value,\n };\n }\n\n // Merged options: explicit prop value overrides slotted options.\n const allOptions = computed<ComboboxOptionItem[]>(() => {\n const optionsProp = props.options.value;\n const base = Array.isArray(optionsProp) ? optionsProp.map(normalizeOption) : slottedOptions.value;\n\n if (createdOptions.value.length === 0) return base;\n\n return [...base, ...createdOptions.value];\n });\n\n const selectionController = {\n clear: () => {\n choice.clear();\n },\n remove: (key: string) => {\n choice.removeValue(key);\n },\n select: (key: string) => {\n choice.selectValue(key);\n },\n toggle: (key: string) => {\n choice.toggleValue(key);\n },\n };\n\n function readOptions(elements: Element[] = Array.from(el.children)) {\n slottedOptions.value = parseSlottedOptions(elements);\n\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n query.value = match?.label ?? selectedValue.value;\n }\n }\n\n // Initialize from light DOM immediately; onMounted/observer keep this in sync afterwards.\n readOptions();\n\n watch(() => {\n const nextOptions = filterOptions(allOptions.value, query.value, isNoFilter());\n\n filteredOptions.value = isMultiple()\n ? nextOptions.filter((option) => !selectedValues.value.includes(option.value))\n : nextOptions;\n });\n\n // \"Create\" option shown when creatable + query doesn't match any existing option\n const creatableLabel = computed(() => {\n return getCreatableLabel(query.value, isCreatable(), filteredOptions.value);\n });\n const inputPlaceholder = () =>\n isMultiple() && selectedValues.value.length > 0 ? '' : props.placeholder.value || '';\n\n function emitChange() {\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectionController.remove(value);\n emitChange();\n triggerValidation('change');\n }\n\n function restoreQueryFromSelection() {\n // Keep input text and selected value in sync whenever the popup closes.\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n isRestoringQuery = true;\n query.value = match?.label ?? '';\n Promise.resolve().then(() => {\n isRestoringQuery = false;\n });\n\n return;\n }\n\n query.value = '';\n }\n\n watch(() => {\n if (isOpen.value && !isMultiple() && selectedValue.value && focusedIndex.value === -1 && query.value === '') {\n const selectedIndex = filteredOptions.value.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n });\n\n // ── Open / Close ─────────────────────────────────────────────────────────\n function openPopup(clearFilter = true, reason: OverlayOpenReason = 'programmatic') {\n if (clearFilter) {\n lastQueryBeforeClear = query.value;\n query.value = '';\n }\n\n // Pre-compute focused index BEFORE opening so the first render has it set\n if (!isMultiple() && selectedValue.value) {\n const freshOptions = filterOptions(allOptions.value, '', isNoFilter());\n const selectedIndex = freshOptions.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n\n optionList.open(reason);\n\n if (!isMultiple() && selectedValue.value && focusedIndex.value >= 0) {\n requestAnimationFrame(() => {\n scrollFocusedIntoView();\n });\n }\n }\n\n function closePopup(reason: DropdownCloseReason = 'programmatic') {\n optionList.close(reason);\n }\n\n const fieldPress = createInteraction({\n disabled: isDisabled,\n onPress: () => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n },\n });\n\n const enterPress = createInteraction({\n disabled: isDisabled,\n keys: ['Enter'],\n onPress: (originalEvent: Event) => {\n const opts = filteredOptions.value;\n\n if (isOpen.value && focusedIndex.value >= 0 && focusedIndex.value < opts.length) {\n selectOption(opts[focusedIndex.value], originalEvent);\n } else if (isOpen.value && focusedIndex.value === -1 && creatableLabel.value) {\n // Focused on the \"create\" item\n createOption(query.value, originalEvent);\n } else if (!isOpen.value) {\n openPopup(true, 'keyboard');\n }\n },\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectOption(opt: ComboboxOptionItem, _originalEvent?: Event) {\n if (opt.disabled) return;\n\n if (isMultiple()) {\n selectionController.toggle(opt.value);\n query.value = '';\n emitChange();\n triggerValidation('change');\n\n if (props.autoclose.value) {\n closePopup();\n }\n\n // Keep dropdown open in multiple mode (unless autoclose is true)\n focusLiveInput();\n requestAnimationFrame(() => focusLiveInput());\n } else {\n selectionController.select(opt.value);\n query.value = opt.label;\n emitChange();\n triggerValidation('change');\n closePopup();\n focusLiveInput();\n }\n }\n function resolveOptionFromElement(optionEl: HTMLElement): ComboboxOptionItem | null {\n const indexAttr = optionEl.getAttribute('data-option-index');\n const index = indexAttr ? Number(indexAttr) : -1;\n\n if (Number.isInteger(index) && index >= 0 && index < filteredOptions.value.length) {\n return filteredOptions.value[index] ?? null;\n }\n\n const valueAttr = optionEl.getAttribute('data-option-value');\n\n if (valueAttr) {\n const byValue = filteredOptions.value.find((option) => option.value === valueAttr);\n\n if (byValue) return byValue;\n }\n\n const labelText = optionEl.querySelector('span')?.textContent?.trim() ?? optionEl.textContent?.trim() ?? '';\n\n if (!labelText) return null;\n\n return filteredOptions.value.find((option) => option.label === labelText || option.value === labelText) ?? null;\n }\n function clearValue(e: Event) {\n e.stopPropagation();\n selectionController.clear();\n query.value = '';\n emitChange();\n triggerValidation('change');\n focusLiveInput();\n }\n function handleInput(e: InputEvent) {\n const target = e.target as HTMLInputElement;\n const newValue = target.value;\n\n // Skip all input processing if we're in the middle of restoring the query\n // This prevents the clearing logic from firing during close/restore\n if (isRestoringQuery) {\n return;\n }\n\n if (newValue === query.value) return;\n\n query.value = newValue;\n\n if (!isMultiple()) {\n const currentItem = selectedValues.value[0];\n const currentLabel = currentItem\n ? (allOptions.value.find((o) => o.value === currentItem)?.label ?? currentItem)\n : '';\n\n // Preserve the current selection while typing. Selection should only\n // change when a new option is committed or when the user explicitly clears.\n const isJustOpening = newValue === '' && lastQueryBeforeClear === currentLabel;\n\n if (isJustOpening) {\n lastQueryBeforeClear = null;\n }\n }\n\n optionList.navigate('first');\n\n if (!isOpen.value) openPopup(false, 'keyboard');\n\n emit('search', { query: target.value });\n }\n function handleFocus() {\n // Intentionally no-op: open only on explicit click or keyboard.\n // Opening on every focus surprises users tabbing through a form.\n }\n\n // ── Keyboard Navigation ──────────────────────────────────────────────────\n function handleKeydown(e: KeyboardEvent) {\n if (isDisabled.value) return;\n\n if (optionList.handleKeydown(e)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n optionList.navigate('first');\n } else {\n optionList.navigate('next');\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n } else {\n optionList.navigate('prev');\n }\n\n break;\n case 'Backspace':\n // In multiple mode, remove the last chip when the input is empty\n if (isMultiple() && !query.value && selectedValues.value.length > 0) {\n choice.removeValue(selectedValues.value[selectedValues.value.length - 1] ?? '');\n emitChange();\n triggerValidation('change');\n }\n\n break;\n case 'Enter':\n enterPress.handleKeydown(e);\n\n break;\n case 'Tab':\n closePopup('programmatic');\n break;\n default:\n break;\n }\n }\n\n // ── Create option ────────────────────────────────────────────────────────\n function createOption(rawQuery: string, originalEvent?: Event) {\n const actualLabel = rawQuery.trim();\n\n if (!actualLabel) return;\n\n const value = makeCreatableValue(actualLabel);\n const newOpt: ComboboxOptionItem = { disabled: false, iconEl: null, label: actualLabel, value };\n\n createdOptions.value = [...createdOptions.value, newOpt];\n selectOption(newOpt, originalEvent);\n }\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n const observeLightDomOptions = (): (() => void) => {\n const observer = new MutationObserver(() => {\n readOptions();\n });\n\n observer.observe(el, {\n attributeFilter: ['disabled', 'disabled-reason', 'label', 'value'],\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n };\n\n const stopObserving = observeLightDomOptions();\n\n const createListboxListeners = (listEl: HTMLElement): (() => void) => {\n const handleActivate = (event: Event) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const createRow = target.closest<HTMLElement>('.no-results-create');\n\n if (createRow) {\n event.preventDefault();\n event.stopPropagation();\n createOption(query.value, event);\n\n return;\n }\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option || option.disabled) return;\n\n selectOption(option, event);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n\n listEl.addEventListener('click', handleActivate);\n listEl.addEventListener('pointermove', handlePointerMove);\n\n return () => {\n listEl.removeEventListener('click', handleActivate);\n listEl.removeEventListener('pointermove', handlePointerMove);\n };\n };\n\n let stopListboxListeners: (() => void) | null = null;\n let listboxListenersTarget: HTMLElement | null = null;\n\n const setListboxElement = (el: HTMLElement | null): void => {\n listboxEl = el;\n\n if (listboxListenersTarget === el) return;\n\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n\n if (!el) return;\n\n stopListboxListeners = createListboxListeners(el);\n listboxListenersTarget = el;\n };\n\n const ensureListboxListeners = (): void => {\n if (!listboxEl) return;\n\n if (listboxListenersTarget === listboxEl && stopListboxListeners) return;\n\n stopListboxListeners?.();\n stopListboxListeners = createListboxListeners(listboxEl);\n listboxListenersTarget = listboxEl;\n };\n\n watch(() => {\n ensureListboxListeners();\n\n if (isOpen.value) {\n if (dropdownEl && 'showPopover' in dropdownEl && !dropdownEl.matches(':popover-open')) dropdownEl.showPopover();\n\n updatePosition();\n } else {\n if (dropdownEl && 'hidePopover' in dropdownEl && dropdownEl.matches(':popover-open')) dropdownEl.hidePopover();\n }\n });\n\n // Once ore-input is in the DOM, grab its inner <input> from its shadow root\n // and attach all combobox-specific ARIA + event handlers imperatively.\n // MUST be registered before the ARIA effects below so inputEl is set first\n // when bitInputRef fires (effects run in registration order).\n onElement(bitInputRef, (bitInputEl) => {\n fieldEl = bitInputEl;\n\n const rawInput = bitInputEl.shadowRoot?.querySelector<HTMLInputElement>('input') ?? null;\n\n if (!rawInput) return;\n\n inputEl = rawInput;\n\n rawInput.setAttribute('role', 'combobox');\n rawInput.setAttribute('autocomplete', 'off');\n rawInput.setAttribute('aria-autocomplete', 'list');\n rawInput.setAttribute('aria-haspopup', 'listbox');\n rawInput.setAttribute('spellcheck', 'false');\n rawInput.setAttribute('aria-controls', `${comboId}-listbox`);\n\n const handleInputClick = (): void => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n };\n\n rawInput.addEventListener('input', handleInput as EventListener);\n rawInput.addEventListener('keydown', handleKeydown as EventListener);\n rawInput.addEventListener('focus', handleFocus);\n rawInput.addEventListener('click', handleInputClick);\n\n return () => {\n inputEl = null;\n fieldEl = null;\n rawInput.removeEventListener('input', handleInput as EventListener);\n rawInput.removeEventListener('keydown', handleKeydown as EventListener);\n rawInput.removeEventListener('focus', handleFocus);\n rawInput.removeEventListener('click', handleInputClick);\n };\n });\n\n // Reactively sync combobox-specific ARIA attrs that ore-input doesn't manage.\n // Uses bitInputRef (a signal) as the gate so the effect re-runs when the\n // inner input mounts — inputEl is a plain variable and would not trigger re-runs.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n el.setAttribute('aria-expanded', String(isOpen.value));\n\n if (isDisabled.value) {\n el.setAttribute('aria-disabled', 'true');\n } else {\n el.removeAttribute('aria-disabled');\n }\n\n if (props.error.value) {\n el.setAttribute('aria-invalid', 'true');\n el.setAttribute('aria-errormessage', `${comboId}-error`);\n } else {\n el.removeAttribute('aria-invalid');\n el.removeAttribute('aria-errormessage');\n }\n });\n\n // Reactively sync the query signal into the raw input value.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n if (el.value !== query.value) el.value = query.value;\n });\n\n onCleanup(() => {\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n stopObserving();\n });\n\n const hideLabel = () => props['hide-label'].value;\n const inputAriaLabel = () => (hideLabel() ? (props.label.value ?? '') : null);\n const inputLabel = () => (hideLabel() ? '' : (props.label.value ?? ''));\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => props.size?.value ?? undefined;\n const inputVariant = () => props.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <slot></slot>\n <ore-input\n class=\"trigger\"\n ref=${bitInputRef}\n aria-label=\"${inputAriaLabel}\"\n label=\"${inputLabel}\"\n placeholder=\"${inputPlaceholder}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n color=\"${inputColor}\"\n size=\"${inputSize}\"\n variant=\"${inputVariant}\"\n rounded=\"${inputRounded}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n ?disabled=\"${isDisabled}\"\n ?required=\"${() => false}\"\n ?fullwidth=\"${inputFullwidth}\"\n ?success=\"${() => props.success.value}\"\n name=\"${() => props.name.value ?? ''}\"\n @click=\"${(e: MouseEvent) => {\n fieldPress.handleClick(e);\n }}\"\n part=\"wrapper\">\n <div slot=\"prefix\" class=\"chips-row\">\n <!-- Keep chip list diffing isolated so input node identity stays stable. -->\n <span class=\"chips-list\">\n ${() =>\n (isMultiple() ? selectedValues.value : []).map(\n (value) => html`\n <ore-chip\n value=${value}\n label=${allOptions.value.find((option) => option.value === value)?.label ?? value}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=\"${props.color}\"\n @remove=${removeChip}>\n ${allOptions.value.find((option) => option.value === value)?.label ?? value}\n </ore-chip>\n `,\n )}\n </span>\n </div>\n <span slot=\"suffix\" class=\"combobox-suffix\" aria-hidden=\"true\">\n <button\n class=\"clear-btn\"\n part=\"clear-btn\"\n type=\"button\"\n aria-label=\"Clear\"\n tabindex=\"-1\"\n ?hidden=${() => !hasValue()}\n @click=\"${clearValue}\">\n <ore-icon name=\"x\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <span class=\"combobox-suffix-end\">\n <span class=\"loader\"></span>\n <span class=\"chevron\">\n <ore-icon name=\"chevron-down\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>\n </span>\n </span>\n </span>\n </ore-input>\n <span\n class=\"sr-only\"\n id=\"${() => `${comboId}-error`}\"\n role=\"alert\"\n aria-live=\"assertive\"\n ?hidden=\"${() => !props.error.value}\">\n ${() => props.error.value ?? ''}\n </span>\n <div\n class=\"dropdown\"\n part=\"dropdown\"\n id=\"${() => `${comboId}-dropdown`}\"\n popover=\"manual\"\n ?data-open=${() => isOpen.value}\n ref=${(el: HTMLElement | null) => {\n dropdownEl = el;\n }}>\n <div\n role=\"listbox\"\n id=\"${() => `${comboId}-listbox`}\"\n style=\"${() =>\n isOpen.value && filteredOptions.value.length > 0 ? `height:${filteredOptions.value.length * 36}px;` : ''}\"\n aria-label=\"${() => props.label.value || props.placeholder.value || 'Options'}\"\n ref=${(el: HTMLElement | null) => {\n setListboxElement(el);\n }}>\n ${() => {\n if (!isOpen.value) return '';\n\n if (isLoading()) {\n return html`\n <div class=\"dropdown-loading\">Loading...</div>\n `;\n }\n\n if (filteredOptions.value.length === 0) {\n if (creatableLabel.value) {\n return html`\n <button type=\"button\" class=\"no-results-create\" ?data-focused=${() => focusedIndex.value === -1}>\n ${creatableLabel.value}\n </button>\n `;\n }\n\n return html`\n <div class=\"no-results\" role=\"presentation\">No results found</div>\n `;\n }\n\n return filteredOptions.value.map((option, index) => {\n return html`\n <div\n class=\"option\"\n role=\"option\"\n id=\"${`${comboId}-opt-${index}`}\"\n data-option-index=\"${index}\"\n data-option-value=\"${option.value}\"\n aria-selected=\"${() =>\n String(\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value,\n )}\"\n aria-disabled=\"${String(option.disabled)}\"\n style=\"${`position:absolute;top:0;left:0;right:0;transform:translateY(${index * 36}px);`}\"\n ?data-focused=${() => focusedIndex.value === index}\n ?data-selected=${() =>\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value}\n ?data-disabled=${option.disabled}>\n <span>${option.label}</span>\n ${\n option.disabled && option.disabledReason\n ? html`<small class=\"disabled-reason\" title=\"${option.disabledReason}\">${option.disabledReason}</small>`\n : html``\n }\n <span class=\"option-check\" aria-hidden=\"true\">\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </span>\n </div>\n `;\n });\n }}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin, componentStyles],\n}) as unknown as AddEventListeners<OreComboboxEvents>;\n"],"mappings":"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"}
package/dist/combobox.js CHANGED
@@ -22,6 +22,7 @@ c(m, {
22
22
  error: d.string(),
23
23
  fullwidth: d.bool(!1),
24
24
  helper: d.string(),
25
+ "hide-label": d.bool(!1),
25
26
  label: d.string(),
26
27
  "label-placement": d.oneOf(["inset", "outside"], "inset"),
27
28
  loading: d.bool(!1),
@@ -108,18 +109,19 @@ c(m, {
108
109
  c?.focus();
109
110
  }
110
111
  let P = p([]), F = p([]), ge = () => !!e.loading.value;
111
- function I(e) {
112
+ function _e(e) {
112
113
  return {
113
114
  disabled: !!e.disabled,
115
+ disabledReason: e.disabledReason,
114
116
  iconEl: e.iconEl ?? null,
115
117
  label: e.label ?? e.value,
116
118
  value: e.value
117
119
  };
118
120
  }
119
- let L = f(() => {
120
- let t = e.options.value, n = Array.isArray(t) ? t.map(I) : P.value;
121
+ let I = f(() => {
122
+ let t = e.options.value, n = Array.isArray(t) ? t.map(_e) : P.value;
121
123
  return F.value.length === 0 ? n : [...n, ...F.value];
122
- }), R = {
124
+ }), L = {
123
125
  clear: () => {
124
126
  v.clear();
125
127
  },
@@ -133,28 +135,28 @@ c(m, {
133
135
  v.toggleValue(e);
134
136
  }
135
137
  };
136
- function z(e = Array.from(t.children)) {
138
+ function R(e = Array.from(t.children)) {
137
139
  if (P.value = ae(e), !O()) {
138
- let e = L.value.find((e) => e.value === M.value);
140
+ let e = I.value.find((e) => e.value === M.value);
139
141
  s.value = e?.label ?? M.value;
140
142
  }
141
143
  }
142
- z(), r(() => {
143
- let e = o(L.value, s.value, k());
144
+ R(), r(() => {
145
+ let e = o(I.value, s.value, k());
144
146
  y.value = O() ? e.filter((e) => !C.value.includes(e.value)) : e;
145
147
  });
146
- let B = f(() => re(s.value, me(), y.value)), _e = () => O() && C.value.length > 0 ? "" : e.placeholder.value || "";
147
- function V() {
148
+ let z = f(() => re(s.value, me(), y.value)), ve = () => O() && C.value.length > 0 ? "" : e.placeholder.value || "";
149
+ function B() {
148
150
  a(t, "input"), a(t, "change");
149
151
  }
150
- function ve(e) {
152
+ function V(e) {
151
153
  e.stopPropagation();
152
154
  let t = e.detail?.value;
153
- t !== void 0 && (R.remove(t), V(), w("change"));
155
+ t !== void 0 && (L.remove(t), B(), w("change"));
154
156
  }
155
157
  function ye() {
156
158
  if (!O()) {
157
- let e = L.value.find((e) => e.value === M.value);
159
+ let e = I.value.find((e) => e.value === M.value);
158
160
  j = !0, s.value = e?.label ?? "", Promise.resolve().then(() => {
159
161
  j = !1;
160
162
  });
@@ -170,7 +172,7 @@ c(m, {
170
172
  });
171
173
  function H(e = !0, t = "programmatic") {
172
174
  if (e && (A = s.value, s.value = ""), !O() && M.value) {
173
- let e = o(L.value, "", k()).findIndex((e) => e.value === M.value);
175
+ let e = o(I.value, "", k()).findIndex((e) => e.value === M.value);
174
176
  e >= 0 && b.set(e);
175
177
  }
176
178
  b.open(t), !O() && M.value && T.value >= 0 && requestAnimationFrame(() => {
@@ -190,11 +192,11 @@ c(m, {
190
192
  keys: ["Enter"],
191
193
  onPress: (e) => {
192
194
  let t = y.value;
193
- E.value && T.value >= 0 && T.value < t.length ? W(t[T.value], e) : E.value && T.value === -1 && B.value ? X(s.value, e) : E.value || H(!0, "keyboard");
195
+ E.value && T.value >= 0 && T.value < t.length ? W(t[T.value], e) : E.value && T.value === -1 && z.value ? Y(s.value, e) : E.value || H(!0, "keyboard");
194
196
  }
195
197
  });
196
198
  function W(t, n) {
197
- t.disabled || (O() ? (R.toggle(t.value), s.value = "", V(), w("change"), e.autoclose.value && U(), N(), requestAnimationFrame(() => N())) : (R.select(t.value), s.value = t.label, V(), w("change"), U(), N()));
199
+ t.disabled || (O() ? (L.toggle(t.value), s.value = "", B(), w("change"), e.autoclose.value && U(), N(), requestAnimationFrame(() => N())) : (L.select(t.value), s.value = t.label, B(), w("change"), U(), N()));
198
200
  }
199
201
  function G(e) {
200
202
  let t = e.getAttribute("data-option-index"), n = t ? Number(t) : -1;
@@ -207,21 +209,21 @@ c(m, {
207
209
  let i = e.querySelector("span")?.textContent?.trim() ?? e.textContent?.trim() ?? "";
208
210
  return i ? y.value.find((e) => e.label === i || e.value === i) ?? null : null;
209
211
  }
210
- function K(e) {
211
- e.stopPropagation(), R.clear(), s.value = "", V(), w("change"), N();
212
+ function Se(e) {
213
+ e.stopPropagation(), L.clear(), s.value = "", B(), w("change"), N();
212
214
  }
213
- function q(e) {
215
+ function K(e) {
214
216
  let t = e.target, r = t.value;
215
217
  if (!j && r !== s.value) {
216
218
  if (s.value = r, !O()) {
217
- let e = C.value[0], t = e ? L.value.find((t) => t.value === e)?.label ?? e : "";
219
+ let e = C.value[0], t = e ? I.value.find((t) => t.value === e)?.label ?? e : "";
218
220
  r === "" && A === t && (A = null);
219
221
  }
220
222
  b.navigate("first"), E.value || H(!1, "keyboard"), n("search", { query: t.value });
221
223
  }
222
224
  }
223
- function J() {}
224
- function Y(e) {
225
+ function q() {}
226
+ function J(e) {
225
227
  if (!x.value && !b.handleKeydown(e)) switch (e.key) {
226
228
  case "ArrowDown":
227
229
  e.preventDefault(), E.value ? b.navigate("next") : (H(!0, "keyboard"), b.navigate("first"));
@@ -230,7 +232,7 @@ c(m, {
230
232
  e.preventDefault(), E.value ? b.navigate("prev") : H(!0, "keyboard");
231
233
  break;
232
234
  case "Backspace":
233
- O() && !s.value && C.value.length > 0 && (v.removeValue(C.value[C.value.length - 1] ?? ""), V(), w("change"));
235
+ O() && !s.value && C.value.length > 0 && (v.removeValue(C.value[C.value.length - 1] ?? ""), B(), w("change"));
234
236
  break;
235
237
  case "Enter":
236
238
  xe.handleKeydown(e);
@@ -238,7 +240,7 @@ c(m, {
238
240
  case "Tab": U("programmatic");
239
241
  }
240
242
  }
241
- function X(e, t) {
243
+ function Y(e, t) {
242
244
  let n = e.trim();
243
245
  if (!n) return;
244
246
  let r = {
@@ -249,13 +251,14 @@ c(m, {
249
251
  };
250
252
  F.value = [...F.value, r], W(r, t);
251
253
  }
252
- let Se = (() => {
254
+ let Ce = (() => {
253
255
  let e = new MutationObserver(() => {
254
- z();
256
+ R();
255
257
  });
256
258
  return e.observe(t, {
257
259
  attributeFilter: [
258
260
  "disabled",
261
+ "disabled-reason",
259
262
  "label",
260
263
  "value"
261
264
  ],
@@ -263,19 +266,19 @@ c(m, {
263
266
  childList: !0,
264
267
  subtree: !0
265
268
  }), () => e.disconnect();
266
- })(), Z = (e) => {
269
+ })(), X = (e) => {
267
270
  let t = (e) => {
268
271
  let t = e.target;
269
272
  if (!(t instanceof Element)) return;
270
273
  if (t.closest(".no-results-create")) {
271
- e.preventDefault(), e.stopPropagation(), X(s.value, e);
274
+ e.preventDefault(), e.stopPropagation(), Y(s.value, e);
272
275
  return;
273
276
  }
274
277
  let n = t.closest(".option");
275
278
  if (!n) return;
276
279
  e.preventDefault(), e.stopPropagation();
277
280
  let r = G(n);
278
- !r || r.disabled || W(r, e);
281
+ r && !r.disabled && W(r, e);
279
282
  }, n = (e) => {
280
283
  let t = e.target;
281
284
  if (!(t instanceof Element)) return;
@@ -289,13 +292,13 @@ c(m, {
289
292
  return e.addEventListener("click", t), e.addEventListener("pointermove", n), () => {
290
293
  e.removeEventListener("click", t), e.removeEventListener("pointermove", n);
291
294
  };
292
- }, Q = null, $ = null, Ce = (e) => {
293
- h = e, $ !== e && (Q?.(), Q = null, $ = null, e && (Q = Z(e), $ = e));
294
- }, we = () => {
295
- h && ($ === h && Q || (Q?.(), Q = Z(h), $ = h));
295
+ }, Z = null, Q = null, we = (e) => {
296
+ h = e, Q !== e && (Z?.(), Z = null, Q = null, e && (Z = X(e), Q = e));
297
+ }, Te = () => {
298
+ h && (Q === h && Z || (Z?.(), Z = X(h), Q = h));
296
299
  };
297
- return r(() => {
298
- we(), E.value ? (m && "showPopover" in m && !m.matches(":popover-open") && m.showPopover(), D()) : m && "hidePopover" in m && m.matches(":popover-open") && m.hidePopover();
300
+ r(() => {
301
+ Te(), E.value ? (m && "showPopover" in m && !m.matches(":popover-open") && m.showPopover(), D()) : m && "hidePopover" in m && m.matches(":popover-open") && m.hidePopover();
299
302
  }), ce(g, (e) => {
300
303
  d = e;
301
304
  let t = e.shadowRoot?.querySelector("input") ?? null;
@@ -304,8 +307,8 @@ c(m, {
304
307
  let n = () => {
305
308
  E.value || H(!0, "click"), N();
306
309
  };
307
- return t.addEventListener("input", q), t.addEventListener("keydown", Y), t.addEventListener("focus", J), t.addEventListener("click", n), () => {
308
- c = null, d = null, t.removeEventListener("input", q), t.removeEventListener("keydown", Y), t.removeEventListener("focus", J), t.removeEventListener("click", n);
310
+ return t.addEventListener("input", K), t.addEventListener("keydown", J), t.addEventListener("focus", q), t.addEventListener("click", n), () => {
311
+ c = null, d = null, t.removeEventListener("input", K), t.removeEventListener("keydown", J), t.removeEventListener("focus", q), t.removeEventListener("click", n);
309
312
  };
310
313
  }), r(() => {
311
314
  if (!g.value) return;
@@ -316,14 +319,17 @@ c(m, {
316
319
  let e = c;
317
320
  e && e.value !== s.value && (e.value = s.value);
318
321
  }), u(() => {
319
- Q?.(), Q = null, $ = null, Se();
320
- }), l`
322
+ Z?.(), Z = null, Q = null, Ce();
323
+ });
324
+ let $ = () => e["hide-label"].value;
325
+ return l`
321
326
  <slot></slot>
322
327
  <ore-input
323
328
  class="trigger"
324
329
  ref=${g}
325
- label="${() => e.label.value ?? ""}"
326
- placeholder="${_e}"
330
+ aria-label="${() => $() ? e.label.value ?? "" : null}"
331
+ label="${() => $() ? "" : e.label.value ?? ""}"
332
+ placeholder="${ve}"
327
333
  label-placement="${() => e["label-placement"].value ?? "inset"}"
328
334
  color="${() => e.color?.value ?? void 0}"
329
335
  size="${() => e.size?.value ?? void 0}"
@@ -346,13 +352,13 @@ c(m, {
346
352
  ${() => (O() ? C.value : []).map((t) => l`
347
353
  <ore-chip
348
354
  value=${t}
349
- label=${L.value.find((e) => e.value === t)?.label ?? t}
355
+ label=${I.value.find((e) => e.value === t)?.label ?? t}
350
356
  mode="removable"
351
357
  variant="flat"
352
358
  size="sm"
353
359
  color="${e.color}"
354
- @remove=${ve}>
355
- ${L.value.find((e) => e.value === t)?.label ?? t}
360
+ @remove=${V}>
361
+ ${I.value.find((e) => e.value === t)?.label ?? t}
356
362
  </ore-chip>
357
363
  `)}
358
364
  </span>
@@ -365,7 +371,7 @@ c(m, {
365
371
  aria-label="Clear"
366
372
  tabindex="-1"
367
373
  ?hidden=${() => !he()}
368
- @click="${K}">
374
+ @click="${Se}">
369
375
  <ore-icon name="x" size="12" stroke-width="2.5" aria-hidden="true"></ore-icon>
370
376
  </button>
371
377
  <span class="combobox-suffix-end">
@@ -399,13 +405,13 @@ c(m, {
399
405
  style="${() => E.value && y.value.length > 0 ? `height:${y.value.length * 36}px;` : ""}"
400
406
  aria-label="${() => e.label.value || e.placeholder.value || "Options"}"
401
407
  ref=${(e) => {
402
- Ce(e);
408
+ we(e);
403
409
  }}>
404
410
  ${() => E.value ? ge() ? l`
405
411
  <div class="dropdown-loading">Loading...</div>
406
- ` : y.value.length === 0 ? B.value ? l`
412
+ ` : y.value.length === 0 ? z.value ? l`
407
413
  <button type="button" class="no-results-create" ?data-focused=${() => T.value === -1}>
408
- ${B.value}
414
+ ${z.value}
409
415
  </button>
410
416
  ` : l`
411
417
  <div class="no-results" role="presentation">No results found</div>
@@ -423,6 +429,7 @@ c(m, {
423
429
  ?data-selected=${() => O() ? C.value.includes(e.value) : M.value === e.value}
424
430
  ?data-disabled=${e.disabled}>
425
431
  <span>${e.label}</span>
432
+ ${e.disabled && e.disabledReason ? l`<small class="disabled-reason" title="${e.disabledReason}">${e.disabledReason}</small>` : l``}
426
433
  <span class="option-check" aria-hidden="true">
427
434
  <ore-icon name="check" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
428
435
  </span>