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