@vonage/vivid 5.17.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 (459) 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/alert/definition.cjs +5 -5
  10. package/alert/definition.js +1 -1
  11. package/alert/index.cjs +2 -2
  12. package/alert/index.js +6 -5
  13. package/audio-player/definition.cjs +5 -5
  14. package/audio-player/definition.js +1 -1
  15. package/audio-player/index.cjs +1 -1
  16. package/audio-player/index.js +2 -1
  17. package/avatar/definition.cjs +5 -5
  18. package/avatar/definition.js +1 -1
  19. package/avatar/index.cjs +3 -3
  20. package/avatar/index.js +6 -5
  21. package/badge/definition.cjs +5 -5
  22. package/badge/definition.js +1 -1
  23. package/badge/index.cjs +1 -4
  24. package/badge/index.js +4 -20
  25. package/banner/definition.cjs +5 -5
  26. package/banner/definition.js +1 -1
  27. package/banner/index.cjs +2 -2
  28. package/banner/index.js +5 -4
  29. package/breadcrumb-item/definition.cjs +4 -4
  30. package/breadcrumb-item/definition.js +1 -1
  31. package/breadcrumb-item/index.cjs +1 -1
  32. package/breadcrumb-item/index.js +1 -0
  33. package/bundled/affix.cjs +1 -1
  34. package/bundled/affix.js +5 -5
  35. package/bundled/definition11.cjs +2 -2
  36. package/bundled/definition11.js +5 -5
  37. package/bundled/definition12.cjs +3 -3
  38. package/bundled/definition12.js +5 -5
  39. package/bundled/definition13.cjs +2 -2
  40. package/bundled/definition13.js +4 -4
  41. package/bundled/definition15.cjs +3 -3
  42. package/bundled/definition15.js +7 -7
  43. package/bundled/definition17.cjs +3 -3
  44. package/bundled/definition17.js +8 -8
  45. package/bundled/definition18.cjs +2 -2
  46. package/bundled/definition18.js +6 -6
  47. package/bundled/definition2.cjs +3 -14
  48. package/bundled/definition2.js +15 -48
  49. package/bundled/definition20.cjs +5 -5
  50. package/bundled/definition20.js +8 -8
  51. package/bundled/definition22.cjs +4 -39
  52. package/bundled/definition22.js +18 -70
  53. package/bundled/definition23.cjs +12 -0
  54. package/bundled/definition23.js +37 -0
  55. package/bundled/definition24.cjs +39 -0
  56. package/bundled/definition24.js +72 -0
  57. package/bundled/definition3.cjs +1 -1
  58. package/bundled/definition3.js +9 -6
  59. package/bundled/definition4.cjs +2 -2
  60. package/bundled/definition4.js +5 -5
  61. package/bundled/definition6.cjs +11 -11
  62. package/bundled/definition6.js +45 -29
  63. package/bundled/localized.cjs +1 -1
  64. package/bundled/localized.js +1 -0
  65. package/bundled/mixins.cjs +4 -4
  66. package/bundled/mixins.js +7 -7
  67. package/bundled/numberConverter.cjs +12 -0
  68. package/bundled/numberConverter.js +38 -0
  69. package/bundled/picker-field.template.cjs +2 -1
  70. package/bundled/picker-field.template.js +2 -1
  71. package/bundled/utils.cjs +1 -0
  72. package/bundled/utils.js +1420 -0
  73. package/bundled/vivid-element.cjs +1 -1
  74. package/bundled/vivid-element.js +1 -1
  75. package/button/definition.cjs +5 -5
  76. package/button/definition.js +1 -1
  77. package/button/index.cjs +1 -1
  78. package/button/index.js +1 -1
  79. package/card/definition.cjs +5 -5
  80. package/card/definition.js +1 -1
  81. package/card/index.cjs +4 -4
  82. package/card/index.js +7 -6
  83. package/checkbox/definition.cjs +5 -5
  84. package/checkbox/definition.js +1 -1
  85. package/checkbox/index.cjs +1 -1
  86. package/checkbox/index.js +1 -1
  87. package/color-picker/definition.cjs +5 -5
  88. package/color-picker/definition.js +1 -1
  89. package/color-picker/index.cjs +7 -7
  90. package/color-picker/index.js +55 -54
  91. package/combobox/definition.cjs +5 -5
  92. package/combobox/definition.js +1 -1
  93. package/combobox/index.cjs +2 -2
  94. package/combobox/index.js +8 -7
  95. package/contextual-help/definition.cjs +5 -5
  96. package/contextual-help/definition.js +1 -1
  97. package/contextual-help/index.cjs +1 -1
  98. package/contextual-help/index.js +1 -1
  99. package/country/definition.cjs +5 -5
  100. package/country/definition.js +1 -1
  101. package/country/index.cjs +1 -12
  102. package/country/index.js +4 -1216
  103. package/country-group/definition.cjs +6 -0
  104. package/country-group/definition.js +3 -0
  105. package/country-group/index.cjs +43 -0
  106. package/country-group/index.js +166 -0
  107. package/custom-elements.json +1112 -450
  108. package/data-grid/definition.cjs +9 -9
  109. package/data-grid/definition.js +2 -2
  110. package/data-grid/index.cjs +4 -4
  111. package/data-grid/index.js +47 -46
  112. package/date-picker/definition.cjs +5 -5
  113. package/date-picker/definition.js +2 -2
  114. package/date-picker/index.cjs +1 -1
  115. package/date-picker/index.js +1 -1
  116. package/date-range-picker/definition.cjs +5 -5
  117. package/date-range-picker/definition.js +2 -2
  118. package/date-range-picker/index.cjs +1 -1
  119. package/date-range-picker/index.js +1 -1
  120. package/date-time-picker/definition.cjs +5 -5
  121. package/date-time-picker/definition.js +2 -2
  122. package/date-time-picker/index.cjs +1 -1
  123. package/date-time-picker/index.js +1 -1
  124. package/dial-pad/definition.cjs +5 -5
  125. package/dial-pad/definition.js +2 -2
  126. package/dial-pad/index.cjs +4 -4
  127. package/dial-pad/index.js +9 -8
  128. package/dialog/definition.cjs +5 -5
  129. package/dialog/definition.js +2 -2
  130. package/dialog/index.cjs +4 -4
  131. package/dialog/index.js +12 -11
  132. package/divider/definition.cjs +1 -1
  133. package/divider/definition.js +1 -1
  134. package/empty-state/definition.cjs +5 -5
  135. package/empty-state/definition.js +2 -2
  136. package/empty-state/index.cjs +2 -2
  137. package/empty-state/index.js +6 -5
  138. package/fab/definition.cjs +5 -5
  139. package/fab/definition.js +2 -2
  140. package/fab/index.cjs +2 -2
  141. package/fab/index.js +5 -4
  142. package/file-picker/definition.cjs +5 -5
  143. package/file-picker/definition.js +2 -2
  144. package/file-picker/index.cjs +6 -6
  145. package/file-picker/index.js +9 -8
  146. package/flag/definition.cjs +6 -0
  147. package/flag/definition.js +3 -0
  148. package/flag/index.cjs +10 -0
  149. package/flag/index.js +61 -0
  150. package/header/definition.cjs +1 -1
  151. package/header/definition.js +1 -1
  152. package/icon/definition.cjs +1 -0
  153. package/icon/definition.js +1 -0
  154. package/icon/index.cjs +1 -1
  155. package/icon/index.js +1 -0
  156. package/index.cjs +183 -174
  157. package/index.js +48 -45
  158. package/layout/definition.cjs +1 -1
  159. package/layout/definition.js +1 -1
  160. package/lib/button/button.d.ts +1 -0
  161. package/lib/components.d.ts +2 -0
  162. package/lib/country/countries-data.d.ts +1 -0
  163. package/lib/country/{country-code-to-flag-icon.d.ts → utils.d.ts} +0 -3
  164. package/lib/country-group/country-group.d.ts +829 -0
  165. package/lib/country-group/country-group.template.d.ts +3 -0
  166. package/lib/country-group/definition.d.ts +3 -0
  167. package/lib/country-group/index.d.ts +1 -0
  168. package/lib/country-group/locale.d.ts +3 -0
  169. package/lib/date-picker/date-picker.d.ts +4 -0
  170. package/lib/date-range-picker/date-range-picker.d.ts +2 -0
  171. package/lib/date-time-picker/date-time-picker.d.ts +4 -0
  172. package/lib/flag/definition.d.ts +3 -0
  173. package/lib/flag/flag.d.ts +8 -0
  174. package/lib/flag/flag.template.d.ts +3 -0
  175. package/lib/flag/index.d.ts +1 -0
  176. package/lib/icon/icon.d.ts +1 -2
  177. package/lib/searchable-select/option-tag.d.ts +3 -1
  178. package/lib/searchable-select/searchable-select.d.ts +3 -1
  179. package/lib/tag-name-map.d.ts +2 -1
  180. package/lib/time-picker/time-picker.d.ts +2 -0
  181. package/locales/de-DE.cjs +1 -0
  182. package/locales/de-DE.js +1 -0
  183. package/locales/en-GB.cjs +1 -0
  184. package/locales/en-GB.js +1 -0
  185. package/locales/en-US.cjs +1 -0
  186. package/locales/en-US.js +1 -0
  187. package/locales/ja-JP.cjs +1 -0
  188. package/locales/ja-JP.js +1 -0
  189. package/locales/zh-CN.cjs +1 -0
  190. package/locales/zh-CN.js +1 -0
  191. package/menu/definition.cjs +5 -5
  192. package/menu/definition.js +1 -1
  193. package/menu/index.cjs +1 -1
  194. package/menu/index.js +1 -1
  195. package/menu-item/definition.cjs +6 -6
  196. package/menu-item/definition.js +1 -1
  197. package/menu-item/index.cjs +1 -1
  198. package/menu-item/index.js +1 -1
  199. package/nav/definition.cjs +1 -1
  200. package/nav/definition.js +1 -1
  201. package/nav-disclosure/definition.cjs +5 -5
  202. package/nav-disclosure/definition.js +2 -2
  203. package/nav-disclosure/index.cjs +2 -2
  204. package/nav-disclosure/index.js +6 -5
  205. package/nav-item/definition.cjs +5 -5
  206. package/nav-item/definition.js +2 -2
  207. package/nav-item/index.cjs +2 -2
  208. package/nav-item/index.js +5 -4
  209. package/note/definition.cjs +5 -5
  210. package/note/definition.js +2 -2
  211. package/note/index.cjs +2 -2
  212. package/note/index.js +5 -4
  213. package/number-field/definition.cjs +5 -5
  214. package/number-field/definition.js +2 -2
  215. package/number-field/index.cjs +2 -2
  216. package/number-field/index.js +6 -5
  217. package/option/definition.cjs +5 -5
  218. package/option/definition.js +1 -1
  219. package/option/index.cjs +1 -1
  220. package/option/index.js +1 -1
  221. package/package.json +4 -4
  222. package/pagination/definition.cjs +5 -5
  223. package/pagination/definition.js +2 -2
  224. package/pagination/index.cjs +1 -1
  225. package/pagination/index.js +1 -1
  226. package/popover/definition.cjs +5 -5
  227. package/popover/definition.js +2 -2
  228. package/popover/index.cjs +4 -4
  229. package/popover/index.js +7 -6
  230. package/popup/definition.cjs +4 -4
  231. package/popup/definition.js +1 -1
  232. package/popup/index.cjs +1 -1
  233. package/popup/index.js +1 -1
  234. package/progress/definition.cjs +1 -1
  235. package/progress/definition.js +1 -1
  236. package/radio/definition.cjs +1 -1
  237. package/radio/definition.js +1 -1
  238. package/radio-group/definition.cjs +5 -5
  239. package/radio-group/definition.js +2 -2
  240. package/radio-group/index.cjs +1 -1
  241. package/radio-group/index.js +1 -1
  242. package/range-slider/definition.cjs +5 -5
  243. package/range-slider/definition.js +2 -2
  244. package/range-slider/index.cjs +1 -1
  245. package/range-slider/index.js +22 -19
  246. package/rich-text-editor/definition.cjs +32 -32
  247. package/rich-text-editor/definition.js +2 -2
  248. package/rich-text-editor/index.cjs +1 -1
  249. package/rich-text-editor/index.js +2 -2
  250. package/rich-text-view/definition.cjs +1 -1
  251. package/rich-text-view/definition.js +1 -1
  252. package/searchable-select/definition.cjs +4 -4
  253. package/searchable-select/definition.js +2 -2
  254. package/searchable-select/index.cjs +6 -4
  255. package/searchable-select/index.js +76 -73
  256. package/select/definition.cjs +5 -5
  257. package/select/definition.js +2 -2
  258. package/select/index.cjs +1 -1
  259. package/select/index.js +1 -1
  260. package/selectable-box/definition.cjs +5 -5
  261. package/selectable-box/definition.js +2 -2
  262. package/selectable-box/index.cjs +1 -1
  263. package/selectable-box/index.js +1 -1
  264. package/shared/icon/utils.d.ts +1 -0
  265. package/shared/localization/Locale.d.ts +2 -0
  266. package/shared/picker-field/mixins/calendar-picker.d.ts +1 -0
  267. package/shared/picker-field/mixins/calendar-picker.template.d.ts +1 -0
  268. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +1 -0
  269. package/shared/picker-field/mixins/single-date-picker.d.ts +1 -0
  270. package/shared/picker-field/mixins/single-value-picker.d.ts +1 -0
  271. package/shared/picker-field/mixins/time-selection-picker.d.ts +1 -0
  272. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +2 -0
  273. package/shared/picker-field/picker-field.d.ts +2 -0
  274. package/side-drawer/definition.cjs +1 -1
  275. package/side-drawer/definition.js +1 -1
  276. package/simple-color-picker/definition.cjs +5 -5
  277. package/simple-color-picker/definition.js +2 -2
  278. package/simple-color-picker/index.cjs +2 -2
  279. package/simple-color-picker/index.js +6 -5
  280. package/slider/definition.cjs +5 -5
  281. package/slider/definition.js +1 -1
  282. package/slider/index.cjs +1 -1
  283. package/slider/index.js +1 -1
  284. package/split-button/definition.cjs +5 -5
  285. package/split-button/definition.js +2 -2
  286. package/split-button/index.cjs +2 -2
  287. package/split-button/index.js +7 -6
  288. package/status/definition.cjs +5 -5
  289. package/status/definition.js +2 -2
  290. package/status/index.cjs +2 -2
  291. package/status/index.js +5 -4
  292. package/switch/definition.cjs +5 -5
  293. package/switch/definition.js +2 -2
  294. package/switch/index.cjs +2 -2
  295. package/switch/index.js +6 -5
  296. package/tab/definition.cjs +5 -5
  297. package/tab/definition.js +2 -2
  298. package/tab/index.cjs +1 -1
  299. package/tab/index.js +1 -1
  300. package/tab-panel/definition.cjs +1 -1
  301. package/tab-panel/definition.js +1 -1
  302. package/table/definition.cjs +17 -17
  303. package/table/definition.js +2 -2
  304. package/table/index.cjs +3 -3
  305. package/table/index.js +6 -5
  306. package/tabs/definition.cjs +6 -6
  307. package/tabs/definition.js +2 -2
  308. package/tabs/index.cjs +1 -1
  309. package/tabs/index.js +1 -1
  310. package/tag/definition.cjs +5 -5
  311. package/tag/definition.js +2 -2
  312. package/tag/index.cjs +4 -4
  313. package/tag/index.js +6 -5
  314. package/tag-group/definition.cjs +1 -1
  315. package/tag-group/definition.js +1 -1
  316. package/text-area/definition.cjs +5 -5
  317. package/text-area/definition.js +2 -2
  318. package/text-area/index.cjs +1 -1
  319. package/text-area/index.js +1 -1
  320. package/text-field/definition.cjs +5 -5
  321. package/text-field/definition.js +1 -1
  322. package/text-field/index.cjs +1 -1
  323. package/text-field/index.js +1 -1
  324. package/time-picker/definition.cjs +4 -4
  325. package/time-picker/definition.js +2 -2
  326. package/time-picker/index.cjs +1 -1
  327. package/time-picker/index.js +1 -1
  328. package/toggletip/definition.cjs +5 -5
  329. package/toggletip/definition.js +1 -1
  330. package/toggletip/index.cjs +1 -1
  331. package/toggletip/index.js +1 -1
  332. package/tooltip/definition.cjs +5 -5
  333. package/tooltip/definition.js +1 -1
  334. package/tooltip/index.cjs +1 -1
  335. package/tooltip/index.js +1 -1
  336. package/tree-item/definition.cjs +5 -5
  337. package/tree-item/definition.js +2 -2
  338. package/tree-item/index.cjs +1 -1
  339. package/tree-item/index.js +1 -1
  340. package/tree-view/definition.cjs +5 -5
  341. package/tree-view/definition.js +2 -2
  342. package/tree-view/index.cjs +1 -1
  343. package/tree-view/index.js +1 -1
  344. package/unbundled/definition11.cjs +6 -0
  345. package/unbundled/definition11.js +6 -0
  346. package/unbundled/definition14.cjs +1 -0
  347. package/unbundled/definition14.js +1 -0
  348. package/unbundled/definition2.cjs +5 -75
  349. package/unbundled/definition2.js +1 -71
  350. package/unbundled/definition28.cjs +1 -0
  351. package/unbundled/definition28.js +1 -0
  352. package/unbundled/definition31.cjs +2 -1189
  353. package/unbundled/definition31.js +1 -1188
  354. package/unbundled/definition32.cjs +207 -1835
  355. package/unbundled/definition32.js +203 -1807
  356. package/unbundled/definition33.cjs +83 -311
  357. package/unbundled/definition33.js +79 -235
  358. package/unbundled/definition34.cjs +1887 -25
  359. package/unbundled/definition34.js +1857 -24
  360. package/unbundled/definition35.cjs +315 -121
  361. package/unbundled/definition35.js +236 -114
  362. package/unbundled/definition36.cjs +25 -405
  363. package/unbundled/definition36.js +22 -397
  364. package/unbundled/definition37.cjs +47 -142
  365. package/unbundled/definition37.js +44 -139
  366. package/unbundled/definition38.cjs +345 -330
  367. package/unbundled/definition38.js +343 -328
  368. package/unbundled/definition39.cjs +183 -235
  369. package/unbundled/definition39.js +181 -233
  370. package/unbundled/definition40.cjs +377 -47
  371. package/unbundled/definition40.js +372 -42
  372. package/unbundled/definition41.cjs +256 -57
  373. package/unbundled/definition41.js +255 -56
  374. package/unbundled/definition42.cjs +45 -432
  375. package/unbundled/definition42.js +41 -428
  376. package/unbundled/definition43.cjs +63 -49
  377. package/unbundled/definition43.js +61 -47
  378. package/unbundled/definition44.cjs +438 -30
  379. package/unbundled/definition44.js +434 -25
  380. package/unbundled/definition45.cjs +46 -84
  381. package/unbundled/definition45.js +43 -81
  382. package/unbundled/definition46.cjs +29 -54
  383. package/unbundled/definition46.js +24 -50
  384. package/unbundled/definition47.cjs +93 -21
  385. package/unbundled/definition47.js +91 -16
  386. package/unbundled/definition48.cjs +49 -33
  387. package/unbundled/definition48.js +46 -30
  388. package/unbundled/definition49.cjs +22 -347
  389. package/unbundled/definition49.js +16 -344
  390. package/unbundled/definition50.cjs +34 -211
  391. package/unbundled/definition50.js +30 -207
  392. package/unbundled/definition51.cjs +282 -242
  393. package/unbundled/definition51.js +275 -235
  394. package/unbundled/definition52.cjs +211 -51
  395. package/unbundled/definition52.js +209 -48
  396. package/unbundled/definition53.cjs +275 -131
  397. package/unbundled/definition53.js +272 -127
  398. package/unbundled/definition54.cjs +50 -261
  399. package/unbundled/definition54.js +48 -260
  400. package/unbundled/definition55.cjs +126 -443
  401. package/unbundled/definition55.js +123 -441
  402. package/unbundled/definition56.cjs +234 -3596
  403. package/unbundled/definition56.js +229 -3428
  404. package/unbundled/definition57.cjs +407 -728
  405. package/unbundled/definition57.js +405 -726
  406. package/unbundled/definition58.cjs +3618 -106
  407. package/unbundled/definition58.js +3449 -100
  408. package/unbundled/definition59.cjs +624 -868
  409. package/unbundled/definition59.js +619 -863
  410. package/unbundled/definition60.cjs +106 -108
  411. package/unbundled/definition60.js +102 -104
  412. package/unbundled/definition61.cjs +1040 -71
  413. package/unbundled/definition61.js +1035 -65
  414. package/unbundled/definition62.cjs +105 -169
  415. package/unbundled/definition62.js +101 -165
  416. package/unbundled/definition63.cjs +70 -113
  417. package/unbundled/definition63.js +65 -109
  418. package/unbundled/definition64.cjs +181 -53
  419. package/unbundled/definition64.js +178 -50
  420. package/unbundled/definition65.cjs +109 -76
  421. package/unbundled/definition65.js +109 -75
  422. package/unbundled/definition66.cjs +58 -21
  423. package/unbundled/definition66.js +55 -15
  424. package/unbundled/definition67.cjs +81 -74
  425. package/unbundled/definition67.js +79 -73
  426. package/unbundled/definition68.cjs +19 -344
  427. package/unbundled/definition68.js +14 -335
  428. package/unbundled/definition69.cjs +88 -26
  429. package/unbundled/definition69.js +85 -22
  430. package/unbundled/definition7.cjs +18 -3
  431. package/unbundled/definition7.js +18 -3
  432. package/unbundled/definition70.cjs +330 -111
  433. package/unbundled/definition70.js +320 -108
  434. package/unbundled/definition71.cjs +26 -271
  435. package/unbundled/definition71.js +21 -267
  436. package/unbundled/definition72.cjs +134 -27
  437. package/unbundled/definition72.js +125 -25
  438. package/unbundled/definition73.cjs +245 -113
  439. package/unbundled/definition73.js +242 -104
  440. package/unbundled/definition74.cjs +28 -212
  441. package/unbundled/definition74.js +26 -202
  442. package/unbundled/definition75.cjs +117 -479
  443. package/unbundled/definition75.js +109 -475
  444. package/unbundled/definition76.cjs +232 -0
  445. package/unbundled/definition76.js +213 -0
  446. package/unbundled/definition77.cjs +533 -0
  447. package/unbundled/definition77.js +513 -0
  448. package/unbundled/numberConverter.cjs +91 -0
  449. package/unbundled/numberConverter.js +74 -0
  450. package/unbundled/picker-field.template.cjs +2 -0
  451. package/unbundled/picker-field.template.js +2 -0
  452. package/unbundled/utils.cjs +1439 -0
  453. package/unbundled/utils.js +1428 -0
  454. package/unbundled/vivid-element.cjs +1 -1
  455. package/unbundled/vivid-element.js +1 -1
  456. package/video-player/definition.cjs +1 -1
  457. package/video-player/definition.js +1 -1
  458. package/vivid.api.json +513 -0
  459. /package/{lib/icon/icon.placeholder.d.ts → shared/icon/icon-placeholder.d.ts} +0 -0
@@ -3,1079 +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("./definition29.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
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
47
34
  * @vueModel modelValue value input,@lazy:change `event.currentTarget.value`
48
- * @vueModel values values input,@lazy:change `event.currentTarget.values`
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
- /** @internal */
789
- _onClickRemove() {
790
- this.$emit("remove", void 0, { bubbles: false });
791
- }
792
- };
793
- require_decorate.__decorate([_microsoft_fast_element.attr], OptionTag.prototype, "shape", void 0);
794
- require_decorate.__decorate([_microsoft_fast_element.observable], OptionTag.prototype, "connotation", void 0);
795
- require_decorate.__decorate([_microsoft_fast_element.attr], OptionTag.prototype, "label", void 0);
796
- require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ mode: "boolean" })], OptionTag.prototype, "removable", void 0);
797
- require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ mode: "boolean" })], OptionTag.prototype, "disabled", void 0);
798
- 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);
799
650
  //#endregion
800
- //#region src/lib/searchable-select/searchable-select.template.ts
801
- 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)]);
802
653
  function renderLabel() {
803
- return _microsoft_fast_element.html`
804
- <label for="control" class="label" id="label"> ${(x) => x.label} </label>
805
- `;
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>`;
806
661
  }
807
- function renderSelectionCount() {
662
+ function renderPlaceholder(context) {
663
+ const optionTag = context.tagFor(require_definition$3.ListboxOption);
808
664
  return _microsoft_fast_element.html`
809
- <span
810
- id="selection-count"
811
- class="selection-count"
812
- aria-label="${(x) => x.locale.searchableSelect.maxSelectedMessage(x.values.length, x.maxSelected)}"
813
- >(${(x) => `${x.values.length}/${x.maxSelected}`})</span
814
- >
815
- `;
665
+ <${optionTag} text="${(x) => x.placeholder}" hidden disabled>
666
+ </${optionTag}>`;
816
667
  }
817
- var tagTemplateFactory = (context, getComponent) => {
818
- const optionTagTag = context.tagFor(OptionTag);
819
- return _microsoft_fast_element.html`
820
- <div class="tag-wrapper">
821
- <${optionTagTag}
822
- class="tag"
823
- tabindex="-1"
824
- data-index="${(x, c) => getComponent(c).values.indexOf(x)}"
825
- removable
826
- :label="${(x, c) => getComponent(c)._tagLabelForValue(x)}"
827
- :shape="${(_, c) => getComponent(c).shape}"
828
- :connotation="${(x, c) => getComponent(c)._tagConnotationForValue(x)}"
829
- ?disabled="${(x, c) => getComponent(c)._isTagDisabled(x)}"
830
- @remove="${(x, c) => getComponent(c)._onTagRemoved(x)}"
831
- @keydown="${(_, c) => getComponent(c)._onTagKeydown(c.event)}"
832
- @mousedown="${() => false}">
833
- <slot slot="icon" name="${(x, c) => getComponent(c)._tagIconSlotName(x)}"></slot>
834
- </${optionTagTag}>
835
- </div>
836
- `;
837
- };
838
- var elidedTagTemplateFactory = (context, getComponent) => {
839
- const optionTagTag = context.tagFor(OptionTag);
668
+ function renderClearButton(context) {
669
+ const buttonTag = context.tagFor(require_definition$1.Button);
840
670
  return _microsoft_fast_element.html`
841
- <${optionTagTag}
842
- class="tag"
843
- tabindex="-1"
844
- :label="${(x, c) => getComponent(x, c)._numElidedTags.toString()}"
845
- :shape="${(x, c) => getComponent(x, c).shape}"
846
- ?disabled="${(x, c) => getComponent(x, c).disabled}"
847
- @mousedown="${() => false}">
848
- </${optionTagTag}>
849
- `;
850
- };
851
- function renderFieldset(context) {
852
- const buttonTag = context.tagFor(require_definition$2.Button);
853
- const progressRingTag = context.tagFor(require_definition$1.ProgressRing);
854
- const affixIconTemplate = require_affix.affixIconTemplateFactory(context);
855
- const chevronTemplate = require_definition$2.chevronTemplateFactory(context);
856
- const tagTemplate = tagTemplateFactory(context, (c) => c.parent);
857
- const nestedTagTemplate = tagTemplateFactory(context, (c) => c.parentContext.parent);
858
- const elidedTagTemplate = elidedTagTemplateFactory(context, (x, _) => x);
859
- const nestedElidedTagTemplate = elidedTagTemplateFactory(context, (_, c) => c.parent);
860
- return _microsoft_fast_element.html`
861
- <div
862
- class="fieldset ${getStateClasses}"
863
- @click="${(x, c) => x._onFieldsetClick(c.event)}"
864
- ${(0, _microsoft_fast_element.ref)("_anchor")}
865
- >
866
- ${(x) => affixIconTemplate(x.icon, require_affix.IconWrapper.Slot)}
867
- <div class="content-area" ${(0, _microsoft_fast_element.ref)("_contentArea")}>
868
- ${(0, _microsoft_fast_element.repeat)((x) => x._tagRows, _microsoft_fast_element.html`
869
- <div class="tag-row">
870
- ${(0, _microsoft_fast_element.when)((_, c) => c.isFirst && c.parent._numElidedTags, nestedElidedTagTemplate)}
871
- ${(0, _microsoft_fast_element.repeat)((x) => x, nestedTagTemplate)}
872
- </div>
873
- `, { positioning: true })}
874
- <div
875
- class="tag-row ${(x) => (0, _microsoft_fast_web_utilities.classNames)(["contains-only-input", x._tagRows.length > 0 && x._lastTagRow.length === 0])}"
876
- >
877
- ${(0, _microsoft_fast_element.when)((x) => x._tagRows.length === 0 && x._numElidedTags, elidedTagTemplate)}
878
- ${(0, _microsoft_fast_element.repeat)((x) => x._lastTagRow, tagTemplate)}
879
- <input
880
- id="control"
881
- class="control"
882
- autocomplete="off"
883
- aria-controls="listbox"
884
- aria-describedby="${(x) => x._feedbackDescribedBy} ${(x) => x.multiple && x.maxSelected && x.maxSelected >= 1 ? "selection-count" : null}"
885
- ${require_delegates_aria.delegateAria({
886
- role: "combobox",
887
- ariaAutoComplete: "list",
888
- ariaHasPopup: "listbox",
889
- ariaExpanded: (x) => x.open
890
- })}
891
- placeholder="${(x) => x.multiple && x.values.length ? "" : x.placeholder}"
892
- type="text"
893
- ?disabled="${(x) => x.disabled}"
894
- :value="${(x) => x._inputValue}"
895
- @input="${(x, c) => {
896
- 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();
897
676
  c.event.stopPropagation();
898
677
  }}"
899
- @change="${(_, c) => {
678
+ @mousedown="${() => false}"
679
+ @keydown="${(x, c) => {
680
+ /* v8 ignore next -- @preserve */
681
+ if (c.event.key === "Tab") x._onClearButtonBlur();
900
682
  c.event.stopPropagation();
683
+ return true;
901
684
  }}"
902
- @focus="${(x, c) => x._onInputFocus(c.event)}"
903
- @blur="${(x, c) => x._onInputBlur(c.event)}"
904
- @keydown="${(x, c) => x._onInputKeydown(c.event)}"
905
- ${(0, _microsoft_fast_element.ref)("_input")}
906
- />
907
- </div>
908
- </div>
909
- <slot name="meta"></slot>
910
- ${(0, _microsoft_fast_element.when)((x) => x._shouldShowClearButton, _microsoft_fast_element.html`<${buttonTag}
911
- aria-label="${(x) => x.locale.searchableSelect.clearButtonLabel}"
912
- @click="${(x) => x._onClearButtonClick()}"
913
- @mousedown="${() => false}"
914
- ?disabled="${(x) => x.disabled}"
915
- :shape="${(x) => x.shape}"
916
- size="super-condensed"
917
- icon="close-line"
918
- appearance="ghost-light"
919
- tabindex="0"
920
- ></${buttonTag}>`)}
921
- <div @mousedown="${() => false}" @click="${(x) => x._onChevronClick()}">
922
- ${(0, _microsoft_fast_element.when)((x) => x.loading, _microsoft_fast_element.html`<${progressRingTag} indeterminate size="-6" aria-hidden="true"></${progressRingTag}>`)}
923
- ${(0, _microsoft_fast_element.when)((x) => !x.loading, chevronTemplate)}
924
- </div>
925
- </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}>
926
698
  `;
927
699
  }
928
- function setFixedDropdownVarWidth(x) {
929
- 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>`;
930
717
  }
931
- function renderSelectAll(context) {
932
- const optionTag = context.tagFor(require_definition$4.ListboxOption);
933
- const dividerTag = context.tagFor(require_divider.Divider);
934
- return _microsoft_fast_element.html`
935
- <${optionTag}
936
- data-select-all
937
- tabindex="-1"
938
- :text="${(x) => x._selectAllLabel}"
939
- :selected="${(x) => x._isAllSelected}"
940
- :_displayCheckmark="${() => true}"
941
- ?disabled="${(x) => x._selectableOptions.length === 0}"
942
- ${(0, _microsoft_fast_element.ref)("_selectAllOption")}>
943
- </${optionTag}>
944
- <${dividerTag} class="divider"></${dividerTag}>
945
- `;
718
+ function setFixedDropdownVarWidth(x) {
719
+ return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
946
720
  }
721
+ /**
722
+ * @param context - element definition context
723
+ */
947
724
  function renderControl(context) {
948
- const popupTag = context.tagFor(require_definition$3.Popup);
725
+ const popupTag = context.tagFor(require_definition$2.Popup);
949
726
  return _microsoft_fast_element.html`
950
- <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp && !x._hasSelectionCount}>
951
- ${(0, _microsoft_fast_element.when)((x) => x.label || x._hasSelectionCount, _microsoft_fast_element.html`
952
- <div>
953
- ${(0, _microsoft_fast_element.when)((x) => x.label, renderLabel())}
954
- ${(0, _microsoft_fast_element.when)((x) => x._hasSelectionCount, renderSelectionCount())}
955
- </div>
956
- `)}
957
- <slot name="contextual-help" ${(0, _microsoft_fast_element.slotted)("_contextualHelpSlottedContent")}></slot>
958
- </div>
959
- <span aria-live="assertive" aria-relevant="text" class="visually-hidden">
960
- ${(x) => x._changeDescription}
961
- </span>
962
- <div>
963
- ${renderFieldset(context)}
964
- <div class="popup-wrapper">
965
- <${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}"
966
737
  :anchor="${(x) => x._anchor}"
967
- :open="${(x) => x.open}"
968
- class="popup"
969
738
  placement="bottom-start"
970
- style="${setFixedDropdownVarWidth}"
971
- strategy="${(x) => x.fixedDropdown ? "fixed" : "absolute"}">
972
- <div
973
- class="listbox"
739
+ strategy="${(x) => x.fixedDropdown ? null : "absolute"}">
740
+ <div class="listbox"
741
+ id="${(x) => x.listboxId}"
974
742
  role="listbox"
975
743
  aria-multiselectable="${(x) => x.multiple}"
976
- aria-required="${(x) => x.required}"
977
- ${(0, _microsoft_fast_element.ref)("_listbox")}
978
- @click="${(x, c) => x._onListboxClick(c.event)}"
979
- @mousedown="${() => false}"
980
- >
981
- ${(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))}
982
750
  <slot
983
751
  ${(0, _microsoft_fast_element.slotted)({
984
- filter: require_definition$4.isListboxOption,
752
+ filter: require_listbox.Listbox.slottedOptionFilter,
985
753
  flatten: true,
986
- property: "_slottedOptions"
754
+ property: "slottedOptions"
987
755
  })}>
988
756
  </slot>
989
- ${(0, _microsoft_fast_element.when)((x) => x._filteredOptions.length === 0, _microsoft_fast_element.html`<div class="empty-message">
990
- ${(0, _microsoft_fast_element.when)((x) => x.loading, _microsoft_fast_element.html`<slot name="loading-options">
991
- ${(x) => x.locale.searchableSelect.loadingOptionsMessage}
992
- </slot>`)}
993
- ${(0, _microsoft_fast_element.when)((x) => !x.loading && x.searchText === "", _microsoft_fast_element.html`<slot name="no-options">
994
- ${(x) => x.locale.searchableSelect.noOptionsMessage}
995
- </slot>`)}
996
- ${(0, _microsoft_fast_element.when)((x) => !x.loading && x.searchText !== "", _microsoft_fast_element.html`<slot name="no-matches">
997
- ${(x) => x.locale.searchableSelect.noMatchesMessage}
998
- </slot>`)}
999
- </div>`)}
1000
- </div>
757
+ </div>
1001
758
  </${popupTag}>
1002
759
  </div>
1003
- </div>
1004
- `;
760
+ `;
1005
761
  }
1006
- var SearchableSelectTemplate = (context) => {
1007
- 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) => {
1008
772
  return _microsoft_fast_element.html`
1009
773
  <template
1010
- :_optionTagTagName="${() => optionTagName}"
1011
- @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))}"
1012
793
  >
1013
- <div class="control-wrapper">
1014
- ${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)}
1015
797
  </div>
1016
798
  </template>
1017
799
  `;
1018
800
  };
1019
801
  //#endregion
1020
- //#region src/lib/searchable-select/option-tag.template.ts
1021
- 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)]);
1022
- function renderRemoveButton(iconTag) {
1023
- return _microsoft_fast_element.html`
1024
- <span
1025
- class="remove-button"
1026
- aria-label="${(x) => x.locale.searchableSelect.removeTagButtonLabel(x.label)}"
1027
- role="button"
1028
- tabindex="${(x) => x.disabled ? null : 0}"
1029
- @click="${(x) => x._onClickRemove()}"
1030
- >
1031
- <${iconTag} name="close-line"></${iconTag}>
1032
- </span>
1033
- `;
1034
- }
1035
- var optionTagTemplate = (context) => {
1036
- const iconTag = context.tagFor(require_definition.Icon);
1037
- return _microsoft_fast_element.html`<span class="${getClasses}" aria-disabled="${(x) => x.disabled}">
1038
- <slot name="icon" aria-hidden="true">
1039
- ${(0, _microsoft_fast_element.when)((x) => x.hasIconPlaceholder, _microsoft_fast_element.html`<div class="icon-placeholder"></div>`)}
1040
- </slot>
1041
- ${(0, _microsoft_fast_element.when)((x) => x.label, (x) => _microsoft_fast_element.html`<span class="label">${x.label}</span>`)}
1042
- ${(0, _microsoft_fast_element.when)((x) => x.removable, renderRemoveButton(iconTag))}
1043
- </span>`;
1044
- };
1045
- //#endregion
1046
- //#region src/lib/searchable-select/definition.ts
802
+ //#region src/lib/select/definition.ts
1047
803
  /**
1048
804
  * @internal
1049
805
  */
1050
- var searchableSelectDefinition = require_vivid_element.defineVividComponent("searchable-select", SearchableSelect, SearchableSelectTemplate, [
1051
- require_definition$2.buttonDefinition,
1052
- require_definition$3.popupDefinition,
806
+ var selectDefinition = require_vivid_element.defineVividComponent("select", Select, SelectTemplate, [
807
+ require_definition$2.popupDefinition,
1053
808
  require_definition.iconDefinition,
1054
- require_vivid_element.defineVividComponent("option-tag", OptionTag, optionTagTemplate, [require_definition.iconDefinition], {
1055
- styles: [option_tag_default],
1056
- shadowOptions: { delegatesFocus: true }
1057
- }),
1058
- require_definition$1.progressRingDefinition,
1059
- require_mixins.feedbackMessageDefinition,
1060
- require_definition$4.listboxOptionDefinition,
1061
- require_definition$5.dividerDefinition
1062
- ], { styles: searchable_select_default });
809
+ require_definition$3.listboxOptionDefinition,
810
+ require_definition$1.buttonDefinition,
811
+ require_mixins.feedbackMessageDefinition
812
+ ], { styles: select_default });
1063
813
  /**
1064
- * Registers the searchable-select element with the design system.
814
+ * Registers the select elements with the design system.
1065
815
  *
1066
816
  * @param prefix - the prefix to use for the component name
1067
817
  */
1068
- var registerSearchableSelect = require_vivid_element.createRegisterFunction(searchableSelectDefinition);
818
+ var registerSelect = require_vivid_element.createRegisterFunction(selectDefinition);
1069
819
  //#endregion
1070
- 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", {
1071
827
  enumerable: true,
1072
828
  get: function() {
1073
- return SearchableSelect;
829
+ return registerSelect;
1074
830
  }
1075
831
  });
1076
- Object.defineProperty(exports, "registerSearchableSelect", {
832
+ Object.defineProperty(exports, "selectDefinition", {
1077
833
  enumerable: true,
1078
834
  get: function() {
1079
- return registerSearchableSelect;
835
+ return selectDefinition;
1080
836
  }
1081
837
  });