@vonage/vivid 4.17.0 → 4.19.0-preview.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 (364) hide show
  1. package/custom-elements.json +4248 -4149
  2. package/date-time-picker/index.cjs +5 -0
  3. package/date-time-picker/index.js +3 -0
  4. package/dial-pad/index.cjs +1 -1
  5. package/dial-pad/index.js +1 -1
  6. package/dialog/index.cjs +1 -1
  7. package/dialog/index.js +1 -1
  8. package/divider/index.cjs +1 -1
  9. package/divider/index.js +1 -1
  10. package/elevation/index.cjs +1 -1
  11. package/elevation/index.js +1 -1
  12. package/empty-state/index.cjs +1 -1
  13. package/empty-state/index.js +1 -1
  14. package/fab/index.cjs +1 -1
  15. package/fab/index.js +1 -1
  16. package/file-picker/index.cjs +1 -1
  17. package/file-picker/index.js +1 -1
  18. package/header/index.cjs +1 -1
  19. package/header/index.js +1 -1
  20. package/icon/index.cjs +1 -1
  21. package/icon/index.js +1 -1
  22. package/index.cjs +136 -133
  23. package/index.js +45 -44
  24. package/layout/index.cjs +1 -1
  25. package/layout/index.js +1 -1
  26. package/lib/action-group/action-group.d.ts +449 -3
  27. package/lib/banner/banner.d.ts +449 -3
  28. package/lib/breadcrumb-item/breadcrumb-item.d.ts +449 -1
  29. package/lib/checkbox/checkbox.d.ts +449 -4
  30. package/lib/components.d.ts +1 -0
  31. package/lib/date-picker/date-picker.d.ts +2182 -4
  32. package/lib/date-picker/date-picker.template.d.ts +2 -0
  33. package/lib/date-range-picker/date-range-picker.d.ts +1110 -4
  34. package/lib/date-range-picker/date-range-picker.template.d.ts +2 -0
  35. package/lib/date-time-picker/date-time-picker.d.ts +2175 -0
  36. package/lib/date-time-picker/date-time-picker.template.d.ts +2 -0
  37. package/lib/date-time-picker/definition.d.ts +1 -0
  38. package/lib/date-time-picker/locale.d.ts +9 -0
  39. package/lib/dialog/dialog.d.ts +449 -2
  40. package/lib/divider/divider.d.ts +448 -1
  41. package/lib/menu/menu.d.ts +446 -1
  42. package/lib/nav-disclosure/nav-disclosure.d.ts +449 -2
  43. package/lib/number-field/number-field.d.ts +450 -3
  44. package/lib/option/option.d.ts +4 -11
  45. package/lib/progress/progress.d.ts +449 -2
  46. package/lib/progress-ring/progress-ring.d.ts +449 -2
  47. package/lib/rich-text-editor/facades/vivid-prose-mirror.facade.d.ts +1 -0
  48. package/lib/rich-text-editor/rich-text-editor.d.ts +7 -4
  49. package/lib/searchable-select/searchable-select.d.ts +3 -0
  50. package/lib/select/select.d.ts +1 -5
  51. package/lib/selectable-box/selectable-box.d.ts +449 -2
  52. package/lib/slider/slider.d.ts +449 -3
  53. package/lib/split-button/split-button.d.ts +449 -3
  54. package/lib/switch/switch.d.ts +449 -2
  55. package/lib/tag-group/tag-group.d.ts +449 -2
  56. package/lib/text-anchor/text-anchor.d.ts +449 -1
  57. package/lib/text-area/text-area.d.ts +450 -3
  58. package/lib/text-field/text-field.d.ts +450 -7
  59. package/lib/time-picker/locale.d.ts +0 -2
  60. package/lib/time-picker/time-picker.d.ts +1053 -9
  61. package/lib/time-picker/time-picker.template.d.ts +2 -1
  62. package/locales/de-DE.cjs +29 -5
  63. package/locales/de-DE.js +29 -5
  64. package/locales/en-GB.cjs +29 -5
  65. package/locales/en-GB.js +29 -5
  66. package/locales/en-US.cjs +29 -5
  67. package/locales/en-US.js +29 -5
  68. package/locales/ja-JP.cjs +29 -5
  69. package/locales/ja-JP.js +29 -5
  70. package/locales/zh-CN.cjs +29 -5
  71. package/locales/zh-CN.js +29 -5
  72. package/menu/index.cjs +1 -1
  73. package/menu/index.js +1 -1
  74. package/menu-item/index.cjs +1 -1
  75. package/menu-item/index.js +1 -1
  76. package/nav/index.cjs +1 -1
  77. package/nav/index.js +1 -1
  78. package/nav-disclosure/index.cjs +1 -1
  79. package/nav-disclosure/index.js +1 -1
  80. package/nav-item/index.cjs +1 -1
  81. package/nav-item/index.js +1 -1
  82. package/note/index.cjs +1 -1
  83. package/note/index.js +1 -1
  84. package/number-field/index.cjs +1 -1
  85. package/number-field/index.js +1 -1
  86. package/option/index.cjs +1 -1
  87. package/option/index.js +1 -1
  88. package/package.json +1 -1
  89. package/pagination/index.cjs +1 -1
  90. package/pagination/index.js +1 -1
  91. package/popup/index.cjs +1 -1
  92. package/popup/index.js +1 -1
  93. package/progress/index.cjs +1 -1
  94. package/progress/index.js +1 -1
  95. package/progress-ring/index.cjs +1 -1
  96. package/progress-ring/index.js +1 -1
  97. package/radio/index.cjs +1 -1
  98. package/radio/index.js +1 -1
  99. package/radio-group/index.cjs +1 -1
  100. package/radio-group/index.js +1 -1
  101. package/range-slider/index.cjs +1 -1
  102. package/range-slider/index.js +1 -1
  103. package/rich-text-editor/index.cjs +1 -1
  104. package/rich-text-editor/index.js +1 -1
  105. package/searchable-select/index.cjs +1 -1
  106. package/searchable-select/index.js +1 -1
  107. package/select/index.cjs +1 -1
  108. package/select/index.js +1 -1
  109. package/selectable-box/index.cjs +1 -1
  110. package/selectable-box/index.js +1 -1
  111. package/shared/Reflector.cjs +71 -0
  112. package/shared/Reflector.js +69 -0
  113. package/shared/affix.cjs +1 -1
  114. package/shared/affix.js +1 -1
  115. package/shared/anchor.cjs +0 -10
  116. package/shared/anchor.js +0 -10
  117. package/shared/aria/delegates-aria.d.ts +454 -0
  118. package/shared/base-progress.js +1 -1
  119. package/shared/breadcrumb-item.cjs +2 -1
  120. package/shared/breadcrumb-item.js +2 -1
  121. package/shared/button.cjs +2 -13
  122. package/shared/button.js +2 -13
  123. package/shared/{presentationDate.cjs → calendar-picker.template.cjs} +730 -900
  124. package/shared/{presentationDate.js → calendar-picker.template.js} +672 -845
  125. package/shared/datetime/dateTimeStr.d.ts +6 -0
  126. package/shared/datetime/presentationDate.d.ts +4 -0
  127. package/shared/{date-picker/calendar → datetime}/presentationDateRange.d.ts +3 -3
  128. package/shared/datetime/presentationDateTime.d.ts +4 -0
  129. package/{lib/time-picker/time → shared/datetime}/time.d.ts +1 -0
  130. package/shared/definition.cjs +1 -1
  131. package/shared/definition.js +1 -1
  132. package/shared/definition11.cjs +8 -11
  133. package/shared/definition11.js +8 -11
  134. package/shared/definition14.cjs +2 -2
  135. package/shared/definition14.js +2 -2
  136. package/shared/definition15.cjs +3 -10
  137. package/shared/definition15.js +3 -10
  138. package/shared/definition16.cjs +29 -33
  139. package/shared/definition16.js +29 -33
  140. package/shared/definition17.cjs +1 -1
  141. package/shared/definition17.js +1 -1
  142. package/shared/definition18.cjs +56 -91
  143. package/shared/definition18.js +56 -91
  144. package/shared/definition19.cjs +68 -32
  145. package/shared/definition19.js +58 -22
  146. package/shared/definition20.cjs +253 -220
  147. package/shared/definition20.js +254 -220
  148. package/shared/definition21.cjs +200 -286
  149. package/shared/definition21.js +198 -284
  150. package/shared/definition22.cjs +302 -31
  151. package/shared/definition22.js +301 -30
  152. package/shared/definition23.cjs +37 -58
  153. package/shared/definition23.js +36 -57
  154. package/shared/definition24.cjs +50 -70
  155. package/shared/definition24.js +49 -69
  156. package/shared/definition25.cjs +75 -2475
  157. package/shared/definition25.js +74 -2475
  158. package/shared/definition26.cjs +2480 -50
  159. package/shared/definition26.js +2479 -48
  160. package/shared/definition27.cjs +53 -271
  161. package/shared/definition27.js +52 -269
  162. package/shared/definition28.cjs +271 -48
  163. package/shared/definition28.js +269 -47
  164. package/shared/definition29.cjs +37 -764
  165. package/shared/definition29.js +36 -758
  166. package/shared/definition3.cjs +2 -9
  167. package/shared/definition3.js +2 -9
  168. package/shared/definition30.cjs +739 -57
  169. package/shared/definition30.js +733 -56
  170. package/shared/definition31.cjs +93 -22
  171. package/shared/definition31.js +92 -21
  172. package/shared/definition32.cjs +28 -10
  173. package/shared/definition32.js +27 -9
  174. package/shared/definition33.cjs +10 -52
  175. package/shared/definition33.js +9 -51
  176. package/shared/definition34.cjs +30 -411
  177. package/shared/definition34.js +30 -412
  178. package/shared/definition35.cjs +422 -52
  179. package/shared/definition35.js +423 -53
  180. package/shared/definition36.cjs +54 -216
  181. package/shared/definition36.js +54 -215
  182. package/shared/definition37.cjs +201 -71
  183. package/shared/definition37.js +200 -70
  184. package/shared/definition38.cjs +53 -48
  185. package/shared/definition38.js +51 -46
  186. package/shared/definition39.cjs +57 -263
  187. package/shared/definition39.js +56 -262
  188. package/shared/definition4.cjs +2 -2
  189. package/shared/definition4.js +2 -2
  190. package/shared/definition40.cjs +220 -148
  191. package/shared/definition40.js +220 -148
  192. package/shared/definition41.cjs +143 -567
  193. package/shared/definition41.js +143 -568
  194. package/shared/definition42.cjs +596 -12573
  195. package/shared/definition42.js +596 -12573
  196. package/shared/definition43.cjs +13489 -1058
  197. package/shared/definition43.js +13489 -1059
  198. package/shared/definition44.cjs +968 -696
  199. package/shared/definition44.js +970 -697
  200. package/shared/definition45.cjs +850 -105
  201. package/shared/definition45.js +850 -104
  202. package/shared/definition46.cjs +110 -90
  203. package/shared/definition46.js +108 -88
  204. package/shared/definition47.cjs +88 -464
  205. package/shared/definition47.js +87 -463
  206. package/shared/definition48.cjs +457 -111
  207. package/shared/definition48.js +456 -110
  208. package/shared/definition49.cjs +103 -109
  209. package/shared/definition49.js +102 -108
  210. package/shared/definition5.cjs +3 -3
  211. package/shared/definition5.js +3 -3
  212. package/shared/definition50.cjs +136 -14
  213. package/shared/definition50.js +135 -13
  214. package/shared/definition51.cjs +16 -115
  215. package/shared/definition51.js +15 -114
  216. package/shared/definition52.cjs +79 -486
  217. package/shared/definition52.js +78 -485
  218. package/shared/definition53.cjs +503 -24
  219. package/shared/definition53.js +502 -23
  220. package/shared/definition54.cjs +23 -137
  221. package/shared/definition54.js +22 -136
  222. package/shared/definition55.cjs +96 -241
  223. package/shared/definition55.js +95 -241
  224. package/shared/definition56.cjs +261 -61
  225. package/shared/definition56.js +260 -60
  226. package/shared/definition57.cjs +419 -788
  227. package/shared/definition57.js +420 -789
  228. package/shared/definition58.cjs +27 -144
  229. package/shared/definition58.js +27 -143
  230. package/shared/definition59.cjs +83 -54
  231. package/shared/definition59.js +82 -53
  232. package/shared/definition6.cjs +1 -1
  233. package/shared/definition6.js +1 -1
  234. package/shared/definition60.cjs +80 -165
  235. package/shared/definition60.js +79 -163
  236. package/shared/definition61.cjs +143 -230
  237. package/shared/definition61.js +141 -229
  238. package/shared/definition62.cjs +233 -69344
  239. package/shared/definition62.js +232 -69343
  240. package/shared/definition63.cjs +69381 -28
  241. package/shared/definition63.js +69379 -26
  242. package/shared/definition64.cjs +28 -2168
  243. package/shared/definition64.js +27 -2166
  244. package/shared/definition65.cjs +2195 -0
  245. package/shared/definition65.js +2190 -0
  246. package/shared/definition7.cjs +1 -1
  247. package/shared/definition7.js +1 -1
  248. package/shared/definition8.cjs +3 -9
  249. package/shared/definition8.js +3 -9
  250. package/shared/definition9.cjs +1 -1
  251. package/shared/definition9.js +1 -1
  252. package/shared/delegates-aria.cjs +69 -0
  253. package/shared/delegates-aria.js +67 -0
  254. package/shared/form-associated.js +1 -1
  255. package/shared/form-elements.cjs +1 -1
  256. package/shared/form-elements.js +1 -1
  257. package/shared/foundation/anchor/anchor.d.ts +0 -8
  258. package/shared/foundation/button/button.d.ts +449 -7
  259. package/shared/foundation/listbox/listbox.d.ts +0 -9
  260. package/shared/listbox.cjs +4 -30
  261. package/shared/listbox.js +4 -30
  262. package/shared/localization/Locale.d.ts +6 -2
  263. package/shared/option.cjs +38 -50
  264. package/shared/option.js +39 -51
  265. package/shared/picker-field/locale.d.ts +4 -0
  266. package/shared/picker-field/mixins/calendar-picker.d.ts +558 -0
  267. package/shared/{date-picker/locale.d.ts → picker-field/mixins/calendar-picker.locale.d.ts} +1 -3
  268. package/shared/picker-field/mixins/calendar-picker.template.d.ts +555 -0
  269. package/shared/picker-field/mixins/calendar-segments/calendarGrid.d.ts +17 -0
  270. package/shared/{date-picker/calendar → picker-field/mixins/calendar-segments}/monthPickerGrid.d.ts +3 -3
  271. package/{lib/time-picker → shared/picker-field/mixins}/inline-time-picker/columns.d.ts +1 -1
  272. package/{lib/time-picker → shared/picker-field/mixins}/inline-time-picker/inline-time-picker.d.ts +2 -2
  273. package/{lib/time-picker/time/picker.d.ts → shared/picker-field/mixins/inline-time-picker/picker-option.d.ts} +1 -1
  274. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +1110 -0
  275. package/shared/picker-field/mixins/single-date-picker.d.ts +1626 -0
  276. package/shared/picker-field/mixins/single-value-picker.d.ts +518 -0
  277. package/shared/picker-field/mixins/time-selection-picker.d.ts +1053 -0
  278. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +1050 -0
  279. package/shared/picker-field/picker-field.d.ts +11 -0
  280. package/shared/picker-field/picker-field.form-associated.d.ts +11 -0
  281. package/shared/picker-field/picker-field.template.d.ts +7 -0
  282. package/shared/picker-field.template.cjs +315 -0
  283. package/shared/picker-field.template.js +310 -0
  284. package/shared/single-date-picker.cjs +46 -0
  285. package/shared/single-date-picker.js +44 -0
  286. package/shared/single-value-picker.cjs +77 -0
  287. package/shared/single-value-picker.js +75 -0
  288. package/shared/slider.template.cjs +3 -3
  289. package/shared/slider.template.js +3 -3
  290. package/shared/text-anchor.cjs +2 -1
  291. package/shared/text-anchor.js +2 -1
  292. package/shared/text-anchor.template.cjs +3 -5
  293. package/shared/text-anchor.template.js +3 -5
  294. package/shared/text-field.cjs +2 -555
  295. package/shared/text-field.js +2 -554
  296. package/shared/time-selection-picker.template.cjs +776 -0
  297. package/shared/time-selection-picker.template.js +767 -0
  298. package/shared/vivid-element.cjs +1 -1
  299. package/shared/vivid-element.js +1 -1
  300. package/side-drawer/index.cjs +1 -1
  301. package/side-drawer/index.js +1 -1
  302. package/slider/index.cjs +1 -1
  303. package/slider/index.js +1 -1
  304. package/split-button/index.cjs +1 -1
  305. package/split-button/index.js +1 -1
  306. package/styles/core/all.css +1 -1
  307. package/styles/core/theme.css +1 -1
  308. package/styles/core/typography.css +1 -1
  309. package/styles/tokens/theme-dark.css +4 -4
  310. package/styles/tokens/theme-light.css +4 -4
  311. package/styles/tokens/vivid-2-compat.css +1 -1
  312. package/switch/index.cjs +1 -1
  313. package/switch/index.js +1 -1
  314. package/tab/index.cjs +1 -1
  315. package/tab/index.js +1 -1
  316. package/tab-panel/index.cjs +1 -1
  317. package/tab-panel/index.js +1 -1
  318. package/tabs/index.cjs +1 -1
  319. package/tabs/index.js +1 -1
  320. package/tag/index.cjs +1 -1
  321. package/tag/index.js +1 -1
  322. package/tag-group/index.cjs +1 -1
  323. package/tag-group/index.js +1 -1
  324. package/text-anchor/index.cjs +1 -1
  325. package/text-anchor/index.js +1 -1
  326. package/text-area/index.cjs +1 -1
  327. package/text-area/index.js +1 -1
  328. package/text-field/index.cjs +1 -1
  329. package/text-field/index.js +1 -1
  330. package/time-picker/index.cjs +1 -1
  331. package/time-picker/index.js +1 -1
  332. package/toggletip/index.cjs +1 -1
  333. package/toggletip/index.js +1 -1
  334. package/tooltip/index.cjs +1 -1
  335. package/tooltip/index.js +1 -1
  336. package/tree-item/index.cjs +1 -1
  337. package/tree-item/index.js +1 -1
  338. package/tree-view/index.cjs +1 -1
  339. package/tree-view/index.js +1 -1
  340. package/video-player/index.cjs +1 -1
  341. package/video-player/index.js +1 -1
  342. package/vivid.api.json +286 -1144
  343. package/lib/time-picker/time-picker.form-associated.d.ts +0 -11
  344. package/shared/aria-global.cjs +0 -93
  345. package/shared/aria-global.js +0 -91
  346. package/shared/date-picker/calendar/calendarGrid.d.ts +0 -17
  347. package/shared/date-picker/calendar/presentationDate.d.ts +0 -4
  348. package/shared/date-picker/date-picker-base.d.ts +0 -21
  349. package/shared/date-picker/date-picker-base.form-associated.d.ts +0 -11
  350. package/shared/date-picker/date-picker-base.template.d.ts +0 -3
  351. package/shared/foundation/patterns/aria-global.d.ts +0 -21
  352. package/shared/foundation/patterns/index.d.ts +0 -1
  353. package/shared/text-field2.cjs +0 -5
  354. package/shared/text-field2.js +0 -3
  355. package/shared/trapped-focus.cjs +0 -35
  356. package/shared/trapped-focus.js +0 -33
  357. /package/shared/{date-picker/calendar → datetime}/dateRange.d.ts +0 -0
  358. /package/shared/{date-picker/calendar → datetime}/dateStr.d.ts +0 -0
  359. /package/shared/{date-picker/calendar → datetime}/month.d.ts +0 -0
  360. /package/{lib/time-picker/time → shared/datetime}/presentationTime.d.ts +0 -0
  361. /package/shared/{date-picker/calendar → datetime}/year.d.ts +0 -0
  362. /package/shared/{date-picker/calendar → picker-field/mixins/calendar-segments}/segment.d.ts +0 -0
  363. /package/{lib/time-picker → shared/picker-field/mixins}/inline-time-picker/definition.d.ts +0 -0
  364. /package/{lib/time-picker → shared/picker-field/mixins}/inline-time-picker/inline-time-picker.template.d.ts +0 -0
@@ -1,147 +1,893 @@
1
- import { C as Checkbox, c as checkboxDefinition } from './definition15.js';
2
- import { R as Radio, r as radioDefinition } from './definition40.js';
3
- import { V as VividElement, a as attr, h as html, d as createRegisterFunction, f as defineVividComponent } from './vivid-element.js';
4
- import { C as Connotation } from './enums.js';
5
- import { c as classNames } from './class-names.js';
1
+ import { P as Popup, p as popupDefinition } from './definition65.js';
2
+ import { i as iconDefinition } from './definition28.js';
3
+ import { l as listboxOptionDefinition } from './definition36.js';
4
+ import { D as DOM, O as Observable, o as observable, a as attr, v as volatile, h as html, d as createRegisterFunction, f as defineVividComponent } from './vivid-element.js';
5
+ import { a as applyMixinsWithObservables } from './applyMixinsWithObservables.js';
6
+ import { L as Listbox } from './listbox.js';
7
+ import { F as FormAssociated } from './form-associated.js';
8
+ import { i as inRange } from './numbers.js';
9
+ import { u as uniqueId } from './strings.js';
10
+ import { a as keySpace, b as keyEscape, c as keyTab, d as keyEnd, e as keyArrowUp, f as keyArrowDown, g as keyHome, k as keyEnter } from './key-codes.js';
11
+ import { F as FormElementSuccessText, a as FormElementHelperText, e as errorText, f as formElements, g as getFeedbackTemplate } from './form-elements.js';
12
+ import { A as AffixIconWithTrailing, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
13
+ import { L as ListboxOption } from './option.js';
14
+ import { c as chevronTemplateFactory } from './definition11.js';
15
+ import { h as handleEscapeKeyAndStopPropogation } from './index.js';
16
+ import { r as ref } from './ref.js';
6
17
  import { w as when } from './when.js';
18
+ import { s as slotted } from './slotted.js';
19
+ import { c as classNames } from './class-names.js';
20
+
21
+ const styles = ".chevron{display:flex;flex-shrink:0;font:var(--vvd-typography-base-extended);transform:rotate(0);transition:transform .2s}:host([aria-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:host(:focus-visible){outline:none}:host{display:inline-flex;flex-direction:column;gap:4px;--_low-ink-color: var(--vvd-color-neutral-600);--focus-stroke-gap-color: transparent}:host([disabled]){--_low-ink-color: var(--vvd-color-neutral-400);cursor:not-allowed}.label{color:var(--vvd-color-canvas-text);contain:inline-size;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(--_connotation-color-intermediate)}.control.appearance-ghost{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control:where(.hover,: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(--_connotation-color-fierce)}.control:where(.hover,: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:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-100);--_appearance-color-outline: var(--vvd-color-neutral-300)}.control:where(.disabled,:disabled).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control:where(.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:where(.readonly):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-600);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control:where(.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:where(.error):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-alert-50);--_appearance-color-outline: transparent}.control:where(.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:where(.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))}.control{border-radius:var(--_select-control-border-radius);block-size:var(--_select-block-size);padding-inline:var(--_select-padding-inline)}.control{--_select-icon-size: 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(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))*.4) ;display:flex;align-items:center;justify-content:space-between;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);gap:8px;transition:box-shadow .2s,background-color .2s}.control.size-condensed{--_select-icon-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))*.4) ;--_select-block-size: calc(1px*(32 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) ;--_select-padding-inline: calc(1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2))/2) }.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}:host(:focus-visible) .control{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.listbox{display:flex;max-height:var(--select-height, 408px);flex-direction:column;padding:4px;gap:2px;overflow-y:auto}:host([multiple]:focus-visible) .listbox{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));border-radius:8px}.selected-value{display:flex;overflow:hidden;flex-grow:1;align-items:center;column-gap:12px;white-space:nowrap}.selected-value .text{overflow:hidden;max-inline-size:100%;text-overflow:ellipsis}.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}";
7
22
 
8
- const styles = ":host{display:flex}.base.connotation-cta{--_connotation-color-firm-all: var(--vvd-selectable-box-cta-firm-all, var(--vvd-color-cta-600));--_connotation-color-pale: var(--vvd-selectable-box-cta-pale, var(--vvd-color-cta-300));--_connotation-color-fierce: var(--vvd-selectable-box-cta-fierce, var(--vvd-color-cta-700));--_connotation-color-faint: var(--vvd-selectable-box-cta-faint, var(--vvd-color-cta-50));--_connotation-color-soft: var(--vvd-selectable-box-cta-soft, var(--vvd-color-cta-100))}.base:not(.connotation-cta){--_connotation-color-firm-all: var(--vvd-selectable-box-accent-firm-all, var(--vvd-color-neutral-600));--_connotation-color-pale: var(--vvd-selectable-box-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-fierce: var(--vvd-selectable-box-accent-fierce, var(--vvd-color-neutral-700));--_connotation-color-faint: var(--vvd-selectable-box-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-selectable-box-accent-soft, var(--vvd-color-neutral-100))}.base{--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-pale)}.base:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}.base:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: var(--_connotation-color-pale)}.base:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: var(--_connotation-color-firm-all)}.base{position:relative;padding:var(--selectable-box-spacing, 16px);border:1px solid var(--_appearance-color-outline);border-radius:8px;background-color:var(--_appearance-color-fill);inline-size:100%;padding-block-start:calc(var(--selectable-box-spacing, 16px) + 36px);text-align:start}.base:focus-visible{--focus-stroke-gap-color: transparent;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.base.tight{overflow:hidden;min-height:calc(var(--selectable-box-spacing, 16px) * 2 + 22px);padding:0}.base.clickable{cursor:pointer}.control{position:absolute;inset-block-start:var(--selectable-box-spacing, 16px);inset-inline-end:var(--selectable-box-spacing, 16px)}";
23
+ class _Select extends Listbox {
24
+ }
25
+ class FormAssociatedSelect extends FormAssociated(_Select) {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.proxy = document.createElement("select");
29
+ }
30
+ }
9
31
 
10
32
  var __defProp = Object.defineProperty;
33
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
34
  var __decorateClass = (decorators, target, key, kind) => {
12
- var result = void 0 ;
35
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
13
36
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14
37
  if (decorator = decorators[i])
15
- result = (decorator(target, key, result) ) || result;
16
- if (result) __defProp(target, key, result);
38
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
39
+ if (kind && result) __defProp(target, key, result);
17
40
  return result;
18
41
  };
19
- class SelectableBox extends VividElement {
42
+ let Select = class extends FormAssociatedSelect {
20
43
  constructor() {
21
44
  super(...arguments);
22
- this.ariaLabel = null;
23
- this.checked = false;
24
- this.clickable = false;
25
- this.clickableBox = false;
26
- this.tight = false;
45
+ this.activeIndex = -1;
46
+ /**
47
+ * The start index when checking a range of options.
48
+ *
49
+ * @internal
50
+ */
51
+ this.rangeStartIndex = -1;
52
+ this.open = false;
53
+ /**
54
+ * The unique id for the internal listbox element.
55
+ *
56
+ * @internal
57
+ */
58
+ this.listboxId = uniqueId("listbox-");
59
+ this.maxHeight = 0;
60
+ this.fixedDropdown = false;
61
+ this.placeholderOption = null;
62
+ this._feedbackWrapper = null;
63
+ }
64
+ /**
65
+ * Returns the last checked option.
66
+ *
67
+ * @internal
68
+ */
69
+ get activeOption() {
70
+ return this.options[this.activeIndex];
71
+ }
72
+ /**
73
+ * Returns the list of checked options.
74
+ *
75
+ * @internal
76
+ */
77
+ get checkedOptions() {
78
+ return this.options.filter((o) => o.checked);
79
+ }
80
+ /**
81
+ * Returns the index of the first selected option.
82
+ *
83
+ * @internal
84
+ */
85
+ get firstSelectedOptionIndex() {
86
+ return this.options.indexOf(this.firstSelectedOption);
87
+ }
88
+ /**
89
+ * Updates the `ariaActiveDescendant` property when the active index changes.
90
+ *
91
+ * @internal
92
+ */
93
+ activeIndexChanged(_, next) {
94
+ this._activeDescendant = this.options[next]?.id ?? "";
95
+ this.focusAndScrollOptionIntoView();
96
+ }
97
+ /**
98
+ * Toggles the checked state for the currently active option.
99
+ *
100
+ * @remarks
101
+ * Multiple-selection mode only.
102
+ *
103
+ * @internal
104
+ */
105
+ checkActiveIndex() {
106
+ const activeItem = this.activeOption;
107
+ if (activeItem) {
108
+ activeItem.checked = true;
109
+ }
110
+ }
111
+ /**
112
+ * Sets the active index to the first option and marks it as checked.
113
+ *
114
+ * @remarks
115
+ * Multi-selection mode only.
116
+ *
117
+ * @param preserveChecked - mark all options unchecked before changing the active index
118
+ *
119
+ * @internal
120
+ */
121
+ checkFirstOption(preserveChecked) {
122
+ if (preserveChecked) {
123
+ if (this.rangeStartIndex === -1) {
124
+ this.rangeStartIndex = this.activeIndex + 1;
125
+ }
126
+ this.options.forEach((o, i) => {
127
+ o.checked = inRange(i, this.rangeStartIndex);
128
+ });
129
+ } else {
130
+ this.uncheckAllOptions();
131
+ }
132
+ this.activeIndex = 0;
133
+ this.checkActiveIndex();
134
+ }
135
+ /**
136
+ * Decrements the active index and sets the matching option as checked.
137
+ *
138
+ * @remarks
139
+ * Multi-selection mode only.
140
+ *
141
+ * @param preserveChecked - mark all options unchecked before changing the active index
142
+ *
143
+ * @internal
144
+ */
145
+ checkLastOption(preserveChecked) {
146
+ if (preserveChecked) {
147
+ if (this.rangeStartIndex === -1) {
148
+ this.rangeStartIndex = this.activeIndex;
149
+ }
150
+ this.options.forEach((o, i) => {
151
+ o.checked = inRange(i, this.rangeStartIndex, this.length);
152
+ });
153
+ } else {
154
+ this.uncheckAllOptions();
155
+ }
156
+ this.activeIndex = this.length - 1;
157
+ this.checkActiveIndex();
158
+ }
159
+ /**
160
+ * Increments the active index and marks the matching option as checked.
161
+ *
162
+ * @remarks
163
+ * Multiple-selection mode only.
164
+ *
165
+ * @param preserveChecked - mark all options unchecked before changing the active index
166
+ *
167
+ * @internal
168
+ */
169
+ checkNextOption(preserveChecked) {
170
+ if (preserveChecked) {
171
+ if (this.rangeStartIndex === -1) {
172
+ this.rangeStartIndex = this.activeIndex;
173
+ }
174
+ this.options.forEach((o, i) => {
175
+ o.checked = inRange(i, this.rangeStartIndex, this.activeIndex + 1);
176
+ });
177
+ } else {
178
+ this.uncheckAllOptions();
179
+ }
180
+ this.activeIndex += this.activeIndex < this.length - 1 ? 1 : 0;
181
+ this.checkActiveIndex();
182
+ }
183
+ /**
184
+ * Decrements the active index and marks the matching option as checked.
185
+ *
186
+ * @remarks
187
+ * Multiple-selection mode only.
188
+ *
189
+ * @param preserveChecked - mark all options unchecked before changing the active index
190
+ *
191
+ * @internal
192
+ */
193
+ checkPreviousOption(preserveChecked) {
194
+ if (preserveChecked) {
195
+ if (this.rangeStartIndex === -1) {
196
+ this.rangeStartIndex = this.activeIndex;
197
+ }
198
+ if (this.checkedOptions.length === 1) {
199
+ this.rangeStartIndex += 1;
200
+ }
201
+ this.options.forEach((o, i) => {
202
+ o.checked = inRange(i, this.activeIndex, this.rangeStartIndex);
203
+ });
204
+ } else {
205
+ this.uncheckAllOptions();
206
+ }
207
+ this.activeIndex -= this.activeIndex > 0 ? 1 : 0;
208
+ this.checkActiveIndex();
209
+ }
210
+ /**
211
+ * @internal
212
+ */
213
+ focusAndScrollOptionIntoView() {
214
+ super.focusAndScrollOptionIntoView(this.activeOption);
215
+ }
216
+ /**
217
+ * In multiple-selection mode:
218
+ * If any options are selected, the first selected option is checked when
219
+ * the listbox receives focus. If no options are selected, the first
220
+ * selectable option is checked.
221
+ *
222
+ * @internal
223
+ */
224
+ focusinHandler(e) {
225
+ if (!this.multiple) {
226
+ return super.focusinHandler(e);
227
+ }
228
+ if (!this.shouldSkipFocus && e.target === e.currentTarget) {
229
+ this.uncheckAllOptions();
230
+ if (this.activeIndex === -1) {
231
+ this.activeIndex = this.firstSelectedOptionIndex !== -1 ? this.firstSelectedOptionIndex : 0;
232
+ }
233
+ this.checkActiveIndex();
234
+ this.setSelectedOptions();
235
+ this.focusAndScrollOptionIntoView();
236
+ }
237
+ this.shouldSkipFocus = false;
238
+ }
239
+ /**
240
+ * Sets an option as selected and gives it focus.
241
+ *
242
+ * @public
243
+ */
244
+ setSelectedOptions() {
245
+ if (!this.multiple) {
246
+ super.setSelectedOptions();
247
+ return;
248
+ }
249
+ if (this.$fastController.isConnected && this.options) {
250
+ this.selectedOptions = this.options.filter((o) => o.selected);
251
+ this.focusAndScrollOptionIntoView();
252
+ }
253
+ }
254
+ /**
255
+ * Toggles the selected state of the provided options. If any provided items
256
+ * are in an unselected state, all items are set to selected. If every
257
+ * provided item is selected, they are all unselected.
258
+ *
259
+ * @internal
260
+ */
261
+ toggleSelectedForAllCheckedOptions() {
262
+ const enabledCheckedOptions = this.checkedOptions.filter(
263
+ (o) => !o.disabled
264
+ );
265
+ const force = !enabledCheckedOptions.every((o) => o.selected);
266
+ enabledCheckedOptions.forEach((o) => o.selected = force);
267
+ this.selectedIndex = this.options.indexOf(
268
+ enabledCheckedOptions[enabledCheckedOptions.length - 1]
269
+ );
270
+ this.setSelectedOptions();
271
+ this.updateValue(true);
272
+ }
273
+ /**
274
+ * @internal
275
+ */
276
+ typeaheadBufferChanged(prev, next) {
277
+ if (!this.multiple) {
278
+ super.typeaheadBufferChanged(prev, next);
279
+ return;
280
+ }
281
+ if (this.$fastController.isConnected) {
282
+ const typeaheadMatches = this.getTypeaheadMatches();
283
+ const activeIndex = this.options.indexOf(typeaheadMatches[0]);
284
+ if (activeIndex > -1) {
285
+ this.activeIndex = activeIndex;
286
+ this.uncheckAllOptions();
287
+ this.checkActiveIndex();
288
+ }
289
+ this.typeaheadExpired = false;
290
+ }
291
+ }
292
+ /**
293
+ * Unchecks all options.
294
+ *
295
+ * @remarks
296
+ * Multiple-selection mode only.
297
+ *
298
+ * @param preserveChecked - reset the rangeStartIndex
299
+ *
300
+ * @internal
301
+ */
302
+ uncheckAllOptions(preserveChecked = false) {
303
+ this.options.forEach((o) => o.checked = false);
304
+ if (!preserveChecked) {
305
+ this.rangeStartIndex = -1;
306
+ }
307
+ }
308
+ /**
309
+ * Sets focus when the open property changes.
310
+ *
311
+ * @internal
312
+ */
313
+ openChanged(prev, next) {
314
+ if (!this.collapsible) {
315
+ return;
316
+ }
317
+ if (this.open) {
318
+ this.focusAndScrollOptionIntoView();
319
+ this.indexWhenOpened = this.selectedIndex;
320
+ DOM.queueUpdate(() => this.focus());
321
+ return;
322
+ }
323
+ const didClose = prev === true && next === false;
324
+ const selectionChangedWhileOpen = this.indexWhenOpened !== this.selectedIndex;
325
+ if (didClose && selectionChangedWhileOpen) {
326
+ this.updateValue(true);
327
+ }
328
+ }
329
+ get collapsible() {
330
+ return !this.multiple;
331
+ }
332
+ /**
333
+ * The value property.
334
+ *
335
+ * @public
336
+ */
337
+ get value() {
338
+ Observable.track(this, "value");
339
+ return this._value;
340
+ }
341
+ set value(next) {
342
+ const prev = `${this._value}`;
343
+ if (this.length) {
344
+ const selectedIndex = this._options.findIndex((el) => el.value === next);
345
+ const prevSelectedValue = this._options[this.selectedIndex]?.value ?? null;
346
+ const nextSelectedValue = this._options[selectedIndex]?.value ?? null;
347
+ if (selectedIndex === -1 || prevSelectedValue !== nextSelectedValue) {
348
+ next = "";
349
+ this.selectedIndex = selectedIndex;
350
+ }
351
+ next = this.firstSelectedOption?.value ?? next;
352
+ }
353
+ if (prev !== next) {
354
+ this._value = next;
355
+ super.valueChanged(prev, next);
356
+ Observable.notify(this, "value");
357
+ this.updateDisplayValue();
358
+ }
27
359
  }
28
360
  /**
361
+ * Sets the value and display value to match the first selected option.
362
+ *
363
+ * @param shouldEmit - if true, the input and change events will be emitted
364
+ *
29
365
  * @internal
30
366
  */
31
- _handleCheckedChange() {
32
- if (this.controlType === "radio" && this.checked) return;
33
- this.checked = !this.checked;
34
- if (this.clickableBox || this.clickable) this.$emit("change");
367
+ updateValue(shouldEmit) {
368
+ if (this.$fastController.isConnected) {
369
+ this.value = this.firstSelectedOption?.value ?? "";
370
+ }
371
+ if (shouldEmit) {
372
+ this.$emit("input");
373
+ this.$emit("change", this, {
374
+ bubbles: true,
375
+ composed: void 0
376
+ });
377
+ }
35
378
  }
36
379
  /**
380
+ * Updates the proxy value when the selected index changes.
381
+ *
382
+ * @param prev - the previous selected index
383
+ * @param next - the next selected index
384
+ *
37
385
  * @internal
38
386
  */
39
- _handleKeydown(event) {
40
- if ((event.code === "Space" || event.code === "Enter") && (this.clickableBox || this.clickable))
41
- return this._handleCheckedChange();
387
+ selectedIndexChanged(prev, next) {
388
+ super.selectedIndexChanged(prev, next);
389
+ this.updateValue();
390
+ }
391
+ /**
392
+ * Handle opening and closing the listbox when the select is clicked.
393
+ *
394
+ * @param e - the mouse event
395
+ * @internal
396
+ */
397
+ clickHandler(e) {
398
+ if (this.disabled) {
399
+ return;
400
+ }
401
+ const clickedOption = e.target.closest(
402
+ `option,[role=option]`
403
+ );
404
+ if (clickedOption && clickedOption.disabled) {
405
+ return;
406
+ }
407
+ if (this.multiple) {
408
+ this.uncheckAllOptions();
409
+ this.activeIndex = this.options.indexOf(clickedOption);
410
+ this.checkActiveIndex();
411
+ this.toggleSelectedForAllCheckedOptions();
412
+ } else {
413
+ super.clickHandler(e);
414
+ }
415
+ if (this.collapsible) {
416
+ this.open = !this.open;
417
+ }
42
418
  return true;
43
419
  }
44
- }
420
+ /**
421
+ * Handles focus state when the element or its children lose focus.
422
+ *
423
+ * @param e - The focus event
424
+ * @internal
425
+ */
426
+ focusoutHandler(e) {
427
+ if (this.multiple) {
428
+ this.uncheckAllOptions();
429
+ }
430
+ if (!this.open) {
431
+ return true;
432
+ }
433
+ const focusTarget = e.relatedTarget;
434
+ if (this.isSameNode(focusTarget)) {
435
+ this.focus();
436
+ return;
437
+ }
438
+ if (!this.options.includes(focusTarget)) {
439
+ this.open = false;
440
+ if (this.indexWhenOpened !== this.selectedIndex) {
441
+ this.updateValue(true);
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ * Updates the value when an option's value changes.
447
+ *
448
+ * @param source - the source object
449
+ * @param propertyName - the property to evaluate
450
+ *
451
+ * @internal
452
+ */
453
+ handleChange(source, propertyName) {
454
+ super.handleChange(source, propertyName);
455
+ if (propertyName === "value") {
456
+ this.updateValue();
457
+ }
458
+ }
459
+ /**
460
+ * Prevents focus when a scrollbar is clicked.
461
+ *
462
+ * @param e - the mouse event object
463
+ *
464
+ * @internal
465
+ */
466
+ mousedownHandler(e) {
467
+ if (e.offsetX >= 0 && e.offsetX <= this.listbox.scrollWidth) {
468
+ return super.mousedownHandler(e);
469
+ }
470
+ return this.collapsible;
471
+ }
472
+ /**
473
+ * @internal
474
+ */
475
+ multipleChanged(_, next) {
476
+ this.options.forEach((o) => {
477
+ o.checked = next ? false : void 0;
478
+ });
479
+ this.setSelectedOptions();
480
+ if (this.proxy) {
481
+ this.proxy.multiple = next;
482
+ }
483
+ }
484
+ /**
485
+ * Updates the selectedness of each option when the list of selected options changes.
486
+ *
487
+ * @param prev - the previous list of selected options
488
+ * @param next - the current list of selected options
489
+ *
490
+ * @internal
491
+ */
492
+ selectedOptionsChanged(prev, next) {
493
+ super.selectedOptionsChanged(prev, next);
494
+ this.options.forEach((o, i) => {
495
+ const proxyOption = this.proxy.options.item(i);
496
+ if (proxyOption) {
497
+ proxyOption.selected = o.selected;
498
+ }
499
+ });
500
+ }
501
+ /**
502
+ * Resets and fills the proxy to match the component's options.
503
+ *
504
+ * @internal
505
+ */
506
+ setProxyOptions() {
507
+ if (this.proxy instanceof HTMLSelectElement && this.options) {
508
+ this.proxy.length = 0;
509
+ this.options.forEach((option) => {
510
+ const proxyOption = option.proxy || (option instanceof HTMLOptionElement ? option.cloneNode() : null);
511
+ if (proxyOption) {
512
+ this.proxy.options.add(proxyOption);
513
+ }
514
+ });
515
+ }
516
+ }
517
+ /**
518
+ * Handles keydown actions when the select is in multiple selection mode.
519
+ *
520
+ * @internal
521
+ */
522
+ multipleKeydownHandler(e) {
523
+ if (this.disabled) {
524
+ return;
525
+ }
526
+ const { key, shiftKey } = e;
527
+ this.shouldSkipFocus = false;
528
+ switch (key) {
529
+ case keyHome: {
530
+ this.checkFirstOption(shiftKey);
531
+ return;
532
+ }
533
+ case keyArrowDown: {
534
+ this.checkNextOption(shiftKey);
535
+ return;
536
+ }
537
+ case keyArrowUp: {
538
+ this.checkPreviousOption(shiftKey);
539
+ return;
540
+ }
541
+ case keyEnd: {
542
+ this.checkLastOption(shiftKey);
543
+ return;
544
+ }
545
+ case keyTab: {
546
+ this.focusAndScrollOptionIntoView();
547
+ return;
548
+ }
549
+ case keyEscape: {
550
+ this.uncheckAllOptions();
551
+ this.checkActiveIndex();
552
+ return;
553
+ }
554
+ case keySpace: {
555
+ e.preventDefault();
556
+ if (this.typeaheadExpired) {
557
+ this.toggleSelectedForAllCheckedOptions();
558
+ return;
559
+ }
560
+ }
561
+ default: {
562
+ if (key.length === 1) {
563
+ this.handleTypeAhead(`${key}`);
564
+ }
565
+ return;
566
+ }
567
+ }
568
+ }
569
+ /**
570
+ * Handle keyboard interaction for the select.
571
+ *
572
+ * @param e - the keyboard event
573
+ * @internal
574
+ */
575
+ keydownHandler(e) {
576
+ const selectedIndexBefore = this.selectedIndex;
577
+ if (this.multiple) {
578
+ this.multipleKeydownHandler(e);
579
+ } else {
580
+ super.keydownHandler(e);
581
+ }
582
+ const key = e.key;
583
+ switch (key) {
584
+ case keySpace: {
585
+ e.preventDefault();
586
+ if (this.collapsible && this.typeaheadExpired) {
587
+ this.open = !this.open;
588
+ }
589
+ break;
590
+ }
591
+ case keyHome:
592
+ case keyEnd: {
593
+ e.preventDefault();
594
+ break;
595
+ }
596
+ case keyEnter: {
597
+ e.preventDefault();
598
+ this.open = !this.open;
599
+ break;
600
+ }
601
+ case keyEscape: {
602
+ if (this.collapsible && this.open) {
603
+ e.preventDefault();
604
+ this.open = false;
605
+ }
606
+ break;
607
+ }
608
+ case keyTab: {
609
+ if (this.collapsible && this.open) {
610
+ e.preventDefault();
611
+ this.open = false;
612
+ }
613
+ return true;
614
+ }
615
+ }
616
+ if (this.collapsible && !this.open && this.selectedIndex !== selectedIndexBefore) {
617
+ this.updateValue(true);
618
+ }
619
+ return !(e.key === keyArrowDown || e.key === keyArrowUp);
620
+ }
621
+ connectedCallback() {
622
+ super.connectedCallback();
623
+ this.addEventListener("focusout", this.focusoutHandler);
624
+ this.addEventListener("contentchange", this.updateDisplayValue);
625
+ }
626
+ disconnectedCallback() {
627
+ this.removeEventListener("focusout", this.focusoutHandler);
628
+ this.removeEventListener("contentchange", this.updateDisplayValue);
629
+ super.disconnectedCallback();
630
+ }
631
+ /**
632
+ *
633
+ * @internal
634
+ */
635
+ updateDisplayValue() {
636
+ if (this.collapsible) {
637
+ Observable.notify(this, "displayValue");
638
+ }
639
+ }
640
+ labelChanged() {
641
+ if (!this.ariaLabel) {
642
+ this.ariaLabel = this.label;
643
+ }
644
+ }
645
+ get displayValue() {
646
+ Observable.track(this, "displayValue");
647
+ return this.firstSelectedOption?.getAttribute("label") ?? this.firstSelectedOption?.text ?? this.placeholder ?? "";
648
+ }
649
+ setDefaultSelectedOption() {
650
+ const options = Array.from(this.children).filter(
651
+ Listbox.slottedOptionFilter
652
+ );
653
+ const selectedIndex = options.findIndex(
654
+ (el) => el.hasAttribute("selected") || el.selected || el.value === this.value
655
+ );
656
+ if (selectedIndex === -1 && !this.placeholderOption) {
657
+ this.selectedIndex = 0;
658
+ return;
659
+ }
660
+ if (selectedIndex !== -1 || this.placeholder !== "") {
661
+ this.selectedIndex = selectedIndex;
662
+ return;
663
+ }
664
+ }
665
+ /*
666
+ * @internal
667
+ */
668
+ slottedOptionsChanged(prev, next) {
669
+ this.options.forEach((o) => {
670
+ const notifier = Observable.getNotifier(o);
671
+ notifier.unsubscribe(this, "value");
672
+ });
673
+ super.slottedOptionsChanged(prev, next);
674
+ this.options.forEach((o) => {
675
+ const notifier = Observable.getNotifier(o);
676
+ notifier.subscribe(this, "value");
677
+ });
678
+ this.setProxyOptions();
679
+ this.updateValue();
680
+ const scale = this.getAttribute("scale") || this.scale;
681
+ next.forEach((element) => {
682
+ if (scale) {
683
+ element.setAttribute("scale", scale);
684
+ element.scale = scale;
685
+ }
686
+ });
687
+ this.proxy.value = this.value;
688
+ this.validate();
689
+ }
690
+ formResetCallback() {
691
+ this.setProxyOptions();
692
+ super.setDefaultSelectedOption();
693
+ if (this.selectedIndex === -1) {
694
+ this.selectedIndex = 0;
695
+ }
696
+ if (this.placeholder) {
697
+ this.selectedIndex = -1;
698
+ }
699
+ }
700
+ };
45
701
  __decorateClass([
46
- attr({ attribute: "aria-label" })
47
- ], SelectableBox.prototype, "ariaLabel");
702
+ observable
703
+ ], Select.prototype, "activeIndex", 2);
704
+ // @ts-expect-error Type is incorrectly non-optional
48
705
  __decorateClass([
49
706
  attr({ mode: "boolean" })
50
- ], SelectableBox.prototype, "checked");
707
+ ], Select.prototype, "multiple", 2);
51
708
  __decorateClass([
52
- attr({ mode: "boolean" })
53
- ], SelectableBox.prototype, "clickable");
709
+ attr({ attribute: "open", mode: "boolean" })
710
+ ], Select.prototype, "open", 2);
711
+ __decorateClass([
712
+ volatile
713
+ ], Select.prototype, "collapsible", 1);
714
+ __decorateClass([
715
+ observable
716
+ ], Select.prototype, "control", 2);
717
+ __decorateClass([
718
+ observable
719
+ ], Select.prototype, "maxHeight", 2);
720
+ __decorateClass([
721
+ observable
722
+ ], Select.prototype, "_anchor", 2);
54
723
  __decorateClass([
55
- attr({ attribute: "clickable-box", mode: "boolean" })
56
- ], SelectableBox.prototype, "clickableBox");
724
+ attr()
725
+ ], Select.prototype, "scale", 2);
57
726
  __decorateClass([
58
727
  attr
59
- ], SelectableBox.prototype, "connotation");
728
+ ], Select.prototype, "appearance", 2);
60
729
  __decorateClass([
61
- attr({ attribute: "control-type" })
62
- ], SelectableBox.prototype, "controlType");
730
+ attr
731
+ ], Select.prototype, "shape", 2);
63
732
  __decorateClass([
64
- attr({ mode: "boolean" })
65
- ], SelectableBox.prototype, "tight");
733
+ attr({ mode: "boolean", attribute: "fixed-dropdown" })
734
+ ], Select.prototype, "fixedDropdown", 2);
735
+ __decorateClass([
736
+ attr
737
+ ], Select.prototype, "placeholder", 2);
738
+ __decorateClass([
739
+ observable
740
+ ], Select.prototype, "placeholderOption", 2);
741
+ __decorateClass([
742
+ observable
743
+ ], Select.prototype, "_feedbackWrapper", 2);
744
+ __decorateClass([
745
+ observable
746
+ ], Select.prototype, "metaSlottedContent", 2);
747
+ Select = __decorateClass([
748
+ errorText,
749
+ formElements
750
+ ], Select);
751
+ applyMixinsWithObservables(
752
+ Select,
753
+ AffixIconWithTrailing,
754
+ FormElementHelperText,
755
+ FormElementSuccessText
756
+ );
66
757
 
67
- const getClasses = ({
68
- connotation,
69
- tight,
70
- checked,
71
- clickableBox,
72
- clickable
758
+ const getStateClasses = ({
759
+ shape,
760
+ disabled,
761
+ appearance,
762
+ metaSlottedContent,
763
+ errorValidationMessage,
764
+ successText,
765
+ placeholder,
766
+ value,
767
+ scale
73
768
  }) => classNames(
74
- "base",
75
- [`connotation-${connotation}`, Boolean(connotation)],
76
- ["tight", tight],
77
- ["selected", checked],
78
- ["clickable", clickableBox || clickable],
79
- ["readonly", !clickableBox && !clickable]
769
+ ["disabled", disabled],
770
+ [`appearance-${appearance}`, Boolean(appearance)],
771
+ [`shape-${shape}`, Boolean(shape)],
772
+ ["has-meta", Boolean(metaSlottedContent?.length)],
773
+ ["error", Boolean(errorValidationMessage)],
774
+ ["success", !!successText],
775
+ ["shows-placeholder", Boolean(placeholder) && !value],
776
+ [`size-${scale}`, Boolean(scale)]
80
777
  );
81
- function handleControlChange(x) {
82
- if (!x.clickableBox) x._handleCheckedChange();
778
+ function renderLabel() {
779
+ return html` <label for="control" class="label" id="label">
780
+ ${(x) => x.label}
781
+ </label>`;
782
+ }
783
+ function renderPlaceholder(context) {
784
+ const optionTag = context.tagFor(ListboxOption);
785
+ return html`
786
+ <${optionTag} ${ref("placeholderOption")}
787
+ text="${(x) => x.placeholder}" hidden disabled>
788
+ </${optionTag}>`;
83
789
  }
84
- function checkbox(context) {
85
- const checkboxTag = context.tagFor(Checkbox);
86
- return html`${when(
87
- (x) => x.controlType !== "radio",
88
- html`
89
- <${checkboxTag}
90
- aria-label="${(x) => !x.clickableBox && !x.clickable && x.ariaLabel ? x.ariaLabel : null}"
91
- @change="${(x) => handleControlChange(x)}"
92
- class="control checkbox"
93
- connotation="${(x) => x.connotation === "cta" ? Connotation.CTA : Connotation.Accent}"
94
- :checked="${(x) => x.checked}"
95
- inert="${(x) => x.clickableBox || x.clickable ? true : null}"
96
- ></${checkboxTag}>`
97
- )} `;
790
+ function selectValue(context) {
791
+ const affixIconTemplate = affixIconTemplateFactory(context);
792
+ const chevronTemplate = chevronTemplateFactory(context);
793
+ return html` <div
794
+ class="control ${getStateClasses}"
795
+ ${ref("_anchor")}
796
+ id="control"
797
+ ?disabled="${(x) => x.disabled}"
798
+ >
799
+ <div class="selected-value">
800
+ ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
801
+ <span class="text">${(x) => x.displayValue}</span>
802
+ <slot name="meta" ${slotted("metaSlottedContent")}></slot>
803
+ </div>
804
+ ${chevronTemplate}
805
+ </div>`;
806
+ }
807
+ function setFixedDropdownVarWidth(x) {
808
+ return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
98
809
  }
99
- function radio(context) {
100
- const radioTag = context.tagFor(Radio);
101
- return html`${when(
102
- (x) => x.controlType === "radio",
103
- html`
104
- <${radioTag}
105
- aria-label="${(x) => !x.clickableBox && !x.clickable && x.ariaLabel ? x.ariaLabel : null}"
106
- @change="${(x) => handleControlChange(x)}"
107
- class="control radio"
108
- connotation="${(x) => x.connotation === "cta" ? Connotation.CTA : Connotation.Accent}"
109
- :checked="${(x) => x.checked}"
110
- inert="${(x) => x.clickableBox || x.clickable ? true : null}"
111
- ></${radioTag}>`
112
- )} `;
810
+ function renderControl(context) {
811
+ const popupTag = context.tagFor(Popup);
812
+ return html`
813
+ ${when((x) => x.label, renderLabel())}
814
+ <div class="control-wrapper">
815
+ ${when((x) => !x.multiple, selectValue(context))}
816
+ <${popupTag} class="popup"
817
+ style="${setFixedDropdownVarWidth}"
818
+ ?open="${(x) => x.collapsible ? x.open : true}"
819
+ :anchor="${(x) => x._anchor}"
820
+ placement="bottom-start"
821
+ strategy="${(x) => x.fixedDropdown ? null : "absolute"}">
822
+ <div class="listbox"
823
+ id="${(x) => x.listboxId}"
824
+ role="listbox"
825
+ aria-multiselectable="${(x) => x.multiple}"
826
+ ?disabled="${(x) => x.disabled}"
827
+ ?hidden="${(x) => x.collapsible ? !x.open : false}"
828
+ ${ref("listbox")}>
829
+ ${when((x) => x.placeholder, renderPlaceholder(context))}
830
+ <slot
831
+ ${slotted({
832
+ filter: Listbox.slottedOptionFilter,
833
+ flatten: true,
834
+ property: "slottedOptions"
835
+ })}>
836
+ </slot>
837
+ </div>
838
+ </${popupTag}>
839
+ </div>
840
+ `;
113
841
  }
114
- const SelectableBoxTemplate = (context) => {
115
- return html`<template role="presentation">
116
- <div
117
- class="${getClasses}"
118
- tabindex="${(x) => x.clickableBox || x.clickable ? "0" : null}"
119
- role="${(x) => x.clickableBox || x.clickable ? "button" : null}"
120
- aria-pressed="${(x) => x.clickableBox || x.clickable ? x.checked ? "true" : "false" : null}"
121
- aria-label="${(x) => x.clickableBox || x.clickable ? x.ariaLabel : null}"
122
- @keydown="${(x, c) => x._handleKeydown(c.event)}"
123
- @click="${(x) => x.clickableBox || x.clickable ? x._handleCheckedChange() : null}"
842
+ function ifNotFromFeedback(handler) {
843
+ return (x, c) => {
844
+ if (!c.event.composedPath().includes(x._feedbackWrapper)) {
845
+ return handler(x, c.event);
846
+ }
847
+ return true;
848
+ };
849
+ }
850
+ const SelectTemplate = (context) => {
851
+ return html`
852
+ <template
853
+ class="base"
854
+ role="combobox"
855
+ aria-haspopup="${(x) => x.collapsible ? "listbox" : "false"}"
856
+ aria-controls="${(x) => x.listboxId}"
857
+ aria-expanded="${(x) => x.open}"
858
+ aria-disabled="${(x) => x.disabled}"
859
+ aria-activedescendant="${(x) => x._activeDescendant}"
860
+ tabindex="${(x) => !x.disabled ? "0" : null}"
861
+ @click="${ifNotFromFeedback((x, e) => x.clickHandler(e))}"
862
+ @focusin="${ifNotFromFeedback((x, e) => x.focusinHandler(e))}"
863
+ @focusout="${ifNotFromFeedback(
864
+ (x, e) => x.focusoutHandler(e)
865
+ )}"
866
+ @keydown="${ifNotFromFeedback((x, e) => {
867
+ x.open && handleEscapeKeyAndStopPropogation(e);
868
+ return x.keydownHandler(e);
869
+ })}"
870
+ @mousedown="${ifNotFromFeedback(
871
+ (x, e) => x.mousedownHandler(e)
872
+ )}"
124
873
  >
125
- ${checkbox(context)} ${radio(context)}
126
- <slot></slot>
127
- </div>
128
- </template>`;
874
+ ${renderControl(context)}
875
+ <div class="feedback-wrapper" ${ref("_feedbackWrapper")}>
876
+ ${getFeedbackTemplate(context)}
877
+ </div>
878
+ </template>
879
+ `;
129
880
  };
130
881
 
131
- const selectableBoxDefinition = defineVividComponent(
132
- "selectable-box",
133
- SelectableBox,
134
- SelectableBoxTemplate,
135
- [checkboxDefinition, radioDefinition],
882
+ const selectDefinition = defineVividComponent(
883
+ "select",
884
+ Select,
885
+ SelectTemplate,
886
+ [popupDefinition, iconDefinition, listboxOptionDefinition],
136
887
  {
137
- styles,
138
- shadowOptions: {
139
- delegatesFocus: true
140
- }
888
+ styles
141
889
  }
142
890
  );
143
- const registerSelectableBox = createRegisterFunction(
144
- selectableBoxDefinition
145
- );
891
+ const registerSelect = createRegisterFunction(selectDefinition);
146
892
 
147
- export { SelectableBox as S, registerSelectableBox as r, selectableBoxDefinition as s };
893
+ export { Select as S, registerSelect as r, selectDefinition as s };