@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,100 +1,603 @@
1
- import { d as createRegisterFunction, n as replaces, t as VividElement, u as defineVividComponent } from "./vivid-element.js";
2
- import { r as Icon, t as iconDefinition } from "./definition.js";
1
+ import { d as createRegisterFunction, t as VividElement, u as defineVividComponent } from "./vivid-element.js";
3
2
  import { t as __decorate } from "./decorate.js";
4
- import { a as affixIconTemplateFactory, i as IconWrapper, t as AffixIcon } from "./affix.js";
5
- import { n as delegateAria, t as DelegatesAria } from "./delegates-aria.js";
6
- import { attr, html, ref } from "@microsoft/fast-element";
7
- import { classNames } from "@microsoft/fast-web-utilities";
8
- //#region src/lib/nav-disclosure/nav-disclosure.scss?inline
9
- var nav_disclosure_default = ".control.connotation-cta{--_connotation-color-primary:var(--vvd-nav-disclosure-cta-primary,var(--vvd-color-cta-500));--_connotation-color-primary-text:var(--vvd-nav-disclosure-cta-primary-text,var(--vvd-color-canvas));--_connotation-color-primary-increment:var(--vvd-nav-disclosure-cta-primary-increment,var(--vvd-color-cta-600));--_connotation-color-contrast:var(--vvd-nav-disclosure-cta-contrast,var(--vvd-color-cta-800));--_connotation-color-fierce:var(--vvd-nav-disclosure-cta-fierce,var(--vvd-color-cta-700));--_connotation-color-fierce-primary:var(--vvd-nav-disclosure-cta-fierce-primary,var(--vvd-color-cta-700));--_connotation-color-faint:var(--vvd-nav-disclosure-cta-faint,var(--vvd-color-cta-50));--_connotation-color-firm:var(--vvd-nav-disclosure-cta-firm,var(--vvd-color-cta-600));--_connotation-color-soft:var(--vvd-nav-disclosure-cta-soft,var(--vvd-color-cta-100))}.control:not(.connotation-cta){--_connotation-color-primary:var(--vvd-nav-disclosure-accent-primary,var(--vvd-color-canvas-text));--_connotation-color-primary-text:var(--vvd-nav-disclosure-accent-primary-text,var(--vvd-color-canvas));--_connotation-color-primary-increment:var(--vvd-nav-disclosure-accent-primary-increment,var(--vvd-color-neutral-800));--_connotation-color-contrast:var(--vvd-nav-disclosure-accent-contrast,var(--vvd-color-neutral-800));--_connotation-color-fierce:var(--vvd-nav-disclosure-accent-fierce,var(--vvd-color-neutral-700));--_connotation-color-fierce-primary:var(--vvd-nav-disclosure-accent-fierce-primary,var(--vvd-color-canvas-text));--_connotation-color-faint:var(--vvd-nav-disclosure-accent-faint,var(--vvd-color-neutral-50));--_connotation-color-firm:var(--vvd-nav-disclosure-accent-firm,var(--vvd-color-canvas-text));--_connotation-color-soft:var(--vvd-nav-disclosure-accent-soft,var(--vvd-color-neutral-100))}.control,.control.appearance-ghost-light{--_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(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-faint);--_appearance-color-outline:transparent}.control:hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-fierce-primary);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-primary), transparent 90%);--_appearance-color-outline:transparent}}.control.hover:where(:not(.disabled,:disabled,.readonly)){--_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-ghost-light{--_appearance-color-text:var(--_connotation-color-fierce-primary);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-primary), transparent 90%);--_appearance-color-outline:transparent}.control:active:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-soft);--_appearance-color-outline:transparent}.control:active:where(:not(.disabled,:disabled)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-fierce-primary);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-primary), transparent 80%);--_appearance-color-outline:transparent}.control.active:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--_connotation-color-firm);--_appearance-color-fill:var(--_connotation-color-soft);--_appearance-color-outline:transparent}.control.active:where(:not(.disabled,:disabled)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-fierce-primary);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-primary), transparent 80%);--_appearance-color-outline:transparent}.control.selected:where(:not(.disabled,:disabled)){--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:var(--_connotation-color-primary);--_appearance-color-outline:transparent}.control.selected:where(:not(.disabled,:disabled)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-firm), transparent 10%);--_appearance-color-outline:transparent}@media (hover:hover){.control.selected:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:var(--_connotation-color-primary-increment);--_appearance-color-outline:transparent}.control.selected:hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-fierce-primary), transparent 20%);--_appearance-color-outline:transparent}}.control.selected.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:var(--_connotation-color-primary-increment);--_appearance-color-outline:transparent}.control.selected.hover:where(:not(.disabled,:disabled,.readonly)).appearance-ghost-light{--_appearance-color-text:var(--_connotation-color-primary-text);--_appearance-color-fill:color-mix(in sRGB, var(--_connotation-color-fierce-primary), transparent 20%);--_appearance-color-outline:transparent}.control{box-sizing:border-box;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);cursor:pointer;font:var(--vvd-typography-base);hyphens:auto;inline-size:100%;min-block-size:calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density,0), 2)));vertical-align:middle;border-radius:8px;align-items:center;gap:12px;padding-block:10px;padding-inline:16px;text-decoration:none;display:flex}.control.current-closed{color:var(--_appearance-color-text)}@supports not (color:color-mix(in srgb, var(--one-color), var(--second-color))){.control.current-closed{background-color:var(--_connotation-color-primary)}}.control:not(.current-closed){color:var(--vvd-color-canvas-text);--focus-stroke-gap-color:transparent}.control:focus-visible{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))}.control{user-select:none}.control .toggleIcon{margin-inline-start:auto}slot[name=icon]{font-size:20px;line-height:1}.content{border-inline-start:1px solid var(--vvd-color-neutral-200);flex-direction:column;gap:4px;margin-block:4px;margin-inline-start:20px;padding-inline-start:12px;display:flex}details>summary{list-style:none}details>summary::-webkit-details-marker{display:none}";
3
+ import { n as applyHostSemantics, t as HostSemantics } from "./host-semantics.js";
4
+ import { n as isListboxOption } from "./option.js";
5
+ import { n as isOptgroup } from "./optgroup.js";
6
+ import { t as extractOptions } from "./extractOptions.js";
7
+ import { attr, html, observable, slotted, when } from "@microsoft/fast-element";
8
+ import { keySpace, uniqueId } from "@microsoft/fast-web-utilities";
9
+ import scrollIntoView from "scroll-into-view-if-needed";
10
+ //#region src/shared/listbox/with-options-filter.ts
11
+ function applyFilter(allOptions, allElements, optionFilter, searchText) {
12
+ const newFilteredOptions = [];
13
+ for (const option of allOptions) {
14
+ option._vvdSearchText = searchText;
15
+ const matches = !searchText || optionFilter(option, searchText);
16
+ option._isNotMatching = !matches;
17
+ if (!option.hidden && !option.disabled && matches) newFilteredOptions.push(option);
18
+ }
19
+ for (const el of allElements) if (isOptgroup(el)) {
20
+ const hasVisibleOption = Array.from(el.children).some((child) => isListboxOption(child) && !child._isNotMatching && !child.hidden);
21
+ el.style.display = hasVisibleOption ? "" : "none";
22
+ }
23
+ return newFilteredOptions;
24
+ }
25
+ var WithOptionsFilter = (Base) => {
26
+ class WithOptionsElement extends Base {
27
+ constructor(..._args) {
28
+ super(..._args);
29
+ this.searchText = "";
30
+ this._filteredOptions = [];
31
+ }
32
+ /** @internal */
33
+ _slottedOptionsChanged() {
34
+ super._slottedOptionsChanged();
35
+ this._updateFilter();
36
+ }
37
+ /** @internal */
38
+ searchTextChanged() {
39
+ this._updateFilter();
40
+ }
41
+ /** @internal */
42
+ optionFilterChanged() {
43
+ this._updateFilter();
44
+ }
45
+ /** @internal */
46
+ _updateFilter() {
47
+ this._filteredOptions = applyFilter(this._slottedOptions, this._slottedElements, this.optionFilter ?? ((option, searchText) => option.text.toLowerCase().includes(searchText.toLowerCase())), this.searchText);
48
+ }
49
+ }
50
+ __decorate([attr({
51
+ attribute: "search-text",
52
+ mode: "fromView"
53
+ })], WithOptionsElement.prototype, "searchText", void 0);
54
+ __decorate([observable], WithOptionsElement.prototype, "optionFilter", void 0);
55
+ __decorate([observable], WithOptionsElement.prototype, "_filteredOptions", void 0);
56
+ return WithOptionsElement;
57
+ };
58
+ //#endregion
59
+ //#region src/shared/listbox/with-options.ts
60
+ /** A mixin for elements that accept slotted options */
61
+ var WithOptions = (Base) => {
62
+ class WithOptionsElement extends Base {
63
+ constructor(..._args) {
64
+ super(..._args);
65
+ this._slottedElements = [];
66
+ this.#onOptgroupChange = () => {
67
+ this._slottedElementsChanged();
68
+ };
69
+ this._slottedOptions = [];
70
+ }
71
+ /** @internal */
72
+ _slottedElementsChanged() {
73
+ this._slottedOptions = extractOptions(this._slottedElements);
74
+ }
75
+ #onOptgroupChange;
76
+ connectedCallback() {
77
+ super.connectedCallback();
78
+ this.addEventListener("optgroup-change", this.#onOptgroupChange);
79
+ }
80
+ disconnectedCallback() {
81
+ super.disconnectedCallback();
82
+ this.removeEventListener("optgroup-change", this.#onOptgroupChange);
83
+ }
84
+ /** @internal */
85
+ _slottedOptionsChanged() {
86
+ for (const option of this._slottedOptions) if (!option.id) option.id = uniqueId("option-");
87
+ }
88
+ }
89
+ __decorate([observable], WithOptionsElement.prototype, "_slottedElements", void 0);
90
+ __decorate([observable], WithOptionsElement.prototype, "_slottedOptions", void 0);
91
+ return WithOptionsElement;
92
+ };
93
+ var optionsTemplate = html`<slot
94
+ ${slotted({
95
+ filter: ((n) => isListboxOption(n) || isOptgroup(n)),
96
+ flatten: true,
97
+ property: "_slottedElements"
98
+ })}
99
+ >
100
+ </slot>`;
101
+ //#endregion
102
+ //#region src/shared/listbox/selection.ts
103
+ var modifierKeys = (e) => {
104
+ const modKey = e.ctrlKey || e.metaKey;
105
+ return e.shiftKey && modKey ? "ShiftMod" : e.shiftKey ? "Shift" : modKey ? "Mod" : null;
106
+ };
107
+ var selectionForMove = (state, ctx, move, mods) => {
108
+ if (move.amount === "step" && mods === "Mod") return null;
109
+ if (ctx.selectionMode === "multiple") {
110
+ if (move.amount === "step" && mods === "Shift") return {
111
+ action: {
112
+ type: "extend-from-anchor",
113
+ anchorIndex: state.rangeAnchorIndex ?? state.activeIndex
114
+ },
115
+ replaceExisting: false
116
+ };
117
+ if (move.amount === "limit" && mods === "ShiftMod") return {
118
+ action: { type: "select-from-current" },
119
+ replaceExisting: false
120
+ };
121
+ }
122
+ if (ctx.selectionBehavior === "replace") return {
123
+ action: { type: "select" },
124
+ replaceExisting: true
125
+ };
126
+ return null;
127
+ };
128
+ /** How the selection should change when an option is triggered (by pressing Space or clicking) */
129
+ var selectionForTrigger = (ctx, mods) => {
130
+ if (mods === "Shift") return {
131
+ action: { type: "select-from-most-recent" },
132
+ replaceExisting: ctx.selectionBehavior === "replace"
133
+ };
134
+ if (mods === "Mod") return {
135
+ action: { type: "toggle" },
136
+ replaceExisting: false
137
+ };
138
+ if (ctx.selectionBehavior === "replace") return {
139
+ action: { type: "select" },
140
+ replaceExisting: true
141
+ };
142
+ return {
143
+ action: { type: "toggle" },
144
+ replaceExisting: false
145
+ };
146
+ };
147
+ function addRange(baseValues, ctx, fromIdx, toIdx) {
148
+ const baseSet = new Set(baseValues);
149
+ const [from, to] = [fromIdx, toIdx].sort((a, b) => a - b);
150
+ const newValues = [...baseValues];
151
+ for (let i = from; i <= to; i++) {
152
+ const v = ctx.selectable.optionValue(i);
153
+ if (!baseSet.has(v)) newValues.push(v);
154
+ }
155
+ return newValues;
156
+ }
157
+ function updateAnchoredRange(baseValues, ctx, anchorIdx, targetIdx, prevTargetIdx) {
158
+ const baseSet = new Set(baseValues);
159
+ const [from, , to] = [
160
+ anchorIdx,
161
+ targetIdx,
162
+ prevTargetIdx
163
+ ].sort((a, b) => a - b);
164
+ let newValues = [...baseValues];
165
+ for (let i = from; i <= to; i++) {
166
+ const v = ctx.selectable.optionValue(i);
167
+ if (i < anchorIdx && i < targetIdx || i > anchorIdx && i > targetIdx) {
168
+ if (baseSet.has(v)) newValues = newValues.filter((val) => val !== v);
169
+ } else if (!baseSet.has(v)) newValues.push(v);
170
+ }
171
+ return newValues;
172
+ }
173
+ function mostRecentlySelectedIndex(state, ctx) {
174
+ const values = state.values;
175
+ for (let i = values.length - 1; i >= 0; i--) {
176
+ const index = ctx.selectable.optionIndex(values[i]);
177
+ if (index !== null) return index;
178
+ }
179
+ return null;
180
+ }
181
+ function applyAction(state, ctx, command) {
182
+ const newState = (v) => {
183
+ return {
184
+ ...state,
185
+ values: v.values ?? state.values,
186
+ activeIndex: v.activeIndex ?? state.activeIndex,
187
+ rangeAnchorIndex: v.rangeAnchorIndex ?? null
188
+ };
189
+ };
190
+ if (command.type !== "action") return newState({});
191
+ const prevValues = state.values;
192
+ const { targetIndex, selection } = command;
193
+ const enforceRestrictions = (newValues) => {
194
+ if (ctx.selectionMode === "single" && newValues.length > 1) return [newValues[newValues.length - 1]];
195
+ if (ctx.requiredSelection !== "none") {
196
+ if (newValues.length === 0) return prevValues;
197
+ if (ctx.requiredSelection === "selectable") {
198
+ if (!newValues.some((v) => ctx.selectable.optionIndex(v) !== null)) return prevValues;
199
+ }
200
+ }
201
+ return newValues;
202
+ };
203
+ const targetValue = ctx.selectable.optionValue(targetIndex);
204
+ const baseValues = selection?.replaceExisting ? [] : prevValues;
205
+ switch (selection?.action.type) {
206
+ case void 0: return newState({ activeIndex: targetIndex });
207
+ case "select": return newState({
208
+ activeIndex: targetIndex,
209
+ values: enforceRestrictions(prevValues.includes(targetValue) ? prevValues : [...baseValues, targetValue])
210
+ });
211
+ case "toggle": return newState({
212
+ activeIndex: targetIndex,
213
+ values: enforceRestrictions(prevValues.includes(targetValue) ? baseValues.filter((v) => v !== targetValue) : [...baseValues, targetValue])
214
+ });
215
+ case "select-from-current": return newState({
216
+ activeIndex: targetIndex,
217
+ values: enforceRestrictions(addRange(baseValues, ctx, state.activeIndex, targetIndex))
218
+ });
219
+ case "select-from-most-recent": return newState({
220
+ activeIndex: targetIndex,
221
+ values: enforceRestrictions(addRange(baseValues, ctx, mostRecentlySelectedIndex(state, ctx) ?? 0, targetIndex))
222
+ });
223
+ case "extend-from-anchor": return newState({
224
+ values: enforceRestrictions(updateAnchoredRange(baseValues, ctx, selection.action.anchorIndex, targetIndex, state.activeIndex)),
225
+ activeIndex: targetIndex,
226
+ rangeAnchorIndex: selection.action.anchorIndex
227
+ });
228
+ }
229
+ }
10
230
  //#endregion
11
- //#region src/lib/nav-disclosure/nav-disclosure.ts
231
+ //#region src/shared/listbox/typeahead.ts
232
+ var TypeaheadTimeout = 2e3;
233
+ function typeaheadFromKey(state, _ctx, key, now) {
234
+ const typeahead = state.typeahead && state.typeahead.lastInputMs > now - TypeaheadTimeout ? state.typeahead : null;
235
+ return key.length === 1 && !(key === keySpace && !typeahead) ? {
236
+ buffer: (typeahead?.buffer ?? "") + key,
237
+ lastInputMs: now
238
+ } : null;
239
+ }
240
+ function applyTypeahead(state, ctx, command) {
241
+ if (command.type !== "typeahead") return {
242
+ ...state,
243
+ typeahead: null
244
+ };
245
+ const typeahead = command.typeahead;
246
+ for (let candidateIdx = (state.activeIndex + 1) % ctx.selectable.numOptions; candidateIdx !== state.activeIndex; candidateIdx = (candidateIdx + 1) % ctx.selectable.numOptions) if (ctx.selectable.optionText(candidateIdx).toLowerCase().startsWith(typeahead.buffer.toLowerCase())) return {
247
+ ...applyAction(state, ctx, {
248
+ type: "action",
249
+ targetIndex: candidateIdx,
250
+ selection: command.selection
251
+ }),
252
+ typeahead
253
+ };
254
+ return {
255
+ ...state,
256
+ typeahead
257
+ };
258
+ }
259
+ //#endregion
260
+ //#region src/shared/listbox/options.ts
261
+ var optionsInterface = (options) => ({
262
+ numOptions: options.length,
263
+ optionValue: (index) => options[index].value,
264
+ optionText: (index) => options[index].text,
265
+ optionIndex: (value) => {
266
+ const index = options.findIndex((o) => o.value === value);
267
+ return index === -1 ? null : index;
268
+ },
269
+ isEq: (newOptions) => options === newOptions
270
+ });
271
+ function initialValues(ctx, allOptions, providedValues) {
272
+ const selectedValues = allOptions.filter((option) => option.selected || providedValues.includes(option.value)).map((o) => o.value);
273
+ const maxSelected = ctx.selectionMode === "single" ? 1 : Infinity;
274
+ return ensureRequiredSelection(ctx, selectedValues.slice(0, maxSelected), maxSelected);
275
+ }
276
+ //#endregion
277
+ //#region src/shared/listbox/state.ts
278
+ function isUIState(state) {
279
+ return "activeIndex" in state;
280
+ }
281
+ function applyContextChange(state, newCtx, requestedValues) {
282
+ const validValues = requestedValues.filter((v) => newCtx.all.optionIndex(v) !== null);
283
+ const maxSelected = newCtx.selectionMode === "single" ? 1 : Infinity;
284
+ let values = validValues.slice(0, maxSelected);
285
+ values = ensureRequiredSelection(newCtx, values, maxSelected);
286
+ return {
287
+ ...state,
288
+ values
289
+ };
290
+ }
291
+ /**
292
+ * Applies the `requiredSelection` restriction to a set of values, selecting a selectable option if needed.
293
+ * @internal
294
+ */
295
+ function ensureRequiredSelection(ctx, values, maxSelected) {
296
+ if (ctx.requiredSelection === "none" || ctx.selectable.numOptions === 0) return values;
297
+ if (values.length === 0) return [ctx.selectable.optionValue(0)];
298
+ if (ctx.requiredSelection === "selectable") {
299
+ if (!values.some((v) => ctx.selectable.optionIndex(v) !== null)) return maxSelected === 1 ? [ctx.selectable.optionValue(0)] : [...values, ctx.selectable.optionValue(0)];
300
+ }
301
+ return values;
302
+ }
303
+ function initialState(ctx, providedOptions, providedValues) {
304
+ const values = initialValues(ctx, providedOptions, providedValues);
305
+ if (ctx.selectable.numOptions === 0) return valuesOnlyState(values);
306
+ let activeIndex = 0;
307
+ for (const candidate of values) {
308
+ const index = ctx.selectable.optionIndex(candidate);
309
+ if (index !== null) {
310
+ activeIndex = index;
311
+ break;
312
+ }
313
+ }
314
+ return {
315
+ values,
316
+ activeIndex,
317
+ typeahead: null,
318
+ rangeAnchorIndex: null
319
+ };
320
+ }
321
+ function valuesOnlyState(values) {
322
+ return { values };
323
+ }
324
+ //#endregion
325
+ //#region src/shared/listbox/move.ts
326
+ function moveFromKey(key) {
327
+ switch (key) {
328
+ case "Home": return {
329
+ direction: "backward",
330
+ amount: "limit"
331
+ };
332
+ case "End": return {
333
+ direction: "forward",
334
+ amount: "limit"
335
+ };
336
+ case "PageUp": return {
337
+ direction: "backward",
338
+ amount: "page"
339
+ };
340
+ case "PageDown": return {
341
+ direction: "forward",
342
+ amount: "page"
343
+ };
344
+ case "ArrowUp": return {
345
+ direction: "backward",
346
+ amount: "step"
347
+ };
348
+ case "ArrowDown": return {
349
+ direction: "forward",
350
+ amount: "step"
351
+ };
352
+ }
353
+ return null;
354
+ }
355
+ function moveIndex(index, numItems, pageSize, move) {
356
+ const limits = {
357
+ backward: 0,
358
+ forward: numItems - 1
359
+ };
360
+ const dirs = {
361
+ backward: -1,
362
+ forward: 1
363
+ };
364
+ const amounts = {
365
+ step: 1,
366
+ page: pageSize
367
+ };
368
+ switch (move.amount) {
369
+ case "limit": return limits[move.direction];
370
+ case "page":
371
+ case "step": return Math.min(limits.forward, Math.max(limits.backward, index + dirs[move.direction] * amounts[move.amount]));
372
+ }
373
+ }
374
+ //#endregion
375
+ //#region src/shared/listbox/commands.ts
376
+ var PageSize = 10;
377
+ function commandFromKey(state, ctx, e, now) {
378
+ if (!isUIState(state)) return null;
379
+ const typeahead = typeaheadFromKey(state, ctx, e.key, now);
380
+ if (typeahead) return {
381
+ type: "typeahead",
382
+ typeahead,
383
+ selection: ctx.selectionBehavior === "replace" ? {
384
+ action: { type: "select" },
385
+ replaceExisting: true
386
+ } : null
387
+ };
388
+ const move = moveFromKey(e.key);
389
+ if (move) return {
390
+ type: "action",
391
+ targetIndex: moveIndex(state.activeIndex, ctx.selectable.numOptions, PageSize, move),
392
+ selection: selectionForMove(state, ctx, move, modifierKeys(e))
393
+ };
394
+ if (e.key === " ") return {
395
+ type: "action",
396
+ targetIndex: state.activeIndex,
397
+ selection: selectionForTrigger(ctx, modifierKeys(e))
398
+ };
399
+ return null;
400
+ }
401
+ function commandFromClick(_state, ctx, e, targetIndex) {
402
+ return {
403
+ type: "action",
404
+ targetIndex,
405
+ selection: selectionForTrigger(ctx, modifierKeys(e))
406
+ };
407
+ }
408
+ function apply(state, context, command) {
409
+ state = applyTypeahead(state, context, command);
410
+ state = applyAction(state, context, command);
411
+ return state;
412
+ }
413
+ //#endregion
414
+ //#region src/lib/listbox/listbox.ts
415
+ var deepEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
12
416
  /**
13
417
  * @public
14
- * @component nav-disclosure
15
- * @slot - Default slot.
16
- * @slot meta - A slot to add additional content to the nav disclosure.
17
- * @slot icon - The preferred way to add an icon to the component.
18
- * @event {CustomEvent<undefined>} toggle - Event emitted when the nav disclosure is toggled.
19
- * @testSelector byLabel byLabel
20
- * @testAction expand toggleNavDisclosure true
21
- * @testAction collapse toggleNavDisclosure false
22
- * @testQuery current navCurrent true
23
- * @testQuery !current navCurrent false
24
- * @testQuery open open true
25
- * @testQuery closed open false
26
- * @testRef summary shadow summary
418
+ * @component listbox
419
+ * @slot - Holds the available options.
420
+ * @slot no-matches - Message that appears when no options match the search query.
421
+ * @event {CustomEvent<undefined>} change - Fired when the selected options change.
422
+ * @vueModel modelValue value change `event.currentTarget.value`
423
+ * @vueModel values values change `event.currentTarget.values`
27
424
  */
28
- var NavDisclosure = class extends AffixIcon(DelegatesAria(VividElement)) {
425
+ var Listbox = class extends WithOptionsFilter(WithOptions(HostSemantics(VividElement))) {
29
426
  constructor(..._args) {
30
427
  super(..._args);
31
- this.open = false;
32
- this.current = false;
33
- this.#onToggle = () => {
34
- this.open = this.details.open;
35
- this.$emit("toggle", void 0, { bubbles: false });
428
+ this.selectionMode = "single";
429
+ this.selectionBehavior = "toggle";
430
+ this.requiredSelection = "none";
431
+ this._activeDescendantId = null;
432
+ this.values = [];
433
+ this._state = valuesOnlyState([]);
434
+ this._ctx = {
435
+ selectionMode: "single",
436
+ selectionBehavior: "toggle",
437
+ requiredSelection: "none",
438
+ selectable: optionsInterface([]),
439
+ all: optionsInterface([])
36
440
  };
441
+ this._externalChangeQueued = false;
442
+ }
443
+ /** @internal */
444
+ selectionModeChanged() {
445
+ this._registerExternalChange();
37
446
  }
38
447
  /** @internal */
39
- connectedCallback() {
40
- super.connectedCallback();
41
- this.details.addEventListener("toggle", this.#onToggle);
42
- this.details.open = this.open;
448
+ selectionBehaviorChanged() {
449
+ this._registerExternalChange();
43
450
  }
44
451
  /** @internal */
45
- disconnectedCallback() {
46
- super.disconnectedCallback();
47
- this.details.removeEventListener("toggle", this.#onToggle);
452
+ requiredSelectionChanged() {
453
+ this._registerExternalChange();
454
+ }
455
+ /** @internal */
456
+ _filteredOptionsChanged() {
457
+ this._registerExternalChange();
458
+ }
459
+ /** @internal */
460
+ valuesChanged() {
461
+ if (this._state && !deepEqual(this._state.values, this.values)) this._registerExternalChange();
462
+ }
463
+ /** The first selected option value, or `null` if no option is selected. In single-selection mode, this can be used as an alternative to `values`. */
464
+ get value() {
465
+ return this.values[0] ?? null;
466
+ }
467
+ set value(value) {
468
+ this.values = value === null ? [] : [value];
469
+ }
470
+ /**
471
+ * Use a microtask to batch multiple synchronous changes. Otherwise, we may update the state based on half-applied changes.
472
+ * @internal
473
+ */
474
+ _registerExternalChange() {
475
+ if (!this._externalChangeQueued) {
476
+ this._externalChangeQueued = true;
477
+ queueMicrotask(() => this._applyPendingExternalChanges());
478
+ }
479
+ }
480
+ /**
481
+ * React to external changes of props or options
482
+ * @internal
483
+ */
484
+ _applyPendingExternalChanges() {
485
+ this._externalChangeQueued = false;
486
+ if (!this._ctx.all.isEq(this._slottedOptions) || !this._ctx.selectable.isEq(this._filteredOptions)) {
487
+ this._initializeState();
488
+ return;
489
+ }
490
+ const newCtx = {
491
+ ...this._ctx,
492
+ selectionMode: this.selectionMode,
493
+ selectionBehavior: this.selectionBehavior,
494
+ requiredSelection: this.requiredSelection
495
+ };
496
+ this._ctx = newCtx;
497
+ this._applyNewState(applyContextChange(this._state, newCtx, this.values));
498
+ }
499
+ /** @internal */
500
+ _initializeState() {
501
+ this._ctx = {
502
+ selectionMode: this.selectionMode,
503
+ selectionBehavior: this.selectionBehavior,
504
+ requiredSelection: this.requiredSelection,
505
+ selectable: optionsInterface(this._filteredOptions),
506
+ all: optionsInterface(this._slottedOptions)
507
+ };
508
+ if (!this._slottedOptions?.length) {
509
+ this._state = valuesOnlyState([]);
510
+ this._activeDescendantId = null;
511
+ return;
512
+ }
513
+ this._applyNewState(initialState(this._ctx, this._slottedOptions, this.values));
514
+ }
515
+ /** @internal */
516
+ _applyNewState(toState) {
517
+ if (isUIState(toState)) {
518
+ const activeOption = this._filteredOptions[toState.activeIndex];
519
+ this._activeDescendantId = activeOption.id;
520
+ scrollIntoView(activeOption, {
521
+ block: "nearest",
522
+ scrollMode: "if-needed"
523
+ });
524
+ } else this._activeDescendantId = null;
525
+ const valuesChanged = !deepEqual(this.values, toState.values);
526
+ this._state = toState;
527
+ this.values = [...toState.values];
528
+ this._updateSlottedOptions();
529
+ if (valuesChanged) this.$emit("change", void 0, {
530
+ bubbles: false,
531
+ composed: false
532
+ });
533
+ }
534
+ /** @internal */
535
+ _updateSlottedOptions() {
536
+ for (const option of this._slottedOptions) {
537
+ option.selected = this.values.includes(option.value);
538
+ option._highlighted = Boolean(this._activeDescendantId && option.id === this._activeDescendantId);
539
+ }
540
+ }
541
+ /** @internal */
542
+ _onKeydown(e) {
543
+ const command = commandFromKey(this._state, this._ctx, e, Date.now());
544
+ if (command) {
545
+ this._applyNewState(apply(this._state, this._ctx, command));
546
+ return false;
547
+ }
548
+ return true;
549
+ }
550
+ /** @internal */
551
+ _onClick(e) {
552
+ const clickedOnOption = e.target.closest(`[data-vvd-component=option]`);
553
+ const targetIndex = clickedOnOption ? this._filteredOptions.indexOf(clickedOnOption) : -1;
554
+ if (targetIndex === -1) return true;
555
+ const state = this._state;
556
+ this._applyNewState(apply(state, this._ctx, commandFromClick(state, this._ctx, e, targetIndex)));
557
+ return false;
48
558
  }
49
- #onToggle;
50
559
  };
51
- __decorate([attr], NavDisclosure.prototype, "label", void 0);
52
- __decorate([attr], NavDisclosure.prototype, "appearance", void 0);
53
- __decorate([attr], NavDisclosure.prototype, "connotation", void 0);
54
- __decorate([attr({ mode: "boolean" })], NavDisclosure.prototype, "open", void 0);
55
- __decorate([replaces({
56
- deprecatedPropertyName: "ariaCurrent",
57
- fromDeprecated: (v) => Boolean(v),
58
- toDeprecated: (v) => v ? "true" : null
59
- }), attr({
60
- attribute: "current",
61
- mode: "boolean"
62
- })], NavDisclosure.prototype, "current", void 0);
560
+ __decorate([attr({
561
+ attribute: "selection-mode",
562
+ mode: "fromView"
563
+ })], Listbox.prototype, "selectionMode", void 0);
564
+ __decorate([attr({
565
+ attribute: "selection-behavior",
566
+ mode: "fromView"
567
+ })], Listbox.prototype, "selectionBehavior", void 0);
568
+ __decorate([attr({
569
+ attribute: "required-selection",
570
+ mode: "fromView"
571
+ })], Listbox.prototype, "requiredSelection", void 0);
572
+ __decorate([observable], Listbox.prototype, "_activeDescendantId", void 0);
573
+ __decorate([observable], Listbox.prototype, "values", void 0);
574
+ //#endregion
575
+ //#region src/lib/listbox/listbox.scss?inline
576
+ var listbox_default = ":host{outline:none;flex-direction:column;gap:2px;display:flex}:host(:not(:focus-visible)){--_suppressable-focus-shadow:none;--_suppressable-focus-outline:none;--_suppressable-focus-outline-offset:0}";
63
577
  //#endregion
64
- //#region src/lib/nav-disclosure/nav-disclosure.template.ts
65
- var NavDisclosureTemplate = (context) => {
66
- const affixIconTemplate = affixIconTemplateFactory(context);
67
- const iconTag = context.tagFor(Icon);
68
- return html`<details class="base" ${ref("details")} ?open=${(x) => x.open}>
69
- <summary class="${(x) => classNames("control", [`appearance-${x.appearance}`, Boolean(x.appearance)], [`connotation-${x.connotation}`, Boolean(x.connotation)], ["current-closed selected", x.current && !x.open])}"
70
- ${delegateAria({
71
- role: "button",
72
- ariaExpanded: (x) => x.open,
73
- ariaCurrent: (x) => x.open ? null : x.current || x.ariaCurrent ? "true" : null,
74
- ariaControls: "disclosure-content"
578
+ //#region src/lib/listbox/listbox.template.ts
579
+ var listboxTemplate = (_context) => {
580
+ return html`<template
581
+ tabindex="0"
582
+ ${applyHostSemantics({
583
+ role: "listbox",
584
+ ariaMultiSelectable: (x) => x.selectionMode === "multiple" ? "true" : void 0
75
585
  })}
76
- >
77
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
78
- ${(x) => x.label}
79
- <slot name="meta"></slot>
80
- <${iconTag} class="toggleIcon" name=${(x) => x.open ? "chevron-up-line" : "chevron-down-line"}
81
- aria-hidden="true"></${iconTag}>
82
- </summary>
83
- <div class="content" id="disclosure-content">
84
- <slot></slot>
85
- </div>
86
- </details>
87
- `;
586
+ aria-activedescendant="${(x) => x._activeDescendantId}"
587
+ @click="${(x, c) => x._onClick(c.event)}"
588
+ @keydown="${(x, c) => x._onKeydown(c.event)}"
589
+ >${optionsTemplate}${when((x) => x.searchText !== "" && x._filteredOptions.length === 0, html`<slot name="no-matches"></slot>`)}</template
590
+ >`;
88
591
  };
89
592
  //#endregion
90
- //#region src/lib/nav-disclosure/definition.ts
593
+ //#region src/lib/listbox/definition.ts
91
594
  /** @internal */
92
- var navDisclosureDefinition = defineVividComponent("nav-disclosure", NavDisclosure, NavDisclosureTemplate, [iconDefinition], { styles: nav_disclosure_default });
595
+ var listboxDefinition = defineVividComponent("listbox", Listbox, listboxTemplate, [], { styles: listbox_default });
93
596
  /**
94
- * Registers the nav-disclosure elements with the design system.
597
+ * Registers the listbox elements with the design system.
95
598
  *
96
599
  * @param prefix - the prefix to use for the component name
97
600
  */
98
- var registerNavDisclosure = createRegisterFunction(navDisclosureDefinition);
601
+ var registerListbox = createRegisterFunction(listboxDefinition);
99
602
  //#endregion
100
- export { registerNavDisclosure as n, NavDisclosure as r, navDisclosureDefinition as t };
603
+ export { registerListbox as n, Listbox as r, listboxDefinition as t };