@vonage/vivid 5.16.0 → 5.18.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 (564) hide show
  1. package/accordion/definition.cjs +6 -6
  2. package/accordion/definition.js +1 -1
  3. package/accordion/index.cjs +1 -1
  4. package/accordion/index.js +2 -2
  5. package/accordion-item/definition.cjs +5 -5
  6. package/accordion-item/definition.js +1 -1
  7. package/accordion-item/index.cjs +1 -1
  8. package/accordion-item/index.js +2 -2
  9. package/action-group/index.cjs +3 -3
  10. package/action-group/index.js +5 -5
  11. package/alert/definition.cjs +5 -5
  12. package/alert/definition.js +1 -1
  13. package/alert/index.cjs +3 -3
  14. package/alert/index.js +15 -14
  15. package/audio-player/definition.cjs +5 -5
  16. package/audio-player/definition.js +1 -1
  17. package/audio-player/index.cjs +16 -16
  18. package/audio-player/index.js +29 -28
  19. package/avatar/definition.cjs +5 -5
  20. package/avatar/definition.js +1 -1
  21. package/avatar/index.cjs +4 -4
  22. package/avatar/index.js +12 -11
  23. package/badge/definition.cjs +5 -5
  24. package/badge/definition.js +1 -1
  25. package/badge/index.cjs +1 -4
  26. package/badge/index.js +4 -20
  27. package/banner/definition.cjs +5 -5
  28. package/banner/definition.js +1 -1
  29. package/banner/index.cjs +3 -3
  30. package/banner/index.js +14 -13
  31. package/breadcrumb-item/definition.cjs +4 -4
  32. package/breadcrumb-item/definition.js +1 -1
  33. package/breadcrumb-item/index.cjs +1 -1
  34. package/breadcrumb-item/index.js +1 -0
  35. package/bundled/affix.cjs +1 -1
  36. package/bundled/affix.js +5 -5
  37. package/bundled/base-color-picker.cjs +2 -2
  38. package/bundled/base-color-picker.js +5 -5
  39. package/bundled/button.cjs +1 -1
  40. package/bundled/button.js +2 -2
  41. package/bundled/calendar-picker.template.cjs +2 -2
  42. package/bundled/calendar-picker.template.js +498 -498
  43. package/bundled/definition10.cjs +18 -30
  44. package/bundled/definition10.js +53 -155
  45. package/bundled/definition11.cjs +10 -19
  46. package/bundled/definition11.js +25 -74
  47. package/bundled/definition12.cjs +72 -18
  48. package/bundled/definition12.js +171 -107
  49. package/bundled/definition13.cjs +18 -17
  50. package/bundled/definition13.js +46 -66
  51. package/bundled/definition14.cjs +5 -10
  52. package/bundled/definition14.js +9 -27
  53. package/bundled/definition15.cjs +17 -71
  54. package/bundled/definition15.js +64 -181
  55. package/bundled/definition16.cjs +12 -4
  56. package/bundled/definition16.js +79 -14
  57. package/bundled/definition17.cjs +19 -13
  58. package/bundled/definition17.js +118 -69
  59. package/bundled/definition18.cjs +87 -12
  60. package/bundled/definition18.js +409 -52
  61. package/bundled/definition19.cjs +5 -87
  62. package/bundled/definition19.js +14 -422
  63. package/bundled/definition2.cjs +3 -14
  64. package/bundled/definition2.js +16 -49
  65. package/bundled/definition20.cjs +30 -5
  66. package/bundled/definition20.js +159 -9
  67. package/bundled/definition21.cjs +28 -19
  68. package/bundled/definition21.js +164 -47
  69. package/bundled/definition22.cjs +4 -24
  70. package/bundled/definition22.js +18 -88
  71. package/bundled/definition23.cjs +12 -0
  72. package/bundled/definition23.js +37 -0
  73. package/bundled/definition24.cjs +39 -0
  74. package/bundled/definition24.js +72 -0
  75. package/bundled/definition3.cjs +1 -1
  76. package/bundled/definition3.js +24 -21
  77. package/bundled/definition4.cjs +23 -38
  78. package/bundled/definition4.js +81 -63
  79. package/bundled/definition5.cjs +2 -2
  80. package/bundled/definition5.js +5 -5
  81. package/bundled/definition6.cjs +11 -11
  82. package/bundled/definition6.js +57 -41
  83. package/bundled/definition9.cjs +12 -30
  84. package/bundled/definition9.js +55 -148
  85. package/bundled/divider.cjs +1 -1
  86. package/bundled/divider.js +5 -5
  87. package/bundled/listbox.cjs +1 -1
  88. package/bundled/listbox.js +1 -1
  89. package/bundled/localized.cjs +1 -1
  90. package/bundled/localized.js +1 -0
  91. package/bundled/mixins.cjs +5 -5
  92. package/bundled/mixins.js +49 -49
  93. package/bundled/numberConverter.cjs +12 -0
  94. package/bundled/numberConverter.js +38 -0
  95. package/bundled/picker-field.template.cjs +8 -7
  96. package/bundled/picker-field.template.js +16 -15
  97. package/bundled/slider.template.cjs +7 -7
  98. package/bundled/slider.template.js +12 -12
  99. package/bundled/slottable-request.cjs +1 -1
  100. package/bundled/slottable-request.js +8 -38
  101. package/bundled/time-selection-picker.template.cjs +4 -4
  102. package/bundled/time-selection-picker.template.js +35 -35
  103. package/bundled/utils.cjs +1 -0
  104. package/bundled/utils.js +1420 -0
  105. package/bundled/vivid-element.cjs +1 -1
  106. package/bundled/vivid-element.js +1 -1
  107. package/button/definition.cjs +5 -5
  108. package/button/definition.js +1 -1
  109. package/button/index.cjs +1 -1
  110. package/button/index.js +1 -1
  111. package/calendar/index.cjs +11 -11
  112. package/calendar/index.js +30 -237
  113. package/calendar-event/index.cjs +3 -3
  114. package/calendar-event/index.js +4 -4
  115. package/card/definition.cjs +5 -5
  116. package/card/definition.js +1 -1
  117. package/card/index.cjs +15 -12
  118. package/card/index.js +17 -13
  119. package/checkbox/definition.cjs +5 -5
  120. package/checkbox/definition.js +1 -1
  121. package/checkbox/index.cjs +1 -1
  122. package/checkbox/index.js +2 -2
  123. package/color-picker/definition.cjs +5 -5
  124. package/color-picker/definition.js +2 -2
  125. package/color-picker/index.cjs +10 -10
  126. package/color-picker/index.js +58 -57
  127. package/combobox/definition.cjs +5 -5
  128. package/combobox/definition.js +2 -2
  129. package/combobox/index.cjs +9 -8
  130. package/combobox/index.js +40 -35
  131. package/contextual-help/definition.cjs +5 -5
  132. package/contextual-help/definition.js +2 -2
  133. package/contextual-help/index.cjs +1 -1
  134. package/contextual-help/index.js +2 -2
  135. package/country/definition.cjs +5 -5
  136. package/country/definition.js +1 -1
  137. package/country/index.cjs +1 -12
  138. package/country/index.js +4 -1216
  139. package/country-group/definition.cjs +6 -0
  140. package/country-group/definition.js +3 -0
  141. package/country-group/index.cjs +43 -0
  142. package/country-group/index.js +166 -0
  143. package/custom-elements.json +1274 -200
  144. package/data-grid/definition.cjs +9 -9
  145. package/data-grid/definition.js +2 -2
  146. package/data-grid/index.cjs +18 -18
  147. package/data-grid/index.js +260 -262
  148. package/date-picker/definition.cjs +5 -5
  149. package/date-picker/definition.js +2 -2
  150. package/date-picker/index.cjs +1 -1
  151. package/date-picker/index.js +13 -13
  152. package/date-range-picker/definition.cjs +5 -5
  153. package/date-range-picker/definition.js +2 -2
  154. package/date-range-picker/index.cjs +1 -1
  155. package/date-range-picker/index.js +8 -8
  156. package/date-time-picker/definition.cjs +5 -5
  157. package/date-time-picker/definition.js +2 -2
  158. package/date-time-picker/index.cjs +4 -4
  159. package/date-time-picker/index.js +25 -25
  160. package/dial-pad/definition.cjs +5 -5
  161. package/dial-pad/definition.js +2 -2
  162. package/dial-pad/index.cjs +6 -5
  163. package/dial-pad/index.js +14 -12
  164. package/dialog/definition.cjs +5 -5
  165. package/dialog/definition.js +2 -2
  166. package/dialog/index.cjs +6 -6
  167. package/dialog/index.js +17 -16
  168. package/divider/definition.cjs +1 -1
  169. package/divider/definition.js +1 -1
  170. package/divider/index.cjs +1 -1
  171. package/divider/index.js +1 -1
  172. package/empty-state/definition.cjs +5 -5
  173. package/empty-state/definition.js +2 -2
  174. package/empty-state/index.cjs +2 -2
  175. package/empty-state/index.js +6 -5
  176. package/fab/definition.cjs +5 -5
  177. package/fab/definition.js +2 -2
  178. package/fab/index.cjs +4 -4
  179. package/fab/index.js +13 -12
  180. package/file-picker/definition.cjs +5 -5
  181. package/file-picker/definition.js +2 -2
  182. package/file-picker/index.cjs +20 -17
  183. package/file-picker/index.js +40 -36
  184. package/flag/definition.cjs +6 -0
  185. package/flag/definition.js +3 -0
  186. package/flag/index.cjs +10 -0
  187. package/flag/index.js +61 -0
  188. package/header/definition.cjs +1 -1
  189. package/header/definition.js +1 -1
  190. package/header/index.cjs +4 -4
  191. package/header/index.js +5 -5
  192. package/icon/definition.cjs +1 -0
  193. package/icon/definition.js +1 -0
  194. package/icon/index.cjs +1 -1
  195. package/icon/index.js +1 -0
  196. package/index.cjs +204 -192
  197. package/index.js +55 -52
  198. package/layout/definition.cjs +1 -1
  199. package/layout/definition.js +1 -1
  200. package/lib/button/button.d.ts +1 -0
  201. package/lib/combobox/combobox.d.ts +0 -3
  202. package/lib/components.d.ts +2 -0
  203. package/lib/country/countries-data.d.ts +1 -0
  204. package/lib/country/{country-code-to-flag-icon.d.ts → utils.d.ts} +0 -3
  205. package/lib/country-group/country-group.d.ts +829 -0
  206. package/lib/country-group/country-group.template.d.ts +3 -0
  207. package/lib/country-group/definition.d.ts +3 -0
  208. package/lib/country-group/index.d.ts +1 -0
  209. package/lib/country-group/locale.d.ts +3 -0
  210. package/lib/date-picker/date-picker.d.ts +4 -0
  211. package/lib/date-range-picker/date-range-picker.d.ts +2 -0
  212. package/lib/date-time-picker/date-time-picker.d.ts +4 -4
  213. package/lib/dial-pad/dial-pad.d.ts +6 -2
  214. package/lib/dialog/dialog.d.ts +0 -1
  215. package/lib/flag/definition.d.ts +3 -0
  216. package/lib/flag/flag.d.ts +8 -0
  217. package/lib/flag/flag.template.d.ts +3 -0
  218. package/lib/flag/index.d.ts +1 -0
  219. package/lib/icon/icon.d.ts +1 -2
  220. package/lib/menu/menu.d.ts +0 -1
  221. package/lib/option/option.d.ts +0 -1
  222. package/lib/rich-text-editor/rte/exports.d.ts +1 -0
  223. package/lib/rich-text-editor/rte/features/alignment.d.ts +1 -1
  224. package/lib/rich-text-editor/rte/features/character-count.d.ts +21 -0
  225. package/lib/rich-text-editor/rte/features/font-size-picker.d.ts +1 -1
  226. package/lib/rich-text-editor/rte/features/internal/basic-text-blocks.d.ts +1 -1
  227. package/lib/rich-text-editor/rte/features/keyboard-shortcuts.d.ts +1 -1
  228. package/lib/rich-text-editor/rte/features/text-color-picker.d.ts +1 -1
  229. package/lib/rich-text-editor/rte/public-interface.d.ts +6 -0
  230. package/lib/searchable-select/option-tag.d.ts +3 -2
  231. package/lib/searchable-select/searchable-select.d.ts +3 -1
  232. package/lib/table/definition.d.ts +2 -1
  233. package/lib/table/table-header-cell.d.ts +3 -0
  234. package/lib/table/table-sorting-button.d.ts +415 -0
  235. package/lib/table/table-sorting-button.template.d.ts +3 -0
  236. package/lib/tag-name-map.d.ts +2 -1
  237. package/lib/time-picker/time-picker.d.ts +2 -0
  238. package/locales/de-DE.cjs +5 -178
  239. package/locales/de-DE.js +3 -179
  240. package/locales/en-GB.cjs +5 -9
  241. package/locales/en-GB.js +3 -10
  242. package/locales/en-US.cjs +269 -2
  243. package/locales/en-US.js +266 -1
  244. package/locales/ja-JP.cjs +5 -171
  245. package/locales/ja-JP.js +3 -172
  246. package/locales/zh-CN.cjs +5 -172
  247. package/locales/zh-CN.js +3 -173
  248. package/menu/definition.cjs +5 -5
  249. package/menu/definition.js +1 -1
  250. package/menu/index.cjs +1 -1
  251. package/menu/index.js +2 -2
  252. package/menu-item/definition.cjs +6 -6
  253. package/menu-item/definition.js +1 -1
  254. package/menu-item/index.cjs +1 -1
  255. package/menu-item/index.js +2 -2
  256. package/nav/definition.cjs +1 -1
  257. package/nav/definition.js +1 -1
  258. package/nav-disclosure/definition.cjs +5 -5
  259. package/nav-disclosure/definition.js +2 -2
  260. package/nav-disclosure/index.cjs +4 -4
  261. package/nav-disclosure/index.js +13 -12
  262. package/nav-item/definition.cjs +5 -5
  263. package/nav-item/definition.js +2 -2
  264. package/nav-item/index.cjs +2 -2
  265. package/nav-item/index.js +12 -11
  266. package/note/definition.cjs +5 -5
  267. package/note/definition.js +2 -2
  268. package/note/index.cjs +3 -3
  269. package/note/index.js +11 -10
  270. package/number-field/definition.cjs +5 -5
  271. package/number-field/definition.js +2 -2
  272. package/number-field/index.cjs +4 -4
  273. package/number-field/index.js +29 -28
  274. package/option/definition.cjs +5 -5
  275. package/option/definition.js +2 -2
  276. package/option/index.cjs +1 -1
  277. package/option/index.js +2 -2
  278. package/package.json +9 -10
  279. package/pagination/definition.cjs +5 -5
  280. package/pagination/definition.js +2 -2
  281. package/pagination/index.cjs +3 -3
  282. package/pagination/index.js +16 -16
  283. package/popover/definition.cjs +5 -5
  284. package/popover/definition.js +2 -2
  285. package/popover/index.cjs +7 -7
  286. package/popover/index.js +12 -11
  287. package/popup/definition.cjs +4 -4
  288. package/popup/definition.js +1 -1
  289. package/popup/index.cjs +1 -1
  290. package/popup/index.js +1 -1
  291. package/progress/definition.cjs +1 -1
  292. package/progress/definition.js +1 -1
  293. package/progress/index.cjs +2 -2
  294. package/progress/index.js +5 -5
  295. package/radio/definition.cjs +1 -1
  296. package/radio/definition.js +1 -1
  297. package/radio/index.cjs +1 -1
  298. package/radio/index.js +1 -1
  299. package/radio-group/definition.cjs +5 -5
  300. package/radio-group/definition.js +2 -2
  301. package/radio-group/index.cjs +4 -4
  302. package/radio-group/index.js +11 -11
  303. package/range-slider/definition.cjs +5 -5
  304. package/range-slider/definition.js +2 -2
  305. package/range-slider/index.cjs +4 -4
  306. package/range-slider/index.js +39 -36
  307. package/rich-text-editor/definition.cjs +32 -31
  308. package/rich-text-editor/definition.js +3 -3
  309. package/rich-text-editor/index.cjs +13 -13
  310. package/rich-text-editor/index.js +1887 -1830
  311. package/rich-text-view/definition.cjs +1 -1
  312. package/rich-text-view/definition.js +1 -1
  313. package/rich-text-view/index.cjs +1 -1
  314. package/rich-text-view/index.js +8 -8
  315. package/searchable-select/definition.cjs +4 -4
  316. package/searchable-select/definition.js +2 -2
  317. package/searchable-select/index.cjs +15 -13
  318. package/searchable-select/index.js +75 -72
  319. package/select/definition.cjs +5 -5
  320. package/select/definition.js +2 -2
  321. package/select/index.cjs +1 -1
  322. package/select/index.js +2 -2
  323. package/selectable-box/definition.cjs +5 -5
  324. package/selectable-box/definition.js +2 -2
  325. package/selectable-box/index.cjs +7 -7
  326. package/selectable-box/index.js +12 -12
  327. package/shared/foundation/test-utilities/fixture.d.ts +1 -1
  328. package/shared/icon/utils.d.ts +1 -0
  329. package/shared/localization/Locale.d.ts +2 -0
  330. package/shared/patterns/linkable.d.ts +1 -1
  331. package/shared/picker-field/mixins/calendar-picker.d.ts +1 -0
  332. package/shared/picker-field/mixins/calendar-picker.template.d.ts +1 -0
  333. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +1 -0
  334. package/shared/picker-field/mixins/single-date-picker.d.ts +1 -0
  335. package/shared/picker-field/mixins/single-value-picker.d.ts +1 -0
  336. package/shared/picker-field/mixins/time-selection-picker.d.ts +1 -0
  337. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +2 -0
  338. package/shared/picker-field/picker-field.d.ts +2 -0
  339. package/side-drawer/definition.cjs +1 -1
  340. package/side-drawer/definition.js +1 -1
  341. package/simple-color-picker/definition.cjs +5 -5
  342. package/simple-color-picker/definition.js +2 -2
  343. package/simple-color-picker/index.cjs +3 -3
  344. package/simple-color-picker/index.js +15 -14
  345. package/slider/definition.cjs +5 -5
  346. package/slider/definition.js +1 -1
  347. package/slider/index.cjs +1 -1
  348. package/slider/index.js +1 -1
  349. package/split-button/definition.cjs +5 -5
  350. package/split-button/definition.js +2 -2
  351. package/split-button/index.cjs +6 -6
  352. package/split-button/index.js +17 -16
  353. package/status/definition.cjs +5 -5
  354. package/status/definition.js +2 -2
  355. package/status/index.cjs +2 -2
  356. package/status/index.js +11 -10
  357. package/switch/definition.cjs +5 -5
  358. package/switch/definition.js +2 -2
  359. package/switch/index.cjs +4 -4
  360. package/switch/index.js +11 -10
  361. package/tab/definition.cjs +5 -5
  362. package/tab/definition.js +2 -2
  363. package/tab/index.cjs +1 -1
  364. package/tab/index.js +2 -2
  365. package/tab-panel/definition.cjs +1 -1
  366. package/tab-panel/definition.js +1 -1
  367. package/tab-panel/index.cjs +1 -1
  368. package/tab-panel/index.js +1 -1
  369. package/table/definition.cjs +4 -1
  370. package/table/definition.js +3 -2
  371. package/table/index.cjs +19 -10
  372. package/table/index.js +70 -21
  373. package/tabs/definition.cjs +6 -6
  374. package/tabs/definition.js +2 -2
  375. package/tabs/index.cjs +2 -2
  376. package/tabs/index.js +5 -5
  377. package/tag/definition.cjs +5 -5
  378. package/tag/definition.js +2 -2
  379. package/tag/index.cjs +8 -8
  380. package/tag/index.js +14 -13
  381. package/tag-group/definition.cjs +1 -1
  382. package/tag-group/definition.js +1 -1
  383. package/tag-group/index.cjs +3 -3
  384. package/tag-group/index.js +5 -5
  385. package/text-area/definition.cjs +5 -5
  386. package/text-area/definition.js +2 -2
  387. package/text-area/index.cjs +2 -2
  388. package/text-area/index.js +13 -13
  389. package/text-field/definition.cjs +5 -5
  390. package/text-field/definition.js +2 -2
  391. package/text-field/index.cjs +1 -1
  392. package/text-field/index.js +2 -2
  393. package/time-picker/definition.cjs +4 -4
  394. package/time-picker/definition.js +2 -2
  395. package/time-picker/index.cjs +1 -1
  396. package/time-picker/index.js +2 -2
  397. package/toggletip/definition.cjs +5 -5
  398. package/toggletip/definition.js +2 -2
  399. package/toggletip/index.cjs +1 -1
  400. package/toggletip/index.js +2 -2
  401. package/tooltip/definition.cjs +5 -5
  402. package/tooltip/definition.js +2 -2
  403. package/tooltip/index.cjs +1 -1
  404. package/tooltip/index.js +2 -2
  405. package/tree-item/definition.cjs +5 -5
  406. package/tree-item/definition.js +2 -2
  407. package/tree-item/index.cjs +1 -1
  408. package/tree-item/index.js +2 -2
  409. package/tree-view/definition.cjs +5 -5
  410. package/tree-view/definition.js +2 -2
  411. package/tree-view/index.cjs +3 -3
  412. package/tree-view/index.js +18 -18
  413. package/unbundled/button.cjs +2 -2
  414. package/unbundled/button.js +2 -2
  415. package/unbundled/calendar-picker.template.cjs +4347 -9
  416. package/unbundled/calendar-picker.template.js +4345 -7
  417. package/unbundled/chunk.cjs +0 -22
  418. package/unbundled/definition11.cjs +6 -0
  419. package/unbundled/definition11.js +6 -0
  420. package/unbundled/definition13.cjs +1 -8
  421. package/unbundled/definition13.js +1 -8
  422. package/unbundled/definition14.cjs +3 -2
  423. package/unbundled/definition14.js +3 -2
  424. package/unbundled/definition2.cjs +5 -75
  425. package/unbundled/definition2.js +1 -71
  426. package/unbundled/definition21.cjs +1 -2
  427. package/unbundled/definition21.js +1 -2
  428. package/unbundled/definition22.cjs +7 -2
  429. package/unbundled/definition22.js +7 -2
  430. package/unbundled/definition24.cjs +98 -979
  431. package/unbundled/definition24.js +93 -974
  432. package/unbundled/definition25.cjs +37 -322
  433. package/unbundled/definition25.js +33 -318
  434. package/unbundled/definition26.cjs +317 -91
  435. package/unbundled/definition26.js +313 -87
  436. package/unbundled/definition27.cjs +94 -192
  437. package/unbundled/definition27.js +91 -183
  438. package/unbundled/definition28.cjs +388 -395
  439. package/unbundled/definition28.js +388 -395
  440. package/unbundled/definition29.cjs +189 -110
  441. package/unbundled/definition29.js +180 -107
  442. package/unbundled/definition30.cjs +520 -36
  443. package/unbundled/definition30.js +519 -35
  444. package/unbundled/definition31.cjs +2 -1189
  445. package/unbundled/definition31.js +1 -1188
  446. package/unbundled/definition32.cjs +207 -1835
  447. package/unbundled/definition32.js +203 -1807
  448. package/unbundled/definition33.cjs +85 -228
  449. package/unbundled/definition33.js +82 -165
  450. package/unbundled/definition34.cjs +1887 -25
  451. package/unbundled/definition34.js +1857 -24
  452. package/unbundled/definition35.cjs +315 -121
  453. package/unbundled/definition35.js +236 -114
  454. package/unbundled/definition36.cjs +25 -405
  455. package/unbundled/definition36.js +22 -397
  456. package/unbundled/definition37.cjs +49 -140
  457. package/unbundled/definition37.js +46 -137
  458. package/unbundled/definition38.cjs +346 -329
  459. package/unbundled/definition38.js +343 -326
  460. package/unbundled/definition39.cjs +183 -234
  461. package/unbundled/definition39.js +181 -232
  462. package/unbundled/definition40.cjs +377 -47
  463. package/unbundled/definition40.js +372 -42
  464. package/unbundled/definition41.cjs +256 -57
  465. package/unbundled/definition41.js +255 -56
  466. package/unbundled/definition42.cjs +45 -421
  467. package/unbundled/definition42.js +41 -417
  468. package/unbundled/definition43.cjs +63 -49
  469. package/unbundled/definition43.js +61 -47
  470. package/unbundled/definition44.cjs +438 -30
  471. package/unbundled/definition44.js +434 -25
  472. package/unbundled/definition45.cjs +46 -84
  473. package/unbundled/definition45.js +43 -81
  474. package/unbundled/definition46.cjs +29 -54
  475. package/unbundled/definition46.js +24 -50
  476. package/unbundled/definition47.cjs +93 -21
  477. package/unbundled/definition47.js +91 -16
  478. package/unbundled/definition48.cjs +49 -33
  479. package/unbundled/definition48.js +46 -30
  480. package/unbundled/definition49.cjs +22 -347
  481. package/unbundled/definition49.js +16 -344
  482. package/unbundled/definition50.cjs +34 -211
  483. package/unbundled/definition50.js +30 -207
  484. package/unbundled/definition51.cjs +282 -242
  485. package/unbundled/definition51.js +275 -235
  486. package/unbundled/definition52.cjs +211 -51
  487. package/unbundled/definition52.js +209 -48
  488. package/unbundled/definition53.cjs +275 -131
  489. package/unbundled/definition53.js +272 -127
  490. package/unbundled/definition54.cjs +50 -261
  491. package/unbundled/definition54.js +48 -260
  492. package/unbundled/definition55.cjs +126 -443
  493. package/unbundled/definition55.js +123 -441
  494. package/unbundled/definition56.cjs +238 -12669
  495. package/unbundled/definition56.js +232 -12506
  496. package/unbundled/definition57.cjs +408 -729
  497. package/unbundled/definition57.js +406 -727
  498. package/unbundled/definition58.cjs +3619 -106
  499. package/unbundled/definition58.js +3449 -99
  500. package/unbundled/definition59.cjs +625 -868
  501. package/unbundled/definition59.js +620 -863
  502. package/unbundled/definition60.cjs +106 -108
  503. package/unbundled/definition60.js +102 -104
  504. package/unbundled/definition61.cjs +1040 -71
  505. package/unbundled/definition61.js +1035 -65
  506. package/unbundled/definition62.cjs +105 -169
  507. package/unbundled/definition62.js +101 -165
  508. package/unbundled/definition63.cjs +70 -113
  509. package/unbundled/definition63.js +65 -109
  510. package/unbundled/definition64.cjs +181 -53
  511. package/unbundled/definition64.js +178 -50
  512. package/unbundled/definition65.cjs +109 -76
  513. package/unbundled/definition65.js +109 -75
  514. package/unbundled/definition66.cjs +58 -21
  515. package/unbundled/definition66.js +55 -15
  516. package/unbundled/definition67.cjs +81 -74
  517. package/unbundled/definition67.js +79 -73
  518. package/unbundled/definition68.cjs +19 -344
  519. package/unbundled/definition68.js +14 -335
  520. package/unbundled/definition69.cjs +88 -26
  521. package/unbundled/definition69.js +85 -22
  522. package/unbundled/definition7.cjs +18 -3
  523. package/unbundled/definition7.js +18 -3
  524. package/unbundled/definition70.cjs +330 -111
  525. package/unbundled/definition70.js +320 -108
  526. package/unbundled/definition71.cjs +26 -271
  527. package/unbundled/definition71.js +21 -267
  528. package/unbundled/definition72.cjs +134 -28
  529. package/unbundled/definition72.js +125 -26
  530. package/unbundled/definition73.cjs +245 -113
  531. package/unbundled/definition73.js +242 -104
  532. package/unbundled/definition74.cjs +28 -212
  533. package/unbundled/definition74.js +26 -202
  534. package/unbundled/definition75.cjs +120 -52190
  535. package/unbundled/definition75.js +112 -52188
  536. package/unbundled/definition76.cjs +232 -0
  537. package/unbundled/definition76.js +213 -0
  538. package/unbundled/definition77.cjs +533 -0
  539. package/unbundled/definition77.js +513 -0
  540. package/unbundled/listbox.cjs +1 -1
  541. package/unbundled/listbox.js +1 -1
  542. package/unbundled/localized.cjs +2 -2
  543. package/unbundled/localized.js +1 -1
  544. package/unbundled/numberConverter.cjs +91 -0
  545. package/unbundled/numberConverter.js +74 -0
  546. package/unbundled/picker-field.template.cjs +3 -1
  547. package/unbundled/picker-field.template.js +3 -1
  548. package/unbundled/slottable-request.cjs +2 -3168
  549. package/unbundled/slottable-request.js +3 -3097
  550. package/unbundled/time-selection-picker.template.cjs +1 -1
  551. package/unbundled/time-selection-picker.template.js +1 -1
  552. package/unbundled/utils.cjs +1439 -0
  553. package/unbundled/utils.js +1428 -0
  554. package/unbundled/vivid-element.cjs +1 -1
  555. package/unbundled/vivid-element.js +1 -1
  556. package/video-player/definition.cjs +1 -1
  557. package/video-player/definition.js +1 -1
  558. package/video-player/index.cjs +3 -3
  559. package/video-player/index.js +9 -9
  560. package/vivid.api.json +860 -409
  561. package/unbundled/chunk.js +0 -33
  562. package/unbundled/en-US.cjs +0 -447
  563. package/unbundled/en-US.js +0 -443
  564. /package/{lib/icon/icon.placeholder.d.ts → shared/icon/icon-placeholder.d.ts} +0 -0
@@ -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 { o as defineVividComponent, s as createRegisterFunction } from "./vivid-element.js";
2
+ import { t as iconDefinition } from "./definition2.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,1052 +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 "./definition27.js";
18
- import { t as dividerDefinition } from "./definition34.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{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;padding-block:8px;padding-inline:16px;transition:box-shadow .2s,background-color .2s;display:flex}@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:8px}:host([shape=pill]) .fieldset{border-radius:24px}.popup-wrapper{position:relative}.content-area{flex-direction:column;flex:1;gap:8px;min-block-size:24px;display:flex;overflow:hidden}.tag-row{gap:8px;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:24px;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:20px}.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 { a as feedbackMessageDefinition, n as WithLightDOMFeedback } 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-400);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-300);--_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-300);--_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 = ".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{box-sizing:border-box;background-color:var(--fill-color);block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16));box-shadow:inset 0 0 0 1px var(--outline-color);color:var(--text-color);font:var(--vvd-typography-base-bold);user-select:none;vertical-align:middle;align-items:center;column-gap:8px;max-inline-size:100%;padding-inline:8px;display:inline-flex;position:relative}.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(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 1.5);line-height:1}.icon-placeholder{inline-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 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
46
- * @vueModel modelValue value input `event.currentTarget.value`
47
- * @vueModel values values input `event.currentTarget.values`
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
33
+ * @vueModel modelValue value input,@lazy:change `event.currentTarget.value`
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({
734
- mode: "boolean",
735
- attribute: "fixed-dropdown"
736
- })], SearchableSelect.prototype, "fixedDropdown", void 0);
737
- __decorate([attr], SearchableSelect.prototype, "placeholder", void 0);
738
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "open", void 0);
739
- __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);
740
629
  __decorate([attr({
741
- attribute: "external-tags",
630
+ attribute: "open",
742
631
  mode: "boolean"
743
- })], SearchableSelect.prototype, "externalTags", void 0);
744
- __decorate([attr({
745
- attribute: "max-lines",
746
- converter: nullableNumberConverter
747
- })], SearchableSelect.prototype, "maxLines", void 0);
748
- __decorate([observable], SearchableSelect.prototype, "values", void 0);
749
- __decorate([observable], SearchableSelect.prototype, "initialValues", void 0);
750
- __decorate([observable], SearchableSelect.prototype, "_input", void 0);
751
- __decorate([observable], SearchableSelect.prototype, "_currentSearchText", void 0);
752
- __decorate([observable], SearchableSelect.prototype, "_slottedOptions", void 0);
753
- __decorate([observable], SearchableSelect.prototype, "optionFilter", void 0);
754
- __decorate([observable], SearchableSelect.prototype, "_filteredOptions", void 0);
755
- __decorate([observable], SearchableSelect.prototype, "_filteredEnabledOptions", void 0);
756
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "loading", void 0);
757
- __decorate([observable], SearchableSelect.prototype, "_highlightedOptionIndex", void 0);
758
- __decorate([observable], SearchableSelect.prototype, "_contentArea", void 0);
759
- __decorate([observable], SearchableSelect.prototype, "_numElidedTags", void 0);
760
- __decorate([observable], SearchableSelect.prototype, "_tagRows", void 0);
761
- __decorate([observable], SearchableSelect.prototype, "_lastTagRow", void 0);
762
- __decorate([observable], SearchableSelect.prototype, "_listbox", void 0);
763
- __decorate([attr({ mode: "boolean" })], SearchableSelect.prototype, "clearable", void 0);
764
- __decorate([attr({
765
- attribute: "max-selected",
766
- converter: nullableNumberConverter
767
- })], SearchableSelect.prototype, "maxSelected", void 0);
768
- __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);
769
640
  __decorate([attr({
770
- attribute: "enable-select-all",
771
- mode: "boolean"
772
- })], SearchableSelect.prototype, "enableSelectAll", void 0);
773
- __decorate([attr({ attribute: "select-all-text" })], SearchableSelect.prototype, "selectAllText", void 0);
774
- __decorate([attr({ attribute: "deselect-all-text" })], SearchableSelect.prototype, "deselectAllText", void 0);
775
- __decorate([observable], SearchableSelect.prototype, "_selectAllOption", void 0);
776
- __decorate([observable], SearchableSelect.prototype, "_changeDescription", void 0);
777
- __decorate([observable], SearchableSelect.prototype, "_anchor", void 0);
778
- //#endregion
779
- //#region src/lib/searchable-select/option-tag.ts
780
- var OptionTag = class extends Localized(VividElement) {
781
- constructor(..._args) {
782
- super(..._args);
783
- this.removable = false;
784
- this.disabled = false;
785
- this.hasIconPlaceholder = false;
786
- }
787
- _onClickRemove() {
788
- this.$emit("remove", void 0, { bubbles: false });
789
- }
790
- };
791
- __decorate([attr], OptionTag.prototype, "shape", void 0);
792
- __decorate([observable], OptionTag.prototype, "connotation", void 0);
793
- __decorate([attr], OptionTag.prototype, "label", void 0);
794
- __decorate([attr({ mode: "boolean" })], OptionTag.prototype, "removable", void 0);
795
- __decorate([attr({ mode: "boolean" })], OptionTag.prototype, "disabled", void 0);
796
- __decorate([observable], OptionTag.prototype, "hasIconPlaceholder", 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);
797
649
  //#endregion
798
- //#region src/lib/searchable-select/searchable-select.template.ts
799
- var getStateClasses = (x) => classNames(["disabled", x.disabled], [`appearance-${x.appearance}`, Boolean(x.appearance)], [`shape-${x.shape}`, Boolean(x.shape)], ["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)]);
800
652
  function renderLabel() {
801
- return html`
802
- <label for="control" class="label" id="label"> ${(x) => x.label} </label>
803
- `;
653
+ return html` <label
654
+ for="${(x) => x.multiple ? null : "control"}"
655
+ class="label"
656
+ id="label"
657
+ >
658
+ ${(x) => x.label}
659
+ </label>`;
804
660
  }
805
- function renderSelectionCount() {
661
+ function renderPlaceholder(context) {
662
+ const optionTag = context.tagFor(ListboxOption);
806
663
  return html`
807
- <span
808
- id="selection-count"
809
- class="selection-count"
810
- aria-label="${(x) => x.locale.searchableSelect.maxSelectedMessage(x.values.length, x.maxSelected)}"
811
- >(${(x) => `${x.values.length}/${x.maxSelected}`})</span
812
- >
813
- `;
664
+ <${optionTag} text="${(x) => x.placeholder}" hidden disabled>
665
+ </${optionTag}>`;
814
666
  }
815
- var tagTemplateFactory = (context, getComponent) => {
816
- const optionTagTag = context.tagFor(OptionTag);
817
- return html`
818
- <div class="tag-wrapper">
819
- <${optionTagTag}
820
- class="tag"
821
- tabindex="-1"
822
- data-index="${(x, c) => getComponent(c).values.indexOf(x)}"
823
- removable
824
- :label="${(x, c) => getComponent(c)._tagLabelForValue(x)}"
825
- :shape="${(_, c) => getComponent(c).shape}"
826
- :connotation="${(x, c) => getComponent(c)._tagConnotationForValue(x)}"
827
- ?disabled="${(x, c) => getComponent(c)._isTagDisabled(x)}"
828
- @remove="${(x, c) => getComponent(c)._onTagRemoved(x)}"
829
- @keydown="${(_, c) => getComponent(c)._onTagKeydown(c.event)}"
830
- @mousedown="${() => false}">
831
- <slot slot="icon" name="${(x, c) => getComponent(c)._tagIconSlotName(x)}"></slot>
832
- </${optionTagTag}>
833
- </div>
834
- `;
835
- };
836
- var elidedTagTemplateFactory = (context, getComponent) => {
837
- const optionTagTag = context.tagFor(OptionTag);
838
- return html`
839
- <${optionTagTag}
840
- class="tag"
841
- tabindex="-1"
842
- :label="${(x, c) => getComponent(x, c)._numElidedTags.toString()}"
843
- :shape="${(x, c) => getComponent(x, c).shape}"
844
- ?disabled="${(x, c) => getComponent(x, c).disabled}"
845
- @mousedown="${() => false}">
846
- </${optionTagTag}>
847
- `;
848
- };
849
- function renderFieldset(context) {
667
+ function renderClearButton(context) {
850
668
  const buttonTag = context.tagFor(Button);
851
- const progressRingTag = context.tagFor(ProgressRing);
852
- const affixIconTemplate = affixIconTemplateFactory(context);
853
- const chevronTemplate = chevronTemplateFactory(context);
854
- const tagTemplate = tagTemplateFactory(context, (c) => c.parent);
855
- const nestedTagTemplate = tagTemplateFactory(context, (c) => c.parentContext.parent);
856
- const elidedTagTemplate = elidedTagTemplateFactory(context, (x, _) => x);
857
- const nestedElidedTagTemplate = elidedTagTemplateFactory(context, (_, c) => c.parent);
858
669
  return html`
859
- <div
860
- class="fieldset ${getStateClasses}"
861
- @click="${(x, c) => x._onFieldsetClick(c.event)}"
862
- ${ref("_anchor")}
863
- >
864
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
865
- <div class="content-area" ${ref("_contentArea")}>
866
- ${repeat((x) => x._tagRows, html`
867
- <div class="tag-row">
868
- ${when((_, c) => c.isFirst && c.parent._numElidedTags, nestedElidedTagTemplate)}
869
- ${repeat((x) => x, nestedTagTemplate)}
870
- </div>
871
- `, { positioning: true })}
872
- <div
873
- class="tag-row ${(x) => classNames(["contains-only-input", x._tagRows.length > 0 && x._lastTagRow.length === 0])}"
874
- >
875
- ${when((x) => x._tagRows.length === 0 && x._numElidedTags, elidedTagTemplate)}
876
- ${repeat((x) => x._lastTagRow, tagTemplate)}
877
- <input
878
- id="control"
879
- class="control"
880
- autocomplete="off"
881
- aria-controls="listbox"
882
- aria-describedby="${(x) => x._feedbackDescribedBy} ${(x) => x.multiple && x.maxSelected && x.maxSelected >= 1 ? "selection-count" : null}"
883
- ${delegateAria({
884
- role: "combobox",
885
- ariaAutoComplete: "list",
886
- ariaHasPopup: "listbox",
887
- ariaExpanded: (x) => x.open
888
- })}
889
- placeholder="${(x) => x.multiple && x.values.length ? "" : x.placeholder}"
890
- type="text"
891
- ?disabled="${(x) => x.disabled}"
892
- :value="${(x) => x._inputValue}"
893
- @input="${(x, c) => {
894
- 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();
895
675
  c.event.stopPropagation();
896
676
  }}"
897
- @change="${(_, c) => {
677
+ @mousedown="${() => false}"
678
+ @keydown="${(x, c) => {
679
+ /* v8 ignore next -- @preserve */
680
+ if (c.event.key === "Tab") x._onClearButtonBlur();
898
681
  c.event.stopPropagation();
682
+ return true;
899
683
  }}"
900
- @focus="${(x, c) => x._onInputFocus(c.event)}"
901
- @blur="${(x, c) => x._onInputBlur(c.event)}"
902
- @keydown="${(x, c) => x._onInputKeydown(c.event)}"
903
- ${ref("_input")}
904
- />
905
- </div>
906
- </div>
907
- <slot name="meta"></slot>
908
- ${when((x) => x._shouldShowClearButton, html`<${buttonTag}
909
- aria-label="${(x) => x.locale.searchableSelect.clearButtonLabel}"
910
- @click="${(x) => x._onClearButtonClick()}"
911
- @mousedown="${() => false}"
912
- ?disabled="${(x) => x.disabled}"
913
- :shape="${(x) => x.shape}"
914
- size="super-condensed"
915
- icon="close-line"
916
- appearance="ghost-light"
917
- tabindex="0"
918
- ></${buttonTag}>`)}
919
- <div @mousedown="${() => false}" @click="${(x) => x._onChevronClick()}">
920
- ${when((x) => x.loading, html`<${progressRingTag} indeterminate size="-6" aria-hidden="true"></${progressRingTag}>`)}
921
- ${when((x) => !x.loading, chevronTemplate)}
922
- </div>
923
- </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}>
924
697
  `;
925
698
  }
926
- function setFixedDropdownVarWidth(x) {
927
- 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>`;
928
716
  }
929
- function renderSelectAll(context) {
930
- const optionTag = context.tagFor(ListboxOption);
931
- const dividerTag = context.tagFor(Divider);
932
- return html`
933
- <${optionTag}
934
- data-select-all
935
- tabindex="-1"
936
- :text="${(x) => x._selectAllLabel}"
937
- :selected="${(x) => x._isAllSelected}"
938
- :_displayCheckmark="${() => true}"
939
- ?disabled="${(x) => x._selectableOptions.length === 0}"
940
- ${ref("_selectAllOption")}>
941
- </${optionTag}>
942
- <${dividerTag} class="divider"></${dividerTag}>
943
- `;
717
+ function setFixedDropdownVarWidth(x) {
718
+ return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
944
719
  }
720
+ /**
721
+ * @param context - element definition context
722
+ */
945
723
  function renderControl(context) {
946
724
  const popupTag = context.tagFor(Popup);
947
725
  return html`
948
- <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp && !x._hasSelectionCount}>
949
- ${when((x) => x.label || x._hasSelectionCount, html`
950
- <div>
951
- ${when((x) => x.label, renderLabel())}
952
- ${when((x) => x._hasSelectionCount, renderSelectionCount())}
953
- </div>
954
- `)}
955
- <slot name="contextual-help" ${slotted("_contextualHelpSlottedContent")}></slot>
956
- </div>
957
- <span aria-live="assertive" aria-relevant="text" class="visually-hidden">
958
- ${(x) => x._changeDescription}
959
- </span>
960
- <div>
961
- ${renderFieldset(context)}
962
- <div class="popup-wrapper">
963
- <${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}"
964
736
  :anchor="${(x) => x._anchor}"
965
- :open="${(x) => x.open}"
966
- class="popup"
967
737
  placement="bottom-start"
968
- style="${setFixedDropdownVarWidth}"
969
- strategy="${(x) => x.fixedDropdown ? "fixed" : "absolute"}">
970
- <div
971
- class="listbox"
738
+ strategy="${(x) => x.fixedDropdown ? null : "absolute"}">
739
+ <div class="listbox"
740
+ id="${(x) => x.listboxId}"
972
741
  role="listbox"
973
742
  aria-multiselectable="${(x) => x.multiple}"
974
- aria-required="${(x) => x.required}"
975
- ${ref("_listbox")}
976
- @click="${(x, c) => x._onListboxClick(c.event)}"
977
- @mousedown="${() => false}"
978
- >
979
- ${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))}
980
749
  <slot
981
750
  ${slotted({
982
- filter: isListboxOption,
751
+ filter: Listbox.slottedOptionFilter,
983
752
  flatten: true,
984
- property: "_slottedOptions"
753
+ property: "slottedOptions"
985
754
  })}>
986
755
  </slot>
987
- ${when((x) => x._filteredOptions.length === 0, html`<div class="empty-message">
988
- ${when((x) => x.loading, html`<slot name="loading-options">
989
- ${(x) => x.locale.searchableSelect.loadingOptionsMessage}
990
- </slot>`)}
991
- ${when((x) => !x.loading && x.searchText === "", html`<slot name="no-options">
992
- ${(x) => x.locale.searchableSelect.noOptionsMessage}
993
- </slot>`)}
994
- ${when((x) => !x.loading && x.searchText !== "", html`<slot name="no-matches">
995
- ${(x) => x.locale.searchableSelect.noMatchesMessage}
996
- </slot>`)}
997
- </div>`)}
998
- </div>
756
+ </div>
999
757
  </${popupTag}>
1000
758
  </div>
1001
- </div>
1002
- `;
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
+ };
1003
769
  }
1004
- var SearchableSelectTemplate = (context) => {
1005
- const optionTagName = context.tagFor(OptionTag, true);
770
+ var SelectTemplate = (context) => {
1006
771
  return html`
1007
772
  <template
1008
- :_optionTagTagName="${() => optionTagName}"
1009
- @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))}"
1010
792
  >
1011
- <div class="control-wrapper">
1012
- ${renderControl(context)} ${(x) => x._getFeedbackTemplate(context)}
793
+ ${renderControl(context)}
794
+ <div class="feedback-wrapper" ${ref("_feedbackWrapper")}>
795
+ ${(x) => x._getFeedbackTemplate(context)}
1013
796
  </div>
1014
797
  </template>
1015
798
  `;
1016
799
  };
1017
800
  //#endregion
1018
- //#region src/lib/searchable-select/option-tag.template.ts
1019
- var getClasses = ({ shape, connotation, disabled, removable }) => classNames("base", ["disabled", disabled], ["removable", removable], [`shape-${shape}`, Boolean(shape)], [`connotation-${connotation}`, Boolean(connotation)]);
1020
- function renderRemoveButton(iconTag) {
1021
- return html`
1022
- <span
1023
- class="remove-button"
1024
- aria-label="${(x) => x.locale.searchableSelect.removeTagButtonLabel(x.label)}"
1025
- role="button"
1026
- tabindex="${(x) => x.disabled ? null : 0}"
1027
- @click="${(x) => x._onClickRemove()}"
1028
- >
1029
- <${iconTag} name="close-line"></${iconTag}>
1030
- </span>
1031
- `;
1032
- }
1033
- var optionTagTemplate = (context) => {
1034
- const iconTag = context.tagFor(Icon);
1035
- return html`<span class="${getClasses}" aria-disabled="${(x) => x.disabled}">
1036
- <slot name="icon" aria-hidden="true">
1037
- ${when((x) => x.hasIconPlaceholder, html`<div class="icon-placeholder"></div>`)}
1038
- </slot>
1039
- ${when((x) => x.label, (x) => html`<span class="label">${x.label}</span>`)}
1040
- ${when((x) => x.removable, renderRemoveButton(iconTag))}
1041
- </span>`;
1042
- };
801
+ //#region src/lib/select/definition.ts
1043
802
  /**
1044
- * Registers the searchable-select element with the design system.
1045
- *
1046
- * @param prefix - the prefix to use for the component name
803
+ * @internal
1047
804
  */
1048
- var registerSearchableSelect = createRegisterFunction(defineVividComponent("searchable-select", SearchableSelect, SearchableSelectTemplate, [
1049
- buttonDefinition,
805
+ var selectDefinition = defineVividComponent("select", Select, SelectTemplate, [
1050
806
  popupDefinition,
1051
807
  iconDefinition,
1052
- defineVividComponent("option-tag", OptionTag, optionTagTemplate, [iconDefinition], {
1053
- styles: [option_tag_default],
1054
- shadowOptions: { delegatesFocus: true }
1055
- }),
1056
- progressRingDefinition,
1057
- feedbackMessageDefinition,
1058
808
  listboxOptionDefinition,
1059
- dividerDefinition
1060
- ], { 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);
1061
818
  //#endregion
1062
- export { SearchableSelect as n, registerSearchableSelect as t };
819
+ export { selectDefinition as n, Select as r, registerSelect as t };