@vonage/vivid 3.26.0 → 3.28.2

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 (381) hide show
  1. package/README.md +4 -1
  2. package/accordion/index.js +0 -2
  3. package/accordion-item/index.js +0 -2
  4. package/alert/index.js +0 -2
  5. package/avatar/index.js +0 -2
  6. package/badge/index.js +0 -2
  7. package/banner/index.js +0 -2
  8. package/breadcrumb-item/index.js +0 -2
  9. package/button/index.js +0 -2
  10. package/calendar/index.js +0 -1
  11. package/calendar-event/index.js +0 -2
  12. package/card/index.js +0 -2
  13. package/checkbox/index.js +0 -2
  14. package/combobox/index.js +0 -3
  15. package/custom-elements.json +440 -51
  16. package/data-grid/index.js +1 -5
  17. package/dialog/index.js +0 -2
  18. package/empty-state/index.js +0 -2
  19. package/fab/index.js +0 -2
  20. package/file-picker/index.js +24 -0
  21. package/header/index.js +1 -1
  22. package/icon/index.js +0 -2
  23. package/index.d.ts +3 -3
  24. package/index.js +31 -35
  25. package/layout/index.js +1 -1
  26. package/lib/accordion/accordion.d.ts +5 -5
  27. package/lib/accordion/accordion.template.d.ts +3 -3
  28. package/lib/accordion/definition.d.ts +2 -2
  29. package/lib/accordion/index.d.ts +1 -1
  30. package/lib/accordion-item/accordion-item.d.ts +12 -12
  31. package/lib/accordion-item/accordion-item.template.d.ts +4 -4
  32. package/lib/accordion-item/definition.d.ts +1 -1
  33. package/lib/accordion-item/index.d.ts +1 -1
  34. package/lib/action-group/action-group.d.ts +11 -11
  35. package/lib/action-group/action-group.template.d.ts +4 -4
  36. package/lib/action-group/definition.d.ts +2 -2
  37. package/lib/action-group/index.d.ts +1 -1
  38. package/lib/alert/alert.d.ts +22 -22
  39. package/lib/alert/alert.template.d.ts +4 -4
  40. package/lib/alert/definition.d.ts +2 -2
  41. package/lib/alert/index.d.ts +1 -1
  42. package/lib/avatar/avatar.d.ts +14 -14
  43. package/lib/avatar/avatar.template.d.ts +4 -4
  44. package/lib/avatar/definition.d.ts +2 -2
  45. package/lib/avatar/index.d.ts +1 -1
  46. package/lib/badge/badge.d.ts +14 -14
  47. package/lib/badge/badge.template.d.ts +4 -4
  48. package/lib/badge/definition.d.ts +4 -4
  49. package/lib/badge/index.d.ts +1 -1
  50. package/lib/banner/banner.d.ts +20 -20
  51. package/lib/banner/banner.template.d.ts +4 -4
  52. package/lib/banner/definition.d.ts +2 -2
  53. package/lib/banner/index.d.ts +1 -1
  54. package/lib/breadcrumb/breadcrumb.d.ts +3 -3
  55. package/lib/breadcrumb/breadcrumb.template.d.ts +4 -4
  56. package/lib/breadcrumb/definition.d.ts +1 -1
  57. package/lib/breadcrumb/index.d.ts +1 -1
  58. package/lib/breadcrumb-item/breadcrumb-item.d.ts +5 -5
  59. package/lib/breadcrumb-item/breadcrumb-item.template.d.ts +4 -4
  60. package/lib/breadcrumb-item/definition.d.ts +1 -1
  61. package/lib/breadcrumb-item/index.d.ts +1 -1
  62. package/lib/button/button.d.ts +18 -18
  63. package/lib/button/button.template.d.ts +4 -4
  64. package/lib/button/definition.d.ts +2 -2
  65. package/lib/button/index.d.ts +1 -1
  66. package/lib/calendar/calendar.d.ts +13 -13
  67. package/lib/calendar/calendar.template.d.ts +4 -4
  68. package/lib/calendar/definition.d.ts +1 -1
  69. package/lib/calendar/helpers/calendar.date-functions.d.ts +2 -2
  70. package/lib/calendar/helpers/calendar.event-context.d.ts +6 -6
  71. package/lib/calendar/helpers/calendar.keyboard-interactions.d.ts +9 -9
  72. package/lib/calendar/index.d.ts +1 -1
  73. package/lib/calendar-event/calendar-event.d.ts +13 -13
  74. package/lib/calendar-event/calendar-event.template.d.ts +4 -4
  75. package/lib/calendar-event/definition.d.ts +2 -2
  76. package/lib/calendar-event/index.d.ts +1 -1
  77. package/lib/card/card.d.ts +10 -10
  78. package/lib/card/card.template.d.ts +4 -4
  79. package/lib/card/definition.d.ts +1 -1
  80. package/lib/card/index.d.ts +1 -1
  81. package/lib/checkbox/checkbox.d.ts +10 -11
  82. package/lib/checkbox/checkbox.template.d.ts +4 -4
  83. package/lib/checkbox/definition.d.ts +1 -1
  84. package/lib/checkbox/index.d.ts +1 -1
  85. package/lib/combobox/combobox.d.ts +12 -13
  86. package/lib/combobox/combobox.template.d.ts +4 -4
  87. package/lib/combobox/definition.d.ts +3 -4
  88. package/lib/combobox/index.d.ts +1 -1
  89. package/lib/components.d.ts +52 -52
  90. package/lib/data-grid/data-grid-cell.d.ts +22 -22
  91. package/lib/data-grid/data-grid-cell.template.d.ts +4 -4
  92. package/lib/data-grid/data-grid-row.d.ts +4 -4
  93. package/lib/data-grid/data-grid-row.template.d.ts +3 -3
  94. package/lib/data-grid/data-grid.d.ts +20 -20
  95. package/lib/data-grid/data-grid.options.d.ts +38 -38
  96. package/lib/data-grid/data-grid.template.d.ts +3 -3
  97. package/lib/data-grid/definition.d.ts +6 -6
  98. package/lib/data-grid/index.d.ts +1 -1
  99. package/lib/dialog/definition.d.ts +2 -2
  100. package/lib/dialog/dialog.d.ts +26 -26
  101. package/lib/dialog/dialog.template.d.ts +4 -4
  102. package/lib/dialog/index.d.ts +1 -1
  103. package/lib/divider/definition.d.ts +1 -1
  104. package/lib/divider/divider.d.ts +3 -3
  105. package/lib/divider/divider.template.d.ts +4 -4
  106. package/lib/divider/index.d.ts +1 -1
  107. package/lib/elevation/definition.d.ts +1 -1
  108. package/lib/elevation/elevation.d.ts +5 -5
  109. package/lib/elevation/elevation.template.d.ts +4 -4
  110. package/lib/elevation/index.d.ts +1 -1
  111. package/lib/empty-state/definition.d.ts +3 -3
  112. package/lib/empty-state/empty-state.d.ts +5 -5
  113. package/lib/empty-state/empty-state.template.d.ts +4 -4
  114. package/lib/empty-state/index.d.ts +1 -1
  115. package/lib/enums.d.ts +60 -60
  116. package/lib/fab/definition.d.ts +4 -4
  117. package/lib/fab/fab.d.ts +12 -12
  118. package/lib/fab/fab.template.d.ts +4 -4
  119. package/lib/fab/index.d.ts +1 -1
  120. package/lib/file-picker/definition.d.ts +3 -0
  121. package/lib/file-picker/file-picker.d.ts +22 -0
  122. package/lib/file-picker/file-picker.template.d.ts +4 -0
  123. package/lib/file-picker/index.d.ts +1 -0
  124. package/lib/focus/definition.d.ts +3 -3
  125. package/lib/focus/focus.d.ts +3 -3
  126. package/lib/focus/focus.template.d.ts +4 -4
  127. package/lib/focus/index.d.ts +1 -1
  128. package/lib/header/definition.d.ts +3 -3
  129. package/lib/header/header.d.ts +5 -5
  130. package/lib/header/header.template.d.ts +4 -4
  131. package/lib/header/index.d.ts +1 -1
  132. package/lib/icon/definition.d.ts +4 -4
  133. package/lib/icon/icon.d.ts +12 -12
  134. package/lib/icon/icon.placeholder.d.ts +1 -1
  135. package/lib/icon/icon.template.d.ts +4 -4
  136. package/lib/icon/index.d.ts +1 -1
  137. package/lib/layout/definition.d.ts +4 -4
  138. package/lib/layout/index.d.ts +1 -1
  139. package/lib/layout/layout.d.ts +17 -17
  140. package/lib/layout/layout.template.d.ts +4 -4
  141. package/lib/listbox/definition.d.ts +4 -4
  142. package/lib/listbox/index.d.ts +1 -1
  143. package/lib/listbox/listbox.d.ts +6 -6
  144. package/lib/listbox/listbox.template.d.ts +4 -4
  145. package/lib/menu/definition.d.ts +12 -12
  146. package/lib/menu/index.d.ts +1 -1
  147. package/lib/menu/menu.d.ts +16 -14
  148. package/lib/menu/menu.template.d.ts +3 -3
  149. package/lib/menu-item/definition.d.ts +3 -3
  150. package/lib/menu-item/index.d.ts +1 -1
  151. package/lib/menu-item/menu-item.d.ts +14 -14
  152. package/lib/menu-item/menu-item.template.d.ts +4 -4
  153. package/lib/nav/definition.d.ts +3 -3
  154. package/lib/nav/index.d.ts +1 -1
  155. package/lib/nav/nav.d.ts +3 -3
  156. package/lib/nav/nav.template.d.ts +4 -4
  157. package/lib/nav-disclosure/definition.d.ts +3 -3
  158. package/lib/nav-disclosure/index.d.ts +1 -1
  159. package/lib/nav-disclosure/nav-disclosure.d.ts +10 -10
  160. package/lib/nav-disclosure/nav-disclosure.template.d.ts +4 -4
  161. package/lib/nav-item/definition.d.ts +3 -3
  162. package/lib/nav-item/index.d.ts +1 -1
  163. package/lib/nav-item/nav-item.d.ts +7 -7
  164. package/lib/nav-item/nav-item.template.d.ts +4 -4
  165. package/lib/note/definition.d.ts +4 -4
  166. package/lib/note/index.d.ts +1 -1
  167. package/lib/note/note.d.ts +10 -10
  168. package/lib/note/note.template.d.ts +4 -4
  169. package/lib/number-field/definition.d.ts +5 -5
  170. package/lib/number-field/index.d.ts +1 -1
  171. package/lib/number-field/number-field.d.ts +13 -13
  172. package/lib/number-field/number-field.template.d.ts +4 -4
  173. package/lib/option/definition.d.ts +3 -3
  174. package/lib/option/index.d.ts +1 -1
  175. package/lib/option/option.d.ts +12 -12
  176. package/lib/option/option.template.d.ts +4 -4
  177. package/lib/pagination/definition.d.ts +3 -3
  178. package/lib/pagination/index.d.ts +1 -1
  179. package/lib/pagination/pagination.d.ts +18 -18
  180. package/lib/pagination/pagination.template.d.ts +4 -4
  181. package/lib/popup/definition.d.ts +5 -5
  182. package/lib/popup/index.d.ts +1 -1
  183. package/lib/popup/popup.d.ts +21 -21
  184. package/lib/popup/popup.template.d.ts +4 -4
  185. package/lib/progress/definition.d.ts +4 -4
  186. package/lib/progress/index.d.ts +1 -1
  187. package/lib/progress/progress.d.ts +9 -9
  188. package/lib/progress/progress.template.d.ts +5 -5
  189. package/lib/progress-ring/definition.d.ts +4 -4
  190. package/lib/progress-ring/index.d.ts +1 -1
  191. package/lib/progress-ring/progress-ring.d.ts +7 -7
  192. package/lib/progress-ring/progress-ring.template.d.ts +4 -4
  193. package/lib/radio/definition.d.ts +3 -3
  194. package/lib/radio/index.d.ts +1 -1
  195. package/lib/radio/radio.d.ts +7 -7
  196. package/lib/radio/radio.template.d.ts +4 -4
  197. package/lib/radio-group/definition.d.ts +11 -11
  198. package/lib/radio-group/index.d.ts +1 -1
  199. package/lib/radio-group/radio-group.d.ts +4 -4
  200. package/lib/radio-group/radio-group.template.d.ts +4 -4
  201. package/lib/select/definition.d.ts +4 -4
  202. package/lib/select/index.d.ts +1 -1
  203. package/lib/select/select.d.ts +17 -18
  204. package/lib/select/select.template.d.ts +4 -4
  205. package/lib/side-drawer/definition.d.ts +3 -3
  206. package/lib/side-drawer/index.d.ts +1 -1
  207. package/lib/side-drawer/side-drawer.d.ts +9 -9
  208. package/lib/side-drawer/side-drawer.template.d.ts +4 -4
  209. package/lib/slider/definition.d.ts +3 -3
  210. package/lib/slider/index.d.ts +1 -1
  211. package/lib/slider/slider.d.ts +4 -4
  212. package/lib/slider/slider.template.d.ts +4 -4
  213. package/lib/switch/definition.d.ts +4 -4
  214. package/lib/switch/index.d.ts +1 -1
  215. package/lib/switch/switch.d.ts +7 -7
  216. package/lib/switch/switch.template.d.ts +4 -4
  217. package/lib/tab/definition.d.ts +4 -4
  218. package/lib/tab/index.d.ts +1 -1
  219. package/lib/tab/tab.d.ts +14 -14
  220. package/lib/tab/tab.template.d.ts +3 -3
  221. package/lib/tab-panel/definition.d.ts +3 -3
  222. package/lib/tab-panel/index.d.ts +1 -1
  223. package/lib/tab-panel/tab-panel.d.ts +3 -3
  224. package/lib/tab-panel/tab-panel.template.d.ts +2 -2
  225. package/lib/tabs/definition.d.ts +3 -3
  226. package/lib/tabs/index.d.ts +1 -1
  227. package/lib/tabs/tabs.d.ts +15 -15
  228. package/lib/tabs/tabs.template.d.ts +2 -2
  229. package/lib/tag/definition.d.ts +4 -4
  230. package/lib/tag/index.d.ts +1 -1
  231. package/lib/tag/tag.d.ts +22 -22
  232. package/lib/tag/tag.template.d.ts +4 -4
  233. package/lib/tag-group/definition.d.ts +3 -3
  234. package/lib/tag-group/index.d.ts +1 -1
  235. package/lib/tag-group/tag-group.d.ts +3 -3
  236. package/lib/tag-group/tag-group.template.d.ts +4 -4
  237. package/lib/text-anchor/definition.d.ts +3 -3
  238. package/lib/text-anchor/index.d.ts +1 -1
  239. package/lib/text-anchor/text-anchor.d.ts +7 -7
  240. package/lib/text-anchor/text-anchor.template.d.ts +4 -4
  241. package/lib/text-area/definition.d.ts +4 -4
  242. package/lib/text-area/index.d.ts +1 -1
  243. package/lib/text-area/text-area.d.ts +8 -9
  244. package/lib/text-area/text-area.template.d.ts +4 -4
  245. package/lib/text-field/definition.d.ts +4 -4
  246. package/lib/text-field/index.d.ts +1 -1
  247. package/lib/text-field/text-field.d.ts +13 -14
  248. package/lib/text-field/text-field.template.d.ts +4 -4
  249. package/lib/toggletip/definition.d.ts +3 -3
  250. package/lib/toggletip/index.d.ts +1 -1
  251. package/lib/toggletip/toggletip.d.ts +15 -15
  252. package/lib/toggletip/toggletip.template.d.ts +4 -4
  253. package/lib/tooltip/definition.d.ts +3 -3
  254. package/lib/tooltip/index.d.ts +1 -1
  255. package/lib/tooltip/tooltip.d.ts +14 -14
  256. package/lib/tooltip/tooltip.template.d.ts +4 -4
  257. package/lib/tree-item/definition.d.ts +3 -3
  258. package/lib/tree-item/index.d.ts +1 -1
  259. package/lib/tree-item/tree-item.d.ts +7 -7
  260. package/lib/tree-item/tree-item.template.d.ts +4 -4
  261. package/lib/tree-view/definition.d.ts +3 -3
  262. package/lib/tree-view/index.d.ts +1 -1
  263. package/lib/tree-view/tree-view.d.ts +3 -3
  264. package/lib/tree-view/tree-view.template.d.ts +2 -2
  265. package/listbox/index.js +17 -21
  266. package/menu/index.js +2 -5
  267. package/menu-item/index.js +1 -4
  268. package/nav/index.js +1 -1
  269. package/nav-disclosure/index.js +1 -3
  270. package/nav-item/index.js +1 -3
  271. package/note/index.js +1 -3
  272. package/number-field/index.js +1 -4
  273. package/option/index.js +0 -2
  274. package/package.json +10 -8
  275. package/pagination/index.js +2 -6
  276. package/popup/index.js +0 -3
  277. package/progress/index.js +1 -1
  278. package/radio/index.js +1 -1
  279. package/radio-group/index.js +3 -3
  280. package/select/index.js +1 -4
  281. package/shared/affix.js +2 -5
  282. package/shared/anchor.js +2 -1
  283. package/shared/apply-mixins.js +1 -1
  284. package/shared/definition.js +7 -9
  285. package/shared/definition10.js +13 -17
  286. package/shared/definition11.js +6 -9
  287. package/shared/definition12.js +16 -18
  288. package/shared/definition13.js +6 -8
  289. package/shared/definition14.js +7 -12
  290. package/shared/definition15.js +43 -52
  291. package/shared/definition16.js +8 -71
  292. package/shared/definition17.js +36 -45
  293. package/shared/definition18.js +19 -24
  294. package/shared/definition19.js +45 -49
  295. package/shared/definition2.js +24 -28
  296. package/shared/definition20.js +390 -281
  297. package/shared/definition21.js +12 -16
  298. package/shared/definition22.js +82 -168
  299. package/shared/definition23.js +35 -41
  300. package/shared/definition24.js +6 -8
  301. package/shared/definition25.js +10 -14
  302. package/shared/definition26.js +40 -42
  303. package/shared/definition27.js +2285 -48
  304. package/shared/definition28.js +46 -38
  305. package/shared/definition29.js +38 -370
  306. package/shared/definition3.js +5 -9
  307. package/shared/definition30.js +348 -302
  308. package/shared/definition31.js +365 -14
  309. package/shared/definition32.js +12 -71
  310. package/shared/definition33.js +63 -26
  311. package/shared/definition34.js +24 -40
  312. package/shared/definition35.js +32 -436
  313. package/shared/definition36.js +428 -217
  314. package/shared/definition37.js +175 -77
  315. package/shared/definition38.js +50 -34
  316. package/shared/definition39.js +36 -430
  317. package/shared/definition4.js +3 -5
  318. package/shared/definition40.js +358 -589
  319. package/shared/definition41.js +644 -75
  320. package/shared/definition42.js +70 -587
  321. package/shared/definition43.js +503 -84
  322. package/shared/definition44.js +124 -52
  323. package/shared/definition45.js +57 -19
  324. package/shared/definition46.js +17 -487
  325. package/shared/definition47.js +477 -102
  326. package/shared/definition48.js +109 -19
  327. package/shared/definition49.js +17 -276
  328. package/shared/definition5.js +7 -8
  329. package/shared/definition50.js +253 -101
  330. package/shared/definition51.js +114 -629
  331. package/shared/definition52.js +92 -85
  332. package/shared/definition53.js +112 -70
  333. package/shared/definition54.js +65 -294
  334. package/shared/definition55.js +303 -0
  335. package/shared/definition6.js +17 -23
  336. package/shared/definition7.js +44 -47
  337. package/shared/definition8.js +3 -5
  338. package/shared/definition9.js +13 -17
  339. package/shared/design-system/index.d.ts +3 -3
  340. package/shared/focus2.js +1 -3
  341. package/shared/form-associated.js +1 -1
  342. package/shared/form-elements.js +16 -20
  343. package/shared/icon.js +2 -1171
  344. package/shared/index.js +41 -1549
  345. package/shared/listbox.js +1 -1
  346. package/shared/patterns/affix.d.ts +9 -9
  347. package/shared/patterns/focus.d.ts +3 -3
  348. package/shared/patterns/form-elements/form-elements.d.ts +57 -57
  349. package/shared/patterns/form-elements/index.d.ts +1 -1
  350. package/shared/patterns/index.d.ts +3 -3
  351. package/shared/repeat.js +1 -1
  352. package/shared/text-anchor.template.js +38 -40
  353. package/shared/text-field.js +1 -1
  354. package/shared/text-field2.js +1 -1
  355. package/shared/when.js +19 -5
  356. package/side-drawer/index.js +1 -1
  357. package/slider/index.js +1 -4
  358. package/styles/core/all.css +1 -1
  359. package/styles/core/theme.css +1 -1
  360. package/styles/core/typography.css +1 -1
  361. package/styles/tokens/theme-dark.css +17 -17
  362. package/styles/tokens/theme-light.css +17 -17
  363. package/switch/index.js +1 -3
  364. package/tab/index.js +1 -3
  365. package/tab-panel/index.js +1 -1
  366. package/tabs/index.js +3 -5
  367. package/tag/index.js +1 -3
  368. package/tag-group/index.js +1 -1
  369. package/text-anchor/index.js +0 -2
  370. package/text-area/index.js +1 -3
  371. package/text-field/index.js +1 -3
  372. package/toggletip/index.js +1 -5
  373. package/tooltip/index.js +1 -4
  374. package/tree-item/index.js +2 -4
  375. package/tree-view/index.js +1 -1
  376. package/vivid.api.json +210 -848
  377. package/shared/es.object.assign.js +0 -68
  378. package/shared/es.regexp.to-string.js +0 -61
  379. package/shared/es.string.includes.js +0 -83
  380. package/shared/string-trim.js +0 -40
  381. package/shared/to-string.js +0 -51
@@ -1,225 +1,191 @@
1
- import { F as FoundationElement, Y as DOM, _ as __decorate, a as attr, o as observable, b as __metadata, h as html, r as registerFactory } from './index.js';
2
- import { i as iconRegistries } from './definition3.js';
3
- import { f as focusRegistries } from './definition4.js';
4
- import './es.object.assign.js';
5
- import { b as AffixIcon, a as affixIconTemplateFactory } from './affix.js';
6
- import { S as StartEnd } from './start-end.js';
7
- import { D as Direction, g as getDirection } from './direction.js';
8
- import { a as applyMixins } from './apply-mixins.js';
9
- import { i as keyArrowLeft, h as keyArrowRight, e as keySpace, d as keyEnter } from './key-codes.js';
10
- import { f as focusTemplateFactory } from './focus2.js';
11
- import { w as when } from './when.js';
1
+ import { F as FoundationElement, D as DOM, _ as __decorate, o as observable, f as __classPrivateFieldSet, d as __classPrivateFieldGet, a as attr, b as __metadata, h as html, r as registerFactory } from './index.js';
2
+ import { P as Popup, p as popupRegistries } from './definition20.js';
3
+ import { M as MenuItem, a as MenuItemRole, r as roleForMenuItem, m as menuItemRegistries } from './definition31.js';
4
+ import { i as isHTMLElement } from './dom.js';
5
+ import { a as keyHome, k as keyEnd, c as keyArrowUp, b as keyArrowDown } from './key-codes.js';
12
6
  import { s as slotted } from './slotted.js';
13
7
  import { c as classNames } from './class-names.js';
14
8
 
15
9
  /**
16
- * Menu items roles.
17
- * @public
18
- */
19
- const MenuItemRole$1 = {
20
- /**
21
- * The menu item has a "menuitem" role
22
- */
23
- menuitem: "menuitem",
24
- /**
25
- * The menu item has a "menuitemcheckbox" role
26
- */
27
- menuitemcheckbox: "menuitemcheckbox",
28
- /**
29
- * The menu item has a "menuitemradio" role
30
- */
31
- menuitemradio: "menuitemradio",
32
- };
33
- /**
34
- * @internal
35
- */
36
- const roleForMenuItem = {
37
- [MenuItemRole$1.menuitem]: "menuitem",
38
- [MenuItemRole$1.menuitemcheckbox]: "menuitemcheckbox",
39
- [MenuItemRole$1.menuitemradio]: "menuitemradio",
40
- };
41
-
42
- /**
43
- * A Switch Custom HTML Element.
44
- * Implements {@link https://www.w3.org/TR/wai-aria-1.1/#menuitem | ARIA menuitem }, {@link https://www.w3.org/TR/wai-aria-1.1/#menuitemcheckbox | ARIA menuitemcheckbox}, or {@link https://www.w3.org/TR/wai-aria-1.1/#menuitemradio | ARIA menuitemradio }.
10
+ * A Menu Custom HTML Element.
11
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
45
12
  *
46
- * @slot checked-indicator - The checked indicator
47
- * @slot radio-indicator - The radio indicator
48
- * @slot start - Content which can be provided before the menu item content
49
- * @slot end - Content which can be provided after the menu item content
50
- * @slot - The default slot for menu item content
51
- * @slot expand-collapse-indicator - The expand/collapse indicator
52
- * @slot submenu - Used to nest menu's within menu items
53
- * @csspart input-container - The element representing the visual checked or radio indicator
54
- * @csspart checkbox - The element wrapping the `menuitemcheckbox` indicator
55
- * @csspart radio - The element wrapping the `menuitemradio` indicator
56
- * @csspart content - The element wrapping the menu item content
57
- * @csspart expand-collapse-glyph-container - The element wrapping the expand collapse element
58
- * @csspart expand-collapse - The expand/collapse element
59
- * @csspart submenu-region - The container for the submenu, used for positioning
60
- * @fires expanded-change - Fires a custom 'expanded-change' event when the expanded state changes
61
- * @fires change - Fires a custom 'change' event when a non-submenu item with a role of `menuitemcheckbox`, `menuitemradio`, or `menuitem` is invoked
13
+ * @slot - The default slot for the menu items
62
14
  *
63
15
  * @public
64
16
  */
65
- class MenuItem$1 extends FoundationElement {
17
+ class Menu$1 extends FoundationElement {
66
18
  constructor() {
67
19
  super(...arguments);
20
+ this.expandedItem = null;
68
21
  /**
69
- * The role of the element.
70
- *
71
- * @public
72
- * @remarks
73
- * HTML Attribute: role
22
+ * The index of the focusable element in the items array
23
+ * defaults to -1
74
24
  */
75
- this.role = MenuItemRole$1.menuitem;
25
+ this.focusIndex = -1;
76
26
  /**
77
27
  * @internal
78
28
  */
79
- this.hasSubmenu = false;
80
- /**
81
- * Track current direction to pass to the anchored region
82
- *
83
- * @internal
84
- */
85
- this.currentDirection = Direction.ltr;
86
- this.focusSubmenuOnLoad = false;
29
+ this.isNestedMenu = () => {
30
+ return (this.parentElement !== null &&
31
+ isHTMLElement(this.parentElement) &&
32
+ this.parentElement.getAttribute("role") === "menuitem");
33
+ };
87
34
  /**
35
+ * if focus is moving out of the menu, reset to a stable initial state
88
36
  * @internal
89
37
  */
90
- this.handleMenuItemKeyDown = (e) => {
91
- if (e.defaultPrevented) {
92
- return false;
38
+ this.handleFocusOut = (e) => {
39
+ if (!this.contains(e.relatedTarget) && this.menuItems !== undefined) {
40
+ this.collapseExpandedItem();
41
+ // find our first focusable element
42
+ const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
43
+ // set the current focus index's tabindex to -1
44
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
45
+ // set the first focusable element tabindex to 0
46
+ this.menuItems[focusIndex].setAttribute("tabindex", "0");
47
+ // set the focus index
48
+ this.focusIndex = focusIndex;
93
49
  }
94
- switch (e.key) {
95
- case keyEnter:
96
- case keySpace:
97
- this.invoke();
98
- return false;
99
- case keyArrowRight:
100
- //open/focus on submenu
101
- this.expandAndFocus();
102
- return false;
103
- case keyArrowLeft:
104
- //close submenu
105
- if (this.expanded) {
106
- this.expanded = false;
107
- this.focus();
108
- return false;
109
- }
110
- }
111
- return true;
112
50
  };
113
- /**
114
- * @internal
115
- */
116
- this.handleMenuItemClick = (e) => {
117
- if (e.defaultPrevented || this.disabled) {
118
- return false;
51
+ this.handleItemFocus = (e) => {
52
+ const targetItem = e.target;
53
+ if (this.menuItems !== undefined &&
54
+ targetItem !== this.menuItems[this.focusIndex]) {
55
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
56
+ this.focusIndex = this.menuItems.indexOf(targetItem);
57
+ targetItem.setAttribute("tabindex", "0");
119
58
  }
120
- this.invoke();
121
- return false;
122
59
  };
123
- /**
124
- * @internal
125
- */
126
- this.submenuLoaded = () => {
127
- if (!this.focusSubmenuOnLoad) {
60
+ this.handleExpandedChanged = (e) => {
61
+ if (e.defaultPrevented ||
62
+ e.target === null ||
63
+ this.menuItems === undefined ||
64
+ this.menuItems.indexOf(e.target) < 0) {
128
65
  return;
129
66
  }
130
- this.focusSubmenuOnLoad = false;
131
- if (this.hasSubmenu) {
132
- this.submenu.focus();
133
- this.setAttribute("tabindex", "-1");
67
+ e.preventDefault();
68
+ const changedItem = e.target;
69
+ // closing an expanded item without opening another
70
+ if (this.expandedItem !== null &&
71
+ changedItem === this.expandedItem &&
72
+ changedItem.expanded === false) {
73
+ this.expandedItem = null;
74
+ return;
75
+ }
76
+ if (changedItem.expanded) {
77
+ if (this.expandedItem !== null && this.expandedItem !== changedItem) {
78
+ this.expandedItem.expanded = false;
79
+ }
80
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
81
+ this.expandedItem = changedItem;
82
+ this.focusIndex = this.menuItems.indexOf(changedItem);
83
+ changedItem.setAttribute("tabindex", "0");
134
84
  }
135
85
  };
136
- /**
137
- * @internal
138
- */
139
- this.handleMouseOver = (e) => {
140
- if (this.disabled || !this.hasSubmenu || this.expanded) {
141
- return false;
86
+ this.removeItemListeners = () => {
87
+ if (this.menuItems !== undefined) {
88
+ this.menuItems.forEach((item) => {
89
+ item.removeEventListener("expanded-change", this.handleExpandedChanged);
90
+ item.removeEventListener("focus", this.handleItemFocus);
91
+ });
142
92
  }
143
- this.expanded = true;
144
- return false;
145
93
  };
146
- /**
147
- * @internal
148
- */
149
- this.handleMouseOut = (e) => {
150
- if (!this.expanded || this.contains(document.activeElement)) {
151
- return false;
94
+ this.setItems = () => {
95
+ const newItems = this.domChildren();
96
+ this.removeItemListeners();
97
+ this.menuItems = newItems;
98
+ const menuItems = this.menuItems.filter(this.isMenuItemElement);
99
+ // if our focus index is not -1 we have items
100
+ if (menuItems.length) {
101
+ this.focusIndex = 0;
152
102
  }
153
- this.expanded = false;
154
- return false;
103
+ function elementIndent(el) {
104
+ const role = el.getAttribute("role");
105
+ const startSlot = el.querySelector("[slot=start]");
106
+ if (role !== MenuItemRole.menuitem && startSlot === null) {
107
+ return 1;
108
+ }
109
+ else if (role === MenuItemRole.menuitem && startSlot !== null) {
110
+ return 1;
111
+ }
112
+ else if (role !== MenuItemRole.menuitem && startSlot !== null) {
113
+ return 2;
114
+ }
115
+ else {
116
+ return 0;
117
+ }
118
+ }
119
+ const indent = menuItems.reduce((accum, current) => {
120
+ const elementValue = elementIndent(current);
121
+ return accum > elementValue ? accum : elementValue;
122
+ }, 0);
123
+ menuItems.forEach((item, index) => {
124
+ item.setAttribute("tabindex", index === 0 ? "0" : "-1");
125
+ item.addEventListener("expanded-change", this.handleExpandedChanged);
126
+ item.addEventListener("focus", this.handleItemFocus);
127
+ if (item instanceof MenuItem) {
128
+ item.startColumnCount = indent;
129
+ }
130
+ });
155
131
  };
156
132
  /**
157
- * @internal
133
+ * handle change from child element
158
134
  */
159
- this.expandAndFocus = () => {
160
- if (!this.hasSubmenu) {
135
+ this.changeHandler = (e) => {
136
+ if (this.menuItems === undefined) {
161
137
  return;
162
138
  }
163
- this.focusSubmenuOnLoad = true;
164
- this.expanded = true;
165
- };
166
- /**
167
- * @internal
168
- */
169
- this.invoke = () => {
170
- if (this.disabled) {
139
+ const changedMenuItem = e.target;
140
+ const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
141
+ if (changeItemIndex === -1) {
171
142
  return;
172
143
  }
173
- switch (this.role) {
174
- case MenuItemRole$1.menuitemcheckbox:
175
- this.checked = !this.checked;
176
- break;
177
- case MenuItemRole$1.menuitem:
178
- // update submenu
179
- this.updateSubmenu();
180
- if (this.hasSubmenu) {
181
- this.expandAndFocus();
144
+ if (changedMenuItem.role === "menuitemradio" &&
145
+ changedMenuItem.checked === true) {
146
+ for (let i = changeItemIndex - 1; i >= 0; --i) {
147
+ const item = this.menuItems[i];
148
+ const role = item.getAttribute("role");
149
+ if (role === MenuItemRole.menuitemradio) {
150
+ item.checked = false;
151
+ }
152
+ if (role === "separator") {
153
+ break;
182
154
  }
183
- else {
184
- this.$emit("change");
155
+ }
156
+ const maxIndex = this.menuItems.length - 1;
157
+ for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
158
+ const item = this.menuItems[i];
159
+ const role = item.getAttribute("role");
160
+ if (role === MenuItemRole.menuitemradio) {
161
+ item.checked = false;
185
162
  }
186
- break;
187
- case MenuItemRole$1.menuitemradio:
188
- if (!this.checked) {
189
- this.checked = true;
163
+ if (role === "separator") {
164
+ break;
190
165
  }
191
- break;
166
+ }
192
167
  }
193
168
  };
194
169
  /**
195
- * Gets the submenu element if any
196
- *
197
- * @internal
170
+ * check if the item is a menu item
198
171
  */
199
- this.updateSubmenu = () => {
200
- this.submenu = this.domChildren().find((element) => {
201
- return element.getAttribute("role") === "menu";
202
- });
203
- this.hasSubmenu = this.submenu === undefined ? false : true;
172
+ this.isMenuItemElement = (el) => {
173
+ return (isHTMLElement(el) &&
174
+ Menu$1.focusableElementRoles.hasOwnProperty(el.getAttribute("role")));
175
+ };
176
+ /**
177
+ * check if the item is focusable
178
+ */
179
+ this.isFocusableElement = (el) => {
180
+ return this.isMenuItemElement(el);
204
181
  };
205
182
  }
206
- expandedChanged(oldValue) {
207
- if (this.$fastController.isConnected) {
208
- if (this.submenu === undefined) {
209
- return;
210
- }
211
- if (this.expanded === false) {
212
- this.submenu.collapseExpandedItem();
213
- }
214
- else {
215
- this.currentDirection = getDirection(this);
216
- }
217
- this.$emit("expanded-change", this, { bubbles: false });
218
- }
219
- }
220
- checkedChanged(oldValue, newValue) {
221
- if (this.$fastController.isConnected) {
222
- this.$emit("change");
183
+ itemsChanged(oldValue, newValue) {
184
+ // only update children after the component is connected and
185
+ // the setItems has run on connectedCallback
186
+ // (menuItems is undefined until then)
187
+ if (this.$fastController.isConnected && this.menuItems !== undefined) {
188
+ this.setItems();
223
189
  }
224
190
  }
225
191
  /**
@@ -228,22 +194,67 @@ class MenuItem$1 extends FoundationElement {
228
194
  connectedCallback() {
229
195
  super.connectedCallback();
230
196
  DOM.queueUpdate(() => {
231
- this.updateSubmenu();
197
+ // wait until children have had a chance to
198
+ // connect before setting/checking their props/attributes
199
+ this.setItems();
232
200
  });
233
- if (!this.startColumnCount) {
234
- this.startColumnCount = 1;
235
- }
236
- this.observer = new MutationObserver(this.updateSubmenu);
201
+ this.addEventListener("change", this.changeHandler);
237
202
  }
238
203
  /**
239
204
  * @internal
240
205
  */
241
206
  disconnectedCallback() {
242
207
  super.disconnectedCallback();
243
- this.submenu = undefined;
244
- if (this.observer !== undefined) {
245
- this.observer.disconnect();
246
- this.observer = undefined;
208
+ this.removeItemListeners();
209
+ this.menuItems = undefined;
210
+ this.removeEventListener("change", this.changeHandler);
211
+ }
212
+ /**
213
+ * Focuses the first item in the menu.
214
+ *
215
+ * @public
216
+ */
217
+ focus() {
218
+ this.setFocus(0, 1);
219
+ }
220
+ /**
221
+ * Collapses any expanded menu items.
222
+ *
223
+ * @public
224
+ */
225
+ collapseExpandedItem() {
226
+ if (this.expandedItem !== null) {
227
+ this.expandedItem.expanded = false;
228
+ this.expandedItem = null;
229
+ }
230
+ }
231
+ /**
232
+ * @internal
233
+ */
234
+ handleMenuKeyDown(e) {
235
+ if (e.defaultPrevented || this.menuItems === undefined) {
236
+ return;
237
+ }
238
+ switch (e.key) {
239
+ case keyArrowDown:
240
+ // go forward one index
241
+ this.setFocus(this.focusIndex + 1, 1);
242
+ return;
243
+ case keyArrowUp:
244
+ // go back one index
245
+ this.setFocus(this.focusIndex - 1, -1);
246
+ return;
247
+ case keyEnd:
248
+ // set focus on last item
249
+ this.setFocus(this.menuItems.length - 1, -1);
250
+ return;
251
+ case keyHome:
252
+ // set focus on first item
253
+ this.setFocus(0, 1);
254
+ return;
255
+ default:
256
+ // if we are not handling the event, do not prevent default
257
+ return true;
247
258
  }
248
259
  }
249
260
  /**
@@ -252,132 +263,167 @@ class MenuItem$1 extends FoundationElement {
252
263
  domChildren() {
253
264
  return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
254
265
  }
266
+ setFocus(focusIndex, adjustment) {
267
+ if (this.menuItems === undefined) {
268
+ return;
269
+ }
270
+ while (focusIndex >= 0 && focusIndex < this.menuItems.length) {
271
+ const child = this.menuItems[focusIndex];
272
+ if (this.isFocusableElement(child)) {
273
+ // change the previous index to -1
274
+ if (this.focusIndex > -1 &&
275
+ this.menuItems.length >= this.focusIndex - 1) {
276
+ this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
277
+ }
278
+ // update the focus index
279
+ this.focusIndex = focusIndex;
280
+ // update the tabindex of next focusable element
281
+ child.setAttribute("tabindex", "0");
282
+ // focus the element
283
+ child.focus();
284
+ break;
285
+ }
286
+ focusIndex += adjustment;
287
+ }
288
+ }
255
289
  }
256
- __decorate([
257
- attr({ mode: "boolean" })
258
- ], MenuItem$1.prototype, "disabled", void 0);
259
- __decorate([
260
- attr({ mode: "boolean" })
261
- ], MenuItem$1.prototype, "expanded", void 0);
262
- __decorate([
263
- observable
264
- ], MenuItem$1.prototype, "startColumnCount", void 0);
265
- __decorate([
266
- attr
267
- ], MenuItem$1.prototype, "role", void 0);
268
- __decorate([
269
- attr({ mode: "boolean" })
270
- ], MenuItem$1.prototype, "checked", void 0);
271
- __decorate([
272
- observable
273
- ], MenuItem$1.prototype, "submenuRegion", void 0);
274
- __decorate([
275
- observable
276
- ], MenuItem$1.prototype, "hasSubmenu", void 0);
277
- __decorate([
278
- observable
279
- ], MenuItem$1.prototype, "currentDirection", void 0);
290
+ Menu$1.focusableElementRoles = roleForMenuItem;
280
291
  __decorate([
281
292
  observable
282
- ], MenuItem$1.prototype, "submenu", void 0);
283
- applyMixins(MenuItem$1, StartEnd);
293
+ ], Menu$1.prototype, "items", void 0);
284
294
 
285
- var css_248z = "/**\n * Do not edit directly\n * Generated on Tue, 25 Jul 2023 07:38:24 GMT\n */\n@supports selector(:focus-visible) {\n :host(:focus) {\n outline: none;\n }\n}\n.base {\n position: relative;\n display: flex;\n box-sizing: border-box;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n gap: 12px;\n inline-size: 100%;\n padding-block: 2px;\n padding-inline: 16px;\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.base:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-soft);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-dim);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:hover, .hover) {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-pale);\n --_appearance-color-outline: transparent;\n}\n.base {\n /* @cssprop [--vvd-menu-item-accent-primary=var(--vvd-color-canvas-text)] */\n --_connotation-color-primary: var(--vvd-menu-item-accent-primary, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-menu-item-accent-primary-text=var(--vvd-color-canvas)] */\n --_connotation-color-primary-text: var(--vvd-menu-item-accent-primary-text, var(--vvd-color-canvas));\n /* @cssprop [--vvd-menu-item-accent-primary-increment=var(--vvd-color-neutral-800)] */\n --_connotation-color-primary-increment: var(--vvd-menu-item-accent-primary-increment, var(--vvd-color-neutral-800));\n /* @cssprop [--vvd-menu-item-accent-faint=var(--vvd-color-neutral-50)] */\n --_connotation-color-faint: var(--vvd-menu-item-accent-faint, var(--vvd-color-neutral-50));\n /* @cssprop [--vvd-menu-item-accent-soft=var(--vvd-color-neutral-100)] */\n --_connotation-color-soft: var(--vvd-menu-item-accent-soft, var(--vvd-color-neutral-100));\n /* @cssprop [--vvd-menu-item-accent-pale=var(--vvd-color-neutral-300)] */\n --_connotation-color-pale: var(--vvd-menu-item-accent-pale, var(--vvd-color-neutral-300));\n /* @cssprop [--vvd-menu-item-accent-dim=var(--vvd-color-neutral-200)] */\n --_connotation-color-dim: var(--vvd-menu-item-accent-dim, var(--vvd-color-neutral-200));\n}\n.base:not(.two-lines) {\n min-block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2)));\n}\n.base.two-lines {\n min-block-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2))) + calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 16)));\n}\n@supports (user-select: none) {\n .base {\n user-select: none;\n }\n}\n.base:not(.disabled) {\n cursor: pointer;\n}\n.base.disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.focus-indicator {\n border-radius: 6px;\n}\n:host(:not(:focus-visible)) .focus-indicator {\n display: none;\n}\n\n.icon {\n flex-shrink: 0;\n font-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2))) / 2);\n line-height: 1;\n}\n\n.action,\n.decorative {\n display: flex;\n place-content: center;\n}\n\n.action {\n color: var(--_appearance-color-text);\n}\n.base.trailing .action {\n order: 1;\n margin-inline-start: auto;\n}\n\n.base:not(.disabled) .decorative {\n color: var(--vvd-color-neutral-600);\n}\n.base.disabled .decorative {\n color: var(--vvd-color-neutral-200);\n}\n.base.has-meta .decorative {\n order: 1;\n margin-inline-start: auto;\n}\n\n.text {\n display: flex;\n overflow: hidden;\n flex-direction: column;\n}\n\n.text-primary,\n.text-secondary {\n /* stylelint-disable value-no-vendor-prefix */\n display: -webkit-box;\n /* stylelint-enable value-no-vendor-prefix */\n overflow: hidden;\n -webkit-box-orient: vertical;\n color: var(--_appearance-color-text);\n font: var(--vvd-typography-base);\n}\n\n.text-primary {\n -webkit-line-clamp: var(--text-primary-line-clamp, 1);\n}\n.base.two-lines .text-primary {\n font: var(--vvd-typography-base-bold);\n}\n\n.text-secondary {\n -webkit-line-clamp: var(--text-secondary-line-clamp, 1);\n}\n.base.two-lines .text-secondary {\n color: var(--vvd-color-neutral-600);\n}";
295
+ var css_248z = "/**\n * Do not edit directly\n * Generated on Mon, 07 Aug 2023 18:00:27 GMT\n */\n.base {\n display: flex;\n box-sizing: border-box;\n flex-direction: column;\n gap: 8px;\n max-block-size: var(--menu-block-size, 408px);\n max-inline-size: var(--menu-max-inline-size, 100%);\n min-inline-size: var(--menu-min-inline-size);\n overflow-x: hidden;\n overflow-y: auto;\n padding-block: 8px;\n}\n\n::slotted(a) {\n color: var(--vvd-color-canvas-text);\n text-decoration: none;\n}\n\n::slotted(a[role=menuitem]:focus) {\n display: block;\n border-radius: 6px;\n box-shadow: inset 0 0 0 3px currentColor;\n outline: 2px solid currentColor;\n outline-offset: -2px;\n}\n\n.header {\n padding-block-start: 8px;\n padding-inline: 16px;\n}\n.hide-header .header {\n display: none;\n}\n\n.action-items {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-inline: 8px;\n}\n.hide-actions .action-items {\n display: none;\n}";
286
296
 
287
- const MenuItemRole = Object.assign(Object.assign({}, MenuItemRole$1), {
288
- 'presentation': 'presentation'
289
- });
290
- class MenuItem extends MenuItem$1 {}
291
- __decorate([attr, __metadata("design:type", String)], MenuItem.prototype, "text", void 0);
297
+ var _Menu_instances, _Menu_observer, _Menu_anchorEl, _Menu_observeMissingAnchor, _Menu_setupAnchor, _Menu_cleanupAnchor, _Menu_openIfClosed, _Menu_closeOnClickOutside;
298
+ class Menu extends Menu$1 {
299
+ constructor() {
300
+ super(...arguments);
301
+ _Menu_instances.add(this);
302
+ _Menu_observer.set(this, void 0);
303
+ _Menu_anchorEl.set(this, null);
304
+ _Menu_observeMissingAnchor.set(this, anchorId => {
305
+ __classPrivateFieldSet(this, _Menu_observer, new MutationObserver(() => {
306
+ const anchor = document.getElementById(anchorId);
307
+ if (anchor) {
308
+ __classPrivateFieldSet(this, _Menu_anchorEl, anchor, "f");
309
+ __classPrivateFieldGet(this, _Menu_instances, "m", _Menu_setupAnchor).call(this, __classPrivateFieldGet(this, _Menu_anchorEl, "f"));
310
+ __classPrivateFieldGet(this, _Menu_observer, "f").disconnect();
311
+ __classPrivateFieldSet(this, _Menu_observer, undefined, "f");
312
+ }
313
+ }), "f");
314
+ __classPrivateFieldGet(this, _Menu_observer, "f").observe(document.body, {
315
+ childList: true,
316
+ subtree: true
317
+ });
318
+ });
319
+ this.placement = 'bottom';
320
+ this.anchor = '';
321
+ this.autoDismiss = false;
322
+ this.open = false;
323
+ _Menu_openIfClosed.set(this, () => {
324
+ if (!this.open) DOM.queueUpdate(() => this.open = true);
325
+ });
326
+ _Menu_closeOnClickOutside.set(this, e => {
327
+ if (!this.contains(e.target)) this.open = false;
328
+ });
329
+ }
330
+ anchorChanged(_, newValue) {
331
+ var _a;
332
+ if (__classPrivateFieldGet(this, _Menu_anchorEl, "f")) __classPrivateFieldGet(this, _Menu_instances, "m", _Menu_cleanupAnchor).call(this, __classPrivateFieldGet(this, _Menu_anchorEl, "f"));
333
+ (_a = __classPrivateFieldGet(this, _Menu_observer, "f")) === null || _a === void 0 ? void 0 : _a.disconnect();
334
+ __classPrivateFieldSet(this, _Menu_anchorEl, newValue instanceof HTMLElement ? newValue : document.getElementById(newValue), "f");
335
+ if (__classPrivateFieldGet(this, _Menu_anchorEl, "f")) {
336
+ __classPrivateFieldGet(this, _Menu_instances, "m", _Menu_setupAnchor).call(this, __classPrivateFieldGet(this, _Menu_anchorEl, "f"));
337
+ } else {
338
+ __classPrivateFieldGet(this, _Menu_observeMissingAnchor, "f").call(this, newValue);
339
+ }
340
+ }
341
+ autoDismissChanged(oldValue, newValue) {
342
+ if (oldValue === undefined) return;
343
+ if (newValue) {
344
+ document.addEventListener('click', __classPrivateFieldGet(this, _Menu_closeOnClickOutside, "f"));
345
+ } else {
346
+ document.removeEventListener('click', __classPrivateFieldGet(this, _Menu_closeOnClickOutside, "f"));
347
+ }
348
+ }
349
+ openChanged() {
350
+ if (__classPrivateFieldGet(this, _Menu_anchorEl, "f")) {
351
+ __classPrivateFieldGet(this, _Menu_anchorEl, "f").ariaExpanded = this.open.toString();
352
+ }
353
+ }
354
+ disconnectedCallback() {
355
+ var _a;
356
+ super.disconnectedCallback();
357
+ if (__classPrivateFieldGet(this, _Menu_anchorEl, "f")) __classPrivateFieldGet(this, _Menu_instances, "m", _Menu_cleanupAnchor).call(this, __classPrivateFieldGet(this, _Menu_anchorEl, "f"));
358
+ (_a = __classPrivateFieldGet(this, _Menu_observer, "f")) === null || _a === void 0 ? void 0 : _a.disconnect();
359
+ document.removeEventListener('click', __classPrivateFieldGet(this, _Menu_closeOnClickOutside, "f"));
360
+ }
361
+ }
362
+ _Menu_observer = new WeakMap(), _Menu_anchorEl = new WeakMap(), _Menu_observeMissingAnchor = new WeakMap(), _Menu_openIfClosed = new WeakMap(), _Menu_closeOnClickOutside = new WeakMap(), _Menu_instances = new WeakSet(), _Menu_setupAnchor = function _Menu_setupAnchor(a) {
363
+ a.addEventListener('click', __classPrivateFieldGet(this, _Menu_openIfClosed, "f"), true);
364
+ a.setAttribute('aria-haspopup', 'menu');
365
+ }, _Menu_cleanupAnchor = function _Menu_cleanupAnchor(a) {
366
+ a.removeEventListener('click', __classPrivateFieldGet(this, _Menu_openIfClosed, "f"), true);
367
+ a.removeAttribute('aria-hasPopup');
368
+ };
369
+ __decorate([attr({
370
+ mode: 'fromView'
371
+ }), __metadata("design:type", String)], Menu.prototype, "placement", void 0);
372
+ __decorate([attr({
373
+ mode: 'fromView'
374
+ }), __metadata("design:type", Object)], Menu.prototype, "anchor", void 0);
375
+ __decorate([attr({
376
+ mode: 'boolean',
377
+ attribute: 'auto-dismiss'
378
+ }), __metadata("design:type", Object)], Menu.prototype, "autoDismiss", void 0);
292
379
  __decorate([attr({
293
- attribute: 'text-secondary'
294
- }), __metadata("design:type", String)], MenuItem.prototype, "textSecondary", void 0);
295
- __decorate([observable, __metadata("design:type", Array)], MenuItem.prototype, "metaSlottedContent", void 0);
296
- applyMixins(MenuItem, AffixIcon);
380
+ mode: 'boolean'
381
+ }), __metadata("design:type", Object)], Menu.prototype, "open", void 0);
382
+ __decorate([observable, __metadata("design:type", Array)], Menu.prototype, "headerSlottedContent", void 0);
383
+ __decorate([observable, __metadata("design:type", Array)], Menu.prototype, "actionItemsSlottedContent", void 0);
297
384
 
298
- let _ = t => t,
299
- _t,
300
- _t2,
301
- _t3,
302
- _t4,
303
- _t5,
304
- _t6,
305
- _t7,
306
- _t8,
307
- _t9;
308
- const getCheckIcon = (affixIconTemplate, x, iconType) => {
309
- const iconStatus = x.checked ? 'checked' : 'unchecked';
310
- const icon = `${iconType}-${iconStatus}-line`;
311
- return affixIconTemplate(icon);
312
- };
313
385
  const getClasses = ({
314
- disabled,
315
- checked,
316
- expanded,
317
- role,
318
- text,
319
- textSecondary,
320
- icon,
321
- metaSlottedContent
322
- }) => classNames('base', ['disabled', Boolean(disabled)], ['selected', role !== MenuItemRole.menuitem && Boolean(checked)], ['trailing', role !== MenuItemRole.menuitem && Boolean(icon)], ['expanded', Boolean(expanded)], ['item-checkbox', role === MenuItemRole.menuitemcheckbox], ['item-radio', role === MenuItemRole.menuitemradio], ['two-lines', Boolean(text === null || text === void 0 ? void 0 : text.length) && Boolean(textSecondary === null || textSecondary === void 0 ? void 0 : textSecondary.length)], ['has-meta', Boolean(metaSlottedContent === null || metaSlottedContent === void 0 ? void 0 : metaSlottedContent.length)]);
323
- function handleClick(x, {
324
- event
325
- }) {
326
- x.handleMenuItemClick(event);
327
- return x.role === MenuItemRole.presentation;
328
- }
329
- const MenuItemTemplate = (context, definition) => {
330
- const affixIconTemplate = affixIconTemplateFactory(context);
331
- const focusTemplate = focusTemplateFactory(context);
332
- return html(_t || (_t = _`
333
- <template
334
- aria-checked="${0}"
335
- aria-disabled="${0}"
336
- aria-expanded="${0}"
337
- @keydown="${0}"
338
- @click="${0}"
339
- @mouseover="${0}"
340
- @mouseout="${0}"
341
- >
342
- <div class="${0}">
343
-
344
- ${0}
345
- ${0}
346
- ${0}
347
- ${0}
348
-
349
- ${0}
350
-
351
- ${0}
352
-
353
- ${0}
354
-
355
-
356
-
357
- </div>
358
- </template>
359
- `), x => x.role !== MenuItemRole.menuitem ? x.checked : void 0, x => x.disabled, x => x.expanded, (x, c) => x.handleMenuItemKeyDown(c.event), handleClick, (x, c) => x.handleMouseOver(c.event), (x, c) => x.handleMouseOut(c.event), getClasses, when(x => x.hasSubmenu, html(_t2 || (_t2 = _`
360
- <div
361
- class="expand-collapse-glyph-container"
362
- >
363
- <span class="expand-collapse">
364
- <slot name="expand-collapse-indicator">
365
- ${0}
366
- </slot>
367
- </span>
368
- </div>
369
- `), definition.expandCollapseGlyph || '')), () => focusTemplate, when(x => x.role !== MenuItemRole.menuitemcheckbox && x.role !== MenuItemRole.menuitemradio, html(_t3 || (_t3 = _`<slot name="meta" ${0}></slot>`), slotted('metaSlottedContent'))), when(x => x.role === MenuItemRole.menuitemcheckbox, html(_t4 || (_t4 = _`<span class="action">${0}</span>`), x => getCheckIcon(affixIconTemplate, x, 'checkbox'))), when(x => x.role === MenuItemRole.menuitemradio, html(_t5 || (_t5 = _`<span class="action">${0}</span>`), x => getCheckIcon(affixIconTemplate, x, 'radio'))), when(x => x.icon, html(_t6 || (_t6 = _`<span class="decorative">${0}</span>`), x => affixIconTemplate(x.icon))), when(x => x.text || x.textSecondary, html(_t7 || (_t7 = _`<span class="text">
370
- ${0}
371
- ${0}
372
- </span>`), when(x => x.text, html(_t8 || (_t8 = _`<span class="text-primary">${0}</span>`), x => x.text)), when(x => x.textSecondary, html(_t9 || (_t9 = _`<span class="text-secondary">${0}</span>`), x => x.textSecondary)))));
386
+ headerSlottedContent,
387
+ actionItemsSlottedContent
388
+ }) => classNames('base', ['hide-header', !(headerSlottedContent === null || headerSlottedContent === void 0 ? void 0 : headerSlottedContent.length)], ['hide-actions', !(actionItemsSlottedContent === null || actionItemsSlottedContent === void 0 ? void 0 : actionItemsSlottedContent.length)]);
389
+ const MenuTemplate = context => {
390
+ const popupTag = context.tagFor(Popup);
391
+ function handlePopupEvents(x, state) {
392
+ x.open = state;
393
+ }
394
+ return html`
395
+ <template>
396
+ <${popupTag}
397
+ :placement=${x => x.placement}
398
+ :open=${x => x.open}
399
+ :anchor=${x => x.anchor}
400
+ @vwc-popup:open="${x => handlePopupEvents(x, true)}"
401
+ @vwc-popup:close="${x => handlePopupEvents(x, false)}"
402
+ >
403
+ <div class="${getClasses}">
404
+ <div class="header">
405
+ <slot name="header" ${slotted('headerSlottedContent')}></slot>
406
+ </div>
407
+ <div
408
+ class="body"
409
+ role="menu"
410
+ @keydown="${(x, c) => x.handleMenuKeyDown(c.event)}"
411
+ @focusout="${(x, c) => x.handleFocusOut(c.event)}"
412
+ >
413
+ <slot ${slotted('items')}></slot>
414
+ </div>
415
+ <footer class="action-items"><slot name="action-items" ${slotted('actionItemsSlottedContent')}></slot></footer>
416
+ </div>
417
+ </${popupTag}>
418
+ </template>`;
373
419
  };
374
420
 
375
- const menuItemDefinition = MenuItem.compose({
376
- baseName: 'menu-item',
377
- template: MenuItemTemplate,
421
+ const menuDefinition = Menu.compose({
422
+ baseName: 'menu',
423
+ template: MenuTemplate,
378
424
  styles: css_248z
379
425
  });
380
- const menuItemRegistries = [menuItemDefinition(), ...iconRegistries, ...focusRegistries];
381
- const registerMenuItem = registerFactory(menuItemRegistries);
426
+ const menuRegistries = [menuDefinition(), ...popupRegistries, ...menuItemRegistries];
427
+ const registerMenu = registerFactory(menuRegistries);
382
428
 
383
- export { MenuItem$1 as M, MenuItemRole$1 as a, registerMenuItem as b, menuItemDefinition as c, menuItemRegistries as m, roleForMenuItem as r };
429
+ export { menuRegistries as a, menuDefinition as m, registerMenu as r };