@nvidia-elements/core 0.0.2 → 0.0.4

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 (265) hide show
  1. package/CHANGELOG.md +20 -28
  2. package/NOTICE.md +119 -0
  3. package/README.md +1 -10
  4. package/dist/_virtual/{_@oxc-project_runtime@0.115.0 → _@oxc-project_runtime@0.123.0}/helpers/decorate.js +1 -1
  5. package/dist/accordion/accordion2.js +5 -5
  6. package/dist/alert/alert-banner2.js +1 -1
  7. package/dist/alert/alert-group2.js +2 -2
  8. package/dist/alert/alert.examples.js.map +1 -1
  9. package/dist/alert/alert.examples.json +1 -1
  10. package/dist/alert/alert2.js +2 -2
  11. package/dist/avatar/avatar-group2.js +1 -1
  12. package/dist/avatar/avatar2.js +2 -2
  13. package/dist/badge/badge2.js +2 -2
  14. package/dist/breadcrumb/breadcrumb2.js +2 -2
  15. package/dist/bundle.d.ts +2 -0
  16. package/dist/bundles/index.d.ts +214 -35
  17. package/dist/bundles/index.js +13 -6952
  18. package/dist/button/button.examples.js.map +1 -1
  19. package/dist/button/button.examples.json +3 -3
  20. package/dist/button/button2.js +2 -2
  21. package/dist/button-group/button-group2.js +2 -2
  22. package/dist/card/card2.js +5 -5
  23. package/dist/chat-message/chat-message2.js +2 -2
  24. package/dist/checkbox/checkbox-group2.js +2 -2
  25. package/dist/checkbox/checkbox2.js +2 -2
  26. package/dist/checkbox/define.js +6 -3
  27. package/dist/checkbox/define.js.map +1 -1
  28. package/dist/color/color2.js +2 -2
  29. package/dist/color/define.js +5 -3
  30. package/dist/color/define.js.map +1 -1
  31. package/dist/combobox/combobox.d.ts +5 -0
  32. package/dist/combobox/combobox.examples.js.map +1 -1
  33. package/dist/combobox/combobox.examples.json +22 -0
  34. package/dist/combobox/combobox.js +1 -1
  35. package/dist/combobox/combobox.js.map +1 -1
  36. package/dist/combobox/combobox2.js +110 -61
  37. package/dist/combobox/combobox2.js.map +1 -1
  38. package/dist/combobox/define.js +5 -3
  39. package/dist/combobox/define.js.map +1 -1
  40. package/dist/copy-button/copy-button2.js +2 -2
  41. package/dist/custom-elements-jsx.d.ts +125 -63
  42. package/dist/custom-elements-vue.d.ts +125 -63
  43. package/dist/custom-elements.json +1626 -806
  44. package/dist/data.html.json +204 -46
  45. package/dist/data.snippets.json +9 -0
  46. package/dist/date/date2.js +2 -2
  47. package/dist/date/define.js +5 -3
  48. package/dist/date/define.js.map +1 -1
  49. package/dist/datetime/datetime2.js +2 -2
  50. package/dist/datetime/define.js +5 -3
  51. package/dist/datetime/define.js.map +1 -1
  52. package/dist/dialog/dialog-footer2.js +2 -2
  53. package/dist/dialog/dialog-header2.js +2 -2
  54. package/dist/dialog/dialog2.js +2 -2
  55. package/dist/divider/divider2.js +2 -2
  56. package/dist/dot/dot2.js +2 -2
  57. package/dist/drawer/drawer-content2.js +2 -2
  58. package/dist/drawer/drawer-footer2.js +2 -2
  59. package/dist/drawer/drawer-header2.js +2 -2
  60. package/dist/drawer/drawer2.js +2 -2
  61. package/dist/dropdown/dropdown-footer2.js +2 -2
  62. package/dist/dropdown/dropdown-header2.js +2 -2
  63. package/dist/dropdown/dropdown2.js +2 -2
  64. package/dist/dropdown-group/dropdown-group.js +2 -2
  65. package/dist/dropzone/dropzone.examples.js.map +1 -1
  66. package/dist/dropzone/dropzone.examples.json +3 -1
  67. package/dist/dropzone/dropzone2.js +2 -2
  68. package/dist/file/define.js +5 -3
  69. package/dist/file/define.js.map +1 -1
  70. package/dist/file/file2.js +1 -1
  71. package/dist/format-datetime/define.d.ts +6 -0
  72. package/dist/format-datetime/define.js +7 -0
  73. package/dist/format-datetime/define.js.map +1 -0
  74. package/dist/format-datetime/format-datetime.d.ts +74 -0
  75. package/dist/format-datetime/format-datetime.examples.js +6 -0
  76. package/dist/format-datetime/format-datetime.examples.js.map +1 -0
  77. package/dist/format-datetime/format-datetime.examples.json +87 -0
  78. package/dist/format-datetime/format-datetime.js +6 -0
  79. package/dist/format-datetime/format-datetime.js.map +1 -0
  80. package/dist/format-datetime/format-datetime2.js +77 -0
  81. package/dist/format-datetime/format-datetime2.js.map +1 -0
  82. package/dist/format-datetime/index.d.ts +1 -0
  83. package/dist/format-datetime/index.js +2 -0
  84. package/dist/format-relative-time/define.d.ts +6 -0
  85. package/dist/format-relative-time/define.js +7 -0
  86. package/dist/format-relative-time/define.js.map +1 -0
  87. package/dist/format-relative-time/format-relative-time.d.ts +47 -0
  88. package/dist/format-relative-time/format-relative-time.examples.js +6 -0
  89. package/dist/format-relative-time/format-relative-time.examples.js.map +1 -0
  90. package/dist/format-relative-time/format-relative-time.examples.json +69 -0
  91. package/dist/format-relative-time/format-relative-time.js +6 -0
  92. package/dist/format-relative-time/format-relative-time.js.map +1 -0
  93. package/dist/format-relative-time/format-relative-time2.js +118 -0
  94. package/dist/format-relative-time/format-relative-time2.js.map +1 -0
  95. package/dist/format-relative-time/index.d.ts +1 -0
  96. package/dist/format-relative-time/index.js +2 -0
  97. package/dist/forms/control/control2.js +2 -2
  98. package/dist/forms/control-group/control-group2.js +2 -2
  99. package/dist/forms/control-message/control-message2.js +2 -2
  100. package/dist/forms/forms.examples.js.map +1 -1
  101. package/dist/forms/forms.examples.json +4 -2
  102. package/dist/grid/cell/cell2.js +1 -1
  103. package/dist/grid/column/column.d.ts +1 -0
  104. package/dist/grid/column/column2.js +5 -2
  105. package/dist/grid/column/column2.js.map +1 -1
  106. package/dist/grid/footer/footer2.js +2 -2
  107. package/dist/grid/grid.examples.js.map +1 -1
  108. package/dist/grid/grid.examples.json +1 -1
  109. package/dist/grid/grid2.js +2 -2
  110. package/dist/grid/header/header2.js +2 -2
  111. package/dist/grid/placeholder/placeholder2.js +1 -1
  112. package/dist/grid/row/row2.js +2 -2
  113. package/dist/icon/icon2.js +3 -3
  114. package/dist/icon-button/icon-button2.js +2 -2
  115. package/dist/index.js +1 -1
  116. package/dist/input/define.js +6 -3
  117. package/dist/input/define.js.map +1 -1
  118. package/dist/input/input-group2.js +1 -1
  119. package/dist/input/input2.js +2 -2
  120. package/dist/internal/base/button.js +1 -1
  121. package/dist/internal/index.js +40 -40
  122. package/dist/internal/services/global.service.js +1 -1
  123. package/dist/internal/services/i18n.service.d.ts +1 -0
  124. package/dist/internal/services/i18n.service.js +2 -1
  125. package/dist/internal/services/i18n.service.js.map +1 -1
  126. package/dist/internal/utils/dom.d.ts +10 -0
  127. package/dist/internal/utils/dom.js +57 -51
  128. package/dist/internal/utils/dom.js.map +1 -1
  129. package/dist/logo/logo2.js +2 -2
  130. package/dist/menu/menu-item2.js +2 -2
  131. package/dist/menu/menu.d.ts +3 -0
  132. package/dist/menu/menu2.js +23 -2
  133. package/dist/menu/menu2.js.map +1 -1
  134. package/dist/month/define.js +5 -3
  135. package/dist/month/define.js.map +1 -1
  136. package/dist/month/month2.js +2 -2
  137. package/dist/notification/notification-group2.js +2 -2
  138. package/dist/notification/notification2.js +2 -2
  139. package/dist/page/page-panel/page-panel-content2.js +1 -1
  140. package/dist/page/page-panel/page-panel-footer2.js +2 -2
  141. package/dist/page/page-panel/page-panel-header2.js +2 -2
  142. package/dist/page/page-panel/page-panel2.js +2 -2
  143. package/dist/page/page.examples.js.map +1 -1
  144. package/dist/page/page.examples.json +0 -11
  145. package/dist/page/page2.js +2 -2
  146. package/dist/page-header/page-header.examples.js.map +1 -1
  147. package/dist/page-header/page-header.examples.json +2 -2
  148. package/dist/page-header/page-header2.js +1 -1
  149. package/dist/page-loader/page-loader.js +1 -1
  150. package/dist/page-loader/page-loader.js.map +1 -1
  151. package/dist/page-loader/page-loader2.js +2 -2
  152. package/dist/pagination/pagination2.js +2 -2
  153. package/dist/panel/panel2.js +5 -5
  154. package/dist/password/define.js +5 -3
  155. package/dist/password/define.js.map +1 -1
  156. package/dist/password/password2.js +2 -2
  157. package/dist/preferences-input/preferences-input2.js +2 -2
  158. package/dist/progress-bar/progress-bar2.js +2 -2
  159. package/dist/progress-ring/progress-ring2.js +2 -2
  160. package/dist/progressive-filter-chip/progressive-filter-chip2.js +2 -2
  161. package/dist/pulse/pulse2.js +2 -2
  162. package/dist/radio/define.js +6 -3
  163. package/dist/radio/define.js.map +1 -1
  164. package/dist/radio/radio-group2.js +2 -2
  165. package/dist/radio/radio2.js +2 -2
  166. package/dist/range/define.js +5 -3
  167. package/dist/range/define.js.map +1 -1
  168. package/dist/range/range2.js +2 -2
  169. package/dist/resize-handle/resize-handle.examples.js.map +1 -1
  170. package/dist/resize-handle/resize-handle.examples.json +3 -1
  171. package/dist/resize-handle/resize-handle2.js +2 -2
  172. package/dist/search/define.js +5 -3
  173. package/dist/search/define.js.map +1 -1
  174. package/dist/search/search2.js +2 -2
  175. package/dist/select/define.js +5 -3
  176. package/dist/select/define.js.map +1 -1
  177. package/dist/select/select2.js +2 -2
  178. package/dist/skeleton/skeleton.examples.js.map +1 -1
  179. package/dist/skeleton/skeleton.examples.json +3 -1
  180. package/dist/skeleton/skeleton2.js +2 -2
  181. package/dist/sort-button/sort-button2.js +2 -2
  182. package/dist/sparkline/sparkline.examples.js.map +1 -1
  183. package/dist/sparkline/sparkline.examples.json +3 -1
  184. package/dist/sparkline/sparkline.utils.js +2 -8
  185. package/dist/sparkline/sparkline.utils.js.map +1 -1
  186. package/dist/sparkline/sparkline2.js +2 -2
  187. package/dist/star-rating/define.js +5 -3
  188. package/dist/star-rating/define.js.map +1 -1
  189. package/dist/star-rating/star-rating2.js +2 -2
  190. package/dist/steps/steps2.js +3 -3
  191. package/dist/switch/define.js +6 -3
  192. package/dist/switch/define.js.map +1 -1
  193. package/dist/switch/switch-group2.js +2 -2
  194. package/dist/switch/switch2.js +2 -2
  195. package/dist/tabs/define.d.ts +2 -1
  196. package/dist/tabs/define.js +2 -1
  197. package/dist/tabs/define.js.map +1 -1
  198. package/dist/tabs/index.d.ts +1 -0
  199. package/dist/tabs/index.js +2 -1
  200. package/dist/tabs/tabs-group.d.ts +51 -0
  201. package/dist/tabs/tabs-group.js +6 -0
  202. package/dist/tabs/tabs-group.js.map +1 -0
  203. package/dist/tabs/tabs-group2.js +144 -0
  204. package/dist/tabs/tabs-group2.js.map +1 -0
  205. package/dist/tabs/tabs.examples.js.map +1 -1
  206. package/dist/tabs/tabs.examples.json +38 -2
  207. package/dist/tabs/tabs2.js +3 -3
  208. package/dist/tag/tag2.js +2 -2
  209. package/dist/textarea/define.js +5 -3
  210. package/dist/textarea/define.js.map +1 -1
  211. package/dist/textarea/textarea2.js +1 -1
  212. package/dist/time/define.js +5 -3
  213. package/dist/time/define.js.map +1 -1
  214. package/dist/time/time2.js +2 -2
  215. package/dist/toast/toast2.js +2 -2
  216. package/dist/toggletip/toggletip-footer2.js +2 -2
  217. package/dist/toggletip/toggletip-header2.js +2 -2
  218. package/dist/toggletip/toggletip2.js +2 -2
  219. package/dist/toolbar/toolbar2.js +2 -2
  220. package/dist/tooltip/tooltip2.js +2 -2
  221. package/dist/tree/tree-node.d.ts +1 -1
  222. package/dist/tree/tree-node.js +1 -1
  223. package/dist/tree/tree-node.js.map +1 -1
  224. package/dist/tree/tree-node2.js +2 -2
  225. package/dist/tree/tree-node2.js.map +1 -1
  226. package/dist/tree/tree.examples.js.map +1 -1
  227. package/dist/tree/tree.examples.json +1 -10
  228. package/dist/tree/tree2.js +2 -2
  229. package/dist/week/define.js +5 -3
  230. package/dist/week/define.js.map +1 -1
  231. package/dist/week/week2.js +2 -2
  232. package/package.json +43 -41
  233. package/dist/app-header/app-header.d.ts +0 -39
  234. package/dist/app-header/app-header.js +0 -6
  235. package/dist/app-header/app-header.js.map +0 -1
  236. package/dist/app-header/app-header2.js +0 -54
  237. package/dist/app-header/app-header2.js.map +0 -1
  238. package/dist/app-header/define.d.ts +0 -6
  239. package/dist/app-header/define.js +0 -7
  240. package/dist/app-header/define.js.map +0 -1
  241. package/dist/app-header/index.d.ts +0 -1
  242. package/dist/app-header/index.js +0 -2
  243. package/dist/bundles/audit-logs.js +0 -50
  244. package/dist/bundles/icons.js +0 -285
  245. package/dist/bundles/index.css +0 -2
  246. package/dist/bundles/log.service.js +0 -90
  247. package/dist/bundles/rolldown-runtime.js +0 -11
  248. package/dist/css/module.layout.css +0 -1
  249. package/dist/css/module.typography.css +0 -1
  250. package/dist/index.css +0 -1
  251. package/dist/json-viewer/define.d.ts +0 -8
  252. package/dist/json-viewer/define.js +0 -8
  253. package/dist/json-viewer/define.js.map +0 -1
  254. package/dist/json-viewer/index.d.ts +0 -2
  255. package/dist/json-viewer/index.js +0 -3
  256. package/dist/json-viewer/json-viewer.d.ts +0 -25
  257. package/dist/json-viewer/json-viewer.js +0 -6
  258. package/dist/json-viewer/json-viewer.js.map +0 -1
  259. package/dist/json-viewer/json-viewer2.js +0 -39
  260. package/dist/json-viewer/json-viewer2.js.map +0 -1
  261. package/dist/json-viewer/node/node.d.ts +0 -21
  262. package/dist/json-viewer/node/node.js +0 -6
  263. package/dist/json-viewer/node/node.js.map +0 -1
  264. package/dist/json-viewer/node/node2.js +0 -72
  265. package/dist/json-viewer/node/node2.js.map +0 -1
@@ -1,8 +1,7 @@
1
1
  import { focusElementTimeout as e } from "../internal/utils/focus.js";
2
- import { getDisplayValue as t, getElementUpdate as n } from "../internal/utils/dom.js";
3
- import { onChildListMutation as r } from "../internal/utils/events.js";
2
+ import { getDisplayValue as t, getElementUpdate as n, getPropertyChanges as r } from "../internal/utils/dom.js";
4
3
  import { createLightDismiss as i } from "../internal/utils/keynav.js";
5
- import { __decorate as a } from "../_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.js";
4
+ import { __decorate as a } from "../_virtual/_@oxc-project_runtime@0.123.0/helpers/decorate.js";
6
5
  import { scopedRegistry as o } from "../internal/decorators/scoped-registry.js";
7
6
  import { useStyles as s } from "../internal/styles/index.js";
8
7
  import { Icon as c } from "../icon/icon2.js";
@@ -32,7 +31,7 @@ var S = class extends l {
32
31
  static {
33
32
  this.metadata = {
34
33
  tag: "nve-combobox",
35
- version: "0.0.2"
34
+ version: "0.0.4"
36
35
  };
37
36
  }
38
37
  static {
@@ -74,40 +73,59 @@ var S = class extends l {
74
73
  get #u() {
75
74
  return !!this.querySelector("[slot=\"footer\"]");
76
75
  }
77
- #d = [];
76
+ get #d() {
77
+ if (!this.behaviorCreate || this.input?.disabled) return !1;
78
+ let e = this.input?.value.trim();
79
+ return e ? !this.#f(e) : !1;
80
+ }
81
+ #f(e) {
82
+ let t = e.toLowerCase();
83
+ return this.#i.find((e) => (e.textContent.trim() || e.value).toLowerCase() === t || e.value.toLowerCase() === t);
84
+ }
85
+ #p = [];
86
+ #m = !1;
78
87
  get prefixContent() {
79
- return this.#r?.multiple && !this.notags ? _`<div class="tags-label" aria-hidden="true">${this.#r.selectedOptions.length} ${this.i18n.selected}</div><div class="tags">${Array.from(this.#r.selectedOptions).map((e) => _`<nve-tag part="tag" readonly="readonly" color="gray-slate" closable .value="${e.value}" @click="${() => this.#E(e)}">${t(e)}</nve-tag>`)}</div>` : _`<slot name="prefix-icon"></slot>`;
88
+ return this.#r?.multiple && !this.notags ? _`<div class="tags-label" aria-hidden="true">${this.#r.selectedOptions.length} ${this.i18n.selected}</div><div class="tags">${Array.from(this.#r.selectedOptions).map((e) => _`<nve-tag part="tag" readonly="readonly" color="gray-slate" closable .value="${e.value}" @click="${() => this.#M(e)}">${t(e)}</nve-tag>`)}</div>` : _`<slot name="prefix-icon"></slot>`;
80
89
  }
81
- get #f() {
90
+ get #h() {
82
91
  return (this.#t?.options?.length ?? 0) > 50;
83
92
  }
84
- get #p() {
93
+ get #g() {
85
94
  return !this._internals.states.has("dirty");
86
95
  }
87
96
  get suffixContent() {
88
97
  if (v) return y;
89
- let e = this.#i, n = this.#f, r = this.#p, i = e.filter((e) => !e.hidden).filter((e) => !(e.value === "" && e.disabled)), a = i.filter((e) => !e.disabled).length === 0;
90
- return _`<nve-dropdown part="dropdown" .popoverType="${"manual"}" .modal="${!1}" @open="${(e) => e.target.hidden = !1}" @close="${this.#A}" hidden .anchor="${this.#s}" .trigger="${this.#s}" position="bottom"><nve-menu part="menu" role="listbox" style="--width:100%;--min-width:fit-content" aria-label="${x(this.i18n.select)}">${i.map((e) => _`<nve-menu-item part="menu-item" .option="${t(e)}" role="option" @click="${() => this.#E(e)}" ?selected="${e.selected}" aria-selected="${e.selected ? "true" : "false"}" ?disabled="${e.disabled}" aria-label="${t(e)}">${this.#m(e)} ${n || r ? t(e) : _`<span role="presentation">${(e.label ? e.label : e.value)?.split("")?.map((e, t) => _`<span ?matches="${this.#D(e, t)}">${e}</span>`)}</span>`}</nve-menu-item>`)} ${a ? _`<nve-menu-item part="menu-item" .value="${""}" disabled="disabled">${this.i18n.noResults}</nve-menu-item>` : y}</nve-menu><slot name="footer"></slot></nve-dropdown>`;
98
+ let e = this.#i, n = this.#h, r = this.#g, i = e.filter((e) => !e.hidden).filter((e) => !(e.value === "" && e.disabled)), a = i.filter((e) => !e.disabled).length === 0, o = this.#d;
99
+ return _`<nve-dropdown part="dropdown" .popoverType="${"manual"}" .modal="${!1}" @open="${this.#D}" @close="${this.#R}" hidden .anchor="${this.#s}" .trigger="${this.#s}" position="bottom"><nve-menu part="menu" role="listbox" style="--width:100%;--min-width:fit-content" aria-label="${x(this.i18n.select)}">${i.map((e) => _`<nve-menu-item part="menu-item" .option="${t(e)}" role="option" @click="${() => this.#M(e)}" ?selected="${e.selected}" aria-selected="${e.selected ? "true" : "false"}" ?disabled="${e.disabled}" aria-label="${t(e)}">${this.#_(e)} ${n || r ? t(e) : _`<span role="presentation">${(e.label ? e.label : e.value)?.split("")?.map((e, t) => _`<span ?matches="${this.#F(e, t)}">${e}</span>`)}</span>`}</nve-menu-item>`)} ${a && !o ? _`<nve-menu-item part="menu-item" .value="${""}" disabled="disabled">${this.i18n.noResults}</nve-menu-item>` : y} ${o ? _`<nve-menu-item part="create-option" role="button" aria-label="${`${this.i18n.create} "${this.input?.value.trim()}"`}" @click="${this.#N}"><nve-icon part="icon" name="add" size="sm"></nve-icon>"${this.input?.value.trim()}"</nve-menu-item>` : y}</nve-menu><slot name="footer"></slot></nve-dropdown>`;
91
100
  }
92
- #m(e) {
101
+ #_(e) {
93
102
  let t = this.#r;
94
- return t?.multiple && this.#f ? _`<input aria-hidden="true" type="checkbox" .checked="${e.selected}" .disabled="${e.disabled}" .name="${e.selected ? "check" : void 0}">` : t?.multiple ? _`<nve-checkbox part="checkbox"><input aria-hidden="true" type="checkbox" .checked="${e.selected}" .disabled="${e.disabled}" .name="${e.selected ? "check" : void 0}"></nve-checkbox>` : t ? _`<nve-icon part="icon" name="check" size="sm"></nve-icon>` : y;
103
+ return t?.multiple && this.#h ? _`<input aria-hidden="true" type="checkbox" .checked="${e.selected}" .disabled="${e.disabled}" .name="${e.selected ? "check" : void 0}">` : t?.multiple ? _`<nve-checkbox part="checkbox"><input aria-hidden="true" type="checkbox" .checked="${e.selected}" .disabled="${e.disabled}" .name="${e.selected ? "check" : void 0}"></nve-checkbox>` : t ? _`<nve-icon part="icon" name="check" size="sm"></nve-icon>` : y;
95
104
  }
96
105
  async firstUpdated(e) {
97
106
  super.firstUpdated(e), this.shadowRoot.addEventListener("slotchange", () => {
98
- this.#e = null, this.#n = null;
99
- }), await this.updateComplete, this.#h(), this.#g(), this.#S(), this.#C(), this.#T(), this.#P(), this.#I(), await this.#w(), this.input.setAttribute("list", ""), this.input.autocomplete = "off";
107
+ this.#e = null, this.#n = null, this.#T();
108
+ }), await this.updateComplete, this.#v(), this.#y(), this.#O(), this.#k(), this.#j(), this.#H(), this.#W(), await this.#A(), this.input.setAttribute("list", ""), this.input.autocomplete = "off";
100
109
  }
101
110
  connectedCallback() {
102
- super.connectedCallback(), this.#d.push(r(this, () => {
103
- this.#x(), this.requestUpdate();
104
- }, {
111
+ super.connectedCallback();
112
+ let e = new MutationObserver((e) => {
113
+ e.some((e) => e.type === "childList" && e.target === this) && (this.#e = null, this.#n = null), this.#T();
114
+ });
115
+ e.observe(this, {
116
+ childList: !0,
117
+ subtree: !0,
105
118
  attributes: !0,
106
- subtree: !0
107
- }));
119
+ attributeFilter: [
120
+ "selected",
121
+ "disabled",
122
+ "value"
123
+ ],
124
+ characterData: !0
125
+ }), this.#p.push(e);
108
126
  }
109
127
  disconnectedCallback() {
110
- super.disconnectedCallback(), this.#d.forEach((e) => e.disconnect());
128
+ super.disconnectedCallback(), this.#p.forEach((e) => e.disconnect());
111
129
  }
112
130
  reset() {
113
131
  this.#o.hidePopover(), this.#r && (this.#r.selectedIndex = -1), super.reset();
@@ -115,39 +133,55 @@ var S = class extends l {
115
133
  selectAll() {
116
134
  this.#i.forEach((e) => e.selected = !0), this.requestUpdate(), this.#r.dispatchEvent(new Event("input", { bubbles: !0 })), this.#r.dispatchEvent(new Event("change", { bubbles: !0 }));
117
135
  }
118
- #h() {
119
- this.#r && !this.#r.multiple && (this.#_(), this.#y(), this.#x());
136
+ #v() {
137
+ this.#r && !this.#r.multiple && (this.#b(), this.#S(), this.#w());
120
138
  }
121
- #g() {
122
- this.#r?.multiple && (this.#_(), this.#y(), this.#x(), this._internals.states.add("multiple"));
139
+ #y() {
140
+ this.#r?.multiple && (this.#b(), this.#S(), this.#w(), this._internals.states.add("multiple"));
123
141
  }
124
- #_() {
142
+ #b() {
125
143
  let e = Array.from(this.#r.selectedOptions).find((e) => e.hasAttribute("selected"));
126
144
  e && !this.#r.multiple && !this.input.defaultValue && (this.input.value = t(e));
127
145
  }
128
- #v() {
146
+ #x() {
129
147
  !this.#r.multiple && !this.input.defaultValue && (this.input.value = t(Array.from(this.#r.selectedOptions).find((e) => e.value === this.#r.value)));
130
148
  }
131
- #y() {
132
- this.#d.push(n(this.#r, "value", () => {
133
- this.#v(), this.requestUpdate();
149
+ #S() {
150
+ this.#p.push(n(this.#r, "value", () => {
151
+ this.#x(), this.requestUpdate();
134
152
  }));
135
153
  }
136
- #b = /* @__PURE__ */ new Set();
137
- #x() {
154
+ #C = /* @__PURE__ */ new Set();
155
+ #w() {
138
156
  this.#i.forEach((e) => {
139
- this.#b.has(e) || (this.#b.add(e), this.#d.push(n(e, "selected", () => this.requestUpdate())));
157
+ this.#C.has(e) || (this.#C.add(e), r(e, "selected", () => this.requestUpdate()));
140
158
  });
141
159
  }
142
- #S() {
160
+ #T() {
161
+ this.#m || (this.#m = !0, queueMicrotask(() => {
162
+ this.#m = !1, this.#E(), this.#w(), this.requestUpdate();
163
+ }));
164
+ }
165
+ #E() {
166
+ let e = new Set(this.#i);
167
+ for (let t of this.#C) e.has(t) || this.#C.delete(t);
168
+ }
169
+ #D(e) {
170
+ e.target.hidden = !1;
171
+ }
172
+ #O() {
143
173
  this.addEventListener("keydown", (e) => {
144
- e.code === "Tab" && (this.#l && this.#o.matches(":popover-open") && this.input.value !== "" && (e.preventDefault(), this.#M(this.#a[0].option), this.#N(this.#i.find((e) => (e.label ? e.label : e.value) === this.#a[0].option))), this.#o.hidePopover());
174
+ let t = this.input.value.trim();
175
+ if (e.code === "Tab" && (this.#l && this.#o.matches(":popover-open") && t !== "" && (e.preventDefault(), this.#B(this.#a[0].option), this.#V(this.#i.find((e) => (e.label ? e.label : e.value) === this.#a[0].option))), this.#o.hidePopover()), e.code === "Enter" && this.behaviorCreate && !this.input.disabled && t) {
176
+ let n = this.#f(t);
177
+ n ? this.#M(n) : (e.preventDefault(), e.stopImmediatePropagation(), this.#P());
178
+ }
145
179
  });
146
180
  }
147
- #C() {
148
- this.input.addEventListener("input", () => this.#O()), this.shadowRoot.addEventListener("slotchange", () => this.#O());
181
+ #k() {
182
+ this.input.addEventListener("input", () => this.#I()), this.shadowRoot.addEventListener("slotchange", () => this.#I());
149
183
  }
150
- async #w() {
184
+ async #A() {
151
185
  let e = this.#o;
152
186
  await e.updateComplete, i({
153
187
  element: e.shadowRoot.querySelector("[internal-host]"),
@@ -156,60 +190,71 @@ var S = class extends l {
156
190
  this.#o.matches(":popover-open") && this.#o.hidePopover();
157
191
  });
158
192
  }
159
- #T() {
193
+ #j() {
160
194
  this.input.addEventListener("pointerdown", () => {
161
- this.#k();
195
+ this.#L();
162
196
  }), this.addEventListener("keydown", (e) => {
163
- e.code !== "Tab" && e.code !== "Escape" && this.#k(), e?.code === "ArrowDown" && this.getRootNode().activeElement === this.input && (this.#o.tabIndex = 0, this.#a[0]?.focus(), e.preventDefault());
197
+ e.code !== "Tab" && e.code !== "Escape" && this.#L(), e?.code === "ArrowDown" && this.getRootNode().activeElement === this.input && (this.#o.tabIndex = 0, this.#a[0]?.focus(), e.preventDefault());
164
198
  });
165
199
  }
166
- #E(n) {
167
- this.#r?.multiple || (this.#M(t(n)), this.#o.hidePopover(), e(this.input)), this.#r && (n.selected = !n.selected, this.#N(n)), this.requestUpdate();
200
+ #M(n) {
201
+ this.#r?.multiple || (this.#B(t(n)), this.#o.hidePopover(), e(this.input)), this.#r && (n.selected = !n.selected, this.#V(n)), this.requestUpdate();
202
+ }
203
+ #N() {
204
+ this.#P();
168
205
  }
169
- #D(e, t) {
206
+ #P() {
207
+ let t = this.input.value.trim();
208
+ t && (this.dispatchEvent(new CustomEvent("create", {
209
+ detail: { value: t },
210
+ bubbles: !0,
211
+ composed: !0
212
+ })), this.input.value = "", this.#o.hidePopover(), e(this.input), this.requestUpdate());
213
+ }
214
+ #F(e, t) {
170
215
  return this.#l ? this.input.value.toLowerCase()[t]?.toLowerCase() === e.toLowerCase() : !1;
171
216
  }
172
- #O() {
217
+ #I() {
173
218
  this.#i.forEach((e) => {
174
219
  e.textContent.trim().length ? e.hidden = !e.textContent.toLocaleLowerCase().includes(this.input?.value.toLowerCase()) : e.hidden = !e.value.toLocaleLowerCase().includes(this.input?.value.toLowerCase());
175
220
  }), this.requestUpdate();
176
221
  }
177
- #k() {
178
- !this.input.disabled && !this.#o.matches(":popover-open") && (this.#r ? this.#i.forEach((e) => e.hidden = !1) : this.#O(), this.#o.style.setProperty("--min-width", `${this.#s.getBoundingClientRect().width}px`), this.#o.showPopover({ source: this.#s }), this.#o.tabIndex = -1);
222
+ #L() {
223
+ !this.input.disabled && !this.#o.matches(":popover-open") && (this.#r ? (this.#i.forEach((e) => e.hidden = !1), this.requestUpdate()) : this.#I(), this.#o.style.setProperty("--min-width", `${this.#s.getBoundingClientRect().width}px`), this.#o.showPopover({ source: this.#s }), this.#o.tabIndex = -1);
179
224
  }
180
- #A() {
181
- this.#o.hidePopover(), this._internals.states.delete("dirty"), this.#j();
225
+ #R() {
226
+ this.#o.hidePopover(), this._internals.states.delete("dirty"), this.#z();
182
227
  }
183
- #j() {
184
- this.#r && !this.#r.multiple && !this.#i.filter((e) => !(e.value === "" && e.disabled)).find((e) => t(e) === this.input.value) && (this.#i.forEach((e) => e.selected = !1), this.#M(""), this.#N({
228
+ #z() {
229
+ this.#r && !this.#r.multiple && !this.#i.filter((e) => !(e.value === "" && e.disabled)).find((e) => t(e) === this.input.value) && (this.#i.forEach((e) => e.selected = !1), this.#B(""), this.#V({
185
230
  value: "",
186
231
  selected: !1
187
232
  }));
188
233
  }
189
- #M(e) {
234
+ #B(e) {
190
235
  this.input.value = e, this.input.dispatchEvent(new Event("input", { bubbles: !0 })), this.input.dispatchEvent(new Event("change", { bubbles: !0 }));
191
236
  }
192
- #N(e) {
237
+ #V(e) {
193
238
  let t = [...this.#i, {
194
239
  value: "",
195
240
  selected: null
196
241
  }].find((t) => t.value === e.value);
197
242
  t && (t.selected = e.selected ?? null), this.#r && !this.#r.multiple && (this.#r.value = e.value), this.#r?.dispatchEvent(new Event("input", { bubbles: !0 })), this.#r?.dispatchEvent(new Event("change", { bubbles: !0 }));
198
243
  }
199
- #P() {
244
+ #H() {
200
245
  if (this.#r?.multiple && !this.notags) {
201
- this.#r.selectedOptions.length > 1 && this.#F(this.#c.getBoundingClientRect().width);
202
- let e = new ResizeObserver((e) => this.#F(e[0].contentRect.width));
203
- this.#d.push(e), e.observe(this.#c);
246
+ this.#r.selectedOptions.length > 1 && this.#U(this.#c.getBoundingClientRect().width);
247
+ let e = new ResizeObserver((e) => this.#U(e[0].contentRect.width));
248
+ this.#p.push(e), e.observe(this.#c);
204
249
  }
205
250
  }
206
- #F(e) {
251
+ #U(e) {
207
252
  this.#r?.multiple && e > this.#s.getBoundingClientRect().width - 100 ? this._internals.states.add("multiple-overflow") : this._internals.states.delete("multiple-overflow");
208
253
  }
209
- #I() {
210
- this.#L(), this.shadowRoot.addEventListener("slotchange", () => this.#L());
254
+ #W() {
255
+ this.#G(), this.shadowRoot.addEventListener("slotchange", () => this.#G());
211
256
  }
212
- #L() {
257
+ #G() {
213
258
  this.#u ? this._internals.states.add("footer-content") : this._internals.states.delete("footer-content");
214
259
  }
215
260
  };
@@ -219,7 +264,11 @@ a([b({
219
264
  })], S.prototype, "container", void 0), a([b({
220
265
  type: Boolean,
221
266
  reflect: !0
222
- })], S.prototype, "notags", void 0), S = a([o()], S);
267
+ })], S.prototype, "notags", void 0), a([b({
268
+ type: Boolean,
269
+ reflect: !0,
270
+ attribute: "behavior-create"
271
+ })], S.prototype, "behaviorCreate", void 0), S = a([o()], S);
223
272
  //#endregion
224
273
  export { S as Combobox };
225
274
 
@@ -1 +1 @@
1
- {"version":3,"file":"combobox2.js","names":["#datalist","#_datalist","#select","#_select","#options","#items","#dropdown","#input","#tags","#hasAvailableOptions","#hasFooterContent","#selectValue","#largeOptionsList","#isPristine","#closeListBox","#getOptionCheckbox","#characterAtIndexMatches","#setupSingleSelect","#setupMultipleSelect","#setupAutoCompleteKeyEvents","#setupMenuItemUpdateEvents","#setupOpenKeyEvents","#setupOverflowListener","#setupSlotStates","#setupLightDismiss","#observers","#syncOptionSelectedStates","#setupInitialValue","#syncSelectValueStates","#updateInputValue","#trackedOptions","#setInputValue","#setSelectValue","#filterOptions","#openListBox","#validateSingleSelectValue","#updateMultipleOverflow","#setSlotStates"],"sources":["../../src/combobox/combobox.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, isServer, nothing } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n createLightDismiss,\n focusElementTimeout,\n getDisplayValue,\n getElementUpdate,\n onChildListMutation,\n scopedRegistry,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { Control } from '@nvidia-elements/core/forms';\nimport { inputStyles } from '@nvidia-elements/core/input';\nimport { Menu, MenuItem } from '@nvidia-elements/core/menu';\nimport { Dropdown } from '@nvidia-elements/core/dropdown';\nimport { Tag } from '@nvidia-elements/core/tag';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { Checkbox } from '@nvidia-elements/core/checkbox';\nimport styles from './combobox.css?inline';\n\n/**\n * @element nve-combobox\n * @description An editable combobox with autocomplete behavior and selection support.\n * @since 0.17.0\n * @entrypoint \\@nvidia-elements/core/combobox\n * @slot - default slot for an input and a datalist/select element\n * @slot prefix-icon - slot for icon before the input\n * @slot footer - slot for dropdown footer content\n * @cssprop --scroll-height\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --background\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --border\n * @cssprop --cursor\n * @cssprop --font-weight\n * @cssprop --width\n * @cssprop --border-color\n * @cssprop --max-height\n * @cssprop --text-transform\n * @csspart tag - The tag element for selected items\n * @csspart dropdown - The dropdown popup element\n * @csspart menu - The menu element\n * @csspart menu-item - The menu item elements\n * @csspart checkbox - The checkbox element\n * @csspart icon - The icon element\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-list/\n */\n@scopedRegistry()\nexport class Combobox extends Control implements ContainerElement {\n /**\n * Reduces the visual container for a minimal borderless appearance while preserving whitespace bounds.\n * Use when embedding within another container such as a toolbar.\n */\n @property({ type: String, reflect: true }) container: 'flat';\n\n /** Disable rendering of inline tags for many-item select */\n @property({ type: Boolean, reflect: true }) notags: boolean;\n\n static styles = useStyles([...Control.styles, inputStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-combobox',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Checkbox.metadata.tag]: Checkbox,\n [Icon.metadata.tag]: Icon,\n [Dropdown.metadata.tag]: Dropdown,\n [Menu.metadata.tag]: Menu,\n [MenuItem.metadata.tag]: MenuItem,\n [Tag.metadata.tag]: Tag\n };\n\n /**\n * If a <select> exists, on focus all options show by default.\n * If a <datalist> exists, on focus only options that match the current input value show.\n */\n\n #_datalist: HTMLSelectElement | null;\n get #datalist(): HTMLSelectElement | null {\n if (!this.#_datalist) {\n this.#_datalist = this.shadowRoot\n ? ((this.shadowRoot\n .querySelector('slot')\n ?.assignedElements({ flatten: true })\n ?.find(i => i.tagName === 'DATALIST' || i.tagName === 'SELECT') ??\n this.querySelector('datalist, select')) as HTMLSelectElement)\n : null;\n }\n return this.#_datalist;\n }\n\n #_select: HTMLSelectElement | null;\n get #select(): HTMLSelectElement | null {\n if (!this.#_select) {\n this.#_select = this.shadowRoot\n ? ((this.shadowRoot\n .querySelector('slot')\n ?.assignedElements({ flatten: true })\n ?.find(i => i.tagName === 'SELECT') ?? this.querySelector('select')) as HTMLSelectElement)\n : null;\n }\n return this.#_select;\n }\n\n get #options(): HTMLOptionElement[] {\n return Array.from(this.#datalist?.options ? this.#datalist.options : []);\n }\n\n get #items() {\n return Array.from(this.shadowRoot!.querySelectorAll<MenuItem>(MenuItem.metadata.tag));\n }\n\n get #dropdown() {\n return this.shadowRoot!.querySelector<Dropdown>(Dropdown.metadata.tag);\n }\n\n get #input() {\n return this.shadowRoot!.querySelector('[input]');\n }\n\n get #tags() {\n return this.shadowRoot!.querySelector('.tags');\n }\n\n get #hasAvailableOptions() {\n return this.#options.find(o => !o.disabled && !o.hidden);\n }\n\n get #hasFooterContent() {\n return !!this.querySelector('[slot=\"footer\"]');\n }\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n\n protected _associateDatalist = false;\n\n protected get prefixContent() {\n return this.#select?.multiple && !this.notags\n ? html`\n <div class=\"tags-label\" aria-hidden=\"true\">${this.#select.selectedOptions.length} ${this.i18n.selected}</div>\n <div class=\"tags\">\n ${Array.from<HTMLOptionElement>(this.#select.selectedOptions).map(\n o => html`\n <nve-tag part=\"tag\" readonly color=\"gray-slate\" closable .value=${o.value} @click=${() => this.#selectValue(o)}>${getDisplayValue(o)}</nve-tag>`\n )}\n </div>`\n : html`<slot name=\"prefix-icon\"></slot>`;\n }\n\n get #largeOptionsList() {\n return (this.#datalist?.options?.length ?? 0) > 50;\n }\n\n get #isPristine() {\n return !this._internals.states.has('dirty');\n }\n\n protected get suffixContent() {\n if (isServer) return nothing;\n const options = this.#options;\n const largeOptionsList = this.#largeOptionsList;\n const isPristine = this.#isPristine;\n const visibleOptions = options.filter(o => !o.hidden).filter(o => !(o.value === '' && o.disabled));\n const hasNoResults = visibleOptions.filter(o => !o.disabled).length === 0;\n return html`\n <nve-dropdown part=\"dropdown\" .popoverType=${'manual'} .modal=${false} @open=${(e: Event) => ((e.target as HTMLElement).hidden = false)} @close=${this.#closeListBox} hidden .anchor=${this.#input as HTMLElement} .trigger=${this.#input as HTMLElement} position=\"bottom\">\n <nve-menu part=\"menu\" role=\"listbox\" style=\"--width: 100%; --min-width: fit-content\" aria-label=${ifDefined(this.i18n.select)}>\n ${visibleOptions.map(\n o => html`\n <nve-menu-item part=\"menu-item\" .option=${getDisplayValue(o)} role=\"option\" @click=${() => this.#selectValue(o)} ?selected=${o.selected} aria-selected=${o.selected ? 'true' : 'false'} ?disabled=${o.disabled} aria-label=${getDisplayValue(o)}>\n ${this.#getOptionCheckbox(o)}\n ${largeOptionsList || isPristine ? getDisplayValue(o) : html`<span role=\"presentation\">${(o.label ? o.label : o.value)?.split('')?.map((c, ci) => html`<span ?matches=${this.#characterAtIndexMatches(c, ci)}>${c}</span>`)}</span>`}\n </nve-menu-item>`\n )}\n ${hasNoResults ? html`<nve-menu-item part=\"menu-item\" .value=${''} disabled>${this.i18n.noResults}</nve-menu-item>` : nothing}\n </nve-menu>\n <slot name=\"footer\"></slot>\n </nve-dropdown>`;\n }\n\n #getOptionCheckbox(o: HTMLOptionElement) {\n const select = this.#select;\n if (select?.multiple && this.#largeOptionsList) {\n return html`<input aria-hidden=\"true\" type=\"checkbox\" .checked=${o.selected} .disabled=${o.disabled} .name=${o.selected ? 'check' : undefined} />`;\n } else if (select?.multiple) {\n /* eslint-disable @nvidia-elements/lint/no-missing-control-label */\n return html`<nve-checkbox part=\"checkbox\"><input aria-hidden=\"true\" type=\"checkbox\" .checked=${o.selected} .disabled=${o.disabled} .name=${o.selected ? 'check' : undefined} /></nve-checkbox>`;\n } else if (select) {\n return html`<nve-icon part=\"icon\" name=\"check\" size=\"sm\"></nve-icon>`;\n } else {\n return nothing;\n }\n }\n\n async firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.shadowRoot!.addEventListener('slotchange', () => {\n this.#_datalist = null;\n this.#_select = null;\n });\n await this.updateComplete;\n this.#setupSingleSelect();\n this.#setupMultipleSelect();\n this.#setupAutoCompleteKeyEvents();\n this.#setupMenuItemUpdateEvents();\n this.#setupOpenKeyEvents();\n this.#setupOverflowListener();\n this.#setupSlotStates();\n await this.#setupLightDismiss();\n this.input.setAttribute('list', '');\n this.input.autocomplete = 'off';\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.#observers.push(\n onChildListMutation(\n this,\n () => {\n this.#syncOptionSelectedStates();\n this.requestUpdate();\n },\n { attributes: true, subtree: true }\n )\n );\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n reset() {\n this.#dropdown!.hidePopover();\n if (this.#select) {\n this.#select.selectedIndex = -1;\n }\n super.reset();\n }\n\n /** Select all options provided */\n selectAll() {\n this.#options.forEach(o => (o.selected = true));\n this.requestUpdate();\n this.#select!.dispatchEvent(new Event('input', { bubbles: true }));\n this.#select!.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setupSingleSelect() {\n if (this.#select && !this.#select.multiple) {\n this.#setupInitialValue();\n this.#syncSelectValueStates();\n this.#syncOptionSelectedStates();\n }\n }\n\n #setupMultipleSelect() {\n if (this.#select?.multiple) {\n this.#setupInitialValue();\n this.#syncSelectValueStates();\n this.#syncOptionSelectedStates();\n this._internals.states.add('multiple');\n }\n }\n\n #setupInitialValue() {\n const selected = Array.from(this.#select!.selectedOptions).find((o: HTMLOptionElement) =>\n o.hasAttribute('selected')\n );\n if (selected && !this.#select!.multiple && !this.input.defaultValue) {\n this.input.value = getDisplayValue(selected);\n }\n }\n\n #updateInputValue() {\n if (!this.#select!.multiple && !this.input.defaultValue) {\n this.input.value = getDisplayValue(\n Array.from(this.#select!.selectedOptions).find(o => o.value === this.#select!.value)!\n );\n }\n }\n\n #syncSelectValueStates() {\n this.#observers.push(\n getElementUpdate(this.#select!, 'value', () => {\n this.#updateInputValue();\n this.requestUpdate();\n })\n );\n }\n\n #trackedOptions = new Set();\n #syncOptionSelectedStates() {\n this.#options.forEach(o => {\n if (!this.#trackedOptions.has(o)) {\n this.#trackedOptions.add(o);\n this.#observers.push(getElementUpdate(o, 'selected', () => this.requestUpdate()));\n }\n });\n }\n\n #setupAutoCompleteKeyEvents() {\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.code === 'Tab') {\n if (this.#hasAvailableOptions && this.#dropdown!.matches(':popover-open') && this.input.value !== '') {\n e.preventDefault();\n // the menu item option property caches/stores the option value instead of value to prevent unnecessary lit lifecycle updates for each menu item\n this.#setInputValue((this.#items[0] as MenuItem & { option: string }).option);\n this.#setSelectValue(\n this.#options.find(\n o => (o.label ? o.label : o.value) === (this.#items[0] as MenuItem & { option: string }).option\n )!\n );\n }\n this.#dropdown!.hidePopover();\n }\n });\n }\n\n #setupMenuItemUpdateEvents() {\n this.input.addEventListener('input', () => this.#filterOptions());\n this.shadowRoot!.addEventListener('slotchange', () => this.#filterOptions());\n }\n\n async #setupLightDismiss() {\n const dropdown = this.#dropdown!;\n await dropdown.updateComplete;\n const options = {\n element: dropdown.shadowRoot!.querySelector<HTMLElement>('[internal-host]')!,\n focusElement: this.input\n };\n createLightDismiss(options, () => {\n if (this.#dropdown!.matches(':popover-open')) {\n this.#dropdown!.hidePopover();\n }\n });\n }\n\n #setupOpenKeyEvents() {\n this.input.addEventListener('pointerdown', () => {\n this.#openListBox();\n });\n\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.code !== 'Tab' && e.code !== 'Escape') {\n this.#openListBox();\n }\n\n if (e?.code === 'ArrowDown' && (this.getRootNode() as ShadowRoot).activeElement === this.input) {\n this.#dropdown!.tabIndex = 0;\n this.#items[0]?.focus();\n e.preventDefault();\n }\n });\n }\n\n #selectValue(option: { selected?: boolean; label?: string; value?: string }) {\n if (!this.#select?.multiple) {\n this.#setInputValue(getDisplayValue(option));\n this.#dropdown!.hidePopover();\n focusElementTimeout(this.input);\n }\n\n if (this.#select) {\n option.selected = !option.selected;\n this.#setSelectValue(option);\n }\n\n this.requestUpdate();\n }\n\n #characterAtIndexMatches(character: string, index: number) {\n if (this.#hasAvailableOptions) {\n return this.input.value.toLowerCase()[index]?.toLowerCase() === character.toLowerCase();\n }\n return false;\n }\n\n #filterOptions() {\n this.#options.forEach(option => {\n const hasLabel = option.textContent!.trim().length;\n if (hasLabel) {\n const matchesLabel = option.textContent!.toLocaleLowerCase().includes(this.input?.value.toLowerCase());\n option.hidden = !matchesLabel;\n } else {\n const matchesValue = option.value.toLocaleLowerCase().includes(this.input?.value.toLowerCase());\n option.hidden = !matchesValue;\n }\n });\n this.requestUpdate();\n }\n\n #openListBox() {\n if (!this.input.disabled && !this.#dropdown!.matches(':popover-open')) {\n if (this.#select) {\n this.#options.forEach(option => (option.hidden = false));\n } else {\n this.#filterOptions();\n }\n this.#dropdown!.style.setProperty('--min-width', `${this.#input!.getBoundingClientRect().width}px`);\n // explicitly provide source as the performance optimizations in the suffixContent getter prevent the dropdown from setting its anchor/trigger reliably\n this.#dropdown!.showPopover({ source: this.#input as HTMLElement });\n this.#dropdown!.tabIndex = -1;\n }\n }\n\n #closeListBox() {\n this.#dropdown!.hidePopover();\n this._internals.states.delete('dirty');\n this.#validateSingleSelectValue();\n }\n\n #validateSingleSelectValue() {\n const invalidInputValue =\n this.#select &&\n !this.#select.multiple &&\n !this.#options.filter(o => !(o.value === '' && o.disabled)).find(o => getDisplayValue(o) === this.input.value);\n if (invalidInputValue) {\n this.#options.forEach(o => (o.selected = false));\n this.#setInputValue('');\n this.#setSelectValue({ value: '', selected: false });\n }\n }\n\n #setInputValue(value: string) {\n this.input.value = value;\n this.input.dispatchEvent(new Event('input', { bubbles: true }));\n this.input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setSelectValue(option: { value?: string; selected?: boolean }) {\n const found = [...this.#options, { value: '', selected: null as boolean | null }].find(\n o => o.value === option.value\n );\n if (found) found.selected = option.selected ?? null;\n\n if (this.#select && !this.#select.multiple) {\n this.#select.value = option.value!;\n }\n\n this.#select?.dispatchEvent(new Event('input', { bubbles: true }));\n this.#select?.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setupOverflowListener() {\n if (this.#select?.multiple && !this.notags) {\n if (this.#select.selectedOptions.length > 1) {\n // only calculate initial overflow if many tags exist\n this.#updateMultipleOverflow(this.#tags!.getBoundingClientRect().width);\n }\n const observer = new ResizeObserver(entries => this.#updateMultipleOverflow(entries[0]!.contentRect.width));\n this.#observers.push(observer);\n observer.observe(this.#tags!);\n }\n }\n\n #updateMultipleOverflow(tagWidth: number) {\n const INPUT_MIN_WIDTH = 100;\n if (this.#select?.multiple && tagWidth > this.#input!.getBoundingClientRect().width - INPUT_MIN_WIDTH) {\n this._internals.states.add('multiple-overflow');\n } else {\n this._internals.states.delete('multiple-overflow');\n }\n }\n\n #setupSlotStates() {\n this.#setSlotStates();\n this.shadowRoot!.addEventListener('slotchange', () => this.#setSlotStates());\n }\n\n #setSlotStates() {\n if (this.#hasFooterContent) {\n this._internals.states.add('footer-content');\n } else {\n this._internals.states.delete('footer-content');\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"combobox2.js","names":["#datalist","#_datalist","#select","#_select","#options","#items","#dropdown","#input","#tags","#hasAvailableOptions","#hasFooterContent","#showCreateItem","#findOptionMatch","#selectValue","#largeOptionsList","#isPristine","#onDropdownOpen","#closeListBox","#getOptionCheckbox","#characterAtIndexMatches","#onCreateItemClick","#onSlottedChildMutation","#setupSingleSelect","#setupMultipleSelect","#setupAutoCompleteKeyEvents","#setupMenuItemUpdateEvents","#setupOpenKeyEvents","#setupOverflowListener","#setupSlotStates","#setupLightDismiss","#observers","#setupInitialValue","#syncSelectValueStates","#syncOptionSelectedStates","#updateInputValue","#trackedOptions","#syncPending","#cleanupStaleTrackedOptions","#setInputValue","#setSelectValue","#dispatchCreate","#filterOptions","#openListBox","#validateSingleSelectValue","#updateMultipleOverflow","#setSlotStates"],"sources":["../../src/combobox/combobox.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, isServer, nothing } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { ContainerElement } from '@nvidia-elements/core/internal';\nimport {\n createLightDismiss,\n focusElementTimeout,\n getDisplayValue,\n getElementUpdate,\n getPropertyChanges,\n scopedRegistry,\n useStyles\n} from '@nvidia-elements/core/internal';\nimport { Control } from '@nvidia-elements/core/forms';\nimport { inputStyles } from '@nvidia-elements/core/input';\nimport { Menu, MenuItem } from '@nvidia-elements/core/menu';\nimport { Dropdown } from '@nvidia-elements/core/dropdown';\nimport { Tag } from '@nvidia-elements/core/tag';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { Checkbox } from '@nvidia-elements/core/checkbox';\nimport styles from './combobox.css?inline';\n\n/**\n * @element nve-combobox\n * @description An editable combobox with autocomplete behavior and selection support.\n * @since 0.17.0\n * @entrypoint \\@nvidia-elements/core/combobox\n * @slot - default slot for an input and a datalist/select element\n * @slot prefix-icon - slot for icon before the input\n * @slot footer - slot for dropdown footer content\n * @cssprop --scroll-height\n * @cssprop --padding\n * @cssprop --font-size\n * @cssprop --height\n * @cssprop --background\n * @cssprop --color\n * @cssprop --border-radius\n * @cssprop --border\n * @cssprop --cursor\n * @cssprop --font-weight\n * @cssprop --width\n * @cssprop --border-color\n * @cssprop --max-height\n * @cssprop --text-transform\n * @csspart tag - The tag element for selected items\n * @csspart dropdown - The dropdown popup element\n * @csspart menu - The menu element\n * @csspart menu-item - The menu item elements\n * @csspart checkbox - The checkbox element\n * @csspart icon - The icon element\n * @event scroll - Fires when the user scrolls the dropdown option list. Throttled to one dispatch per animation frame. `detail: { scrollTop, scrollHeight, clientHeight }`.\n * @event create - Fires when the user confirms a value that doesn't match any existing option and the `behavior-create` attribute exists. `detail: { value }`.\n * @csspart create-option - The menu item element for creating new options\n * @aria https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-list/\n */\n@scopedRegistry()\nexport class Combobox extends Control implements ContainerElement {\n /**\n * Reduces the visual container for a minimal borderless appearance while preserving whitespace bounds.\n * Use when embedding within another container such as a toolbar.\n */\n @property({ type: String, reflect: true }) container: 'flat';\n\n /** Disable rendering of inline tags for many-item select */\n @property({ type: Boolean, reflect: true }) notags: boolean;\n\n /** Enable creation of new options when the input value doesn't match any existing option. Dispatches a `create` event with `{ value }` detail. */\n @property({ type: Boolean, reflect: true, attribute: 'behavior-create' }) behaviorCreate: boolean;\n\n static styles = useStyles([...Control.styles, inputStyles, styles]);\n\n static readonly metadata = {\n tag: 'nve-combobox',\n version: '0.0.0'\n };\n\n static elementDefinitions = {\n [Checkbox.metadata.tag]: Checkbox,\n [Icon.metadata.tag]: Icon,\n [Dropdown.metadata.tag]: Dropdown,\n [Menu.metadata.tag]: Menu,\n [MenuItem.metadata.tag]: MenuItem,\n [Tag.metadata.tag]: Tag\n };\n\n /**\n * If a <select> exists, on focus all options show by default.\n * If a <datalist> exists, on focus only options that match the current input value show.\n */\n\n #_datalist: HTMLSelectElement | null;\n get #datalist(): HTMLSelectElement | null {\n if (!this.#_datalist) {\n this.#_datalist = this.shadowRoot\n ? ((this.shadowRoot\n .querySelector('slot')\n ?.assignedElements({ flatten: true })\n ?.find(i => i.tagName === 'DATALIST' || i.tagName === 'SELECT') ??\n this.querySelector('datalist, select')) as HTMLSelectElement)\n : null;\n }\n return this.#_datalist;\n }\n\n #_select: HTMLSelectElement | null;\n get #select(): HTMLSelectElement | null {\n if (!this.#_select) {\n this.#_select = this.shadowRoot\n ? ((this.shadowRoot\n .querySelector('slot')\n ?.assignedElements({ flatten: true })\n ?.find(i => i.tagName === 'SELECT') ?? this.querySelector('select')) as HTMLSelectElement)\n : null;\n }\n return this.#_select;\n }\n\n get #options(): HTMLOptionElement[] {\n return Array.from(this.#datalist?.options ? this.#datalist.options : []);\n }\n\n get #items() {\n return Array.from(this.shadowRoot!.querySelectorAll<MenuItem>(MenuItem.metadata.tag));\n }\n\n get #dropdown() {\n return this.shadowRoot!.querySelector<Dropdown>(Dropdown.metadata.tag);\n }\n\n get #input() {\n return this.shadowRoot!.querySelector('[input]');\n }\n\n get #tags() {\n return this.shadowRoot!.querySelector('.tags');\n }\n\n get #hasAvailableOptions() {\n return this.#options.find(o => !o.disabled && !o.hidden);\n }\n\n get #hasFooterContent() {\n return !!this.querySelector('[slot=\"footer\"]');\n }\n\n get #showCreateItem(): boolean {\n if (!this.behaviorCreate || this.input?.disabled) return false;\n const value = this.input?.value.trim();\n if (!value) return false;\n return !this.#findOptionMatch(value);\n }\n\n #findOptionMatch(value: string): HTMLOptionElement | undefined {\n const lower = value.toLowerCase();\n return this.#options.find(o => {\n const display = o.textContent!.trim() || o.value;\n return display.toLowerCase() === lower || o.value.toLowerCase() === lower;\n });\n }\n\n #observers: (MutationObserver | ResizeObserver)[] = [];\n #syncPending = false;\n\n protected _associateDatalist = false;\n\n protected get prefixContent() {\n return this.#select?.multiple && !this.notags\n ? html`\n <div class=\"tags-label\" aria-hidden=\"true\">${this.#select.selectedOptions.length} ${this.i18n.selected}</div>\n <div class=\"tags\">\n ${Array.from<HTMLOptionElement>(this.#select.selectedOptions).map(\n o => html`\n <nve-tag part=\"tag\" readonly color=\"gray-slate\" closable .value=${o.value} @click=${() => this.#selectValue(o)}>${getDisplayValue(o)}</nve-tag>`\n )}\n </div>`\n : html`<slot name=\"prefix-icon\"></slot>`;\n }\n\n get #largeOptionsList() {\n return (this.#datalist?.options?.length ?? 0) > 50;\n }\n\n get #isPristine() {\n return !this._internals.states.has('dirty');\n }\n\n protected get suffixContent() {\n if (isServer) return nothing;\n const options = this.#options;\n const largeOptionsList = this.#largeOptionsList;\n const isPristine = this.#isPristine;\n const visibleOptions = options.filter(o => !o.hidden).filter(o => !(o.value === '' && o.disabled));\n const hasNoResults = visibleOptions.filter(o => !o.disabled).length === 0;\n const showCreateItem = this.#showCreateItem;\n return html`\n <nve-dropdown part=\"dropdown\" .popoverType=${'manual'} .modal=${false} @open=${this.#onDropdownOpen} @close=${this.#closeListBox} hidden .anchor=${this.#input as HTMLElement} .trigger=${this.#input as HTMLElement} position=\"bottom\">\n <nve-menu part=\"menu\" role=\"listbox\" style=\"--width: 100%; --min-width: fit-content\" aria-label=${ifDefined(this.i18n.select)}>\n ${visibleOptions.map(\n o => html`\n <nve-menu-item part=\"menu-item\" .option=${getDisplayValue(o)} role=\"option\" @click=${() => this.#selectValue(o)} ?selected=${o.selected} aria-selected=${o.selected ? 'true' : 'false'} ?disabled=${o.disabled} aria-label=${getDisplayValue(o)}>\n ${this.#getOptionCheckbox(o)}\n ${largeOptionsList || isPristine ? getDisplayValue(o) : html`<span role=\"presentation\">${(o.label ? o.label : o.value)?.split('')?.map((c, ci) => html`<span ?matches=${this.#characterAtIndexMatches(c, ci)}>${c}</span>`)}</span>`}\n </nve-menu-item>`\n )}\n ${hasNoResults && !showCreateItem ? html`<nve-menu-item part=\"menu-item\" .value=${''} disabled>${this.i18n.noResults}</nve-menu-item>` : nothing}\n ${\n showCreateItem\n ? html`<nve-menu-item part=\"create-option\" role=\"button\" aria-label=${`${this.i18n.create} \"${this.input?.value.trim()}\"`} @click=${this.#onCreateItemClick}>\n <nve-icon part=\"icon\" name=\"add\" size=\"sm\"></nve-icon> \"${this.input?.value.trim()}\"\n </nve-menu-item>`\n : nothing\n }\n </nve-menu>\n <slot name=\"footer\"></slot>\n </nve-dropdown>`;\n }\n\n #getOptionCheckbox(o: HTMLOptionElement) {\n const select = this.#select;\n if (select?.multiple && this.#largeOptionsList) {\n return html`<input aria-hidden=\"true\" type=\"checkbox\" .checked=${o.selected} .disabled=${o.disabled} .name=${o.selected ? 'check' : undefined} />`;\n } else if (select?.multiple) {\n /* eslint-disable @nvidia-elements/lint/no-missing-control-label */\n return html`<nve-checkbox part=\"checkbox\"><input aria-hidden=\"true\" type=\"checkbox\" .checked=${o.selected} .disabled=${o.disabled} .name=${o.selected ? 'check' : undefined} /></nve-checkbox>`;\n } else if (select) {\n return html`<nve-icon part=\"icon\" name=\"check\" size=\"sm\"></nve-icon>`;\n } else {\n return nothing;\n }\n }\n\n async firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.shadowRoot!.addEventListener('slotchange', () => {\n this.#_datalist = null;\n this.#_select = null;\n this.#onSlottedChildMutation();\n });\n await this.updateComplete;\n this.#setupSingleSelect();\n this.#setupMultipleSelect();\n this.#setupAutoCompleteKeyEvents();\n this.#setupMenuItemUpdateEvents();\n this.#setupOpenKeyEvents();\n this.#setupOverflowListener();\n this.#setupSlotStates();\n await this.#setupLightDismiss();\n this.input.setAttribute('list', '');\n this.input.autocomplete = 'off';\n }\n\n connectedCallback() {\n super.connectedCallback();\n const observer = new MutationObserver(mutations => {\n if (mutations.some(m => m.type === 'childList' && m.target === this)) {\n this.#_datalist = null;\n this.#_select = null;\n }\n this.#onSlottedChildMutation();\n });\n observer.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['selected', 'disabled', 'value'],\n characterData: true\n });\n this.#observers.push(observer);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n reset() {\n this.#dropdown!.hidePopover();\n if (this.#select) {\n this.#select.selectedIndex = -1;\n }\n super.reset();\n }\n\n /** Select all options provided */\n selectAll() {\n this.#options.forEach(o => (o.selected = true));\n this.requestUpdate();\n this.#select!.dispatchEvent(new Event('input', { bubbles: true }));\n this.#select!.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setupSingleSelect() {\n if (this.#select && !this.#select.multiple) {\n this.#setupInitialValue();\n this.#syncSelectValueStates();\n this.#syncOptionSelectedStates();\n }\n }\n\n #setupMultipleSelect() {\n if (this.#select?.multiple) {\n this.#setupInitialValue();\n this.#syncSelectValueStates();\n this.#syncOptionSelectedStates();\n this._internals.states.add('multiple');\n }\n }\n\n #setupInitialValue() {\n const selected = Array.from(this.#select!.selectedOptions).find((o: HTMLOptionElement) =>\n o.hasAttribute('selected')\n );\n if (selected && !this.#select!.multiple && !this.input.defaultValue) {\n this.input.value = getDisplayValue(selected);\n }\n }\n\n #updateInputValue() {\n if (!this.#select!.multiple && !this.input.defaultValue) {\n this.input.value = getDisplayValue(\n Array.from(this.#select!.selectedOptions).find(o => o.value === this.#select!.value)!\n );\n }\n }\n\n #syncSelectValueStates() {\n this.#observers.push(\n getElementUpdate(this.#select!, 'value', () => {\n this.#updateInputValue();\n this.requestUpdate();\n })\n );\n }\n\n #trackedOptions = new Set<HTMLOptionElement>();\n #syncOptionSelectedStates() {\n this.#options.forEach(o => {\n if (!this.#trackedOptions.has(o)) {\n this.#trackedOptions.add(o);\n getPropertyChanges(o, 'selected', () => this.requestUpdate());\n }\n });\n }\n\n #onSlottedChildMutation() {\n if (!this.#syncPending) {\n this.#syncPending = true;\n queueMicrotask(() => {\n this.#syncPending = false;\n this.#cleanupStaleTrackedOptions();\n this.#syncOptionSelectedStates();\n this.requestUpdate();\n });\n }\n }\n\n #cleanupStaleTrackedOptions() {\n const currentOptions = new Set(this.#options);\n for (const tracked of this.#trackedOptions) {\n if (!currentOptions.has(tracked)) {\n this.#trackedOptions.delete(tracked);\n }\n }\n }\n\n #onDropdownOpen(e: Event) {\n (e.target as HTMLElement).hidden = false;\n }\n\n #setupAutoCompleteKeyEvents() {\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n const value = this.input.value.trim();\n\n if (e.code === 'Tab') {\n if (this.#hasAvailableOptions && this.#dropdown!.matches(':popover-open') && value !== '') {\n e.preventDefault();\n // the menu item option property caches/stores the option value instead of value to prevent unnecessary lit lifecycle updates for each menu item\n this.#setInputValue((this.#items[0] as MenuItem & { option: string }).option);\n this.#setSelectValue(\n this.#options.find(\n o => (o.label ? o.label : o.value) === (this.#items[0] as MenuItem & { option: string }).option\n )!\n );\n }\n this.#dropdown!.hidePopover();\n }\n\n if (e.code === 'Enter' && this.behaviorCreate && !this.input.disabled && value) {\n const match = this.#findOptionMatch(value);\n if (match) {\n this.#selectValue(match);\n } else {\n e.preventDefault();\n e.stopImmediatePropagation();\n this.#dispatchCreate();\n }\n }\n });\n }\n\n #setupMenuItemUpdateEvents() {\n this.input.addEventListener('input', () => this.#filterOptions());\n this.shadowRoot!.addEventListener('slotchange', () => this.#filterOptions());\n }\n\n async #setupLightDismiss() {\n const dropdown = this.#dropdown!;\n await dropdown.updateComplete;\n const options = {\n element: dropdown.shadowRoot!.querySelector<HTMLElement>('[internal-host]')!,\n focusElement: this.input\n };\n createLightDismiss(options, () => {\n if (this.#dropdown!.matches(':popover-open')) {\n this.#dropdown!.hidePopover();\n }\n });\n }\n\n #setupOpenKeyEvents() {\n this.input.addEventListener('pointerdown', () => {\n this.#openListBox();\n });\n\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.code !== 'Tab' && e.code !== 'Escape') {\n this.#openListBox();\n }\n\n if (e?.code === 'ArrowDown' && (this.getRootNode() as ShadowRoot).activeElement === this.input) {\n this.#dropdown!.tabIndex = 0;\n this.#items[0]?.focus();\n e.preventDefault();\n }\n });\n }\n\n #selectValue(option: { selected?: boolean; label?: string; value?: string }) {\n if (!this.#select?.multiple) {\n this.#setInputValue(getDisplayValue(option));\n this.#dropdown!.hidePopover();\n focusElementTimeout(this.input);\n }\n\n if (this.#select) {\n option.selected = !option.selected;\n this.#setSelectValue(option);\n }\n\n this.requestUpdate();\n }\n\n #onCreateItemClick() {\n this.#dispatchCreate();\n }\n\n #dispatchCreate() {\n const value = this.input.value.trim();\n if (value) {\n this.dispatchEvent(new CustomEvent('create', { detail: { value }, bubbles: true, composed: true }));\n this.input.value = '';\n this.#dropdown!.hidePopover();\n focusElementTimeout(this.input);\n this.requestUpdate();\n }\n }\n\n #characterAtIndexMatches(character: string, index: number) {\n if (this.#hasAvailableOptions) {\n return this.input.value.toLowerCase()[index]?.toLowerCase() === character.toLowerCase();\n }\n return false;\n }\n\n #filterOptions() {\n this.#options.forEach(option => {\n const hasLabel = option.textContent!.trim().length;\n if (hasLabel) {\n const matchesLabel = option.textContent!.toLocaleLowerCase().includes(this.input?.value.toLowerCase());\n option.hidden = !matchesLabel;\n } else {\n const matchesValue = option.value.toLocaleLowerCase().includes(this.input?.value.toLowerCase());\n option.hidden = !matchesValue;\n }\n });\n this.requestUpdate();\n }\n\n #openListBox() {\n if (!this.input.disabled && !this.#dropdown!.matches(':popover-open')) {\n if (this.#select) {\n this.#options.forEach(option => (option.hidden = false));\n this.requestUpdate();\n } else {\n this.#filterOptions();\n }\n this.#dropdown!.style.setProperty('--min-width', `${this.#input!.getBoundingClientRect().width}px`);\n // explicitly provide source as the performance optimizations in the suffixContent getter prevent the dropdown from setting its anchor/trigger reliably\n this.#dropdown!.showPopover({ source: this.#input as HTMLElement });\n this.#dropdown!.tabIndex = -1;\n }\n }\n\n #closeListBox() {\n this.#dropdown!.hidePopover();\n this._internals.states.delete('dirty');\n this.#validateSingleSelectValue();\n }\n\n #validateSingleSelectValue() {\n const invalidInputValue =\n this.#select &&\n !this.#select.multiple &&\n !this.#options.filter(o => !(o.value === '' && o.disabled)).find(o => getDisplayValue(o) === this.input.value);\n if (invalidInputValue) {\n this.#options.forEach(o => (o.selected = false));\n this.#setInputValue('');\n this.#setSelectValue({ value: '', selected: false });\n }\n }\n\n #setInputValue(value: string) {\n this.input.value = value;\n this.input.dispatchEvent(new Event('input', { bubbles: true }));\n this.input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setSelectValue(option: { value?: string; selected?: boolean }) {\n const found = [...this.#options, { value: '', selected: null as boolean | null }].find(\n o => o.value === option.value\n );\n if (found) found.selected = option.selected ?? null;\n\n if (this.#select && !this.#select.multiple) {\n this.#select.value = option.value!;\n }\n\n this.#select?.dispatchEvent(new Event('input', { bubbles: true }));\n this.#select?.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n #setupOverflowListener() {\n if (this.#select?.multiple && !this.notags) {\n if (this.#select.selectedOptions.length > 1) {\n // only calculate initial overflow if many tags exist\n this.#updateMultipleOverflow(this.#tags!.getBoundingClientRect().width);\n }\n const observer = new ResizeObserver(entries => this.#updateMultipleOverflow(entries[0]!.contentRect.width));\n this.#observers.push(observer);\n observer.observe(this.#tags!);\n }\n }\n\n #updateMultipleOverflow(tagWidth: number) {\n const INPUT_MIN_WIDTH = 100;\n if (this.#select?.multiple && tagWidth > this.#input!.getBoundingClientRect().width - INPUT_MIN_WIDTH) {\n this._internals.states.add('multiple-overflow');\n } else {\n this._internals.states.delete('multiple-overflow');\n }\n }\n\n #setupSlotStates() {\n this.#setSlotStates();\n this.shadowRoot!.addEventListener('slotchange', () => this.#setSlotStates());\n }\n\n #setSlotStates() {\n if (this.#hasFooterContent) {\n this._internals.states.add('footer-content');\n } else {\n this._internals.states.delete('footer-content');\n }\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { define as e } from "../internal/utils/dom.js";
2
- import { Combobox as t } from "./combobox2.js";
3
- //#region src/combobox/define.ts
4
- e(t);
2
+ import { ControlMessage as t } from "../forms/control-message/control-message2.js";
3
+ import { Control as n } from "../forms/control/control2.js";
4
+ import { ControlGroup as r } from "../forms/control-group/control-group2.js";
5
+ import { Combobox as i } from "./combobox2.js";
6
+ e(i), e(n), e(r), e(t);
5
7
  //#endregion
6
8
 
7
9
  //# sourceMappingURL=define.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","names":[],"sources":["../../src/combobox/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { Combobox } from '@nvidia-elements/core/combobox';\nimport '@nvidia-elements/core/forms/define.js';\n\ndefine(Combobox);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-combobox': Combobox;\n }\n}\n"],"mappings":";;;AAOA,EAAO,EAAS"}
1
+ {"version":3,"file":"define.js","names":[],"sources":["../../src/combobox/define.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { define } from '@nvidia-elements/core/internal';\nimport { Combobox } from '@nvidia-elements/core/combobox';\nimport { Control, ControlGroup, ControlMessage } from '@nvidia-elements/core/forms';\n\ndefine(Combobox);\ndefine(Control);\ndefine(ControlGroup);\ndefine(ControlMessage);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nve-combobox': Combobox;\n }\n}\n"],"mappings":";;;;;AAOA,EAAO,EAAS,EAChB,EAAO,EAAQ,EACf,EAAO,EAAa,EACpB,EAAO,EAAe"}
@@ -1,4 +1,4 @@
1
- import { __decorate as e } from "../_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.js";
1
+ import { __decorate as e } from "../_virtual/_@oxc-project_runtime@0.123.0/helpers/decorate.js";
2
2
  import { I18nController as t } from "../internal/controllers/i18n.controller.js";
3
3
  import { scopedRegistry as n } from "../internal/decorators/scoped-registry.js";
4
4
  import { useStyles as r } from "../internal/styles/index.js";
@@ -19,7 +19,7 @@ var p = class extends a {
19
19
  static {
20
20
  this.metadata = {
21
21
  tag: "nve-copy-button",
22
- version: "0.0.2"
22
+ version: "0.0.4"
23
23
  };
24
24
  }
25
25
  static {