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