@vonage/vivid 5.24.0 → 5.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/README.md +1 -1
  2. package/avatar/index.cjs +10 -10
  3. package/avatar/index.js +4 -3
  4. package/breadcrumb-item/index.cjs +9 -5
  5. package/breadcrumb-item/index.js +11 -6
  6. package/bundled/affix.cjs +1 -1
  7. package/bundled/affix.js +1 -1
  8. package/bundled/definition10.cjs +2 -1
  9. package/bundled/definition10.js +3 -2
  10. package/bundled/definition11.cjs +4 -4
  11. package/bundled/definition11.js +4 -3
  12. package/bundled/definition12.cjs +1 -1
  13. package/bundled/definition12.js +1 -0
  14. package/bundled/definition15.cjs +5 -5
  15. package/bundled/definition15.js +4 -3
  16. package/bundled/definition17.cjs +7 -7
  17. package/bundled/definition17.js +22 -109
  18. package/bundled/definition18.cjs +3 -3
  19. package/bundled/definition18.js +9 -31
  20. package/bundled/definition19.cjs +19 -19
  21. package/bundled/definition19.js +3 -2
  22. package/bundled/definition21.cjs +8 -8
  23. package/bundled/definition21.js +5 -4
  24. package/bundled/definition22.cjs +2 -2
  25. package/bundled/definition22.js +2 -2
  26. package/bundled/definition24.cjs +4 -4
  27. package/bundled/definition24.js +4 -3
  28. package/bundled/definition25.cjs +3 -3
  29. package/bundled/definition25.js +32 -28
  30. package/bundled/definition3.cjs +5 -5
  31. package/bundled/definition3.js +10 -40
  32. package/bundled/definition4.cjs +6 -6
  33. package/bundled/definition4.js +4 -3
  34. package/bundled/definition6.cjs +11 -11
  35. package/bundled/definition6.js +4 -3
  36. package/bundled/definition9.cjs +12 -6
  37. package/bundled/definition9.js +66 -43
  38. package/bundled/extractOptions.cjs +1 -1
  39. package/bundled/extractOptions.js +2 -2
  40. package/bundled/icon.cjs +1 -0
  41. package/bundled/icon.js +34 -0
  42. package/bundled/listbox.cjs +1 -1
  43. package/bundled/listbox.js +5 -2
  44. package/bundled/mixins.cjs +8 -8
  45. package/bundled/mixins.js +4 -3
  46. package/bundled/optgroup.cjs +1 -0
  47. package/bundled/optgroup.js +27 -0
  48. package/bundled/option.cjs +1 -0
  49. package/bundled/option.js +93 -0
  50. package/bundled/vivid-element.cjs +1 -1
  51. package/bundled/vivid-element.js +1 -1
  52. package/card/index.cjs +22 -22
  53. package/card/index.js +4 -3
  54. package/color-picker/index.cjs +18 -18
  55. package/color-picker/index.js +4 -3
  56. package/combobox/index.cjs +7 -7
  57. package/combobox/index.js +4 -2
  58. package/custom-elements.json +4159 -3847
  59. package/data-grid/index.cjs +24 -24
  60. package/data-grid/index.js +4 -3
  61. package/dial-pad/index.cjs +21 -21
  62. package/dial-pad/index.js +4 -3
  63. package/dialog/index.cjs +14 -14
  64. package/dialog/index.js +4 -3
  65. package/empty-state/index.cjs +3 -3
  66. package/empty-state/index.js +4 -3
  67. package/file-picker/index.cjs +7 -7
  68. package/file-picker/index.js +4 -3
  69. package/icon/definition.cjs +2 -1
  70. package/icon/definition.js +2 -1
  71. package/index.cjs +148 -141
  72. package/index.js +41 -37
  73. package/lib/accordion-item/accordion-item.d.ts +1 -0
  74. package/lib/combobox/combobox.d.ts +1 -1
  75. package/lib/components.d.ts +1 -0
  76. package/lib/dial-pad/dial-pad.d.ts +0 -1
  77. package/lib/listbox/definition.d.ts +3 -0
  78. package/lib/listbox/index.d.ts +1 -0
  79. package/lib/listbox/listbox.d.ts +1302 -0
  80. package/lib/listbox/listbox.template.d.ts +3 -0
  81. package/lib/listbox/variations.browser-spec.d.ts +1 -0
  82. package/lib/menu/menu.d.ts +0 -1
  83. package/lib/number-field/number-field.d.ts +0 -1
  84. package/lib/rich-text-editor/rte/features/base.d.ts +1 -0
  85. package/lib/rich-text-editor/rte/utils/default-textblock.d.ts +2 -2
  86. package/lib/tag-name-map.d.ts +2 -1
  87. package/lib/text-field/text-field.d.ts +1 -0
  88. package/lib/toggletip/toggletip.d.ts +1 -0
  89. package/lib/tooltip/tooltip.d.ts +1 -0
  90. package/listbox/definition.cjs +5 -0
  91. package/listbox/definition.js +2 -0
  92. package/listbox/index.cjs +11 -0
  93. package/listbox/index.js +540 -0
  94. package/nav/definition.cjs +1 -1
  95. package/nav/definition.js +1 -1
  96. package/nav-disclosure/definition.cjs +1 -1
  97. package/nav-disclosure/definition.js +1 -1
  98. package/nav-disclosure/index.cjs +4 -4
  99. package/nav-disclosure/index.js +4 -3
  100. package/nav-item/definition.cjs +1 -1
  101. package/nav-item/definition.js +1 -1
  102. package/note/definition.cjs +1 -1
  103. package/note/definition.js +1 -1
  104. package/number-field/definition.cjs +1 -1
  105. package/number-field/definition.js +1 -1
  106. package/optgroup/definition.cjs +2 -1
  107. package/optgroup/definition.js +2 -1
  108. package/option/definition.cjs +2 -1
  109. package/option/definition.js +2 -1
  110. package/package.json +8 -7
  111. package/pagination/definition.cjs +1 -1
  112. package/pagination/definition.js +1 -1
  113. package/platform-switch/definition.cjs +1 -1
  114. package/platform-switch/definition.js +1 -1
  115. package/popover/definition.cjs +1 -1
  116. package/popover/definition.js +1 -1
  117. package/popover/index.cjs +5 -5
  118. package/popover/index.js +4 -3
  119. package/progress/definition.cjs +1 -1
  120. package/progress/definition.js +1 -1
  121. package/radio/definition.cjs +1 -1
  122. package/radio/definition.js +1 -1
  123. package/radio-group/definition.cjs +1 -1
  124. package/radio-group/definition.js +1 -1
  125. package/range-slider/definition.cjs +1 -1
  126. package/range-slider/definition.js +1 -1
  127. package/rich-text-editor/definition.cjs +1 -1
  128. package/rich-text-editor/definition.js +1 -1
  129. package/rich-text-editor/index.cjs +13 -13
  130. package/rich-text-editor/index.js +22 -19
  131. package/rich-text-view/definition.cjs +1 -1
  132. package/rich-text-view/definition.js +1 -1
  133. package/searchable-select/definition.cjs +1 -1
  134. package/searchable-select/definition.js +1 -1
  135. package/searchable-select/index.cjs +23 -23
  136. package/searchable-select/index.js +10 -7
  137. package/select/definition.cjs +1 -1
  138. package/select/definition.js +1 -1
  139. package/selectable-box/definition.cjs +1 -1
  140. package/selectable-box/definition.js +1 -1
  141. package/shared/listbox/commands.d.ts +17 -0
  142. package/shared/listbox/move.d.ts +6 -0
  143. package/shared/listbox/options.d.ts +12 -0
  144. package/shared/listbox/selection.d.ts +28 -0
  145. package/shared/listbox/state.d.ts +26 -0
  146. package/shared/listbox/typeahead.d.ts +8 -0
  147. package/shared/listbox/with-options-filter.d.ts +440 -0
  148. package/shared/listbox/with-options.d.ts +862 -0
  149. package/side-drawer/definition.cjs +1 -1
  150. package/side-drawer/definition.js +1 -1
  151. package/simple-color-picker/definition.cjs +1 -1
  152. package/simple-color-picker/definition.js +1 -1
  153. package/simple-color-picker/index.cjs +6 -6
  154. package/simple-color-picker/index.js +4 -3
  155. package/split-button/definition.cjs +1 -1
  156. package/split-button/definition.js +1 -1
  157. package/status/definition.cjs +1 -1
  158. package/status/definition.js +1 -1
  159. package/switch/definition.cjs +1 -1
  160. package/switch/definition.js +1 -1
  161. package/tab/definition.cjs +1 -1
  162. package/tab/definition.js +1 -1
  163. package/tab-panel/definition.cjs +1 -1
  164. package/tab-panel/definition.js +1 -1
  165. package/table/definition.cjs +1 -1
  166. package/table/definition.js +1 -1
  167. package/table/index.cjs +13 -13
  168. package/table/index.js +4 -3
  169. package/tabs/definition.cjs +1 -1
  170. package/tabs/definition.js +1 -1
  171. package/tag/definition.cjs +1 -1
  172. package/tag/definition.js +1 -1
  173. package/tag/index.cjs +11 -11
  174. package/tag/index.js +4 -3
  175. package/tag-group/definition.cjs +1 -1
  176. package/tag-group/definition.js +1 -1
  177. package/text-area/definition.cjs +1 -1
  178. package/text-area/definition.js +1 -1
  179. package/time-picker/definition.cjs +1 -1
  180. package/time-picker/definition.js +1 -1
  181. package/tree-item/definition.cjs +1 -1
  182. package/tree-item/definition.js +1 -1
  183. package/tree-view/definition.cjs +1 -1
  184. package/tree-view/definition.js +1 -1
  185. package/unbundled/affix.cjs +2 -2
  186. package/unbundled/affix.js +1 -1
  187. package/unbundled/base-progress.cjs +1 -1
  188. package/unbundled/base-progress.js +1 -1
  189. package/unbundled/button.cjs +2 -2
  190. package/unbundled/button.js +2 -2
  191. package/unbundled/definition.cjs +2 -65
  192. package/unbundled/definition.js +4 -61
  193. package/unbundled/definition11.cjs +4 -3
  194. package/unbundled/definition11.js +3 -2
  195. package/unbundled/definition12.cjs +3 -2
  196. package/unbundled/definition12.js +3 -2
  197. package/unbundled/definition14.cjs +2 -1
  198. package/unbundled/definition14.js +2 -1
  199. package/unbundled/definition17.cjs +9 -4
  200. package/unbundled/definition17.js +9 -4
  201. package/unbundled/definition2.cjs +7 -2
  202. package/unbundled/definition2.js +8 -3
  203. package/unbundled/definition21.cjs +2 -1
  204. package/unbundled/definition21.js +2 -1
  205. package/unbundled/definition23.cjs +2 -1
  206. package/unbundled/definition23.js +2 -1
  207. package/unbundled/definition24.cjs +6 -4
  208. package/unbundled/definition24.js +6 -4
  209. package/unbundled/definition25.cjs +2 -1
  210. package/unbundled/definition25.js +2 -1
  211. package/unbundled/definition26.cjs +7 -4
  212. package/unbundled/definition26.js +7 -4
  213. package/unbundled/definition27.cjs +39 -5
  214. package/unbundled/definition27.js +40 -6
  215. package/unbundled/definition28.cjs +4 -3
  216. package/unbundled/definition28.js +4 -3
  217. package/unbundled/definition29.cjs +5 -168
  218. package/unbundled/definition29.js +11 -162
  219. package/unbundled/definition30.cjs +2 -63
  220. package/unbundled/definition30.js +5 -54
  221. package/unbundled/definition31.cjs +5 -3
  222. package/unbundled/definition31.js +5 -3
  223. package/unbundled/definition32.cjs +2 -1
  224. package/unbundled/definition32.js +2 -1
  225. package/unbundled/definition35.cjs +2 -1
  226. package/unbundled/definition35.js +2 -1
  227. package/unbundled/definition37.cjs +1 -1
  228. package/unbundled/definition37.js +1 -1
  229. package/unbundled/definition39.cjs +1 -1
  230. package/unbundled/definition39.js +1 -1
  231. package/unbundled/definition40.cjs +4 -2
  232. package/unbundled/definition40.js +4 -2
  233. package/unbundled/definition41.cjs +11 -6
  234. package/unbundled/definition41.js +11 -6
  235. package/unbundled/definition42.cjs +5 -4
  236. package/unbundled/definition42.js +5 -4
  237. package/unbundled/definition44.cjs +3 -2
  238. package/unbundled/definition44.js +3 -2
  239. package/unbundled/definition45.cjs +2 -2
  240. package/unbundled/definition45.js +2 -2
  241. package/unbundled/definition49.cjs +583 -79
  242. package/unbundled/definition49.js +579 -76
  243. package/unbundled/definition50.cjs +71 -33
  244. package/unbundled/definition50.js +67 -29
  245. package/unbundled/definition51.cjs +54 -23
  246. package/unbundled/definition51.js +52 -18
  247. package/unbundled/definition52.cjs +23 -39
  248. package/unbundled/definition52.js +17 -36
  249. package/unbundled/definition53.cjs +29 -314
  250. package/unbundled/definition53.js +27 -312
  251. package/unbundled/definition54.cjs +302 -195
  252. package/unbundled/definition54.js +298 -191
  253. package/unbundled/definition55.cjs +210 -40
  254. package/unbundled/definition55.js +206 -36
  255. package/unbundled/definition56.cjs +42 -266
  256. package/unbundled/definition56.js +38 -262
  257. package/unbundled/definition57.cjs +270 -50
  258. package/unbundled/definition57.js +267 -46
  259. package/unbundled/definition58.cjs +48 -146
  260. package/unbundled/definition58.js +47 -143
  261. package/unbundled/definition59.cjs +127 -225
  262. package/unbundled/definition59.js +122 -223
  263. package/unbundled/definition6.cjs +2 -1
  264. package/unbundled/definition6.js +2 -1
  265. package/unbundled/definition60.cjs +199 -418
  266. package/unbundled/definition60.js +196 -415
  267. package/unbundled/definition61.cjs +442 -3738
  268. package/unbundled/definition61.js +432 -3565
  269. package/unbundled/definition62.cjs +3717 -730
  270. package/unbundled/definition62.js +3544 -720
  271. package/unbundled/definition63.cjs +770 -97
  272. package/unbundled/definition63.js +767 -94
  273. package/unbundled/definition64.cjs +100 -999
  274. package/unbundled/definition64.js +98 -994
  275. package/unbundled/definition65.cjs +991 -93
  276. package/unbundled/definition65.js +985 -90
  277. package/unbundled/definition66.cjs +109 -73
  278. package/unbundled/definition66.js +105 -63
  279. package/unbundled/definition67.cjs +69 -155
  280. package/unbundled/definition67.js +60 -152
  281. package/unbundled/definition68.cjs +155 -119
  282. package/unbundled/definition68.js +151 -115
  283. package/unbundled/definition69.cjs +124 -49
  284. package/unbundled/definition69.js +120 -45
  285. package/unbundled/definition70.cjs +51 -85
  286. package/unbundled/definition70.js +50 -81
  287. package/unbundled/definition71.cjs +91 -19
  288. package/unbundled/definition71.js +86 -14
  289. package/unbundled/definition72.cjs +20 -87
  290. package/unbundled/definition72.js +14 -84
  291. package/unbundled/definition73.cjs +77 -294
  292. package/unbundled/definition73.js +72 -217
  293. package/unbundled/definition74.cjs +289 -311
  294. package/unbundled/definition74.js +219 -306
  295. package/unbundled/definition75.cjs +326 -26
  296. package/unbundled/definition75.js +317 -23
  297. package/unbundled/definition76.cjs +27 -122
  298. package/unbundled/definition76.js +22 -118
  299. package/unbundled/definition77.cjs +105 -232
  300. package/unbundled/definition77.js +101 -228
  301. package/unbundled/definition78.cjs +259 -26
  302. package/unbundled/definition78.js +249 -23
  303. package/unbundled/definition79.cjs +29 -148
  304. package/unbundled/definition79.js +27 -133
  305. package/unbundled/definition80.cjs +118 -173
  306. package/unbundled/definition80.js +109 -169
  307. package/unbundled/definition81.cjs +181 -477
  308. package/unbundled/definition81.js +176 -471
  309. package/unbundled/definition82.cjs +517 -0
  310. package/unbundled/definition82.js +497 -0
  311. package/unbundled/extractOptions.cjs +5 -5
  312. package/unbundled/extractOptions.js +2 -2
  313. package/unbundled/icon.cjs +67 -0
  314. package/unbundled/icon.js +61 -0
  315. package/unbundled/linkable.cjs +1 -1
  316. package/unbundled/linkable.js +1 -1
  317. package/unbundled/listbox.cjs +8 -3
  318. package/unbundled/listbox.js +7 -2
  319. package/unbundled/mixins.cjs +2 -1
  320. package/unbundled/mixins.js +2 -1
  321. package/unbundled/optgroup.cjs +66 -0
  322. package/unbundled/optgroup.js +54 -0
  323. package/unbundled/option.cjs +176 -0
  324. package/unbundled/option.js +164 -0
  325. package/unbundled/time-selection-picker.template.cjs +1 -1
  326. package/unbundled/time-selection-picker.template.js +1 -1
  327. package/unbundled/vivid-element.cjs +1 -1
  328. package/unbundled/vivid-element.js +1 -1
  329. package/video-player/definition.cjs +1 -1
  330. package/video-player/definition.js +1 -1
  331. package/vivid.api.json +336 -193
@@ -1,141 +1,814 @@
1
1
  require("./chunk.cjs");
2
2
  const require_vivid_element = require("./vivid-element.cjs");
3
+ const require_definition = require("./definition.cjs");
3
4
  const require_decorate = require("./decorate.cjs");
4
- const require_slottable_request = require("./slottable-request.cjs");
5
+ const require_affix = require("./affix.cjs");
6
+ const require_form_associated = require("./form-associated.cjs");
7
+ const require_localized = require("./localized.cjs");
8
+ const require_definition$1 = require("./definition6.cjs");
9
+ const require_dialog = require("./dialog.cjs");
10
+ const require_definition$2 = require("./definition9.cjs");
11
+ const require_host_semantics = require("./host-semantics.cjs");
12
+ const require_mixins = require("./mixins.cjs");
13
+ const require_form_element = require("./form-element.cjs");
14
+ const require_with_error_text = require("./with-error-text.cjs");
15
+ const require_with_success_text = require("./with-success-text.cjs");
16
+ const require_with_contextual_help = require("./with-contextual-help.cjs");
17
+ const require_option = require("./option.cjs");
18
+ const require_definition$3 = require("./definition29.cjs");
19
+ const require_definition$4 = require("./definition30.cjs");
20
+ const require_listbox = require("./listbox.cjs");
5
21
  let _microsoft_fast_element = require("@microsoft/fast-element");
6
- let prosemirror_model = require("prosemirror-model");
7
- //#region src/lib/rich-text-view/rich-text-view.scss?inline
8
- var rich_text_view_default = ":host{display:contents}.content{overflow-wrap:break-word;white-space:break-spaces;display:contents}";
22
+ let _microsoft_fast_web_utilities = require("@microsoft/fast-web-utilities");
23
+ //#region src/lib/select/select.scss?inline
24
+ var select_default = ".label-wrapper{align-items:center;gap:var(--label-wrapper-gap,4px);flex-direction:row;display:flex}.label-wrapper[hidden]{display:none}.label:not(slot),.label::slotted(label){flex:0 auto}.chevron{font:var(--vvd-typography-base-extended);flex-shrink:0;display:flex;transform:rotate(0)}@media (prefers-reduced-motion:no-preference){.chevron{transition:transform .2s}}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host(:focus-visible){outline:none}:host{--_low-ink-color:var(--vvd-color-neutral-600);--focus-stroke-gap-color:transparent;flex-direction:column;gap:4px;display:inline-flex}:host([disabled]){--_low-ink-color:var(--vvd-color-neutral-600);cursor:not-allowed}.label{color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base)}.control{--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-500)}.control.appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}@media (hover:hover){.control:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.control:hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}}.control.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-canvas);--_appearance-color-outline:var(--vvd-color-neutral-700)}.control.hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}.control:disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.control:disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.disabled{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:var(--vvd-color-neutral-100);--_appearance-color-outline:var(--vvd-color-neutral-300)}.control.disabled.appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-300);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.readonly:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--vvd-color-canvas-text);--_appearance-color-fill:var(--vvd-color-neutral-200);--_appearance-color-outline:var(--vvd-color-neutral-400)}.control.readonly:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:var(--vvd-color-neutral-600);--_appearance-color-fill:transparent;--_appearance-color-outline:transparent}.control.error:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:var(--vvd-color-alert-500)}.control.error:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-alert-50);--_appearance-color-outline:transparent}.control.success:where(:not(.disabled,:disabled)){--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:var(--vvd-color-success-500)}.control.success:where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text:notset;--_appearance-color-fill:var(--vvd-color-success-50);--_appearance-color-outline:transparent}.control{--_connotation-color-primary:var(--vvd-select-accent-primary,var(--vvd-color-canvas-text));--_connotation-color-primary-text:var(--vvd-select-accent-primary-text,var(--vvd-color-canvas));--_connotation-color-primary-increment:var(--vvd-select-accent-primary-increment,var(--vvd-color-neutral-800));--_connotation-color-intermediate:var(--vvd-select-accent-intermediate,var(--vvd-color-neutral-500));--_connotation-color-faint:var(--vvd-select-accent-faint,var(--vvd-color-neutral-50));--_connotation-color-soft:var(--vvd-select-accent-soft,var(--vvd-color-neutral-100));--_connotation-color-firm:var(--vvd-select-accent-firm,var(--vvd-color-canvas-text));--_connotation-color-fierce:var(--vvd-select-accent-fierce,var(--vvd-color-neutral-700));border-radius:var(--_select-control-border-radius);block-size:var(--_select-block-size);padding-inline:var(--_select-padding-inline);--_select-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2);--_select-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));--_select-padding-inline:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);justify-content:space-between;align-items:center;gap:8px;transition:box-shadow .2s,background-color .2s;display:flex}.control.size-condensed{--_select-icon-size:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2))) / 2.5);--_select-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 8));--_select-padding-inline:calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16)) / 2)}.control.size-condensed:not(.shape-pill){--_select-control-border-radius:4px}.control-wrapper{position:relative}.control:not(.disabled){cursor:pointer}.control.disabled{pointer-events:none}.control:not(.shape-pill){--_select-control-border-radius:8px}.control.shape-pill{--_select-control-border-radius:24px}.listbox{max-height:var(--select-height,408px);flex-direction:column;gap:2px;padding:4px;display:flex;overflow-y:auto}:host([multiple]:focus-visible) .listbox{box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px));border-radius:8px}.selected-value{white-space:nowrap;flex-grow:1;align-items:center;column-gap:12px;display:flex;overflow:hidden}.selected-value .text{text-overflow:ellipsis;max-inline-size:100%;overflow:hidden}.control.shows-placeholder .selected-value .text{color:var(--vvd-color-neutral-600)}.selected-value slot[name=icon]{flex:0 0 var(--_select-icon-size);font-size:var(--_select-icon-size);line-height:1}.control.has-meta .selected-value{padding-inline-end:8px}.feedback-wrapper{display:contents}::part(popup-base){inline-size:max-content;min-inline-size:var(--_select-fixed-width,100%)}:host([multiple]) ::part(popup-base){position:static}@supports selector(:has(*)){:host(:focus-within) .control:not(.has-activedescendant,:has(.clear-button:focus)){--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}@supports not selector(:has(*)){:host(:focus-within) .control:not(.has-activedescendant){--focus-stroke-gap-color:transparent;box-shadow:0 0 0 4px color-mix(in sRGB, var(--focus-stroke-color,var(--vvd-color-cta-500)), transparent 85%), inset 0 0 0 3px var(--focus-stroke-gap-color,currentColor);outline:1px solid var(--focus-stroke-color,var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset,0px))}}:host(:not(:focus-visible)){--_suppressable-focus-shadow:none;--_suppressable-focus-outline:none;--_suppressable-focus-outline-offset:0}:host([multiple]) .clear-button{margin-inline-start:auto}:host([multiple][clearable]) .label-wrapper{min-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2) - 16))}";
9
25
  //#endregion
10
- //#region src/lib/rich-text-view/rich-text-view.ts
26
+ //#region src/lib/select/select.ts
11
27
  /**
12
28
  * @public
13
- * @component rich-text-view
14
- * @dynamicSlot `@vonage/vivid#RteChildSlotProps` child - Used for custom rendered children.
29
+ * @component select
30
+ * @slot - Default slot.
31
+ * @slot icon - The preferred way to add an icon to the select control.
32
+ * @slot meta - Slot to add meta content to the select control.
33
+ * @slot helper-text - Describes how to use the select. Alternative to the `helper-text` attribute.
34
+ * @event {CustomEvent<undefined>} input - Fires a custom 'input' event when the value updates
35
+ * @event {CustomEvent<HTMLElement>} change - Fires a custom 'change' event when the value updates
36
+ * @vueModel modelValue value input,@lazy:change `event.currentTarget.value`
37
+ * @testAction selectOptionByValue selectOptionByValue
38
+ * @testAction selectOptionByText selectOptionByText
15
39
  */
16
- var RichTextView = class extends require_vivid_element.VividElement {
40
+ 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))))))))) {
17
41
  constructor(..._args) {
18
42
  super(..._args);
19
- this._slotCounter = 0;
20
- this._slottedChildren = /* @__PURE__ */ new Set();
21
- this._slotRequests = /* @__PURE__ */ new Set();
22
- this._contentElement = null;
43
+ this.proxy = document.createElement("select");
44
+ this.activeIndex = -1;
45
+ this.rangeStartIndex = -1;
46
+ this.open = false;
47
+ this.listboxId = (0, _microsoft_fast_web_utilities.uniqueId)("listbox-");
48
+ this.maxHeight = 0;
49
+ this.fixedDropdown = false;
50
+ this._feedbackWrapper = null;
51
+ this._isResetting = false;
52
+ this.clearable = false;
53
+ this._isClearButtonFocused = false;
54
+ }
55
+ /**
56
+ * Returns the last checked option.
57
+ *
58
+ * @internal
59
+ */
60
+ get activeOption() {
61
+ return this.options[this.activeIndex];
62
+ }
63
+ /**
64
+ * Returns the list of checked options.
65
+ *
66
+ * @internal
67
+ */
68
+ get checkedOptions() {
69
+ return this.options.filter((o) => o.checked);
70
+ }
71
+ /**
72
+ * Returns the index of the first selected option.
73
+ *
74
+ * @internal
75
+ */
76
+ get firstSelectedOptionIndex() {
77
+ return this.options.indexOf(this.firstSelectedOption);
78
+ }
79
+ /**
80
+ * Updates the `ariaActiveDescendant` property when the active index changes.
81
+ *
82
+ * @internal
83
+ */
84
+ activeIndexChanged(_, next) {
85
+ this._activeDescendant = this.options[next]?.id ?? "";
86
+ this.focusAndScrollOptionIntoView();
87
+ }
88
+ /**
89
+ * Toggles the checked state for the currently active option.
90
+ *
91
+ * @remarks
92
+ * Multiple-selection mode only.
93
+ *
94
+ * @internal
95
+ */
96
+ checkActiveIndex() {
97
+ const activeItem = this.activeOption;
98
+ /* v8 ignore else -- @preserve */
99
+ if (activeItem) activeItem.checked = true;
100
+ }
101
+ /**
102
+ * Sets the active index to the first option and marks it as checked.
103
+ *
104
+ * @remarks
105
+ * Multi-selection mode only.
106
+ *
107
+ * @param preserveChecked - mark all options unchecked before changing the active index
108
+ *
109
+ * @internal
110
+ */
111
+ checkFirstOption(preserveChecked) {
112
+ const firstSelectableIndex = this.getNextSelectableIndex(0);
113
+ if (firstSelectableIndex === -1) return;
114
+ if (preserveChecked) {
115
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
116
+ this.options.forEach((o, i) => {
117
+ o.checked = (0, _microsoft_fast_web_utilities.inRange)(i, firstSelectableIndex, this.rangeStartIndex + 1) && !o.disabled;
118
+ });
119
+ } else this.uncheckAllOptions();
120
+ this.activeIndex = firstSelectableIndex;
121
+ this.checkActiveIndex();
122
+ }
123
+ /**
124
+ * Decrements the active index and sets the matching option as checked.
125
+ *
126
+ * @remarks
127
+ * Multi-selection mode only.
128
+ *
129
+ * @param preserveChecked - mark all options unchecked before changing the active index
130
+ *
131
+ * @internal
132
+ */
133
+ checkLastOption(preserveChecked) {
134
+ const lastSelectableIndex = this.getPreviousSelectableIndex(this.length - 1);
135
+ if (lastSelectableIndex === -1) return;
136
+ if (preserveChecked) {
137
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
138
+ this.options.forEach((o, i) => {
139
+ o.checked = (0, _microsoft_fast_web_utilities.inRange)(i, this.rangeStartIndex, lastSelectableIndex + 1) && !o.disabled;
140
+ });
141
+ } else this.uncheckAllOptions();
142
+ this.activeIndex = lastSelectableIndex;
143
+ this.checkActiveIndex();
144
+ }
145
+ /**
146
+ * Increments the active index and marks the matching option as checked.
147
+ *
148
+ * @remarks
149
+ * Multiple-selection mode only.
150
+ *
151
+ * @param preserveChecked - mark all options unchecked before changing the active index
152
+ *
153
+ * @internal
154
+ */
155
+ checkNextOption(preserveChecked) {
156
+ const nextIndex = this.getNextSelectableIndex(this.activeIndex + 1);
157
+ if (nextIndex === -1) return;
158
+ if (preserveChecked) {
159
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
160
+ this.options.forEach((o, i) => {
161
+ o.checked = (0, _microsoft_fast_web_utilities.inRange)(i, this.rangeStartIndex, nextIndex + 1) && !o.disabled;
162
+ });
163
+ } else this.uncheckAllOptions();
164
+ this.activeIndex = nextIndex;
165
+ this.checkActiveIndex();
166
+ }
167
+ /**
168
+ * Decrements the active index and marks the matching option as checked.
169
+ *
170
+ * @remarks
171
+ * Multiple-selection mode only.
172
+ *
173
+ * @param preserveChecked - mark all options unchecked before changing the active index
174
+ *
175
+ * @internal
176
+ */
177
+ checkPreviousOption(preserveChecked) {
178
+ const previousIndex = this.getPreviousSelectableIndex(this.activeIndex - 1);
179
+ if (previousIndex === -1) return;
180
+ if (preserveChecked) {
181
+ if (this.rangeStartIndex === -1) this.rangeStartIndex = this.activeIndex;
182
+ if (this.checkedOptions.length === 1) this.rangeStartIndex += 1;
183
+ this.options.forEach((o, i) => {
184
+ o.checked = (0, _microsoft_fast_web_utilities.inRange)(i, previousIndex, this.rangeStartIndex + 1) && !o.disabled;
185
+ });
186
+ } else this.uncheckAllOptions();
187
+ this.activeIndex = previousIndex;
188
+ this.checkActiveIndex();
23
189
  }
24
190
  /** @internal */
25
- viewChanged(oldView, newView) {
26
- if (oldView) this._removeStyles();
27
- if (newView) this._addStyles(newView);
28
- this._updateView();
29
- }
30
- _addStyles(view) {
31
- const config = view[require_slottable_request.impl].config[require_slottable_request.impl];
32
- this._styles = new _microsoft_fast_element.ElementStyles(require_slottable_request.sortedContributions(config.features.flatMap((f) => f.getStyles())));
33
- this._styles.addStylesTo(this.shadowRoot);
34
- }
35
- _removeStyles() {
36
- if (this._styles) {
37
- this._styles.removeStylesFrom(this.shadowRoot);
38
- this._styles = void 0;
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) {
204
+ super.focusinHandler(e);
205
+ return;
206
+ }
207
+ /* v8 ignore else -- @preserve */
208
+ if (!this.shouldSkipFocus && e.target === e.currentTarget) {
209
+ this.uncheckAllOptions();
210
+ if (this.activeIndex === -1) this.activeIndex = this.firstSelectedOptionIndex !== -1 ? this.firstSelectedOptionIndex : 0;
211
+ this.checkActiveIndex();
212
+ this.setSelectedOptions();
213
+ this.focusAndScrollOptionIntoView();
214
+ }
215
+ this.shouldSkipFocus = false;
216
+ }
217
+ /** Sets an option as selected and gives it focus. */
218
+ setSelectedOptions() {
219
+ if (!this.multiple) {
220
+ super.setSelectedOptions();
221
+ return;
222
+ }
223
+ /* v8 ignore else -- @preserve */
224
+ if (this.$fastController.isConnected && this.options) {
225
+ this.selectedOptions = this.options.filter((o) => o.selected);
226
+ this.focusAndScrollOptionIntoView();
39
227
  }
40
228
  }
41
- _cleanupLightDom() {
42
- for (const el of this._slottedChildren) this.removeChild(el);
43
- for (const slotName of this._slotRequests) require_slottable_request.dispatchSlottableRequest(this, "child", slotName, require_slottable_request.removeSymbol);
44
- this._slottedChildren.clear();
45
- this._slotRequests.clear();
46
- this._slotCounter = 0;
47
- }
48
- _updateView() {
49
- if (!this._contentElement) return;
50
- this._contentElement.innerHTML = "";
51
- this._cleanupLightDom();
52
- if (this.view) this._contentElement.appendChild(this._renderView(this.view));
53
- }
54
- _renderView(rteView) {
55
- const ctx = rteView[require_slottable_request.impl];
56
- if (rteView.type === "node" && rteView.node.type === "doc") rteView = rteView.children;
57
- if (rteView.type === "fragment") {
58
- const frag = document.createDocumentFragment();
59
- for (const child of rteView.content) frag.appendChild(this._renderView(child));
60
- return frag;
229
+ /**
230
+ * Toggles the selected state of the provided options. If any provided items
231
+ * are in an unselected state, all items are set to selected. If every
232
+ * provided item is selected, they are all unselected.
233
+ *
234
+ * @internal
235
+ */
236
+ toggleSelectedForAllCheckedOptions() {
237
+ const enabledCheckedOptions = this.checkedOptions.filter((o) => !o.disabled);
238
+ const force = !enabledCheckedOptions.every((o) => o.selected);
239
+ enabledCheckedOptions.forEach((o) => o.selected = force);
240
+ this.selectedIndex = this.options.indexOf(enabledCheckedOptions[enabledCheckedOptions.length - 1]);
241
+ this.setSelectedOptions();
242
+ this.updateValue(true);
243
+ }
244
+ /** @internal */
245
+ typeaheadBufferChanged(prev, next) {
246
+ if (!this.multiple) {
247
+ super.typeaheadBufferChanged(prev, next);
248
+ return;
61
249
  }
62
- const customRenderedView = ctx.options.renderChildView?.(rteView) ?? false;
63
- if (customRenderedView) return this._handleCustomRender(rteView, customRenderedView);
64
- else return this._renderDefault(rteView);
65
- }
66
- _handleCustomRender(rteView, customResult) {
67
- const slotName = `child-view-${this._slotCounter++}`;
68
- const slot = document.createElement("slot");
69
- slot.setAttribute("name", slotName);
70
- if (customResult === true) {
71
- this._slotRequests.add(slotName);
72
- require_slottable_request.dispatchSlottableRequest(this, "child", slotName, { view: rteView });
73
- } else {
74
- const { dom, contentDom = dom } = customResult;
75
- const nestedView = document.createElement(this.tagName);
76
- nestedView.view = rteView.children;
77
- contentDom.appendChild(nestedView);
78
- dom.setAttribute("slot", slotName);
79
- this.appendChild(dom);
80
- this._slottedChildren.add(dom);
250
+ /* v8 ignore if -- @preserve */
251
+ if (this.$fastController.isConnected) {
252
+ const typeaheadMatches = this.getTypeaheadMatches();
253
+ const activeIndex = this.options.indexOf(typeaheadMatches[0]);
254
+ if (activeIndex > -1) {
255
+ this.activeIndex = activeIndex;
256
+ this.uncheckAllOptions();
257
+ this.checkActiveIndex();
258
+ }
259
+ this.typeaheadExpired = false;
81
260
  }
82
- return slot;
83
- }
84
- _renderDefault(view) {
85
- const schema = view[require_slottable_request.impl].config[require_slottable_request.impl].schema;
86
- if (view.type === "node" && view.node.type === "text") return document.createTextNode(view.node.text);
87
- const item = view.type === "node" ? view.node : view.mark;
88
- const pmItem = view.type === "node" ? prosemirror_model.Node.fromJSON(schema, item) : prosemirror_model.Mark.fromJSON(schema, item);
89
- const spec = pmItem instanceof prosemirror_model.Node ? pmItem.type.spec.toDOM(pmItem) : pmItem.type.spec.toDOM(pmItem, true);
90
- const { dom, contentDOM = dom } = prosemirror_model.DOMSerializer.renderSpec(document, spec);
91
- const childrenRendered = this._renderView(view.children);
92
- contentDOM.appendChild(childrenRendered);
93
- return dom;
261
+ }
262
+ /**
263
+ * Unchecks all options.
264
+ *
265
+ * @remarks
266
+ * Multiple-selection mode only.
267
+ *
268
+ * @param preserveChecked - reset the rangeStartIndex
269
+ *
270
+ * @internal
271
+ */
272
+ uncheckAllOptions(preserveChecked = false) {
273
+ this.options.forEach((o) => o.checked = false);
274
+ /* v8 ignore else -- @preserve */
275
+ if (!preserveChecked) this.rangeStartIndex = -1;
276
+ }
277
+ /**
278
+ * Sets focus when the open property changes.
279
+ *
280
+ * @internal
281
+ */
282
+ openChanged(prev, next) {
283
+ if (!this.collapsible) return;
284
+ if (this.open) {
285
+ this.focusAndScrollOptionIntoView();
286
+ this.indexWhenOpened = this.selectedIndex;
287
+ _microsoft_fast_element.Updates.enqueue(() => this.focus());
288
+ return;
289
+ }
290
+ const didClose = prev && !next;
291
+ const selectionChangedWhileOpen = this.indexWhenOpened !== this.selectedIndex;
292
+ if (didClose && selectionChangedWhileOpen) this.updateValue(true);
293
+ }
294
+ /**
295
+ * The component is collapsible when in single-selection mode.
296
+ *
297
+ * @internal
298
+ */
299
+ get collapsible() {
300
+ return !this.multiple;
301
+ }
302
+ /** @internal */
303
+ valueChanged(prev, next) {
304
+ const nextSelectedIndex = this.options.findIndex((el) => el.value === next);
305
+ const validNextSelectedIndex = this._validSelectedIndex(nextSelectedIndex);
306
+ const nextValue = this.options[validNextSelectedIndex]?.value ?? "";
307
+ if (this.selectedIndex !== validNextSelectedIndex) this.selectedIndex = validNextSelectedIndex;
308
+ if (next !== nextValue) return;
309
+ super.valueChanged(prev, next);
310
+ this.updateDisplayValue();
311
+ }
312
+ /**
313
+ * Sets the value and display value to match the first selected option.
314
+ *
315
+ * @param shouldEmit - if true, the input and change events will be emitted
316
+ *
317
+ * @internal
318
+ */
319
+ updateValue(shouldEmit) {
320
+ if (this.$fastController.isConnected) this.value = this.firstSelectedOption?.value ?? "";
321
+ if (shouldEmit) {
322
+ this.$emit("input");
323
+ this.$emit("change", this, {
324
+ bubbles: true,
325
+ composed: void 0
326
+ });
327
+ }
328
+ }
329
+ /**
330
+ * Updates the proxy value when the selected index changes.
331
+ *
332
+ * @param prev - the previous selected index
333
+ * @param next - the next selected index
334
+ *
335
+ * @internal
336
+ */
337
+ selectedIndexChanged(prev, next) {
338
+ super.selectedIndexChanged(prev, next);
339
+ this.updateValue();
340
+ }
341
+ /**
342
+ * Handle opening and closing the listbox when the select is clicked.
343
+ *
344
+ * @param e - the mouse event
345
+ * @internal
346
+ */
347
+ clickHandler(e) {
348
+ if (this.disabled || this._isFromContextualHelp(e)) return;
349
+ const clickedOption = e.target.closest(`option,[role=option],[data-vvd-component=option]`);
350
+ if (clickedOption && clickedOption.disabled) return;
351
+ if (this.multiple) {
352
+ this.uncheckAllOptions();
353
+ this.activeIndex = this.options.indexOf(clickedOption);
354
+ this.checkActiveIndex();
355
+ this.toggleSelectedForAllCheckedOptions();
356
+ } else super.clickHandler(e);
357
+ if (this.collapsible) this.open = !this.open;
358
+ return true;
359
+ }
360
+ /**
361
+ * Handles focus state when the element or its children lose focus.
362
+ *
363
+ * @param e - The focus event
364
+ * @internal
365
+ */
366
+ focusoutHandler(e) {
367
+ if (this.multiple) this.uncheckAllOptions();
368
+ if (!this.open) return true;
369
+ const focusTarget = e.relatedTarget;
370
+ if (this.isSameNode(focusTarget)) {
371
+ this.focus();
372
+ return;
373
+ }
374
+ /* v8 ignore else -- @preserve */
375
+ if (!this.options.includes(focusTarget)) {
376
+ this.open = false;
377
+ if (this.indexWhenOpened !== this.selectedIndex) this.updateValue(true);
378
+ }
379
+ }
380
+ /**
381
+ * Updates the value when an option's value changes.
382
+ *
383
+ * @param source - the source object
384
+ * @param propertyName - the property to evaluate
385
+ *
386
+ * @internal
387
+ */
388
+ handleChange(source, propertyName) {
389
+ super.handleChange(source, propertyName);
390
+ if (propertyName === "value") this.updateValue();
391
+ }
392
+ /**
393
+ * Prevents focus when a scrollbar is clicked.
394
+ *
395
+ * @param e - the mouse event object
396
+ *
397
+ * @internal
398
+ */
399
+ mousedownHandler(e) {
400
+ if (e.offsetX >= 0 && e.offsetX <= this.listbox.scrollWidth) return super.mousedownHandler(e);
401
+ return this.collapsible;
94
402
  }
95
403
  /** @internal */
404
+ multipleChanged(_, next) {
405
+ this.options.forEach((o) => {
406
+ o.checked = next ? false : void 0;
407
+ });
408
+ this.setSelectedOptions();
409
+ /* v8 ignore if -- @preserve */
410
+ if (this.proxy) this.proxy.multiple = next;
411
+ }
412
+ /**
413
+ * Updates the selectedness of each option when the list of selected options changes.
414
+ *
415
+ * @param prev - the previous list of selected options
416
+ * @param next - the current list of selected options
417
+ *
418
+ * @internal
419
+ */
420
+ selectedOptionsChanged(prev, next) {
421
+ super.selectedOptionsChanged(prev, next);
422
+ this.options.forEach((o, i) => {
423
+ const proxyOption = this.proxy.options.item(i);
424
+ if (proxyOption) proxyOption.selected = o.selected;
425
+ });
426
+ }
427
+ /**
428
+ * Resets and fills the proxy to match the component's options.
429
+ *
430
+ * @internal
431
+ */
432
+ setProxyOptions() {
433
+ /* v8 ignore else -- @preserve */
434
+ if (this.proxy instanceof HTMLSelectElement && this.options) {
435
+ this.proxy.length = 0;
436
+ this.options.forEach((option) => {
437
+ const proxyOption = option.proxy || (option instanceof HTMLOptionElement ? option.cloneNode() : null);
438
+ if (proxyOption) this.proxy.options.add(proxyOption);
439
+ });
440
+ }
441
+ }
442
+ /**
443
+ * Handles keydown actions when the select is in multiple selection mode.
444
+ *
445
+ * @internal
446
+ */
447
+ multipleKeydownHandler(e) {
448
+ if (this.disabled) return;
449
+ const { key, shiftKey } = e;
450
+ this.shouldSkipFocus = false;
451
+ switch (key) {
452
+ case _microsoft_fast_web_utilities.keyHome:
453
+ this.checkFirstOption(shiftKey);
454
+ return;
455
+ case _microsoft_fast_web_utilities.keyArrowDown:
456
+ this.checkNextOption(shiftKey);
457
+ return;
458
+ case _microsoft_fast_web_utilities.keyArrowUp:
459
+ this.checkPreviousOption(shiftKey);
460
+ return;
461
+ case _microsoft_fast_web_utilities.keyEnd:
462
+ this.checkLastOption(shiftKey);
463
+ return;
464
+ case _microsoft_fast_web_utilities.keyTab:
465
+ this.focusAndScrollOptionIntoView();
466
+ return;
467
+ case _microsoft_fast_web_utilities.keyEscape:
468
+ this.uncheckAllOptions();
469
+ this.checkActiveIndex();
470
+ return;
471
+ case _microsoft_fast_web_utilities.keySpace:
472
+ e.preventDefault();
473
+ /* v8 ignore else -- @preserve */
474
+ if (this.typeaheadExpired) {
475
+ this.toggleSelectedForAllCheckedOptions();
476
+ return;
477
+ }
478
+ default:
479
+ /* v8 ignore else -- @preserve */
480
+ if (key.length === 1) this.handleTypeAhead(key);
481
+ return;
482
+ }
483
+ }
484
+ /**
485
+ * Handle keyboard interaction for the select.
486
+ *
487
+ * @param e - the keyboard event
488
+ * @internal
489
+ */
490
+ keydownHandler(e) {
491
+ const selectedIndexBefore = this.selectedIndex;
492
+ if (this.multiple) this.multipleKeydownHandler(e);
493
+ else super.keydownHandler(e);
494
+ switch (e.key) {
495
+ case _microsoft_fast_web_utilities.keySpace:
496
+ e.preventDefault();
497
+ if (this.collapsible && this.typeaheadExpired) this.open = !this.open;
498
+ break;
499
+ case _microsoft_fast_web_utilities.keyHome:
500
+ case _microsoft_fast_web_utilities.keyEnd:
501
+ e.preventDefault();
502
+ break;
503
+ case _microsoft_fast_web_utilities.keyEnter:
504
+ e.preventDefault();
505
+ this.open = !this.open;
506
+ break;
507
+ case _microsoft_fast_web_utilities.keyEscape:
508
+ if (this.collapsible && this.open) {
509
+ e.preventDefault();
510
+ this.open = false;
511
+ }
512
+ break;
513
+ case _microsoft_fast_web_utilities.keyTab:
514
+ if (this.collapsible && this.open) {
515
+ e.preventDefault();
516
+ this.open = false;
517
+ }
518
+ return true;
519
+ }
520
+ if (this.collapsible && !this.open && this.selectedIndex !== selectedIndexBefore) this.updateValue(true);
521
+ return !(e.key === _microsoft_fast_web_utilities.keyArrowDown || e.key === _microsoft_fast_web_utilities.keyArrowUp);
522
+ }
96
523
  connectedCallback() {
97
524
  super.connectedCallback();
98
- this._updateView();
525
+ this.addEventListener("focusout", this.focusoutHandler);
526
+ this.addEventListener("contentchange", this.updateDisplayValue);
99
527
  }
100
- /** @internal */
101
528
  disconnectedCallback() {
529
+ this.removeEventListener("focusout", this.focusoutHandler);
530
+ this.removeEventListener("contentchange", this.updateDisplayValue);
102
531
  super.disconnectedCallback();
103
- this._removeStyles();
104
- this._cleanupLightDom();
532
+ }
533
+ /** @internal */
534
+ updateDisplayValue() {
535
+ if (this.collapsible) _microsoft_fast_element.Observable.notify(this, "displayValue");
536
+ }
537
+ get displayValue() {
538
+ _microsoft_fast_element.Observable.track(this, "displayValue");
539
+ return this.firstSelectedOption?.getAttribute("label") ?? this.firstSelectedOption?.text ?? this.placeholder ?? "";
540
+ }
541
+ _newDefaultSelectedIndex(prev, next, currentSelectIndex) {
542
+ const defaultSelectedIndex = super._newDefaultSelectedIndex(prev, next, currentSelectIndex);
543
+ if (defaultSelectedIndex === null && currentSelectIndex === -1 && !this.placeholder) {
544
+ const firstSelectableIndex = this.getNextSelectableIndex(0);
545
+ if (firstSelectableIndex !== -1) return firstSelectableIndex;
546
+ }
547
+ return defaultSelectedIndex;
548
+ }
549
+ _isDefaultSelected(option) {
550
+ return super._isDefaultSelected(option) || option.value === this.initialValue || !this._isResetting && option.value === this.value;
551
+ }
552
+ slottedOptionsChanged(prev, next) {
553
+ this.options.forEach((o) => {
554
+ _microsoft_fast_element.Observable.getNotifier(o).unsubscribe(this, "value");
555
+ });
556
+ super.slottedOptionsChanged(prev, next);
557
+ this.options.forEach((o) => {
558
+ _microsoft_fast_element.Observable.getNotifier(o).subscribe(this, "value");
559
+ });
560
+ this.setProxyOptions();
561
+ this.updateValue();
562
+ const scale = this.getAttribute("scale") || this.scale;
563
+ next.forEach((element) => {
564
+ if (scale) {
565
+ element.setAttribute("scale", scale);
566
+ element.scale = scale;
567
+ }
568
+ });
569
+ this.proxy.value = this.value;
570
+ this.validate();
571
+ }
572
+ formResetCallback() {
573
+ this.setProxyOptions();
574
+ this._isResetting = true;
575
+ this.selectedIndex = this._newDefaultSelectedIndex([], this.options, -1) ?? -1;
576
+ this._isResetting = false;
577
+ }
578
+ /** @internal */
579
+ get _shouldShowClearButton() {
580
+ if (!this.clearable) return false;
581
+ if (this.multiple) return this.selectedOptions?.length > 0;
582
+ return this.value !== "";
583
+ }
584
+ /** @internal */
585
+ _onClearButtonFocus() {
586
+ this._isClearButtonFocused = true;
587
+ this.activeIndex = -1;
588
+ this.uncheckAllOptions();
589
+ }
590
+ /** @internal */
591
+ _onClearButtonBlur() {
592
+ this._isClearButtonFocused = false;
593
+ }
594
+ /** @internal */
595
+ get _shouldShowLabelWrapper() {
596
+ return Boolean(this.label || this._hasContextualHelp || this.multiple && this._shouldShowClearButton);
597
+ }
598
+ /** @internal */
599
+ _onClearButtonClick() {
600
+ if (this.multiple) this.selectedOptions.forEach((o) => {
601
+ /* v8 ignore else -- @preserve */
602
+ if (!o.disabled) o.selected = false;
603
+ });
604
+ else this.selectedIndex = -1;
605
+ this.updateValue(true);
105
606
  }
106
607
  };
107
- require_decorate.__decorate([_microsoft_fast_element.observable], RichTextView.prototype, "view", void 0);
608
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "activeIndex", void 0);
609
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ mode: "boolean" })], Select.prototype, "multiple", void 0);
610
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({
611
+ attribute: "open",
612
+ mode: "boolean"
613
+ })], Select.prototype, "open", void 0);
614
+ require_decorate.__decorate([_microsoft_fast_element.volatile], Select.prototype, "collapsible", null);
615
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "control", void 0);
616
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "maxHeight", void 0);
617
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "_anchor", void 0);
618
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)()], Select.prototype, "scale", void 0);
619
+ require_decorate.__decorate([_microsoft_fast_element.attr], Select.prototype, "appearance", void 0);
620
+ require_decorate.__decorate([_microsoft_fast_element.attr], Select.prototype, "shape", void 0);
621
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({
622
+ mode: "boolean",
623
+ attribute: "fixed-dropdown"
624
+ })], Select.prototype, "fixedDropdown", void 0);
625
+ require_decorate.__decorate([_microsoft_fast_element.attr], Select.prototype, "placeholder", void 0);
626
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "_feedbackWrapper", void 0);
627
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "metaSlottedContent", void 0);
628
+ require_decorate.__decorate([(0, _microsoft_fast_element.attr)({ mode: "boolean" })], Select.prototype, "clearable", void 0);
629
+ require_decorate.__decorate([_microsoft_fast_element.observable], Select.prototype, "_isClearButtonFocused", void 0);
108
630
  //#endregion
109
- //#region src/lib/rich-text-view/rich-text-view.template.ts
110
- var RichTextViewTemplate = () => _microsoft_fast_element.html`<div class="content rich-text" ${(0, _microsoft_fast_element.ref)("_contentElement")}></div>`;
631
+ //#region src/lib/select/select.template.ts
632
+ function renderLabel() {
633
+ return _microsoft_fast_element.html` <label
634
+ for="${(x) => x.multiple ? null : "control"}"
635
+ class="label"
636
+ id="label"
637
+ >
638
+ ${(x) => x.label}
639
+ </label>`;
640
+ }
641
+ function renderPlaceholder(context) {
642
+ const optionTag = context.tagFor(require_option.ListboxOption);
643
+ return _microsoft_fast_element.html`
644
+ <${optionTag} text="${(x) => x.placeholder}" hidden disabled>
645
+ </${optionTag}>`;
646
+ }
647
+ function renderClearButton(context) {
648
+ const buttonTag = context.tagFor(require_definition$1.Button);
649
+ return _microsoft_fast_element.html`
650
+ <${buttonTag}
651
+ aria-label="${(x) => x.locale.select.clearButtonLabel}"
652
+ aria-hidden="${(x) => x._isClearButtonFocused ? "false" : "true"}"
653
+ @click="${(x, c) => {
654
+ x._onClearButtonClick();
655
+ c.event.stopPropagation();
656
+ }}"
657
+ @mousedown="${() => false}"
658
+ @keydown="${(x, c) => {
659
+ /* v8 ignore next -- @preserve */
660
+ if (c.event.key === "Tab") x._onClearButtonBlur();
661
+ c.event.stopPropagation();
662
+ return true;
663
+ }}"
664
+ @focusin="${(x, c) => {
665
+ c.event.stopPropagation();
666
+ x._onClearButtonFocus();
667
+ }}"
668
+ @focusout="${(x) => x._onClearButtonBlur()}"
669
+ ?disabled="${(x) => x.disabled}"
670
+ :shape="${(x) => x.shape}"
671
+ size="super-condensed"
672
+ icon="close-line"
673
+ appearance="ghost-light"
674
+ class="clear-button"
675
+ tabindex="0"
676
+ ></${buttonTag}>
677
+ `;
678
+ }
679
+ function selectValue(context) {
680
+ const affixIconTemplate = require_affix.affixIconTemplateFactory(context);
681
+ const chevronTemplate = require_definition$1.chevronTemplateFactory(context);
682
+ return _microsoft_fast_element.html` <div
683
+ class="control ${(x) => (0, _microsoft_fast_web_utilities.classNames)(["has-activedescendant", Boolean(x._activeDescendant) && x.open], ["disabled", x.disabled], [`appearance-${x.appearance}`, Boolean(x.appearance)], [`shape-${x.shape}`, Boolean(x.shape)], ["has-meta", Boolean(x.metaSlottedContent?.length)], ["error", Boolean(x.errorValidationMessage)], ["success", !!x.successText], ["shows-placeholder", Boolean(x.placeholder) && !x.value], [`size-${x.scale}`, Boolean(x.scale)])}"
684
+ ${(0, _microsoft_fast_element.ref)("_anchor")}
685
+ id="control"
686
+ ?disabled="${(x) => x.disabled}"
687
+ >
688
+ <div class="selected-value">
689
+ ${(x) => affixIconTemplate(x.icon, require_affix.IconWrapper.Slot)}
690
+ <span class="text">${(x) => x.displayValue}</span>
691
+ <slot name="meta" ${(0, _microsoft_fast_element.slotted)("metaSlottedContent")}></slot>
692
+ </div>
693
+ ${(0, _microsoft_fast_element.when)((x) => x._shouldShowClearButton, renderClearButton(context))}
694
+ ${chevronTemplate}
695
+ </div>`;
696
+ }
697
+ function setFixedDropdownVarWidth(x) {
698
+ return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
699
+ }
700
+ /** @param context - element definition context */
701
+ function renderControl(context) {
702
+ const popupTag = context.tagFor(require_definition$2.Popup);
703
+ return _microsoft_fast_element.html`
704
+ <div class="label-wrapper" ?hidden=${(x) => !x._shouldShowLabelWrapper}>
705
+ ${(0, _microsoft_fast_element.when)((x) => x.label, renderLabel())}
706
+ ${(0, _microsoft_fast_element.when)((x) => x.multiple && x._shouldShowClearButton, renderClearButton(context))}
707
+ <slot name="contextual-help" ${(0, _microsoft_fast_element.slotted)("_contextualHelpSlottedContent")}></slot>
708
+ </div>
709
+ <div class="control-wrapper">
710
+ ${(0, _microsoft_fast_element.when)((x) => !x.multiple, selectValue(context))}
711
+ <${popupTag} class="popup"
712
+ style="${setFixedDropdownVarWidth}"
713
+ ?open="${(x) => x.collapsible ? x.open : true}"
714
+ :anchor="${(x) => x._anchor}"
715
+ placement="bottom-start"
716
+ strategy="${(x) => x.fixedDropdown ? null : "absolute"}">
717
+ <div class="listbox"
718
+ id="${(x) => x.listboxId}"
719
+ role="listbox"
720
+ aria-multiselectable="${(x) => x.multiple}"
721
+ aria-label="${(x) => x.multiple && !x.label && x.ariaLabel ? x.ariaLabel : null}"
722
+ aria-labelledby="${(x) => x.multiple && x.label ? "label" : null}"
723
+ ?disabled="${(x) => x.disabled}"
724
+ ?hidden="${(x) => x.collapsible ? !x.open : false}"
725
+ ${(0, _microsoft_fast_element.ref)("listbox")}>
726
+ ${(0, _microsoft_fast_element.when)((x) => x.placeholder, renderPlaceholder(context))}
727
+ <slot
728
+ ${(0, _microsoft_fast_element.slotted)({
729
+ filter: require_listbox.Listbox.slottedOptionFilter,
730
+ flatten: true,
731
+ property: "slottedOptions"
732
+ })}>
733
+ </slot>
734
+ </div>
735
+ </${popupTag}>
736
+ </div>
737
+ `;
738
+ }
739
+ /** Ignore events that originate from feedback, e.g. a click on link */
740
+ function ifNotFromFeedback(handler) {
741
+ return (x, c) => {
742
+ if (!c.event.composedPath().includes(x._feedbackWrapper)) {
743
+ handler(x, c.event);
744
+ return;
745
+ }
746
+ return true;
747
+ };
748
+ }
749
+ var SelectTemplate = (context) => {
750
+ return _microsoft_fast_element.html`
751
+ <template
752
+ ${require_host_semantics.applyHostSemantics({
753
+ role: "combobox",
754
+ ariaLabel: (x) => x.ariaLabel ?? x.label,
755
+ ariaHasPopup: (x) => x.collapsible ? "listbox" : "false",
756
+ ariaExpanded: (x) => x.open,
757
+ ariaDisabled: (x) => x.disabled
758
+ })}
759
+ aria-controls="${(x) => x.listboxId}"
760
+ aria-activedescendant="${(x) => x.open ? x._activeDescendant : null}"
761
+ aria-describedby="${(x) => x._feedbackDescribedBy}"
762
+ tabindex="${(x) => !x.disabled ? "0" : null}"
763
+ @click="${ifNotFromFeedback((x, e) => x.clickHandler(e))}"
764
+ @focusin="${ifNotFromFeedback((x, e) => x.focusinHandler(e))}"
765
+ @focusout="${ifNotFromFeedback((x, e) => x.focusoutHandler(e))}"
766
+ @keydown="${ifNotFromFeedback((x, e) => {
767
+ if (x.open) require_dialog.handleEscapeKeyAndStopPropogation(e);
768
+ return x.keydownHandler(e);
769
+ })}"
770
+ @mousedown="${ifNotFromFeedback((x, e) => x.mousedownHandler(e))}"
771
+ >
772
+ ${renderControl(context)}
773
+ <div class="feedback-wrapper" ${(0, _microsoft_fast_element.ref)("_feedbackWrapper")}>
774
+ ${(x) => x._getFeedbackTemplate(context)}
775
+ </div>
776
+ </template>
777
+ `;
778
+ };
111
779
  //#endregion
112
- //#region src/lib/rich-text-view/definition.ts
113
- var richTextViewDefinition = require_vivid_element.defineVividComponent("rich-text-view", RichTextView, RichTextViewTemplate, [], {
114
- styles: rich_text_view_default,
115
- shadowOptions: { delegatesFocus: true }
116
- });
780
+ //#region src/lib/select/definition.ts
781
+ /** @internal */
782
+ var selectDefinition = require_vivid_element.defineVividComponent("select", Select, SelectTemplate, [
783
+ require_definition$2.popupDefinition,
784
+ require_definition.iconDefinition,
785
+ require_definition$3.listboxOptionDefinition,
786
+ require_definition$4.optgroupDefinition,
787
+ require_definition$1.buttonDefinition,
788
+ require_mixins.feedbackMessageDefinition
789
+ ], { styles: select_default });
117
790
  /**
118
- * Registers the rich-text-view element with the design system.
791
+ * Registers the select elements with the design system.
119
792
  *
120
793
  * @param prefix - the prefix to use for the component name
121
794
  */
122
- var registerRichTextView = require_vivid_element.createRegisterFunction(richTextViewDefinition);
795
+ var registerSelect = require_vivid_element.createRegisterFunction(selectDefinition);
123
796
  //#endregion
124
- Object.defineProperty(exports, "RichTextView", {
797
+ Object.defineProperty(exports, "Select", {
125
798
  enumerable: true,
126
799
  get: function() {
127
- return RichTextView;
800
+ return Select;
128
801
  }
129
802
  });
130
- Object.defineProperty(exports, "registerRichTextView", {
803
+ Object.defineProperty(exports, "registerSelect", {
131
804
  enumerable: true,
132
805
  get: function() {
133
- return registerRichTextView;
806
+ return registerSelect;
134
807
  }
135
808
  });
136
- Object.defineProperty(exports, "richTextViewDefinition", {
809
+ Object.defineProperty(exports, "selectDefinition", {
137
810
  enumerable: true,
138
811
  get: function() {
139
- return richTextViewDefinition;
812
+ return selectDefinition;
140
813
  }
141
814
  });