@vonage/vivid 5.23.1 → 5.25.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 (522) hide show
  1. package/README.md +1 -1
  2. package/accordion/index.cjs +1 -1
  3. package/accordion/index.js +1 -1
  4. package/accordion-item/index.cjs +1 -1
  5. package/accordion-item/index.js +1 -1
  6. package/audio-player/index.cjs +2 -2
  7. package/audio-player/index.js +3 -3
  8. package/avatar/index.cjs +10 -10
  9. package/avatar/index.js +4 -3
  10. package/badge/index.cjs +1 -1
  11. package/badge/index.js +1 -1
  12. package/breadcrumb-item/index.cjs +9 -5
  13. package/breadcrumb-item/index.js +11 -6
  14. package/bundled/affix.cjs +1 -1
  15. package/bundled/affix.js +1 -1
  16. package/bundled/definition10.cjs +2 -1
  17. package/bundled/definition10.js +3 -2
  18. package/bundled/definition11.cjs +4 -4
  19. package/bundled/definition11.js +4 -3
  20. package/bundled/definition12.cjs +1 -1
  21. package/bundled/definition12.js +1 -0
  22. package/bundled/definition15.cjs +8 -7
  23. package/bundled/definition15.js +27 -24
  24. package/bundled/definition17.cjs +7 -7
  25. package/bundled/definition17.js +22 -109
  26. package/bundled/definition18.cjs +12 -83
  27. package/bundled/definition18.js +20 -426
  28. package/bundled/definition19.cjs +87 -7
  29. package/bundled/definition19.js +433 -16
  30. package/bundled/definition20.cjs +7 -37
  31. package/bundled/definition20.js +17 -172
  32. package/bundled/definition21.cjs +35 -27
  33. package/bundled/definition21.js +155 -154
  34. package/bundled/definition22.cjs +29 -6
  35. package/bundled/definition22.js +172 -20
  36. package/bundled/definition23.cjs +6 -12
  37. package/bundled/definition23.js +17 -32
  38. package/bundled/definition24.cjs +12 -39
  39. package/bundled/definition24.js +33 -67
  40. package/bundled/definition25.cjs +44 -0
  41. package/bundled/definition25.js +81 -0
  42. package/bundled/definition3.cjs +5 -5
  43. package/bundled/definition3.js +10 -40
  44. package/bundled/definition4.cjs +6 -6
  45. package/bundled/definition4.js +4 -3
  46. package/bundled/definition6.cjs +11 -11
  47. package/bundled/definition6.js +4 -3
  48. package/bundled/definition9.cjs +12 -6
  49. package/bundled/definition9.js +66 -43
  50. package/bundled/extractOptions.cjs +1 -0
  51. package/bundled/extractOptions.js +11 -0
  52. package/bundled/icon.cjs +1 -0
  53. package/bundled/icon.js +34 -0
  54. package/bundled/listbox.cjs +1 -1
  55. package/bundled/listbox.js +28 -12
  56. package/bundled/mixins.cjs +8 -8
  57. package/bundled/mixins.js +4 -3
  58. package/bundled/optgroup.cjs +1 -0
  59. package/bundled/optgroup.js +27 -0
  60. package/bundled/option.cjs +1 -0
  61. package/bundled/option.js +93 -0
  62. package/bundled/render-in-light-dom.cjs +1 -1
  63. package/bundled/render-in-light-dom.js +16 -19
  64. package/bundled/vivid-element.cjs +1 -1
  65. package/bundled/vivid-element.js +9 -1
  66. package/card/index.cjs +22 -22
  67. package/card/index.js +4 -3
  68. package/color-picker/index.cjs +18 -18
  69. package/color-picker/index.js +4 -3
  70. package/combobox/definition.cjs +1 -1
  71. package/combobox/definition.js +1 -1
  72. package/combobox/index.cjs +7 -7
  73. package/combobox/index.js +31 -21
  74. package/country/definition.cjs +1 -1
  75. package/country/definition.js +1 -1
  76. package/country/index.cjs +1 -1
  77. package/country/index.js +1 -1
  78. package/country-group/definition.cjs +1 -1
  79. package/country-group/definition.js +1 -1
  80. package/country-group/index.cjs +1 -1
  81. package/country-group/index.js +2 -2
  82. package/custom-elements.json +8438 -7866
  83. package/data-grid/definition.cjs +1 -1
  84. package/data-grid/definition.js +1 -1
  85. package/data-grid/index.cjs +26 -26
  86. package/data-grid/index.js +9 -8
  87. package/date-picker/definition.cjs +1 -1
  88. package/date-picker/definition.js +1 -1
  89. package/date-picker/index.cjs +1 -1
  90. package/date-picker/index.js +1 -1
  91. package/date-range-picker/definition.cjs +1 -1
  92. package/date-range-picker/definition.js +1 -1
  93. package/date-range-picker/index.cjs +1 -1
  94. package/date-range-picker/index.js +1 -1
  95. package/date-time-picker/definition.cjs +1 -1
  96. package/date-time-picker/definition.js +1 -1
  97. package/date-time-picker/index.cjs +1 -1
  98. package/date-time-picker/index.js +1 -1
  99. package/dial-pad/definition.cjs +1 -1
  100. package/dial-pad/definition.js +1 -1
  101. package/dial-pad/index.cjs +7 -7
  102. package/dial-pad/index.js +124 -54
  103. package/dialog/definition.cjs +1 -1
  104. package/dialog/definition.js +1 -1
  105. package/dialog/index.cjs +14 -14
  106. package/dialog/index.js +4 -3
  107. package/divider/definition.cjs +1 -1
  108. package/divider/definition.js +1 -1
  109. package/divider/index.cjs +1 -1
  110. package/divider/index.js +1 -1
  111. package/empty-state/definition.cjs +1 -1
  112. package/empty-state/definition.js +1 -1
  113. package/empty-state/index.cjs +3 -3
  114. package/empty-state/index.js +4 -3
  115. package/fab/definition.cjs +1 -1
  116. package/fab/definition.js +1 -1
  117. package/file-picker/definition.cjs +1 -1
  118. package/file-picker/definition.js +1 -1
  119. package/file-picker/index.cjs +7 -7
  120. package/file-picker/index.js +4 -3
  121. package/flag/definition.cjs +1 -1
  122. package/flag/definition.js +1 -1
  123. package/header/definition.cjs +1 -1
  124. package/header/definition.js +1 -1
  125. package/header/index.cjs +3 -3
  126. package/header/index.js +3 -3
  127. package/icon/definition.cjs +2 -1
  128. package/icon/definition.js +2 -1
  129. package/index.cjs +209 -198
  130. package/index.js +59 -54
  131. package/kbd-key/definition.cjs +1 -1
  132. package/kbd-key/definition.js +1 -1
  133. package/kbd-shortcut/definition.cjs +1 -1
  134. package/kbd-shortcut/definition.js +1 -1
  135. package/layout/definition.cjs +1 -1
  136. package/layout/definition.js +1 -1
  137. package/lib/accordion-item/accordion-item.d.ts +3 -1
  138. package/lib/action-group/action-group.d.ts +1 -1
  139. package/lib/alert/alert.d.ts +2 -2
  140. package/lib/audio-player/audio-player.d.ts +1 -1
  141. package/lib/avatar/avatar.d.ts +1 -1
  142. package/lib/badge/badge.d.ts +1 -1
  143. package/lib/banner/banner.d.ts +3 -3
  144. package/lib/breadcrumb/breadcrumb.d.ts +1 -1
  145. package/lib/breadcrumb-item/breadcrumb-item.d.ts +1 -1
  146. package/lib/button/button.d.ts +3 -3
  147. package/lib/calendar-event/calendar-event.d.ts +1 -1
  148. package/lib/card/card.d.ts +1 -1
  149. package/lib/checkbox/checkbox.d.ts +6 -6
  150. package/lib/color-picker/color-picker.d.ts +7 -7
  151. package/lib/combobox/combobox.d.ts +8 -8
  152. package/lib/components.d.ts +2 -0
  153. package/lib/country-group/country-group.d.ts +2 -2
  154. package/lib/data-grid/data-grid-cell.d.ts +4 -3
  155. package/lib/data-grid/data-grid-row.d.ts +3 -2
  156. package/lib/data-grid/data-grid.options.d.ts +5 -0
  157. package/lib/date-picker/date-picker.d.ts +8 -8
  158. package/lib/date-range-picker/date-range-picker.d.ts +4 -4
  159. package/lib/date-time-picker/date-time-picker.d.ts +8 -8
  160. package/lib/dial-pad/dial-pad.d.ts +2 -2
  161. package/lib/dialog/dialog.d.ts +2 -2
  162. package/lib/divider/divider.d.ts +1 -1
  163. package/lib/fab/fab.d.ts +1 -1
  164. package/lib/file-picker/file-picker.d.ts +7 -7
  165. package/lib/header/header.d.ts +1 -1
  166. package/lib/listbox/definition.d.ts +3 -0
  167. package/lib/listbox/index.d.ts +1 -0
  168. package/lib/listbox/listbox.d.ts +1302 -0
  169. package/lib/listbox/listbox.template.d.ts +3 -0
  170. package/lib/listbox/variations.browser-spec.d.ts +1 -0
  171. package/lib/menu/menu.d.ts +2 -3
  172. package/lib/menu-item/menu-item.d.ts +3 -3
  173. package/lib/nav/nav.d.ts +1 -1
  174. package/lib/nav-disclosure/nav-disclosure.d.ts +2 -2
  175. package/lib/nav-item/nav-item.d.ts +2 -2
  176. package/lib/note/note.d.ts +1 -1
  177. package/lib/number-field/number-field.d.ts +9 -10
  178. package/lib/optgroup/definition.d.ts +3 -0
  179. package/lib/optgroup/index.d.ts +1 -0
  180. package/lib/optgroup/optgroup.d.ts +430 -0
  181. package/lib/optgroup/optgroup.template.d.ts +2 -0
  182. package/lib/optgroup/variations.browser-spec.d.ts +1 -0
  183. package/lib/option/option.d.ts +2 -2
  184. package/lib/pagination/pagination.d.ts +1 -1
  185. package/lib/popover/popover.d.ts +2 -2
  186. package/lib/progress/progress.d.ts +1 -1
  187. package/lib/progress-ring/progress-ring.d.ts +1 -1
  188. package/lib/radio/radio.d.ts +3 -3
  189. package/lib/radio-group/radio-group.d.ts +1 -1
  190. package/lib/range-slider/range-slider.d.ts +3 -3
  191. package/lib/rich-text-editor/rich-text-editor.d.ts +1 -1
  192. package/lib/rich-text-editor/rte/features/base.d.ts +1 -0
  193. package/lib/rich-text-editor/rte/utils/default-textblock.d.ts +2 -2
  194. package/lib/searchable-select/option-tag.d.ts +1 -1
  195. package/lib/searchable-select/searchable-select.d.ts +47 -47
  196. package/lib/select/select.d.ts +9 -9
  197. package/lib/selectable-box/selectable-box.d.ts +1 -1
  198. package/lib/simple-color-picker/simple-color-picker.d.ts +2 -2
  199. package/lib/slider/slider.d.ts +3 -3
  200. package/lib/split-button/split-button.d.ts +3 -3
  201. package/lib/status/status.d.ts +1 -1
  202. package/lib/switch/switch.d.ts +2 -2
  203. package/lib/tab/tab.d.ts +3 -3
  204. package/lib/tab-panel/tab-panel.d.ts +1 -1
  205. package/lib/table/table-cell.d.ts +1 -1
  206. package/lib/table/table-header-cell.d.ts +1 -1
  207. package/lib/table/table-row.d.ts +1 -1
  208. package/lib/table/table-sorting-button.d.ts +1 -1
  209. package/lib/tag/tag.d.ts +3 -3
  210. package/lib/tag-group/tag-group.d.ts +1 -1
  211. package/lib/tag-name-map.d.ts +3 -1
  212. package/lib/text-area/text-area.d.ts +8 -8
  213. package/lib/text-field/text-field.d.ts +10 -9
  214. package/lib/time-picker/time-picker.d.ts +4 -4
  215. package/lib/toggletip/toggletip.d.ts +3 -2
  216. package/lib/tooltip/tooltip.d.ts +3 -2
  217. package/lib/tree-item/tree-item.d.ts +2 -2
  218. package/lib/tree-view/tree-view.d.ts +1 -1
  219. package/lib/video-player/video-player.d.ts +1 -1
  220. package/listbox/definition.cjs +5 -0
  221. package/listbox/definition.js +2 -0
  222. package/listbox/index.cjs +11 -0
  223. package/listbox/index.js +540 -0
  224. package/menu/index.cjs +1 -1
  225. package/menu/index.js +1 -1
  226. package/menu-item/index.cjs +1 -1
  227. package/menu-item/index.js +1 -1
  228. package/nav/definition.cjs +1 -1
  229. package/nav/definition.js +1 -1
  230. package/nav-disclosure/definition.cjs +1 -1
  231. package/nav-disclosure/definition.js +1 -1
  232. package/nav-disclosure/index.cjs +4 -4
  233. package/nav-disclosure/index.js +4 -3
  234. package/nav-item/definition.cjs +1 -1
  235. package/nav-item/definition.js +1 -1
  236. package/note/definition.cjs +1 -1
  237. package/note/definition.js +1 -1
  238. package/number-field/definition.cjs +1 -1
  239. package/number-field/definition.js +1 -1
  240. package/number-field/index.cjs +1 -1
  241. package/number-field/index.js +1 -1
  242. package/optgroup/definition.cjs +6 -0
  243. package/optgroup/definition.js +3 -0
  244. package/optgroup/index.cjs +1 -0
  245. package/optgroup/index.js +4 -0
  246. package/option/definition.cjs +2 -1
  247. package/option/definition.js +2 -1
  248. package/package.json +9 -8
  249. package/pagination/definition.cjs +1 -1
  250. package/pagination/definition.js +1 -1
  251. package/platform-switch/definition.cjs +1 -1
  252. package/platform-switch/definition.js +1 -1
  253. package/popover/definition.cjs +1 -1
  254. package/popover/definition.js +1 -1
  255. package/popover/index.cjs +5 -5
  256. package/popover/index.js +4 -3
  257. package/progress/definition.cjs +1 -1
  258. package/progress/definition.js +1 -1
  259. package/radio/definition.cjs +1 -1
  260. package/radio/definition.js +1 -1
  261. package/radio-group/definition.cjs +1 -1
  262. package/radio-group/definition.js +1 -1
  263. package/range-slider/definition.cjs +1 -1
  264. package/range-slider/definition.js +1 -1
  265. package/rich-text-editor/definition.cjs +1 -1
  266. package/rich-text-editor/definition.js +1 -1
  267. package/rich-text-editor/index.cjs +13 -13
  268. package/rich-text-editor/index.js +26 -23
  269. package/rich-text-view/definition.cjs +1 -1
  270. package/rich-text-view/definition.js +1 -1
  271. package/searchable-select/definition.cjs +1 -1
  272. package/searchable-select/definition.js +1 -1
  273. package/searchable-select/index.cjs +23 -23
  274. package/searchable-select/index.js +67 -49
  275. package/select/definition.cjs +1 -1
  276. package/select/definition.js +1 -1
  277. package/select/index.cjs +1 -1
  278. package/select/index.js +1 -1
  279. package/selectable-box/definition.cjs +1 -1
  280. package/selectable-box/definition.js +1 -1
  281. package/shared/aria/delegates-aria.d.ts +1 -1
  282. package/shared/aria/host-semantics.d.ts +1 -1
  283. package/shared/color-picker/base-color-picker.d.ts +1 -1
  284. package/shared/feedback/feedback-message.d.ts +1 -1
  285. package/shared/feedback/mixins.d.ts +2 -2
  286. package/shared/foundation/button/button.d.ts +2 -2
  287. package/shared/foundation/form-associated/form-associated.d.ts +2 -2
  288. package/shared/foundation/listbox/extractOptions.d.ts +2 -0
  289. package/shared/foundation/listbox/listbox.d.ts +2 -0
  290. package/shared/listbox/commands.d.ts +17 -0
  291. package/shared/listbox/move.d.ts +6 -0
  292. package/shared/listbox/options.d.ts +12 -0
  293. package/shared/listbox/selection.d.ts +28 -0
  294. package/shared/listbox/state.d.ts +26 -0
  295. package/shared/listbox/typeahead.d.ts +8 -0
  296. package/shared/listbox/with-options-filter.d.ts +440 -0
  297. package/shared/listbox/with-options.d.ts +862 -0
  298. package/shared/patterns/affix.d.ts +2 -2
  299. package/shared/patterns/anchored.d.ts +2 -2
  300. package/shared/patterns/char-count/char-count.d.ts +1 -1
  301. package/shared/patterns/form-elements/form-element.d.ts +1 -1
  302. package/shared/patterns/form-elements/with-contextual-help.d.ts +1 -1
  303. package/shared/patterns/form-elements/with-error-text.d.ts +1 -1
  304. package/shared/patterns/form-elements/with-success-text.d.ts +1 -1
  305. package/shared/patterns/kbd-shortcut.d.ts +1 -1
  306. package/shared/patterns/linkable.d.ts +1 -1
  307. package/shared/patterns/localized.d.ts +2 -2
  308. package/shared/patterns/trapped-focus.d.ts +1 -1
  309. package/shared/picker-field/mixins/calendar-picker.d.ts +2 -2
  310. package/shared/picker-field/mixins/calendar-picker.template.d.ts +2 -2
  311. package/shared/picker-field/mixins/inline-time-picker/inline-time-picker.d.ts +1 -1
  312. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +2 -2
  313. package/shared/picker-field/mixins/single-date-picker.d.ts +2 -2
  314. package/shared/picker-field/mixins/single-value-picker.d.ts +2 -2
  315. package/shared/picker-field/mixins/time-selection-picker.d.ts +2 -2
  316. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +4 -4
  317. package/shared/picker-field/picker-field.d.ts +7 -7
  318. package/side-drawer/definition.cjs +1 -1
  319. package/side-drawer/definition.js +1 -1
  320. package/simple-color-picker/definition.cjs +1 -1
  321. package/simple-color-picker/definition.js +1 -1
  322. package/simple-color-picker/index.cjs +6 -6
  323. package/simple-color-picker/index.js +4 -3
  324. package/split-button/definition.cjs +1 -1
  325. package/split-button/definition.js +1 -1
  326. package/split-button/index.cjs +1 -0
  327. package/split-button/index.js +1 -0
  328. package/status/definition.cjs +1 -1
  329. package/status/definition.js +1 -1
  330. package/switch/definition.cjs +1 -1
  331. package/switch/definition.js +1 -1
  332. package/switch/index.cjs +6 -5
  333. package/switch/index.js +16 -14
  334. package/tab/definition.cjs +1 -1
  335. package/tab/definition.js +1 -1
  336. package/tab-panel/definition.cjs +1 -1
  337. package/tab-panel/definition.js +1 -1
  338. package/table/definition.cjs +1 -1
  339. package/table/definition.js +1 -1
  340. package/table/index.cjs +13 -13
  341. package/table/index.js +4 -3
  342. package/tabs/definition.cjs +1 -1
  343. package/tabs/definition.js +1 -1
  344. package/tag/definition.cjs +1 -1
  345. package/tag/definition.js +1 -1
  346. package/tag/index.cjs +11 -11
  347. package/tag/index.js +4 -3
  348. package/tag-group/definition.cjs +1 -1
  349. package/tag-group/definition.js +1 -1
  350. package/text-area/definition.cjs +1 -1
  351. package/text-area/definition.js +1 -1
  352. package/time-picker/definition.cjs +1 -1
  353. package/time-picker/definition.js +1 -1
  354. package/tree-item/definition.cjs +1 -1
  355. package/tree-item/definition.js +1 -1
  356. package/tree-view/definition.cjs +1 -1
  357. package/tree-view/definition.js +1 -1
  358. package/unbundled/affix.cjs +2 -2
  359. package/unbundled/affix.js +1 -1
  360. package/unbundled/base-progress.cjs +1 -1
  361. package/unbundled/base-progress.js +1 -1
  362. package/unbundled/button.cjs +2 -2
  363. package/unbundled/button.js +2 -2
  364. package/unbundled/definition.cjs +2 -65
  365. package/unbundled/definition.js +4 -61
  366. package/unbundled/definition11.cjs +4 -3
  367. package/unbundled/definition11.js +3 -2
  368. package/unbundled/definition12.cjs +3 -2
  369. package/unbundled/definition12.js +3 -2
  370. package/unbundled/definition13.cjs +1 -1
  371. package/unbundled/definition13.js +1 -1
  372. package/unbundled/definition14.cjs +2 -1
  373. package/unbundled/definition14.js +2 -1
  374. package/unbundled/definition17.cjs +9 -4
  375. package/unbundled/definition17.js +9 -4
  376. package/unbundled/definition2.cjs +14 -3
  377. package/unbundled/definition2.js +15 -4
  378. package/unbundled/definition21.cjs +2 -1
  379. package/unbundled/definition21.js +2 -1
  380. package/unbundled/definition23.cjs +3 -1
  381. package/unbundled/definition23.js +4 -2
  382. package/unbundled/definition24.cjs +6 -4
  383. package/unbundled/definition24.js +6 -4
  384. package/unbundled/definition25.cjs +2 -1
  385. package/unbundled/definition25.js +2 -1
  386. package/unbundled/definition26.cjs +7 -4
  387. package/unbundled/definition26.js +7 -4
  388. package/unbundled/definition27.cjs +39 -5
  389. package/unbundled/definition27.js +40 -6
  390. package/unbundled/definition28.cjs +4 -3
  391. package/unbundled/definition28.js +4 -3
  392. package/unbundled/definition29.cjs +5 -168
  393. package/unbundled/definition29.js +11 -162
  394. package/unbundled/definition30.cjs +26 -506
  395. package/unbundled/definition30.js +24 -498
  396. package/unbundled/definition31.cjs +503 -39
  397. package/unbundled/definition31.js +501 -37
  398. package/unbundled/definition32.cjs +39 -239
  399. package/unbundled/definition32.js +36 -236
  400. package/unbundled/definition33.cjs +236 -74
  401. package/unbundled/definition33.js +233 -71
  402. package/unbundled/definition34.cjs +74 -1968
  403. package/unbundled/definition34.js +70 -1940
  404. package/unbundled/definition35.cjs +1993 -26
  405. package/unbundled/definition35.js +1965 -27
  406. package/unbundled/definition36.cjs +26 -111
  407. package/unbundled/definition36.js +23 -103
  408. package/unbundled/definition37.cjs +53 -294
  409. package/unbundled/definition37.js +50 -291
  410. package/unbundled/definition38.cjs +282 -132
  411. package/unbundled/definition38.js +279 -129
  412. package/unbundled/definition39.cjs +165 -339
  413. package/unbundled/definition39.js +163 -337
  414. package/unbundled/definition40.cjs +395 -227
  415. package/unbundled/definition40.js +393 -225
  416. package/unbundled/definition41.cjs +269 -47
  417. package/unbundled/definition41.js +264 -42
  418. package/unbundled/definition42.cjs +48 -67
  419. package/unbundled/definition42.js +45 -64
  420. package/unbundled/definition43.cjs +56 -383
  421. package/unbundled/definition43.js +55 -382
  422. package/unbundled/definition44.cjs +387 -44
  423. package/unbundled/definition44.js +383 -40
  424. package/unbundled/definition45.cjs +53 -45
  425. package/unbundled/definition45.js +49 -41
  426. package/unbundled/definition46.cjs +40 -164
  427. package/unbundled/definition46.js +36 -160
  428. package/unbundled/definition47.cjs +171 -31
  429. package/unbundled/definition47.js +168 -22
  430. package/unbundled/definition48.cjs +30 -89
  431. package/unbundled/definition48.js +22 -87
  432. package/unbundled/definition49.cjs +589 -48
  433. package/unbundled/definition49.js +587 -47
  434. package/unbundled/definition50.cjs +90 -21
  435. package/unbundled/definition50.js +88 -16
  436. package/unbundled/definition51.cjs +47 -32
  437. package/unbundled/definition51.js +44 -29
  438. package/unbundled/definition52.cjs +22 -323
  439. package/unbundled/definition52.js +16 -320
  440. package/unbundled/definition53.cjs +33 -212
  441. package/unbundled/definition53.js +29 -208
  442. package/unbundled/definition54.cjs +318 -41
  443. package/unbundled/definition54.js +314 -37
  444. package/unbundled/definition55.cjs +199 -253
  445. package/unbundled/definition55.js +193 -247
  446. package/unbundled/definition56.cjs +45 -53
  447. package/unbundled/definition56.js +42 -49
  448. package/unbundled/definition57.cjs +255 -133
  449. package/unbundled/definition57.js +253 -128
  450. package/unbundled/definition58.cjs +49 -245
  451. package/unbundled/definition58.js +47 -244
  452. package/unbundled/definition59.cjs +127 -444
  453. package/unbundled/definition59.js +124 -444
  454. package/unbundled/definition6.cjs +2 -1
  455. package/unbundled/definition6.js +2 -1
  456. package/unbundled/definition60.cjs +230 -3746
  457. package/unbundled/definition60.js +223 -3576
  458. package/unbundled/definition61.cjs +427 -739
  459. package/unbundled/definition61.js +425 -737
  460. package/unbundled/definition62.cjs +3762 -103
  461. package/unbundled/definition62.js +3593 -97
  462. package/unbundled/definition63.cjs +678 -886
  463. package/unbundled/definition63.js +672 -877
  464. package/unbundled/definition64.cjs +104 -108
  465. package/unbundled/definition64.js +100 -104
  466. package/unbundled/definition65.cjs +999 -65
  467. package/unbundled/definition65.js +995 -58
  468. package/unbundled/definition66.cjs +105 -155
  469. package/unbundled/definition66.js +101 -151
  470. package/unbundled/definition67.cjs +71 -121
  471. package/unbundled/definition67.js +63 -119
  472. package/unbundled/definition68.cjs +162 -51
  473. package/unbundled/definition68.js +158 -47
  474. package/unbundled/definition69.cjs +117 -75
  475. package/unbundled/definition69.js +116 -71
  476. package/unbundled/definition70.cjs +59 -21
  477. package/unbundled/definition70.js +56 -15
  478. package/unbundled/definition71.cjs +80 -75
  479. package/unbundled/definition71.js +76 -74
  480. package/unbundled/definition72.cjs +20 -305
  481. package/unbundled/definition72.js +14 -230
  482. package/unbundled/definition73.cjs +75 -315
  483. package/unbundled/definition73.js +74 -307
  484. package/unbundled/definition74.cjs +308 -30
  485. package/unbundled/definition74.js +231 -24
  486. package/unbundled/definition75.cjs +314 -109
  487. package/unbundled/definition75.js +304 -106
  488. package/unbundled/definition76.cjs +26 -250
  489. package/unbundled/definition76.js +21 -246
  490. package/unbundled/definition77.cjs +133 -27
  491. package/unbundled/definition77.js +124 -25
  492. package/unbundled/definition78.cjs +230 -116
  493. package/unbundled/definition78.js +227 -107
  494. package/unbundled/definition79.cjs +28 -203
  495. package/unbundled/definition79.js +26 -193
  496. package/unbundled/definition80.cjs +126 -477
  497. package/unbundled/definition80.js +118 -473
  498. package/unbundled/definition81.cjs +221 -0
  499. package/unbundled/definition81.js +202 -0
  500. package/unbundled/definition82.cjs +517 -0
  501. package/unbundled/definition82.js +497 -0
  502. package/unbundled/extractOptions.cjs +21 -0
  503. package/unbundled/extractOptions.js +16 -0
  504. package/unbundled/icon.cjs +67 -0
  505. package/unbundled/icon.js +61 -0
  506. package/unbundled/linkable.cjs +1 -1
  507. package/unbundled/linkable.js +1 -1
  508. package/unbundled/listbox.cjs +29 -7
  509. package/unbundled/listbox.js +29 -7
  510. package/unbundled/mixins.cjs +2 -1
  511. package/unbundled/mixins.js +2 -1
  512. package/unbundled/optgroup.cjs +66 -0
  513. package/unbundled/optgroup.js +54 -0
  514. package/unbundled/option.cjs +176 -0
  515. package/unbundled/option.js +164 -0
  516. package/unbundled/time-selection-picker.template.cjs +1 -1
  517. package/unbundled/time-selection-picker.template.js +1 -1
  518. package/unbundled/vivid-element.cjs +10 -1
  519. package/unbundled/vivid-element.js +10 -1
  520. package/video-player/definition.cjs +1 -1
  521. package/video-player/definition.js +1 -1
  522. package/vivid.api.json +568 -231
@@ -1,1001 +1,796 @@
1
- import { d as createRegisterFunction, t as VividElement, u as defineVividComponent } from "./vivid-element.js";
2
- import { r as Icon, t as iconDefinition } from "./definition.js";
1
+ import { d as createRegisterFunction, u as defineVividComponent } from "./vivid-element.js";
2
+ import { t as iconDefinition } from "./definition.js";
3
3
  import { t as __decorate } from "./decorate.js";
4
4
  import { a as affixIconTemplateFactory, i as IconWrapper, n as AffixIconWithTrailing } from "./affix.js";
5
- import { n as delegateAria, t as DelegatesAria } from "./delegates-aria.js";
6
- import { r as ProgressRing, t as progressRingDefinition } from "./definition5.js";
7
5
  import { n as FormAssociated } from "./form-associated.js";
8
6
  import { t as Localized } from "./localized.js";
9
7
  import { i as Button, r as chevronTemplateFactory, t as buttonDefinition } from "./definition6.js";
8
+ import { t as handleEscapeKeyAndStopPropogation } from "./dialog.js";
10
9
  import { i as Popup, t as popupDefinition } from "./definition9.js";
11
- import { t as Divider } from "./divider.js";
12
- import { r as feedbackMessageDefinition, t as WithFeedback } from "./mixins.js";
10
+ import { n as applyHostSemantics, t as HostSemantics } from "./host-semantics.js";
11
+ import { n as WithLightDOMFeedback, r as feedbackMessageDefinition } from "./mixins.js";
13
12
  import { t as FormElement } from "./form-element.js";
14
13
  import { t as WithErrorText } from "./with-error-text.js";
15
14
  import { t as WithSuccessText } from "./with-success-text.js";
16
15
  import { t as WithContextualHelp } from "./with-contextual-help.js";
17
- import { i as isListboxOption, r as ListboxOption, t as listboxOptionDefinition } from "./definition29.js";
18
- import { t as dividerDefinition } from "./definition35.js";
19
- import { t as scrollIntoView } from "./scrollIntoView.js";
20
- import { Observable, Updates, attr, html, nullableNumberConverter, observable, ref, repeat, slotted, when } from "@microsoft/fast-element";
21
- import { classNames } from "@microsoft/fast-web-utilities";
22
- //#region src/lib/searchable-select/searchable-select.scss?inline
23
- var searchable_select_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}.chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:not(.disabled) .chevron{cursor:pointer}.disabled .chevron{color:var(--_low-ink-color);cursor:not-allowed}:host(:focus-visible){outline:none}:host{--_low-ink-color:var(--vvd-color-neutral-600);inline-size:300px;display:inline-block}:host([disabled]){--_low-ink-color:var(--vvd-color-neutral-400);cursor:not-allowed}.control-wrapper{flex-direction:column;gap:4px;display:flex}.label{color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base)}.selection-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.fieldset{--_connotation-color-primary:var(--vvd-searchable-select-accent-primary,var(--vvd-color-canvas-text));--_connotation-color-primary-text:var(--vvd-searchable-select-accent-primary-text,var(--vvd-color-canvas));--_connotation-color-primary-increment:var(--vvd-searchable-select-accent-primary-increment,var(--vvd-color-neutral-800));--_connotation-color-intermediate:var(--vvd-searchable-select-accent-intermediate,var(--vvd-color-neutral-500));--_connotation-color-faint:var(--vvd-searchable-select-accent-faint,var(--vvd-color-neutral-50));--_connotation-color-soft:var(--vvd-searchable-select-accent-soft,var(--vvd-color-neutral-100));--_connotation-color-firm:var(--vvd-searchable-select-accent-firm,var(--vvd-color-canvas-text));--_connotation-color-fierce:var(--vvd-searchable-select-accent-fierce,var(--vvd-color-neutral-700));--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-500)}.fieldset.appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}@media (hover:hover){.fieldset:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.fieldset:hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}}.fieldset.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.fieldset.hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}.fieldset:disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.fieldset:disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.fieldset.disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.fieldset.disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.fieldset.readonly:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-neutral-200);--_appearance-color-outline:var(--vvd-color-neutral-400)}.fieldset.readonly:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.fieldset.error:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:var(--vvd-color-alert-500)}.fieldset.error:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:transparent}.fieldset.success:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:var(--vvd-color-success-500)}.fieldset.success:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:transparent}.fieldset{--_searchable-select-block-size:24px;--_searchable-select-padding-block:8px;--_searchable-select-padding-inline:16px;--_searchable-select-icon-size:20px;--_searchable-select-border-radius:8px;--_searchable-select-gap:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);justify-content:space-between;align-items:center;gap:var(--_searchable-select-gap);padding-block:var(--_searchable-select-padding-block);padding-inline:var(--_searchable-select-padding-inline);transition:box-shadow .2s,background-color .2s;display:flex}.fieldset.size-condensed{--_searchable-select-block-size:20px;--_searchable-select-padding-block:6px;--_searchable-select-padding-inline:12px;--_searchable-select-gap:6px}.fieldset.size-condensed:not(.shape-pill){--_searchable-select-border-radius:4px}@supports selector(:has(*)){.fieldset:not(.has-highlighted-option):has(input:focus){box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent}}@supports not selector(:has(*)){.fieldset:not(.has-highlighted-option):focus-within{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent}}:host(:not([shape=pill])) .fieldset{border-radius:var(--_searchable-select-border-radius)}:host([shape=pill]) .fieldset{border-radius:24px}.popup-wrapper{position:relative}.content-area{gap:var(--_searchable-select-gap);min-block-size:var(--_searchable-select-block-size);flex-direction:column;flex:1;display:flex;overflow:hidden}.tag-row{gap:var(--_searchable-select-gap);inline-size:100%;display:flex}.tag-row.contains-only-input:not(:focus-within){display:contents}.tag-wrapper{overflow:hidden}.tag{max-inline-size:100%}input{box-sizing:border-box;block-size:var(--_searchable-select-block-size);font:var(--vvd-typography-base);background:0 0;border:none;outline:none;flex:1;min-inline-size:min(100px,40%);max-inline-size:100%}.contains-only-input input:not(:focus){opacity:0;pointer-events:none;block-size:0;inline-size:0;min-inline-size:0;position:absolute}.listbox{max-block-size:var(--searchable-select-height,408px);flex-direction:column;gap:2px;padding:4px;display:flex;overflow-y:auto}.empty-message{color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);text-align:center;justify-content:center;align-items:center;min-block-size:40px;display:flex}::part(popup-base){inline-size:max-content;min-inline-size:var(--_searchable-select-fixed-width,100%)}slot[name=icon]{font-size:var(--_searchable-select-icon-size)}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}::slotted([data-vvd-component=option][data-highlighted]),[data-select-all][data-highlighted]{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));--focus-stroke-gap-color:transparent;border-radius:8px}.divider{margin-block:10px;margin-inline:12px}";
16
+ import { t as ListboxOption } from "./option.js";
17
+ import { t as listboxOptionDefinition } from "./definition29.js";
18
+ import { t as optgroupDefinition } from "./definition30.js";
19
+ import { t as Listbox } from "./listbox.js";
20
+ import { Observable, Updates, attr, html, observable, ref, slotted, volatile, when } from "@microsoft/fast-element";
21
+ import { classNames, inRange, keyArrowDown, keyArrowUp, keyEnd, keyEnter, keyEscape, keyHome, keySpace, keyTab, uniqueId } from "@microsoft/fast-web-utilities";
22
+ //#region src/lib/select/select.scss?inline
23
+ var select_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}.chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host(:focus-visible){outline:none}:host{--_low-ink-color:var(--vvd-color-neutral-600);--focus-stroke-gap-color:transparent;flex-direction:column;gap:4px;display:inline-flex}:host([disabled]){--_low-ink-color:var(--vvd-color-neutral-600);cursor:not-allowed}.label{color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base)}.control{--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-500)}.control.appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}@media (hover:hover){.control:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.control:hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}}.control.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.control.hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}.control:disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.control:disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.control.disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.readonly:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-neutral-200);--_appearance-color-outline:var(--vvd-color-neutral-400)}.control.readonly:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.error:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:var(--vvd-color-alert-500)}.control.error:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:transparent}.control.success:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:var(--vvd-color-success-500)}.control.success:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:transparent}.control{--_connotation-color-primary:var(--vvd-select-accent-primary,var(--vvd-color-canvas-text));--_connotation-color-primary-text:var(--vvd-select-accent-primary-text,var(--vvd-color-canvas));--_connotation-color-primary-increment:var(--vvd-select-accent-primary-increment,var(--vvd-color-neutral-800));--_connotation-color-intermediate:var(--vvd-select-accent-intermediate,var(--vvd-color-neutral-500));--_connotation-color-faint:var(--vvd-select-accent-faint,var(--vvd-color-neutral-50));--_connotation-color-soft:var(--vvd-select-accent-soft,var(--vvd-color-neutral-100));--_connotation-color-firm:var(--vvd-select-accent-firm,var(--vvd-color-canvas-text));--_connotation-color-fierce:var(--vvd-select-accent-fierce,var(--vvd-color-neutral-700));border-radius:var(--_select-control-border-radius);block-size:var(--_select-block-size);padding-inline:var(--_select-padding-inline);--_select-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_select-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_select-padding-inline:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);justify-content:space-between;align-items:center;gap:8px;transition:box-shadow .2s,background-color .2s;display:flex}.control.size-condensed{--_select-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_select-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_select-padding-inline:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2)}.control.size-condensed:not(.shape-pill){--_select-control-border-radius:4px}.control-wrapper{position:relative}.control:not(.disabled){cursor:pointer}.control.disabled{pointer-events:none}.control:not(.shape-pill){--_select-control-border-radius:8px}.control.shape-pill{--_select-control-border-radius:24px}.listbox{max-height:var(--select-height,408px);flex-direction:column;gap:2px;padding:4px;display:flex;overflow-y:auto}:host([multiple]:focus-visible) .listbox{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:8px}.selected-value{white-space:nowrap;flex-grow:1;align-items:center;column-gap:12px;display:flex;overflow:hidden}.selected-value .text{text-overflow:ellipsis;max-inline-size:100%;overflow:hidden}.control.shows-placeholder .selected-value .text{color:var(--vvd-color-neutral-600)}.selected-value slot[name=icon]{flex:0 0 var(--_select-icon-size);font-size:var(--_select-icon-size);line-height:1}.control.has-meta .selected-value{padding-inline-end:8px}.feedback-wrapper{display:contents}::part(popup-base){inline-size:max-content;min-inline-size:var(--_select-fixed-width,100%)}:host([multiple]) ::part(popup-base){position:static}@supports selector(:has(*)){:host(:focus-within) .control:not(.has-activedescendant,:has(.clear-button:focus)){--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){:host(:focus-within) .control:not(.has-activedescendant){--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}:host(:not(:focus-visible)){--_suppressable-focus-shadow:none;--_suppressable-focus-outline:none;--_suppressable-focus-outline-offset:0}:host([multiple]) .clear-button{margin-inline-start:auto}:host([multiple][clearable]) .label-wrapper{min-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16))}";
24
24
  //#endregion
25
- //#region src/lib/searchable-select/option-tag.scss?inline
26
- var option_tag_default = ":host{display:block}.base.connotation-cta{--_connotation-color-contrast:var(--vvd-option-tag-cta-contrast,var(--vvd-color-cta-800))}.base:not(.connotation-cta){--_connotation-color-contrast:var(--vvd-option-tag-accent-contrast,var(--vvd-color-neutral-800))}.base{--_option-tag-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));box-sizing:border-box;background-color:var(--fill-color);block-size:var(--_option-tag-block-size);box-shadow:inset 0 0 0 1px var(--outline-color);color:var(--text-color);font:var(--vvd-typography-base-bold);user-select:none;align-items:center;column-gap:8px;max-inline-size:100%;padding-inline:8px;display:flex;position:relative}.base.size-condensed{--_option-tag-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 20));padding-inline:4px}.base:not(.disabled){--text-color:var(--_connotation-color-contrast);--fill-color:var(--_connotation-color-soft);--outline-color:transparent}@supports (background-color:color-mix(in srgb, black 50%, white)){.base:not(.disabled){--fill-color:color-mix(in sRGB, var(--_connotation-color-contrast), transparent 87.5%)}}.base.disabled{--text-color:var(--vvd-color-neutral-300);--fill-color:var(--vvd-color-neutral-200);--outline-color:transparent}@supports (background-color:color-mix(in srgb, black 50%, white)){.base.disabled{--fill-color:color-mix(in sRGB, var(--vvd-color-neutral-800), transparent 87.5%)}}.base:not(.shape-pill){border-radius:4px}.base.shape-pill{border-radius:16px}.label{text-overflow:ellipsis;white-space:nowrap;max-inline-size:100%;overflow:hidden}slot[name=icon]{font-size:calc(var(--_option-tag-block-size) / 1.5);line-height:1}.icon-placeholder{inline-size:calc(var(--_option-tag-block-size) / 1.5)}.remove-button{border-radius:inherit;cursor:pointer;outline:none;align-items:center;display:flex}.disabled .remove-button{pointer-events:none}.remove-button:focus-visible:before{--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));z-index:1;border-radius:inherit;content:\"\";pointer-events:none;display:block;position:absolute;inset:0}";
27
- //#endregion
28
- //#region src/lib/searchable-select/searchable-select.ts
29
- var TagGapPx = 8;
30
- var InputMinWidthPx = 100;
31
- var PageSize = 10;
32
- var isFormAssociatedTryingToSetFormValue = (value) => typeof value === "string";
25
+ //#region src/lib/select/select.ts
33
26
  /**
34
27
  * @public
35
- * @component searchable-select
36
- * @slot - Holds the available options.
37
- * @slot icon - The preferred way to add an icon to the control.
38
- * @slot meta - Slot to add meta content to the control.
39
- * @slot helper-text - Describes how to use the component. Alternative to the `helper-text` attribute.
40
- * @slot no-options - Message that appears when no options are available.
41
- * @slot no-matches - Message that appears when no options match the search query.
42
- * @slot loading-options - Message that appears there are no options to display and the component is in a loading state.
43
- * @event {CustomEvent<undefined>} input - Fired when the selected options change
44
- * @event {CustomEvent<undefined>} search-text-change - Fired when the search text changes
45
- * @event {CustomEvent<undefined>} change - Fired when the selected options change
28
+ * @component select
29
+ * @slot - Default slot.
30
+ * @slot icon - The preferred way to add an icon to the select control.
31
+ * @slot meta - Slot to add meta content to the select control.
32
+ * @slot helper-text - Describes how to use the select. Alternative to the `helper-text` attribute.
33
+ * @event {CustomEvent<undefined>} input - Fires a custom 'input' event when the value updates
34
+ * @event {CustomEvent<HTMLElement>} change - Fires a custom 'change' event when the value updates
46
35
  * @vueModel modelValue value input,@lazy:change `event.currentTarget.value`
47
- * @vueModel values values input,@lazy:change `event.currentTarget.values`
48
36
  * @testAction selectOptionByValue selectOptionByValue
49
37
  * @testAction selectOptionByText selectOptionByText
50
- * @testQuery values values
51
- * @testQuery selectedOptions selectedOptionsText
52
38
  */
53
- var SearchableSelect = class extends WithContextualHelp(WithFeedback(WithErrorText(WithSuccessText(FormElement(DelegatesAria(AffixIconWithTrailing(Localized(FormAssociated(VividElement))))))))) {
39
+ var Select = class extends WithLightDOMFeedback(WithContextualHelp(WithErrorText(WithSuccessText(Localized(FormElement(HostSemantics(AffixIconWithTrailing(FormAssociated(Listbox))))))))) {
54
40
  constructor(..._args) {
55
41
  super(..._args);
56
- this.fixedDropdown = false;
42
+ this.proxy = document.createElement("select");
43
+ this.activeIndex = -1;
44
+ this.rangeStartIndex = -1;
57
45
  this.open = false;
58
- this.multiple = false;
59
- this.externalTags = false;
60
- this.maxLines = null;
61
- this.values = [];
62
- this.initialValues = [];
63
- this._currentSearchText = null;
64
- this._areOptionsInitialized = false;
65
- this.#slottedOptionsChangeHandler = { handleChange: (source, _) => {
66
- if (source.selected && !this.values.includes(source.value)) this.values = [...this.values, source.value];
67
- else if (!source.selected && this.values.includes(source.value)) this.values = this.values.filter((option) => option !== source.value);
68
- } };
69
- this.#clonedTagIcons = /* @__PURE__ */ new Map();
70
- this._filteredOptions = [];
71
- this._filteredEnabledOptions = [];
72
- this.loading = false;
73
- this._highlightedOptionIndex = null;
74
- this._numElidedTags = 0;
75
- this._tagRows = [];
76
- this._lastTagRow = [];
46
+ this.listboxId = uniqueId("listbox-");
47
+ this.maxHeight = 0;
48
+ this.fixedDropdown = false;
49
+ this._feedbackWrapper = null;
50
+ this._isResetting = false;
77
51
  this.clearable = false;
78
- this.maxSelected = null;
79
- this._slottedDisabledOptions = [];
80
- this.enableSelectAll = false;
81
- this.proxy = document.createElement("input");
82
- this.setFormValue = (value, state) => {
83
- if (isFormAssociatedTryingToSetFormValue(value)) return;
84
- super.setFormValue(value, state);
85
- };
86
- this._changeDescription = "";
87
- this.#resizeObserver = new ResizeObserver(() => {
88
- this.#updateTagLayout();
89
- });
90
- }
91
- /** @internal */
92
- openChanged() {
93
- if (!this.open) this.#transitionHighlightedOptionTo(null);
52
+ this._isClearButtonFocused = false;
53
+ }
54
+ /**
55
+ * Returns the last checked option.
56
+ *
57
+ * @internal
58
+ */
59
+ get activeOption() {
60
+ return this.options[this.activeIndex];
61
+ }
62
+ /**
63
+ * Returns the list of checked options.
64
+ *
65
+ * @internal
66
+ */
67
+ get checkedOptions() {
68
+ return this.options.filter((o) => o.checked);
69
+ }
70
+ /**
71
+ * Returns the index of the first selected option.
72
+ *
73
+ * @internal
74
+ */
75
+ get firstSelectedOptionIndex() {
76
+ return this.options.indexOf(this.firstSelectedOption);
77
+ }
78
+ /**
79
+ * Updates the `ariaActiveDescendant` property when the active index changes.
80
+ *
81
+ * @internal
82
+ */
83
+ activeIndexChanged(_, next) {
84
+ this._activeDescendant = this.options[next]?.id ?? "";
85
+ this.focusAndScrollOptionIntoView();
86
+ }
87
+ /**
88
+ * Toggles the checked state for the currently active option.
89
+ *
90
+ * @remarks
91
+ * Multiple-selection mode only.
92
+ *
93
+ * @internal
94
+ */
95
+ checkActiveIndex() {
96
+ const activeItem = this.activeOption;
97
+ /* v8 ignore else -- @preserve */
98
+ if (activeItem) activeItem.checked = true;
99
+ }
100
+ /**
101
+ * Sets the active index to the first option and marks it as checked.
102
+ *
103
+ * @remarks
104
+ * Multi-selection mode only.
105
+ *
106
+ * @param preserveChecked - mark all options unchecked before changing the active index
107
+ *
108
+ * @internal
109
+ */
110
+ checkFirstOption(preserveChecked) {
111
+ const firstSelectableIndex = this.getNextSelectableIndex(0);
112
+ if (firstSelectableIndex === -1) return;
113
+ if (preserveChecked) {
114
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
115
+ this.options.forEach((o, i) => {
116
+ o.checked = inRange(i, firstSelectableIndex, this.rangeStartIndex + 1) && !o.disabled;
117
+ });
118
+ } else this.uncheckAllOptions();
119
+ this.activeIndex = firstSelectableIndex;
120
+ this.checkActiveIndex();
121
+ }
122
+ /**
123
+ * Decrements the active index and sets the matching option as checked.
124
+ *
125
+ * @remarks
126
+ * Multi-selection mode only.
127
+ *
128
+ * @param preserveChecked - mark all options unchecked before changing the active index
129
+ *
130
+ * @internal
131
+ */
132
+ checkLastOption(preserveChecked) {
133
+ const lastSelectableIndex = this.getPreviousSelectableIndex(this.length - 1);
134
+ if (lastSelectableIndex === -1) return;
135
+ if (preserveChecked) {
136
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
137
+ this.options.forEach((o, i) => {
138
+ o.checked = inRange(i, this.rangeStartIndex, lastSelectableIndex + 1) && !o.disabled;
139
+ });
140
+ } else this.uncheckAllOptions();
141
+ this.activeIndex = lastSelectableIndex;
142
+ this.checkActiveIndex();
143
+ }
144
+ /**
145
+ * Increments the active index and marks the matching option as checked.
146
+ *
147
+ * @remarks
148
+ * Multiple-selection mode only.
149
+ *
150
+ * @param preserveChecked - mark all options unchecked before changing the active index
151
+ *
152
+ * @internal
153
+ */
154
+ checkNextOption(preserveChecked) {
155
+ const nextIndex = this.getNextSelectableIndex(this.activeIndex + 1);
156
+ if (nextIndex === -1) return;
157
+ if (preserveChecked) {
158
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
159
+ this.options.forEach((o, i) => {
160
+ o.checked = inRange(i, this.rangeStartIndex, nextIndex + 1) && !o.disabled;
161
+ });
162
+ } else this.uncheckAllOptions();
163
+ this.activeIndex = nextIndex;
164
+ this.checkActiveIndex();
165
+ }
166
+ /**
167
+ * Decrements the active index and marks the matching option as checked.
168
+ *
169
+ * @remarks
170
+ * Multiple-selection mode only.
171
+ *
172
+ * @param preserveChecked - mark all options unchecked before changing the active index
173
+ *
174
+ * @internal
175
+ */
176
+ checkPreviousOption(preserveChecked) {
177
+ const previousIndex = this.getPreviousSelectableIndex(this.activeIndex - 1);
178
+ if (previousIndex === -1) return;
179
+ if (preserveChecked) {
180
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
181
+ if (this.checkedOptions.length === 1) this.rangeStartIndex += 1;
182
+ this.options.forEach((o, i) => {
183
+ o.checked = inRange(i, previousIndex, this.rangeStartIndex + 1) && !o.disabled;
184
+ });
185
+ } else this.uncheckAllOptions();
186
+ this.activeIndex = previousIndex;
187
+ this.checkActiveIndex();
188
+ }
189
+ /** @internal */
190
+ focusAndScrollOptionIntoView() {
191
+ super.focusAndScrollOptionIntoView(this.activeOption);
192
+ }
193
+ /**
194
+ * In multiple-selection mode:
195
+ * If any options are selected, the first selected option is checked when
196
+ * the listbox receives focus. If no options are selected, the first
197
+ * selectable option is checked.
198
+ *
199
+ * @internal
200
+ */
201
+ focusinHandler(e) {
202
+ if (!this.multiple) {
203
+ super.focusinHandler(e);
204
+ return;
205
+ }
206
+ /* v8 ignore else -- @preserve */
207
+ if (!this.shouldSkipFocus && e.target === e.currentTarget) {
208
+ this.uncheckAllOptions();
209
+ if (this.activeIndex === -1) this.activeIndex = this.firstSelectedOptionIndex !== -1 ? this.firstSelectedOptionIndex : 0;
210
+ this.checkActiveIndex();
211
+ this.setSelectedOptions();
212
+ this.focusAndScrollOptionIntoView();
213
+ }
214
+ this.shouldSkipFocus = false;
94
215
  }
95
- /** @internal */
96
- valuesChanged() {
97
- if (!this._areOptionsInitialized) return;
98
- if (!this.multiple && this.values.length > 1) {
99
- this.values = [this.values[0]];
216
+ /** Sets an option as selected and gives it focus. */
217
+ setSelectedOptions() {
218
+ if (!this.multiple) {
219
+ super.setSelectedOptions();
100
220
  return;
101
221
  }
102
- if (this.values.some((value) => !this.#isValidValue(value))) {
103
- this.values = this.values.filter((value) => this.#isValidValue(value));
222
+ /* v8 ignore else -- @preserve */
223
+ if (this.$fastController.isConnected && this.options) {
224
+ this.selectedOptions = this.options.filter((o) => o.selected);
225
+ this.focusAndScrollOptionIntoView();
226
+ }
227
+ }
228
+ /**
229
+ * Toggles the selected state of the provided options. If any provided items
230
+ * are in an unselected state, all items are set to selected. If every
231
+ * provided item is selected, they are all unselected.
232
+ *
233
+ * @internal
234
+ */
235
+ toggleSelectedForAllCheckedOptions() {
236
+ const enabledCheckedOptions = this.checkedOptions.filter((o) => !o.disabled);
237
+ const force = !enabledCheckedOptions.every((o) => o.selected);
238
+ enabledCheckedOptions.forEach((o) => o.selected = force);
239
+ this.selectedIndex = this.options.indexOf(enabledCheckedOptions[enabledCheckedOptions.length - 1]);
240
+ this.setSelectedOptions();
241
+ this.updateValue(true);
242
+ }
243
+ /** @internal */
244
+ typeaheadBufferChanged(prev, next) {
245
+ if (!this.multiple) {
246
+ super.typeaheadBufferChanged(prev, next);
104
247
  return;
105
248
  }
106
- this.value = this.values.length ? this.values[0] : "";
107
- this.#updateSelectionLimit();
108
- this.#updateSelectedOnSlottedOptions();
109
- if (this.$fastController.isConnected) this.#updateTagLayout();
110
- this.#updateFormValue();
111
- }
112
- #updateValuesThroughUserInteraction(newValues) {
113
- this.values = newValues;
114
- this.$emit("change", void 0, { bubbles: false });
115
- this.$emit("input", void 0, { bubbles: false });
116
- }
117
- #updateValuesWhileMaintainingOrder(newValues) {
118
- const oldSet = new Set(this.values);
119
- const newSet = new Set(newValues);
120
- this.values = [...this.values].filter((v) => newSet.has(v)).concat([...newValues].filter((v) => !oldSet.has(v)));
249
+ /* v8 ignore if -- @preserve */
250
+ if (this.$fastController.isConnected) {
251
+ const typeaheadMatches = this.getTypeaheadMatches();
252
+ const activeIndex = this.options.indexOf(typeaheadMatches[0]);
253
+ if (activeIndex > -1) {
254
+ this.activeIndex = activeIndex;
255
+ this.uncheckAllOptions();
256
+ this.checkActiveIndex();
257
+ }
258
+ this.typeaheadExpired = false;
259
+ }
121
260
  }
122
- /** @internal */
123
- initialValuesChanged() {
124
- if (!this.dirtyValue) {
125
- this.values = this.initialValues;
126
- this.dirtyValue = false;
261
+ /**
262
+ * Unchecks all options.
263
+ *
264
+ * @remarks
265
+ * Multiple-selection mode only.
266
+ *
267
+ * @param preserveChecked - reset the rangeStartIndex
268
+ *
269
+ * @internal
270
+ */
271
+ uncheckAllOptions(preserveChecked = false) {
272
+ this.options.forEach((o) => o.checked = false);
273
+ /* v8 ignore else -- @preserve */
274
+ if (!preserveChecked) this.rangeStartIndex = -1;
275
+ }
276
+ /**
277
+ * Sets focus when the open property changes.
278
+ *
279
+ * @internal
280
+ */
281
+ openChanged(prev, next) {
282
+ if (!this.collapsible) return;
283
+ if (this.open) {
284
+ this.focusAndScrollOptionIntoView();
285
+ this.indexWhenOpened = this.selectedIndex;
286
+ Updates.enqueue(() => this.focus());
287
+ return;
127
288
  }
289
+ const didClose = prev && !next;
290
+ const selectionChangedWhileOpen = this.indexWhenOpened !== this.selectedIndex;
291
+ if (didClose && selectionChangedWhileOpen) this.updateValue(true);
128
292
  }
129
- #isValidValue(value) {
130
- return this._slottedOptions.some((option) => option.value === value);
293
+ /**
294
+ * The component is collapsible when in single-selection mode.
295
+ *
296
+ * @internal
297
+ */
298
+ get collapsible() {
299
+ return !this.multiple;
131
300
  }
132
301
  /** @internal */
133
302
  valueChanged(prev, next) {
303
+ const nextSelectedIndex = this.options.findIndex((el) => el.value === next);
304
+ const validNextSelectedIndex = this._validSelectedIndex(nextSelectedIndex);
305
+ const nextValue = this.options[validNextSelectedIndex]?.value ?? "";
306
+ if (this.selectedIndex !== validNextSelectedIndex) this.selectedIndex = validNextSelectedIndex;
307
+ if (next !== nextValue) return;
134
308
  super.valueChanged(prev, next);
135
- if (!this._areOptionsInitialized) return;
136
- const isValidValue = this._slottedOptions.some((option) => option.value === next);
137
- if (this.values[0] !== next) this.values = isValidValue ? [next] : [];
138
- }
139
- get selectedIndex() {
140
- if (this.values.length) return this._slottedOptions.findIndex((option) => option.value === this.values[0]);
141
- else return -1;
142
- }
143
- set selectedIndex(index) {
144
- this.value = this._slottedOptions[index]?.value ?? "";
145
- }
146
- get options() {
147
- return [...this._slottedOptions];
148
- }
149
- get selectedOptions() {
150
- return this._slottedOptions.filter((option) => this.values.includes(option.value));
151
- }
152
- /** @internal */
153
- _currentSearchTextChanged() {
154
- this.#updateFilteredOptions();
155
- this.$emit("search-text-change", void 0, {
156
- bubbles: false,
157
- composed: false
158
- });
159
- }
160
- /** Read-only property containing the current search text. */
161
- get searchText() {
162
- return this._currentSearchText ?? "";
163
- }
164
- /** @internal */
165
- get _inputValue() {
166
- return this._currentSearchText ?? (!this.multiple && this.value !== "" ? this.#textForValue(this.value) ?? "" : "");
167
- }
168
- /** @internal */
169
- _onInputInput(event) {
170
- this._currentSearchText = event.target.value;
171
- }
172
- /** @internal */
173
- _onInputFocus(_) {
174
- this.#updateFilteredOptions();
175
- }
176
- /** @internal */
177
- _onInputBlur(_) {
178
- this.open = false;
179
- this._currentSearchText = null;
180
- this._changeDescription = "";
181
- }
182
- /** @internal */
183
- _onInputKeydown(e) {
184
- if (e.ctrlKey || e.shiftKey) return true;
185
- switch (e.key) {
186
- case "Enter":
187
- this.#selectHighlightedOption();
188
- if (this._inputValue === "") this.open = !this.open;
189
- return false;
190
- case "Escape":
191
- this.open = false;
192
- break;
193
- case "Home":
194
- if (!this.open) {
195
- this.open = true;
196
- break;
197
- }
198
- this.#highlightFirstOption();
199
- return false;
200
- case "End":
201
- if (!this.open) {
202
- this.open = true;
203
- break;
204
- }
205
- this.#highlightLastOption();
206
- return false;
207
- case "PageUp":
208
- if (!this.open) {
209
- this.open = true;
210
- break;
211
- }
212
- this.#highlightPrevPage();
213
- return false;
214
- case "PageDown":
215
- if (!this.open) {
216
- this.open = true;
217
- break;
218
- }
219
- this.#highlightNextPage();
220
- return false;
221
- case "ArrowUp":
222
- if (!this.open) {
223
- this.open = true;
224
- break;
225
- }
226
- this.#highlightPreviousOption();
227
- return false;
228
- case "ArrowDown":
229
- if (!this.open) {
230
- this.open = true;
231
- break;
232
- }
233
- this.#highlightNextOption();
234
- return false;
235
- case "ArrowLeft":
236
- if (this.multiple && this._inputValue === "" && this.values.length && !this.externalTags) {
237
- this.#moveTagFocusTo(this.#nextTagIndexLeft(this.values.length));
238
- return false;
239
- }
240
- return true;
241
- case "Backspace":
242
- if (this.multiple && this._inputValue === "" && this.values.length) {
243
- this._onTagRemoved(this.values[this.values.length - 1]);
244
- return false;
245
- }
246
- return true;
247
- default:
248
- /* v8 ignore next -- @preserve */
249
- if (!this.open) this.open = true;
250
- return true;
309
+ this.updateDisplayValue();
310
+ }
311
+ /**
312
+ * Sets the value and display value to match the first selected option.
313
+ *
314
+ * @param shouldEmit - if true, the input and change events will be emitted
315
+ *
316
+ * @internal
317
+ */
318
+ updateValue(shouldEmit) {
319
+ if (this.$fastController.isConnected) this.value = this.firstSelectedOption?.value ?? "";
320
+ if (shouldEmit) {
321
+ this.$emit("input");
322
+ this.$emit("change", this, {
323
+ bubbles: true,
324
+ composed: void 0
325
+ });
251
326
  }
327
+ }
328
+ /**
329
+ * Updates the proxy value when the selected index changes.
330
+ *
331
+ * @param prev - the previous selected index
332
+ * @param next - the next selected index
333
+ *
334
+ * @internal
335
+ */
336
+ selectedIndexChanged(prev, next) {
337
+ super.selectedIndexChanged(prev, next);
338
+ this.updateValue();
339
+ }
340
+ /**
341
+ * Handle opening and closing the listbox when the select is clicked.
342
+ *
343
+ * @param e - the mouse event
344
+ * @internal
345
+ */
346
+ clickHandler(e) {
347
+ if (this.disabled || this._isFromContextualHelp(e)) return;
348
+ const clickedOption = e.target.closest(`option,[role=option],[data-vvd-component=option]`);
349
+ if (clickedOption && clickedOption.disabled) return;
350
+ if (this.multiple) {
351
+ this.uncheckAllOptions();
352
+ this.activeIndex = this.options.indexOf(clickedOption);
353
+ this.checkActiveIndex();
354
+ this.toggleSelectedForAllCheckedOptions();
355
+ } else super.clickHandler(e);
356
+ if (this.collapsible) this.open = !this.open;
252
357
  return true;
253
358
  }
254
- /** @internal */
255
- _slottedOptionsChanged(oldValue, newValue) {
256
- const hasSlottedOptions = Boolean(this.querySelectorAll(`:not([slot])`).length);
257
- if (!newValue.length && hasSlottedOptions) return;
258
- this._areOptionsInitialized = true;
259
- if (oldValue) {
260
- this._slottedDisabledOptions = [];
261
- for (const option of oldValue) Observable.getNotifier(option).unsubscribe(this.#slottedOptionsChangeHandler, "selected");
359
+ /**
360
+ * Handles focus state when the element or its children lose focus.
361
+ *
362
+ * @param e - The focus event
363
+ * @internal
364
+ */
365
+ focusoutHandler(e) {
366
+ if (this.multiple) this.uncheckAllOptions();
367
+ if (!this.open) return true;
368
+ const focusTarget = e.relatedTarget;
369
+ if (this.isSameNode(focusTarget)) {
370
+ this.focus();
371
+ return;
262
372
  }
263
373
  /* v8 ignore else -- @preserve */
264
- if (newValue) for (const option of newValue) {
265
- option._displayCheckmark = true;
266
- Observable.getNotifier(option).subscribe(this.#slottedOptionsChangeHandler, "selected");
267
- }
268
- const values = [];
269
- for (const option of this._slottedOptions) {
270
- if (option.selected || option.value === this.value || this.values.includes(option.value)) values.push(option.value);
271
- if (option.disabled) this._slottedDisabledOptions.push(option);
272
- }
273
- this.#updateValuesWhileMaintainingOrder(values);
274
- this.#updateFilteredOptions();
275
- this.#updateSelectionLimit();
276
- }
277
- #slottedOptionsChangeHandler;
278
- #updateSelectedOnSlottedOptions() {
279
- for (const option of this._slottedOptions) {
280
- option.selected = this.values.includes(option.value);
281
- this.#updateClonedTagIconOfOption(option);
282
- }
283
- }
284
- #handleOptionInteraction(option) {
285
- const value = option.value;
286
- let newValues;
287
- let shouldClearSearchText = false;
288
- const isSelection = !this.values.includes(value);
289
- if (this.multiple) {
290
- if (isSelection) newValues = [...this.values, value];
291
- else newValues = this.values.filter((option) => option !== value);
292
- shouldClearSearchText = true;
293
- } else {
294
- if (isSelection) {
295
- newValues = [value];
296
- shouldClearSearchText = true;
297
- } else newValues = [];
374
+ if (!this.options.includes(focusTarget)) {
298
375
  this.open = false;
299
- }
300
- this.#updateValuesThroughUserInteraction(newValues);
301
- const optionMessage = isSelection ? this.locale.searchableSelect.optionSelectedMessage(option._getAccessibleName()) : this.locale.searchableSelect.optionDeselectedMessage(option._getAccessibleName());
302
- const maxSelectedMessage = this.multiple && this.maxSelected && this.maxSelected >= 1 ? this.locale.searchableSelect.maxSelectedMessage(this.values.length, this.maxSelected) : "";
303
- this._changeDescription = `${optionMessage} ${maxSelectedMessage}`;
304
- if (shouldClearSearchText) this._currentSearchText = null;
305
- }
306
- #clonedTagIcons;
307
- #tagIconOfOption(option) {
308
- return option.querySelector("[slot=\"tag-icon\"]");
309
- }
310
- /** @internal */
311
- _tagIconSlotName(value) {
312
- return `_tag-icon-${this.values.indexOf(value)}`;
313
- }
314
- #updateClonedTagIconOfOption(option) {
315
- if (option.selected && this.#tagIconOfOption(option)) {
316
- let clone = this.#clonedTagIcons.get(option);
317
- /* v8 ignore else -- @preserve */
318
- if (!clone) {
319
- clone = this.#tagIconOfOption(option).cloneNode(true);
320
- this.#clonedTagIcons.set(option, clone);
321
- }
322
- clone.slot = this._tagIconSlotName(option.value);
323
- this.appendChild(clone);
324
- } else {
325
- const clone = this.#clonedTagIcons.get(option);
326
- if (clone) {
327
- clone.remove();
328
- this.#clonedTagIcons.delete(option);
329
- }
376
+ if (this.indexWhenOpened !== this.selectedIndex) this.updateValue(true);
330
377
  }
331
378
  }
332
- /** @internal */
333
- optionFilterChanged() {
334
- this.#updateFilteredOptions();
335
- }
336
- /** @internal */
337
- loadingChanged(_oldValue, newValue) {
338
- this._changeDescription = this.locale.searchableSelect.loadingOptionsMessage;
339
- if (_oldValue && !newValue) this._changeDescription = "";
340
- }
341
- #updateFilteredOptions() {
342
- const newFilteredOptions = [];
343
- const optionFilter = this.optionFilter ?? ((option, searchText) => option.text.toLowerCase().includes(searchText.toLowerCase()));
344
- for (const option of this._slottedOptions ?? []) {
345
- option._vvdSearchText = this.searchText;
346
- const matches = !this.searchText || optionFilter(option, this.searchText);
347
- option._isNotMatching = !matches;
348
- if (!option.hidden && matches) newFilteredOptions.push(option);
349
- }
350
- this.#transitionHighlightedOptionTo(null);
351
- this._filteredOptions = newFilteredOptions;
352
- const enabled = newFilteredOptions.filter((o) => !o.disabled);
353
- if (this._selectAllOption) this._filteredEnabledOptions = [this._selectAllOption, ...enabled];
354
- else this._filteredEnabledOptions = enabled;
355
- }
356
- #transitionHighlightedOptionTo(index) {
357
- if (typeof this._highlightedOptionIndex === "number") {
358
- const prevOption = this._filteredEnabledOptions[this._highlightedOptionIndex];
359
- prevOption._highlighted = false;
360
- prevOption.removeAttribute("data-highlighted");
361
- }
362
- if (typeof index === "number") if (!this._filteredEnabledOptions.length) index = null;
363
- else index = Math.max(0, Math.min(this._filteredEnabledOptions.length - 1, index));
364
- this._highlightedOptionIndex = index;
365
- if (typeof this._highlightedOptionIndex === "number") {
366
- const highlightedOption = this._filteredEnabledOptions[this._highlightedOptionIndex];
367
- highlightedOption._highlighted = true;
368
- highlightedOption.setAttribute("data-highlighted", "");
369
- scrollIntoView(highlightedOption, this._listbox, "nearest");
370
- this._changeDescription = this.locale.searchableSelect.optionFocusedMessage(highlightedOption._getAccessibleName(), this._highlightedOptionIndex + 1, this._filteredEnabledOptions.length, highlightedOption.selected);
371
- }
379
+ /**
380
+ * Updates the value when an option's value changes.
381
+ *
382
+ * @param source - the source object
383
+ * @param propertyName - the property to evaluate
384
+ *
385
+ * @internal
386
+ */
387
+ handleChange(source, propertyName) {
388
+ super.handleChange(source, propertyName);
389
+ if (propertyName === "value") this.updateValue();
390
+ }
391
+ /**
392
+ * Prevents focus when a scrollbar is clicked.
393
+ *
394
+ * @param e - the mouse event object
395
+ *
396
+ * @internal
397
+ */
398
+ mousedownHandler(e) {
399
+ if (e.offsetX >= 0 && e.offsetX <= this.listbox.scrollWidth) return super.mousedownHandler(e);
400
+ return this.collapsible;
401
+ }
402
+ /** @internal */
403
+ multipleChanged(_, next) {
404
+ this.options.forEach((o) => {
405
+ o.checked = next ? false : void 0;
406
+ });
407
+ this.setSelectedOptions();
408
+ /* v8 ignore if -- @preserve */
409
+ if (this.proxy) this.proxy.multiple = next;
410
+ }
411
+ /**
412
+ * Updates the selectedness of each option when the list of selected options changes.
413
+ *
414
+ * @param prev - the previous list of selected options
415
+ * @param next - the current list of selected options
416
+ *
417
+ * @internal
418
+ */
419
+ selectedOptionsChanged(prev, next) {
420
+ super.selectedOptionsChanged(prev, next);
421
+ this.options.forEach((o, i) => {
422
+ const proxyOption = this.proxy.options.item(i);
423
+ if (proxyOption) proxyOption.selected = o.selected;
424
+ });
372
425
  }
373
- #selectHighlightedOption() {
374
- if (this._highlightedOptionIndex === null) return;
375
- const highlightedOption = this._filteredEnabledOptions[this._highlightedOptionIndex];
376
- if (highlightedOption.getAttribute("data-select-all") !== null) {
377
- this._toggleSelectAll();
378
- return;
426
+ /**
427
+ * Resets and fills the proxy to match the component's options.
428
+ *
429
+ * @internal
430
+ */
431
+ setProxyOptions() {
432
+ /* v8 ignore else -- @preserve */
433
+ if (this.proxy instanceof HTMLSelectElement && this.options) {
434
+ this.proxy.length = 0;
435
+ this.options.forEach((option) => {
436
+ const proxyOption = option.proxy || (option instanceof HTMLOptionElement ? option.cloneNode() : null);
437
+ if (proxyOption) this.proxy.options.add(proxyOption);
438
+ });
379
439
  }
380
- this.#handleOptionInteraction(highlightedOption);
381
- }
382
- #highlightFirstOption() {
383
- this.#transitionHighlightedOptionTo(0);
384
- }
385
- #highlightLastOption() {
386
- this.#transitionHighlightedOptionTo(this._filteredEnabledOptions.length - 1);
387
440
  }
388
- #highlightPrevPage() {
389
- this.#transitionHighlightedOptionTo((this._highlightedOptionIndex ?? this._filteredEnabledOptions.length) - PageSize);
390
- }
391
- #highlightNextPage() {
392
- this.#transitionHighlightedOptionTo((this._highlightedOptionIndex ?? -1) + PageSize);
393
- }
394
- #highlightPreviousOption() {
395
- this.#transitionHighlightedOptionTo((this._highlightedOptionIndex ?? this._filteredEnabledOptions.length) - 1);
396
- }
397
- #highlightNextOption() {
398
- this.#transitionHighlightedOptionTo((this._highlightedOptionIndex ?? -1) + 1);
399
- }
400
- /** @internal */
401
- _tagLabelForValue(value) {
402
- return this._slottedOptions.find((option) => option.value === value).label;
403
- }
404
- /** @internal */
405
- _tagConnotationForValue(value) {
406
- return this._slottedOptions.find((option) => option.value === value).tagConnotation;
407
- }
408
- /** @internal */
409
- _isTagDisabled(value) {
410
- const option = this._slottedOptions.find((option) => option.value === value);
411
- return this.disabled || option.disabled;
412
- }
413
- #textForValue(value) {
414
- return (this._slottedOptions?.find((option) => option.value === value))?.label;
415
- }
416
- /** @internal */
417
- #measureTagWidth(label, removable, hasIcon) {
418
- const tag = document.createElement(this._optionTagTagName);
419
- tag.label = label;
420
- tag.removable = removable;
421
- tag.style.cssText = "position: absolute; visibility: hidden;";
422
- tag.hasIconPlaceholder = hasIcon;
423
- this.shadowRoot.appendChild(tag);
424
- const width = tag.getBoundingClientRect().width;
425
- tag.remove();
426
- return width;
427
- }
428
- #updateTagLayout() {
429
- if (!this.multiple) {
430
- this._numElidedTags = 0;
431
- this._tagRows = [];
432
- this._lastTagRow = [];
433
- return;
434
- }
435
- if (this.externalTags) {
436
- this._numElidedTags = this.values.length;
437
- this._tagRows = [];
438
- this._lastTagRow = [];
439
- return;
440
- }
441
- const rowWidth = this._contentArea.getBoundingClientRect().width;
442
- const rows = [[]];
443
- let currentRowIndex = 0;
444
- let currentRowWidth = InputMinWidthPx;
445
- let i;
446
- for (i = this.values.length - 1; i >= 0; i--) {
447
- const isLastRow = this.maxLines && currentRowIndex === this.maxLines - 1;
448
- const tagWidth = this.#measureTagWidth(this._tagLabelForValue(this.values[i]), true, this.#tagIconOfOption(this.selectedOptions[i]) !== null);
449
- const entry = {
450
- value: this.values[i],
451
- width: tagWidth
452
- };
453
- let elidedTagCounterWidth = 0;
454
- if (isLastRow) {
455
- const numElidedTags = i;
456
- if (numElidedTags) elidedTagCounterWidth = TagGapPx + this.#measureTagWidth(numElidedTags.toString(), false, false);
457
- }
458
- if (currentRowWidth + TagGapPx + tagWidth + elidedTagCounterWidth > rowWidth) {
459
- if (isLastRow) if (i === this.values.length - 1) {
460
- rows[currentRowIndex].unshift(entry);
461
- currentRowWidth += TagGapPx + tagWidth;
462
- } else break;
463
- else {
464
- rows.push([]);
465
- currentRowIndex++;
466
- rows[currentRowIndex].unshift(entry);
467
- currentRowWidth = tagWidth;
441
+ /**
442
+ * Handles keydown actions when the select is in multiple selection mode.
443
+ *
444
+ * @internal
445
+ */
446
+ multipleKeydownHandler(e) {
447
+ if (this.disabled) return;
448
+ const { key, shiftKey } = e;
449
+ this.shouldSkipFocus = false;
450
+ switch (key) {
451
+ case keyHome:
452
+ this.checkFirstOption(shiftKey);
453
+ return;
454
+ case keyArrowDown:
455
+ this.checkNextOption(shiftKey);
456
+ return;
457
+ case keyArrowUp:
458
+ this.checkPreviousOption(shiftKey);
459
+ return;
460
+ case keyEnd:
461
+ this.checkLastOption(shiftKey);
462
+ return;
463
+ case keyTab:
464
+ this.focusAndScrollOptionIntoView();
465
+ return;
466
+ case keyEscape:
467
+ this.uncheckAllOptions();
468
+ this.checkActiveIndex();
469
+ return;
470
+ case keySpace:
471
+ e.preventDefault();
472
+ /* v8 ignore else -- @preserve */
473
+ if (this.typeaheadExpired) {
474
+ this.toggleSelectedForAllCheckedOptions();
475
+ return;
468
476
  }
469
- continue;
470
- }
471
- rows[currentRowIndex].unshift(entry);
472
- currentRowWidth += TagGapPx + tagWidth;
473
- }
474
- this._numElidedTags = i + 1;
475
- rows.reverse();
476
- for (let i = 0; i < rows.length - 1; i++) {
477
- let lineWidth = rows[i].map((e) => e.width).reduce((a, b) => a + b, 0) + (rows[i].length - 1) * TagGapPx;
478
- if (i === 0 && this._numElidedTags) lineWidth += TagGapPx + this.#measureTagWidth(this._numElidedTags.toString(), false, false);
479
- while (rows[i + 1].length && lineWidth + TagGapPx + rows[i + 1][0].width <= rowWidth) {
480
- const nextTag = rows[i + 1].shift();
481
- rows[i].push(nextTag);
482
- lineWidth += TagGapPx + nextTag.width;
483
- }
477
+ default:
478
+ /* v8 ignore else -- @preserve */
479
+ if (key.length === 1) this.handleTypeAhead(key);
480
+ return;
484
481
  }
485
- const rowValues = rows.map((line) => line.map((entry) => entry.value));
486
- this._tagRows = rowValues.slice(0, -1);
487
- this._lastTagRow = rowValues.slice(-1)[0];
488
- }
489
- /** @internal */
490
- _onTagRemoved(value) {
491
- this.#updateValuesThroughUserInteraction(this.values.filter((option) => option !== value));
492
- this.#updateFilteredOptions();
493
482
  }
494
- /** @internal */
495
- _onTagKeydown(event) {
496
- const tagIndex = parseInt(event.target.dataset.index);
497
- switch (event.key) {
498
- case "Backspace":
499
- case "Delete":
500
- case "Enter":
501
- case " ":
502
- this._onTagRemoved(this.values[tagIndex]);
503
- Updates.process();
504
- this.#moveTagFocusTo(this.#nextTagIndexForRemoved(tagIndex));
483
+ /**
484
+ * Handle keyboard interaction for the select.
485
+ *
486
+ * @param e - the keyboard event
487
+ * @internal
488
+ */
489
+ keydownHandler(e) {
490
+ const selectedIndexBefore = this.selectedIndex;
491
+ if (this.multiple) this.multipleKeydownHandler(e);
492
+ else super.keydownHandler(e);
493
+ switch (e.key) {
494
+ case keySpace:
495
+ e.preventDefault();
496
+ if (this.collapsible && this.typeaheadExpired) this.open = !this.open;
505
497
  break;
506
- case "ArrowLeft":
507
- this.#moveTagFocusTo(this.#nextTagIndexLeft(tagIndex) ?? tagIndex);
498
+ case keyHome:
499
+ case keyEnd:
500
+ e.preventDefault();
508
501
  break;
509
- case "ArrowRight":
510
- this.#moveTagFocusTo(this.#nextTagIndexRight(tagIndex));
502
+ case keyEnter:
503
+ e.preventDefault();
504
+ this.open = !this.open;
511
505
  break;
506
+ case keyEscape:
507
+ if (this.collapsible && this.open) {
508
+ e.preventDefault();
509
+ this.open = false;
510
+ }
511
+ break;
512
+ case keyTab:
513
+ if (this.collapsible && this.open) {
514
+ e.preventDefault();
515
+ this.open = false;
516
+ }
517
+ return true;
512
518
  }
513
- return true;
514
- }
515
- #moveTagFocusTo(index) {
516
- if (index === null) this._input.focus();
517
- else this.shadowRoot.querySelector(`[data-index="${index}"]`)?.focus();
518
- }
519
- #nextTagIndexLeft(index) {
520
- if (!this.values.length) return null;
521
- for (let i = index - 1; i >= 0; i--) if (!this._isTagDisabled(this.values[i])) return i;
522
- return null;
523
- }
524
- #nextTagIndexRight(index) {
525
- if (!this.values.length) return null;
526
- for (let i = index + 1; i < this.values.length; i++) if (!this._isTagDisabled(this.values[i])) return i;
527
- return null;
528
- }
529
- #nextTagIndexForRemoved(index) {
530
- return this.#nextTagIndexRight(index - 1) ?? this.#nextTagIndexLeft(index);
531
- }
532
- /** @internal */
533
- _onListboxClick(e) {
534
- if (this.disabled) return;
535
- const capturedOption = e.target.closest(`option,[role=option],[data-vvd-component=option]`);
536
- if (capturedOption?.getAttribute("data-select-all") !== null) {
537
- this._toggleSelectAll();
538
- return;
539
- }
540
- if (capturedOption && !capturedOption.disabled) this.#handleOptionInteraction(capturedOption);
541
- }
542
- /** @internal */
543
- get _shouldShowClearButton() {
544
- return this.clearable && this.values.length > 0;
545
- }
546
- /** @internal */
547
- _onClearButtonClick() {
548
- this.#updateValuesThroughUserInteraction(this.selectedOptions.filter((option) => option.disabled).map((option) => option.value));
549
- }
550
- /** @internal */
551
- maxSelectedChanged() {
552
- this.#updateSelectionLimit();
519
+ if (this.collapsible && !this.open && this.selectedIndex !== selectedIndexBefore) this.updateValue(true);
520
+ return !(e.key === keyArrowDown || e.key === keyArrowUp);
553
521
  }
554
- #updateSelectionLimit() {
555
- if (!this.multiple || !this._slottedOptions || typeof this.maxSelected !== "number" || this.maxSelected <= 0) return;
556
- const options = this._slottedOptions.filter((option) => !this._slottedDisabledOptions.includes(option));
557
- if (this.values.length >= this.maxSelected) {
558
- const unselectedOptions = options.filter((option) => !this.selectedOptions.includes(option));
559
- for (const option of unselectedOptions) option.disabled = true;
560
- } else for (const option of options) option.disabled = false;
561
- }
562
- /** @internal */
563
- get _hasSelectionCount() {
564
- return this.multiple && this.maxSelected && this.maxSelected >= 1;
522
+ connectedCallback() {
523
+ super.connectedCallback();
524
+ this.addEventListener("focusout", this.focusoutHandler);
525
+ this.addEventListener("contentchange", this.updateDisplayValue);
565
526
  }
566
- /** @internal */
567
- get _selectableOptions() {
568
- return this._slottedOptions?.filter((o) => !this._slottedDisabledOptions.includes(o) && !o.disabled) ?? [];
527
+ disconnectedCallback() {
528
+ this.removeEventListener("focusout", this.focusoutHandler);
529
+ this.removeEventListener("contentchange", this.updateDisplayValue);
530
+ super.disconnectedCallback();
569
531
  }
570
532
  /** @internal */
571
- get _selectAllLabel() {
572
- return this._isAllSelected ? this.deselectAllText ?? this.locale.searchableSelect.deselectAllLabel : this.selectAllText ?? this.locale.searchableSelect.selectAllLabel;
533
+ updateDisplayValue() {
534
+ if (this.collapsible) Observable.notify(this, "displayValue");
573
535
  }
574
- /** @internal */
575
- get _isAllSelected() {
576
- const selectedValues = this.values;
577
- if (!this.multiple || !this._slottedOptions) return false;
578
- const selectable = this._selectableOptions;
579
- if (selectable.length === 0) return false;
580
- const selected = new Set(selectedValues);
581
- return selectable.every((o) => selected.has(o.value));
536
+ get displayValue() {
537
+ Observable.track(this, "displayValue");
538
+ return this.firstSelectedOption?.getAttribute("label") ?? this.firstSelectedOption?.text ?? this.placeholder ?? "";
582
539
  }
583
- /** @internal */
584
- _toggleSelectAll() {
585
- const selectableValues = this._selectableOptions.map((o) => o.value);
586
- if (this._isAllSelected) {
587
- const updatedValues = this.values.filter((v) => !selectableValues.includes(v));
588
- this.#updateValuesThroughUserInteraction(updatedValues);
589
- this._changeDescription = this.locale.searchableSelect.deselectedAllMessage;
590
- return;
540
+ _newDefaultSelectedIndex(prev, next, currentSelectIndex) {
541
+ const defaultSelectedIndex = super._newDefaultSelectedIndex(prev, next, currentSelectIndex);
542
+ if (defaultSelectedIndex === null && currentSelectIndex === -1 && !this.placeholder) {
543
+ const firstSelectableIndex = this.getNextSelectableIndex(0);
544
+ if (firstSelectableIndex !== -1) return firstSelectableIndex;
591
545
  }
592
- const missingValues = selectableValues.filter((v) => !this.values.includes(v));
593
- const updatedValues = [...this.values, ...missingValues];
594
- this.#updateValuesThroughUserInteraction(updatedValues);
595
- this._changeDescription = this.locale.searchableSelect.selectedAllMessage;
546
+ return defaultSelectedIndex;
596
547
  }
597
- #determineInitialValues() {
598
- return this.initialValues.length ? this.initialValues : this.initialValue ? [this.initialValue] : [];
548
+ _isDefaultSelected(option) {
549
+ return super._isDefaultSelected(option) || option.value === this.initialValue || !this._isResetting && option.value === this.value;
599
550
  }
600
- /** @internal */
601
- nameChanged(previous, next) {
602
- super.nameChanged(previous, next);
603
- this.#updateFormValue();
604
- }
605
- #updateFormValue() {
606
- if (!this.name) this.setFormValue(null);
607
- else {
608
- const formData = new FormData();
609
- for (const value of this.values) formData.append(this.name, value);
610
- this.setFormValue(formData);
611
- }
551
+ slottedOptionsChanged(prev, next) {
552
+ this.options.forEach((o) => {
553
+ Observable.getNotifier(o).unsubscribe(this, "value");
554
+ });
555
+ super.slottedOptionsChanged(prev, next);
556
+ this.options.forEach((o) => {
557
+ Observable.getNotifier(o).subscribe(this, "value");
558
+ });
559
+ this.setProxyOptions();
560
+ this.updateValue();
561
+ const scale = this.getAttribute("scale") || this.scale;
562
+ next.forEach((element) => {
563
+ if (scale) {
564
+ element.setAttribute("scale", scale);
565
+ element.scale = scale;
566
+ }
567
+ });
568
+ this.proxy.value = this.value;
569
+ this.validate();
612
570
  }
613
- /** @internal */
614
571
  formResetCallback() {
615
- super.formResetCallback();
616
- this.#updateValuesThroughUserInteraction(this.#determineInitialValues());
572
+ this.setProxyOptions();
573
+ this._isResetting = true;
574
+ this.selectedIndex = this._newDefaultSelectedIndex([], this.options, -1) ?? -1;
575
+ this._isResetting = false;
617
576
  }
618
- #resizeObserver;
619
577
  /** @internal */
620
- _onFieldsetClick(e) {
621
- if (this.disabled) return;
622
- if (!e.defaultPrevented) {
623
- this._input.focus();
624
- this.open = true;
625
- }
578
+ get _shouldShowClearButton() {
579
+ if (!this.clearable) return false;
580
+ if (this.multiple) return this.selectedOptions?.length > 0;
581
+ return this.value !== "";
626
582
  }
627
583
  /** @internal */
628
- _onChevronClick() {
629
- if (this.open) {
630
- this.open = false;
631
- return false;
632
- }
633
- return true;
634
- }
635
- connectedCallback() {
636
- super.connectedCallback();
637
- if (!this.values.length) this.values = this.#determineInitialValues();
638
- this.#resizeObserver.observe(this._contentArea);
639
- }
640
- disconnectedCallback() {
641
- super.disconnectedCallback();
642
- this.#resizeObserver.disconnect();
584
+ _onClearButtonFocus() {
585
+ this._isClearButtonFocused = true;
586
+ this.activeIndex = -1;
587
+ this.uncheckAllOptions();
643
588
  }
644
589
  /** @internal */
645
- validate() {
646
- super.validate(this._input ?? void 0);
590
+ _onClearButtonBlur() {
591
+ this._isClearButtonFocused = false;
647
592
  }
648
593
  /** @internal */
649
- focus(options) {
650
- this._input?.focus(options);
594
+ get _shouldShowLabelWrapper() {
595
+ return Boolean(this.label || this._hasContextualHelp || this.multiple && this._shouldShowClearButton);
651
596
  }
652
597
  /** @internal */
653
- _onMouseDown(event) {
654
- const originalTarget = event.composedPath()[0];
655
- if (!event.defaultPrevented && originalTarget !== this._input && !this._isFromContextualHelp(event)) {
656
- this._input.focus();
657
- return false;
658
- }
659
- return true;
598
+ _onClearButtonClick() {
599
+ if (this.multiple) this.selectedOptions.forEach((o) => {
600
+ /* v8 ignore else -- @preserve */
601
+ if (!o.disabled) o.selected = false;
602
+ });
603
+ else this.selectedIndex = -1;
604
+ this.updateValue(true);
660
605
  }
661
606
  };
662
- __decorate([attr], SearchableSelect.prototype, "appearance", void 0);
663
- __decorate([attr], SearchableSelect.prototype, "shape", void 0);
664
- __decorate([attr()], SearchableSelect.prototype, "scale", void 0);
665
- __decorate([attr({
666
- mode: "boolean",
667
- attribute: "fixed-dropdown"
668
- })], SearchableSelect.prototype, "fixedDropdown", void 0);
669
- __decorate([attr], SearchableSelect.prototype, "placeholder", void 0);
670
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "open", void 0);
671
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "multiple", void 0);
607
+ __decorate([observable], Select.prototype, "activeIndex", void 0);
608
+ __decorate([attr({ mode: "boolean" })], Select.prototype, "multiple", void 0);
672
609
  __decorate([attr({
673
- attribute: "external-tags",
610
+ attribute: "open",
674
611
  mode: "boolean"
675
- })], SearchableSelect.prototype, "externalTags", void 0);
612
+ })], Select.prototype, "open", void 0);
613
+ __decorate([volatile], Select.prototype, "collapsible", null);
614
+ __decorate([observable], Select.prototype, "control", void 0);
615
+ __decorate([observable], Select.prototype, "maxHeight", void 0);
616
+ __decorate([observable], Select.prototype, "_anchor", void 0);
617
+ __decorate([attr()], Select.prototype, "scale", void 0);
618
+ __decorate([attr], Select.prototype, "appearance", void 0);
619
+ __decorate([attr], Select.prototype, "shape", void 0);
676
620
  __decorate([attr({
677
- attribute: "max-lines",
678
- converter: nullableNumberConverter
679
- })], SearchableSelect.prototype, "maxLines", void 0);
680
- __decorate([observable], SearchableSelect.prototype, "values", void 0);
681
- __decorate([observable], SearchableSelect.prototype, "initialValues", void 0);
682
- __decorate([observable], SearchableSelect.prototype, "_input", void 0);
683
- __decorate([observable], SearchableSelect.prototype, "_currentSearchText", void 0);
684
- __decorate([observable], SearchableSelect.prototype, "_slottedOptions", void 0);
685
- __decorate([observable], SearchableSelect.prototype, "optionFilter", void 0);
686
- __decorate([observable], SearchableSelect.prototype, "_filteredOptions", void 0);
687
- __decorate([observable], SearchableSelect.prototype, "_filteredEnabledOptions", void 0);
688
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "loading", void 0);
689
- __decorate([observable], SearchableSelect.prototype, "_highlightedOptionIndex", void 0);
690
- __decorate([observable], SearchableSelect.prototype, "_contentArea", void 0);
691
- __decorate([observable], SearchableSelect.prototype, "_numElidedTags", void 0);
692
- __decorate([observable], SearchableSelect.prototype, "_tagRows", void 0);
693
- __decorate([observable], SearchableSelect.prototype, "_lastTagRow", void 0);
694
- __decorate([observable], SearchableSelect.prototype, "_listbox", void 0);
695
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "clearable", void 0);
696
- __decorate([attr({
697
- attribute: "max-selected",
698
- converter: nullableNumberConverter
699
- })], SearchableSelect.prototype, "maxSelected", void 0);
700
- __decorate([observable], SearchableSelect.prototype, "_slottedDisabledOptions", void 0);
701
- __decorate([attr({
702
- attribute: "enable-select-all",
703
- mode: "boolean"
704
- })], SearchableSelect.prototype, "enableSelectAll", void 0);
705
- __decorate([attr({ attribute: "select-all-text" })], SearchableSelect.prototype, "selectAllText", void 0);
706
- __decorate([attr({ attribute: "deselect-all-text" })], SearchableSelect.prototype, "deselectAllText", void 0);
707
- __decorate([observable], SearchableSelect.prototype, "_selectAllOption", void 0);
708
- __decorate([observable], SearchableSelect.prototype, "_changeDescription", void 0);
709
- __decorate([observable], SearchableSelect.prototype, "_anchor", void 0);
710
- //#endregion
711
- //#region src/lib/searchable-select/option-tag.ts
712
- var OptionTag = class extends Localized(VividElement) {
713
- constructor(..._args) {
714
- super(..._args);
715
- this.removable = false;
716
- this.disabled = false;
717
- this.hasIconPlaceholder = false;
718
- }
719
- /** @internal */
720
- _onClickRemove() {
721
- this.$emit("remove", void 0, { bubbles: false });
722
- }
723
- };
724
- __decorate([attr], OptionTag.prototype, "shape", void 0);
725
- __decorate([observable], OptionTag.prototype, "connotation", void 0);
726
- __decorate([attr], OptionTag.prototype, "label", void 0);
727
- __decorate([attr({ mode: "boolean" })], OptionTag.prototype, "removable", void 0);
728
- __decorate([attr({ mode: "boolean" })], OptionTag.prototype, "disabled", void 0);
729
- __decorate([observable], OptionTag.prototype, "hasIconPlaceholder", void 0);
730
- __decorate([attr()], OptionTag.prototype, "scale", void 0);
621
+ mode: "boolean",
622
+ attribute: "fixed-dropdown"
623
+ })], Select.prototype, "fixedDropdown", void 0);
624
+ __decorate([attr], Select.prototype, "placeholder", void 0);
625
+ __decorate([observable], Select.prototype, "_feedbackWrapper", void 0);
626
+ __decorate([observable], Select.prototype, "metaSlottedContent", void 0);
627
+ __decorate([attr({ mode: "boolean" })], Select.prototype, "clearable", void 0);
628
+ __decorate([observable], Select.prototype, "_isClearButtonFocused", void 0);
731
629
  //#endregion
732
- //#region src/lib/searchable-select/searchable-select.template.ts
630
+ //#region src/lib/select/select.template.ts
733
631
  function renderLabel() {
734
- return html`
735
- <label for="control" class="label" id="label"> ${(x) => x.label} </label>
736
- `;
632
+ return html` <label
633
+ for="${(x) => x.multiple ? null : "control"}"
634
+ class="label"
635
+ id="label"
636
+ >
637
+ ${(x) => x.label}
638
+ </label>`;
737
639
  }
738
- function renderSelectionCount() {
640
+ function renderPlaceholder(context) {
641
+ const optionTag = context.tagFor(ListboxOption);
739
642
  return html`
740
- <span
741
- id="selection-count"
742
- class="selection-count"
743
- aria-label="${(x) => x.locale.searchableSelect.maxSelectedMessage(x.values.length, x.maxSelected)}"
744
- >(${(x) => `${x.values.length}/${x.maxSelected}`})</span
745
- >
746
- `;
643
+ <${optionTag} text="${(x) => x.placeholder}" hidden disabled>
644
+ </${optionTag}>`;
747
645
  }
748
- var tagTemplateFactory = (context, getComponent) => {
749
- const optionTagTag = context.tagFor(OptionTag);
750
- return html`
751
- <div class="tag-wrapper">
752
- <${optionTagTag}
753
- class="tag"
754
- tabindex="-1"
755
- data-index="${(x, c) => getComponent(c).values.indexOf(x)}"
756
- removable
757
- :label="${(x, c) => getComponent(c)._tagLabelForValue(x)}"
758
- :shape="${(_, c) => getComponent(c).shape}"
759
- :connotation="${(x, c) => getComponent(c)._tagConnotationForValue(x)}"
760
- :scale="${(_, c) => getComponent(c).scale}"
761
- ?disabled="${(x, c) => getComponent(c)._isTagDisabled(x)}"
762
- @remove="${(x, c) => getComponent(c)._onTagRemoved(x)}"
763
- @keydown="${(_, c) => getComponent(c)._onTagKeydown(c.event)}"
764
- @mousedown="${() => false}">
765
- <slot slot="icon" name="${(x, c) => getComponent(c)._tagIconSlotName(x)}"></slot>
766
- </${optionTagTag}>
767
- </div>
768
- `;
769
- };
770
- var elidedTagTemplateFactory = (context, getComponent) => {
771
- const optionTagTag = context.tagFor(OptionTag);
772
- return html`
773
- <${optionTagTag}
774
- class="tag"
775
- tabindex="-1"
776
- :label="${(x, c) => getComponent(x, c)._numElidedTags.toString()}"
777
- :shape="${(x, c) => getComponent(x, c).shape}"
778
- :scale="${(x, c) => getComponent(x, c).scale}"
779
- ?disabled="${(x, c) => getComponent(x, c).disabled}"
780
- @mousedown="${() => false}">
781
- </${optionTagTag}>
782
- `;
783
- };
784
- function renderFieldset(context) {
646
+ function renderClearButton(context) {
785
647
  const buttonTag = context.tagFor(Button);
786
- const progressRingTag = context.tagFor(ProgressRing);
787
- const affixIconTemplate = affixIconTemplateFactory(context);
788
- const chevronTemplate = chevronTemplateFactory(context);
789
- const tagTemplate = tagTemplateFactory(context, (c) => c.parent);
790
- const nestedTagTemplate = tagTemplateFactory(context, (c) => c.parentContext.parent);
791
- const elidedTagTemplate = elidedTagTemplateFactory(context, (x, _) => x);
792
- const nestedElidedTagTemplate = elidedTagTemplateFactory(context, (_, c) => c.parent);
793
648
  return html`
794
- <div
795
- class="fieldset ${(x) => classNames(["disabled", x.disabled], [`appearance-${x.appearance}`, Boolean(x.appearance)], [`shape-${x.shape}`, Boolean(x.shape)], [`size-${x.scale}`, Boolean(x.scale)], ["error", Boolean(x.errorValidationMessage)], ["success", !!x.successText], ["has-highlighted-option", x._highlightedOptionIndex !== null])}"
796
- @click="${(x, c) => x._onFieldsetClick(c.event)}"
797
- ${ref("_anchor")}
798
- >
799
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
800
- <div class="content-area" ${ref("_contentArea")}>
801
- ${repeat((x) => x._tagRows, html`
802
- <div class="tag-row">
803
- ${when((_, c) => c.isFirst && c.parent._numElidedTags, nestedElidedTagTemplate)}
804
- ${repeat((x) => x, nestedTagTemplate)}
805
- </div>
806
- `, { positioning: true })}
807
- <div
808
- class="tag-row ${(x) => classNames(["contains-only-input", x._tagRows.length > 0 && x._lastTagRow.length === 0])}"
809
- >
810
- ${when((x) => x._tagRows.length === 0 && x._numElidedTags, elidedTagTemplate)}
811
- ${repeat((x) => x._lastTagRow, tagTemplate)}
812
- <input
813
- id="control"
814
- class="control"
815
- autocomplete="off"
816
- ${delegateAria({
817
- role: "combobox",
818
- ariaAutoComplete: "list",
819
- ariaHasPopup: "listbox",
820
- ariaExpanded: (x) => x.open,
821
- ariaControls: "listbox",
822
- ariaDescribedBy: (x) => `${x._feedbackDescribedBy} ${x.multiple && x.maxSelected && x.maxSelected >= 1 ? "selection-count" : null}`
823
- })}
824
- placeholder="${(x) => x.multiple && x.values.length ? "" : x.placeholder}"
825
- type="text"
826
- ?disabled="${(x) => x.disabled}"
827
- :value="${(x) => x._inputValue}"
828
- @input="${(x, c) => {
829
- x._onInputInput(c.event);
649
+ <${buttonTag}
650
+ aria-label="${(x) => x.locale.select.clearButtonLabel}"
651
+ aria-hidden="${(x) => x._isClearButtonFocused ? "false" : "true"}"
652
+ @click="${(x, c) => {
653
+ x._onClearButtonClick();
830
654
  c.event.stopPropagation();
831
655
  }}"
832
- @change="${(_, c) => {
656
+ @mousedown="${() => false}"
657
+ @keydown="${(x, c) => {
658
+ /* v8 ignore next -- @preserve */
659
+ if (c.event.key === "Tab") x._onClearButtonBlur();
833
660
  c.event.stopPropagation();
661
+ return true;
834
662
  }}"
835
- @focus="${(x, c) => x._onInputFocus(c.event)}"
836
- @blur="${(x, c) => x._onInputBlur(c.event)}"
837
- @keydown="${(x, c) => x._onInputKeydown(c.event)}"
838
- ${ref("_input")}
839
- />
840
- </div>
841
- </div>
842
- <slot name="meta"></slot>
843
- ${when((x) => x._shouldShowClearButton, html`<${buttonTag}
844
- aria-label="${(x) => x.locale.searchableSelect.clearButtonLabel}"
845
- @click="${(x) => x._onClearButtonClick()}"
846
- @mousedown="${() => false}"
847
- ?disabled="${(x) => x.disabled}"
848
- :shape="${(x) => x.shape}"
849
- size="super-condensed"
850
- icon="close-line"
851
- appearance="ghost-light"
852
- tabindex="0"
853
- ></${buttonTag}>`)}
854
- <div @mousedown="${() => false}" @click="${(x) => x._onChevronClick()}">
855
- ${when((x) => x.loading, html`<${progressRingTag} indeterminate size="-6" aria-hidden="true"></${progressRingTag}>`)}
856
- ${when((x) => !x.loading, chevronTemplate)}
857
- </div>
858
- </div>
663
+ @focusin="${(x, c) => {
664
+ c.event.stopPropagation();
665
+ x._onClearButtonFocus();
666
+ }}"
667
+ @focusout="${(x) => x._onClearButtonBlur()}"
668
+ ?disabled="${(x) => x.disabled}"
669
+ :shape="${(x) => x.shape}"
670
+ size="super-condensed"
671
+ icon="close-line"
672
+ appearance="ghost-light"
673
+ class="clear-button"
674
+ tabindex="0"
675
+ ></${buttonTag}>
859
676
  `;
860
677
  }
861
- function setFixedDropdownVarWidth(x) {
862
- return x.open && x.fixedDropdown ? `--_searchable-select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
678
+ function selectValue(context) {
679
+ const affixIconTemplate = affixIconTemplateFactory(context);
680
+ const chevronTemplate = chevronTemplateFactory(context);
681
+ return html` <div
682
+ class="control ${(x) => classNames(["has-activedescendant", Boolean(x._activeDescendant) && x.open], ["disabled", x.disabled], [`appearance-${x.appearance}`, Boolean(x.appearance)], [`shape-${x.shape}`, Boolean(x.shape)], ["has-meta", Boolean(x.metaSlottedContent?.length)], ["error", Boolean(x.errorValidationMessage)], ["success", !!x.successText], ["shows-placeholder", Boolean(x.placeholder) && !x.value], [`size-${x.scale}`, Boolean(x.scale)])}"
683
+ ${ref("_anchor")}
684
+ id="control"
685
+ ?disabled="${(x) => x.disabled}"
686
+ >
687
+ <div class="selected-value">
688
+ ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
689
+ <span class="text">${(x) => x.displayValue}</span>
690
+ <slot name="meta" ${slotted("metaSlottedContent")}></slot>
691
+ </div>
692
+ ${when((x) => x._shouldShowClearButton, renderClearButton(context))}
693
+ ${chevronTemplate}
694
+ </div>`;
863
695
  }
864
- function renderSelectAll(context) {
865
- const optionTag = context.tagFor(ListboxOption);
866
- const dividerTag = context.tagFor(Divider);
867
- return html`
868
- <${optionTag}
869
- data-select-all
870
- tabindex="-1"
871
- :text="${(x) => x._selectAllLabel}"
872
- :selected="${(x) => x._isAllSelected}"
873
- :_displayCheckmark="${() => true}"
874
- ?disabled="${(x) => x._selectableOptions.length === 0}"
875
- ${ref("_selectAllOption")}>
876
- </${optionTag}>
877
- <${dividerTag} class="divider"></${dividerTag}>
878
- `;
696
+ function setFixedDropdownVarWidth(x) {
697
+ return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
879
698
  }
699
+ /** @param context - element definition context */
880
700
  function renderControl(context) {
881
701
  const popupTag = context.tagFor(Popup);
882
702
  return html`
883
- <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp && !x._hasSelectionCount}>
884
- ${when((x) => x.label || x._hasSelectionCount, html`
885
- <div>
886
- ${when((x) => x.label, renderLabel())}
887
- ${when((x) => x._hasSelectionCount, renderSelectionCount())}
888
- </div>
889
- `)}
890
- <slot name="contextual-help" ${slotted("_contextualHelpSlottedContent")}></slot>
891
- </div>
892
- <span aria-live="assertive" aria-relevant="text" class="visually-hidden">
893
- ${(x) => x._changeDescription}
894
- </span>
895
- <div>
896
- ${renderFieldset(context)}
897
- <div class="popup-wrapper">
898
- <${popupTag}
703
+ <div class="label-wrapper" ?hidden=${(x) => !x._shouldShowLabelWrapper}>
704
+ ${when((x) => x.label, renderLabel())}
705
+ ${when((x) => x.multiple && x._shouldShowClearButton, renderClearButton(context))}
706
+ <slot name="contextual-help" ${slotted("_contextualHelpSlottedContent")}></slot>
707
+ </div>
708
+ <div class="control-wrapper">
709
+ ${when((x) => !x.multiple, selectValue(context))}
710
+ <${popupTag} class="popup"
711
+ style="${setFixedDropdownVarWidth}"
712
+ ?open="${(x) => x.collapsible ? x.open : true}"
899
713
  :anchor="${(x) => x._anchor}"
900
- :open="${(x) => x.open}"
901
- class="popup"
902
714
  placement="bottom-start"
903
- style="${setFixedDropdownVarWidth}"
904
- strategy="${(x) => x.fixedDropdown ? "fixed" : "absolute"}">
905
- <div
906
- class="listbox"
715
+ strategy="${(x) => x.fixedDropdown ? null : "absolute"}">
716
+ <div class="listbox"
717
+ id="${(x) => x.listboxId}"
907
718
  role="listbox"
908
719
  aria-multiselectable="${(x) => x.multiple}"
909
- aria-required="${(x) => x.required}"
910
- ${ref("_listbox")}
911
- @click="${(x, c) => x._onListboxClick(c.event)}"
912
- @mousedown="${() => false}"
913
- >
914
- ${when((x) => x.enableSelectAll && x.multiple && !x.maxSelected, renderSelectAll(context))}
720
+ aria-label="${(x) => x.multiple && !x.label && x.ariaLabel ? x.ariaLabel : null}"
721
+ aria-labelledby="${(x) => x.multiple && x.label ? "label" : null}"
722
+ ?disabled="${(x) => x.disabled}"
723
+ ?hidden="${(x) => x.collapsible ? !x.open : false}"
724
+ ${ref("listbox")}>
725
+ ${when((x) => x.placeholder, renderPlaceholder(context))}
915
726
  <slot
916
727
  ${slotted({
917
- filter: isListboxOption,
728
+ filter: Listbox.slottedOptionFilter,
918
729
  flatten: true,
919
- property: "_slottedOptions"
730
+ property: "slottedOptions"
920
731
  })}>
921
732
  </slot>
922
- ${when((x) => x._filteredOptions.length === 0, html`<div class="empty-message">
923
- ${when((x) => x.loading, html`<slot name="loading-options">
924
- ${(x) => x.locale.searchableSelect.loadingOptionsMessage}
925
- </slot>`)}
926
- ${when((x) => !x.loading && x.searchText === "", html`<slot name="no-options">
927
- ${(x) => x.locale.searchableSelect.noOptionsMessage}
928
- </slot>`)}
929
- ${when((x) => !x.loading && x.searchText !== "", html`<slot name="no-matches">
930
- ${(x) => x.locale.searchableSelect.noMatchesMessage}
931
- </slot>`)}
932
- </div>`)}
933
- </div>
733
+ </div>
934
734
  </${popupTag}>
935
735
  </div>
936
- </div>
937
- `;
736
+ `;
737
+ }
738
+ /** Ignore events that originate from feedback, e.g. a click on link */
739
+ function ifNotFromFeedback(handler) {
740
+ return (x, c) => {
741
+ if (!c.event.composedPath().includes(x._feedbackWrapper)) {
742
+ handler(x, c.event);
743
+ return;
744
+ }
745
+ return true;
746
+ };
938
747
  }
939
- var SearchableSelectTemplate = (context) => {
940
- const optionTagName = context.tagFor(OptionTag, true);
748
+ var SelectTemplate = (context) => {
941
749
  return html`
942
750
  <template
943
- :_optionTagTagName="${() => optionTagName}"
944
- @mousedown="${(x, c) => x._onMouseDown(c.event)}"
751
+ ${applyHostSemantics({
752
+ role: "combobox",
753
+ ariaLabel: (x) => x.ariaLabel ?? x.label,
754
+ ariaHasPopup: (x) => x.collapsible ? "listbox" : "false",
755
+ ariaExpanded: (x) => x.open,
756
+ ariaDisabled: (x) => x.disabled
757
+ })}
758
+ aria-controls="${(x) => x.listboxId}"
759
+ aria-activedescendant="${(x) => x.open ? x._activeDescendant : null}"
760
+ aria-describedby="${(x) => x._feedbackDescribedBy}"
761
+ tabindex="${(x) => !x.disabled ? "0" : null}"
762
+ @click="${ifNotFromFeedback((x, e) => x.clickHandler(e))}"
763
+ @focusin="${ifNotFromFeedback((x, e) => x.focusinHandler(e))}"
764
+ @focusout="${ifNotFromFeedback((x, e) => x.focusoutHandler(e))}"
765
+ @keydown="${ifNotFromFeedback((x, e) => {
766
+ if (x.open) handleEscapeKeyAndStopPropogation(e);
767
+ return x.keydownHandler(e);
768
+ })}"
769
+ @mousedown="${ifNotFromFeedback((x, e) => x.mousedownHandler(e))}"
945
770
  >
946
- <div class="control-wrapper">
947
- ${renderControl(context)} ${(x) => x._getFeedbackTemplate(context)}
771
+ ${renderControl(context)}
772
+ <div class="feedback-wrapper" ${ref("_feedbackWrapper")}>
773
+ ${(x) => x._getFeedbackTemplate(context)}
948
774
  </div>
949
775
  </template>
950
776
  `;
951
777
  };
952
778
  //#endregion
953
- //#region src/lib/searchable-select/option-tag.template.ts
954
- function renderRemoveButton(iconTag) {
955
- return html`
956
- <span
957
- class="remove-button"
958
- aria-label="${(x) => x.locale.searchableSelect.removeTagButtonLabel(x.label)}"
959
- role="button"
960
- tabindex="${(x) => x.disabled ? null : 0}"
961
- @click="${(x) => x._onClickRemove()}"
962
- >
963
- <${iconTag} name="close-line"></${iconTag}>
964
- </span>
965
- `;
966
- }
967
- var optionTagTemplate = (context) => {
968
- const iconTag = context.tagFor(Icon);
969
- return html`<span
970
- class="${(x) => classNames("base", ["disabled", x.disabled], ["removable", x.removable], [`shape-${x.shape}`, Boolean(x.shape)], [`connotation-${x.connotation}`, Boolean(x.connotation)], [`size-${x.scale}`, Boolean(x.scale)])}"
971
- aria-disabled="${(x) => x.disabled}"
972
- >
973
- <slot name="icon" aria-hidden="true">
974
- ${when((x) => x.hasIconPlaceholder, html`<div class="icon-placeholder"></div>`)}
975
- </slot>
976
- ${when((x) => x.label, (x) => html`<span class="label">${x.label}</span>`)}
977
- ${when((x) => x.removable, renderRemoveButton(iconTag))}
978
- </span>`;
979
- };
779
+ //#region src/lib/select/definition.ts
980
780
  /** @internal */
981
- var searchableSelectDefinition = defineVividComponent("searchable-select", SearchableSelect, SearchableSelectTemplate, [
982
- buttonDefinition,
781
+ var selectDefinition = defineVividComponent("select", Select, SelectTemplate, [
983
782
  popupDefinition,
984
783
  iconDefinition,
985
- defineVividComponent("option-tag", OptionTag, optionTagTemplate, [iconDefinition], {
986
- styles: [option_tag_default],
987
- shadowOptions: { delegatesFocus: true }
988
- }),
989
- progressRingDefinition,
990
- feedbackMessageDefinition,
991
784
  listboxOptionDefinition,
992
- dividerDefinition
993
- ], { styles: searchable_select_default });
785
+ optgroupDefinition,
786
+ buttonDefinition,
787
+ feedbackMessageDefinition
788
+ ], { styles: select_default });
994
789
  /**
995
- * Registers the searchable-select element with the design system.
790
+ * Registers the select elements with the design system.
996
791
  *
997
792
  * @param prefix - the prefix to use for the component name
998
793
  */
999
- var registerSearchableSelect = createRegisterFunction(searchableSelectDefinition);
794
+ var registerSelect = createRegisterFunction(selectDefinition);
1000
795
  //#endregion
1001
- export { searchableSelectDefinition as n, SearchableSelect as r, registerSearchableSelect as t };
796
+ export { selectDefinition as n, Select as r, registerSelect as t };