@crowdstrike/glide-core 0.13.0 → 0.14.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 (287) hide show
  1. package/dist/drawer.d.ts +2 -2
  2. package/dist/drawer.js +1 -1
  3. package/dist/drawer.styles.js +3 -3
  4. package/dist/dropdown.js +11 -11
  5. package/dist/dropdown.option.d.ts +1 -1
  6. package/dist/dropdown.option.js +1 -1
  7. package/dist/dropdown.styles.js +11 -16
  8. package/dist/input.styles.js +6 -1
  9. package/dist/styles/variables.css +1 -1
  10. package/dist/textarea.styles.js +6 -0
  11. package/dist/toasts.d.ts +2 -2
  12. package/dist/toasts.toast.d.ts +1 -1
  13. package/dist/toasts.toast.js +1 -1
  14. package/dist/toasts.toast.styles.js +8 -0
  15. package/dist/tree.item.styles.js +2 -2
  16. package/package.json +9 -6
  17. package/dist/accordion.stories.d.ts +0 -6
  18. package/dist/accordion.test.basics.d.ts +0 -1
  19. package/dist/accordion.test.basics.js +0 -28
  20. package/dist/accordion.test.events.d.ts +0 -1
  21. package/dist/accordion.test.events.js +0 -28
  22. package/dist/accordion.test.focus.d.ts +0 -1
  23. package/dist/accordion.test.focus.js +0 -11
  24. package/dist/accordion.test.interactions.d.ts +0 -1
  25. package/dist/accordion.test.interactions.js +0 -75
  26. package/dist/button-group.button.test.basics.d.ts +0 -1
  27. package/dist/button-group.button.test.basics.js +0 -97
  28. package/dist/button-group.button.test.events.d.ts +0 -1
  29. package/dist/button-group.button.test.events.js +0 -15
  30. package/dist/button-group.button.test.focus.d.ts +0 -1
  31. package/dist/button-group.button.test.focus.js +0 -13
  32. package/dist/button-group.button.test.interactions.d.ts +0 -1
  33. package/dist/button-group.button.test.interactions.js +0 -42
  34. package/dist/button-group.stories.d.ts +0 -7
  35. package/dist/button-group.test.basics.d.ts +0 -1
  36. package/dist/button-group.test.basics.js +0 -148
  37. package/dist/button-group.test.events.d.ts +0 -1
  38. package/dist/button-group.test.events.js +0 -241
  39. package/dist/button-group.test.focus.d.ts +0 -1
  40. package/dist/button-group.test.focus.js +0 -39
  41. package/dist/button-group.test.interactions.d.ts +0 -1
  42. package/dist/button-group.test.interactions.js +0 -91
  43. package/dist/button.stories.d.ts +0 -7
  44. package/dist/button.test.basics.d.ts +0 -1
  45. package/dist/button.test.basics.js +0 -69
  46. package/dist/button.test.events.d.ts +0 -1
  47. package/dist/button.test.events.js +0 -102
  48. package/dist/checkbox-group.stories.d.ts +0 -6
  49. package/dist/checkbox-group.test.basics.d.ts +0 -1
  50. package/dist/checkbox-group.test.basics.js +0 -116
  51. package/dist/checkbox-group.test.events.d.ts +0 -1
  52. package/dist/checkbox-group.test.events.js +0 -111
  53. package/dist/checkbox-group.test.focus.d.ts +0 -1
  54. package/dist/checkbox-group.test.focus.js +0 -70
  55. package/dist/checkbox-group.test.form.d.ts +0 -1
  56. package/dist/checkbox-group.test.form.js +0 -131
  57. package/dist/checkbox-group.test.interactions.d.ts +0 -1
  58. package/dist/checkbox-group.test.interactions.js +0 -82
  59. package/dist/checkbox-group.test.validity.d.ts +0 -1
  60. package/dist/checkbox-group.test.validity.js +0 -145
  61. package/dist/checkbox.stories.d.ts +0 -5
  62. package/dist/checkbox.test.basics.d.ts +0 -1
  63. package/dist/checkbox.test.basics.js +0 -90
  64. package/dist/checkbox.test.events.d.ts +0 -1
  65. package/dist/checkbox.test.events.js +0 -105
  66. package/dist/checkbox.test.focus.d.ts +0 -1
  67. package/dist/checkbox.test.focus.js +0 -51
  68. package/dist/checkbox.test.form.d.ts +0 -1
  69. package/dist/checkbox.test.form.js +0 -133
  70. package/dist/checkbox.test.interactions.d.ts +0 -1
  71. package/dist/checkbox.test.interactions.js +0 -131
  72. package/dist/checkbox.test.validity.d.ts +0 -1
  73. package/dist/checkbox.test.validity.js +0 -128
  74. package/dist/drawer.stories.d.ts +0 -6
  75. package/dist/drawer.test.accessibility.d.ts +0 -1
  76. package/dist/drawer.test.accessibility.js +0 -22
  77. package/dist/drawer.test.basics.d.ts +0 -1
  78. package/dist/drawer.test.basics.js +0 -44
  79. package/dist/drawer.test.closing.d.ts +0 -1
  80. package/dist/drawer.test.closing.js +0 -40
  81. package/dist/drawer.test.events.d.ts +0 -1
  82. package/dist/drawer.test.events.js +0 -42
  83. package/dist/drawer.test.methods.d.ts +0 -1
  84. package/dist/drawer.test.methods.js +0 -35
  85. package/dist/dropdown.option.test.basics.d.ts +0 -1
  86. package/dist/dropdown.option.test.basics.js +0 -34
  87. package/dist/dropdown.option.test.basics.multiple.d.ts +0 -1
  88. package/dist/dropdown.option.test.basics.multiple.js +0 -36
  89. package/dist/dropdown.option.test.basics.single.d.ts +0 -1
  90. package/dist/dropdown.option.test.basics.single.js +0 -29
  91. package/dist/dropdown.option.test.events.d.ts +0 -1
  92. package/dist/dropdown.option.test.events.js +0 -36
  93. package/dist/dropdown.option.test.focus.d.ts +0 -1
  94. package/dist/dropdown.option.test.focus.js +0 -11
  95. package/dist/dropdown.option.test.interactions.multiple.d.ts +0 -1
  96. package/dist/dropdown.option.test.interactions.multiple.js +0 -42
  97. package/dist/dropdown.option.test.interactions.single.d.ts +0 -1
  98. package/dist/dropdown.option.test.interactions.single.js +0 -76
  99. package/dist/dropdown.stories.d.ts +0 -8
  100. package/dist/dropdown.test.basics.d.ts +0 -1
  101. package/dist/dropdown.test.basics.filterable.d.ts +0 -1
  102. package/dist/dropdown.test.basics.filterable.js +0 -108
  103. package/dist/dropdown.test.basics.js +0 -181
  104. package/dist/dropdown.test.basics.multiple.d.ts +0 -1
  105. package/dist/dropdown.test.basics.multiple.js +0 -259
  106. package/dist/dropdown.test.basics.single.d.ts +0 -1
  107. package/dist/dropdown.test.basics.single.js +0 -122
  108. package/dist/dropdown.test.events.d.ts +0 -1
  109. package/dist/dropdown.test.events.filterable.d.ts +0 -1
  110. package/dist/dropdown.test.events.filterable.js +0 -31
  111. package/dist/dropdown.test.events.js +0 -251
  112. package/dist/dropdown.test.events.multiple.d.ts +0 -1
  113. package/dist/dropdown.test.events.multiple.js +0 -446
  114. package/dist/dropdown.test.events.single.d.ts +0 -1
  115. package/dist/dropdown.test.events.single.js +0 -343
  116. package/dist/dropdown.test.focus.d.ts +0 -1
  117. package/dist/dropdown.test.focus.filterable.d.ts +0 -1
  118. package/dist/dropdown.test.focus.filterable.js +0 -140
  119. package/dist/dropdown.test.focus.js +0 -107
  120. package/dist/dropdown.test.focus.multiple.d.ts +0 -1
  121. package/dist/dropdown.test.focus.multiple.js +0 -170
  122. package/dist/dropdown.test.focus.single.d.ts +0 -1
  123. package/dist/dropdown.test.focus.single.js +0 -42
  124. package/dist/dropdown.test.form.d.ts +0 -1
  125. package/dist/dropdown.test.form.js +0 -74
  126. package/dist/dropdown.test.form.multiple.d.ts +0 -1
  127. package/dist/dropdown.test.form.multiple.js +0 -151
  128. package/dist/dropdown.test.form.single.d.ts +0 -1
  129. package/dist/dropdown.test.form.single.js +0 -129
  130. package/dist/dropdown.test.interactions.d.ts +0 -1
  131. package/dist/dropdown.test.interactions.filterable.d.ts +0 -1
  132. package/dist/dropdown.test.interactions.filterable.js +0 -805
  133. package/dist/dropdown.test.interactions.js +0 -696
  134. package/dist/dropdown.test.interactions.multiple.d.ts +0 -1
  135. package/dist/dropdown.test.interactions.multiple.js +0 -1026
  136. package/dist/dropdown.test.interactions.single.d.ts +0 -1
  137. package/dist/dropdown.test.interactions.single.js +0 -569
  138. package/dist/dropdown.test.validity.d.ts +0 -1
  139. package/dist/dropdown.test.validity.js +0 -181
  140. package/dist/form-controls-layout.stories.d.ts +0 -10
  141. package/dist/form-controls-layout.test.basics.d.ts +0 -2
  142. package/dist/form-controls-layout.test.basics.js +0 -75
  143. package/dist/form-controls-layout.test.interactions.d.ts +0 -2
  144. package/dist/form-controls-layout.test.interactions.js +0 -26
  145. package/dist/icon-button.stories.d.ts +0 -6
  146. package/dist/icon-button.test.basics.d.ts +0 -1
  147. package/dist/icon-button.test.basics.js +0 -43
  148. package/dist/icon-button.test.focus.d.ts +0 -1
  149. package/dist/icon-button.test.focus.js +0 -13
  150. package/dist/input.stories.d.ts +0 -8
  151. package/dist/input.test.basics.d.ts +0 -1
  152. package/dist/input.test.basics.js +0 -138
  153. package/dist/input.test.events.d.ts +0 -1
  154. package/dist/input.test.events.js +0 -98
  155. package/dist/input.test.focus.d.ts +0 -1
  156. package/dist/input.test.focus.js +0 -58
  157. package/dist/input.test.form.d.ts +0 -1
  158. package/dist/input.test.form.js +0 -74
  159. package/dist/input.test.validity.d.ts +0 -1
  160. package/dist/input.test.validity.js +0 -258
  161. package/dist/label.test.basics.d.ts +0 -1
  162. package/dist/label.test.basics.js +0 -136
  163. package/dist/menu.button.test.basics.d.ts +0 -1
  164. package/dist/menu.button.test.basics.js +0 -43
  165. package/dist/menu.link.test.basics.d.ts +0 -1
  166. package/dist/menu.link.test.basics.js +0 -47
  167. package/dist/menu.options.test.basics.d.ts +0 -2
  168. package/dist/menu.options.test.basics.js +0 -44
  169. package/dist/menu.options.test.events.d.ts +0 -1
  170. package/dist/menu.options.test.events.js +0 -19
  171. package/dist/menu.stories.d.ts +0 -11
  172. package/dist/menu.test.basics.d.ts +0 -1
  173. package/dist/menu.test.basics.js +0 -178
  174. package/dist/menu.test.events.d.ts +0 -3
  175. package/dist/menu.test.events.js +0 -125
  176. package/dist/menu.test.focus.d.ts +0 -2
  177. package/dist/menu.test.focus.js +0 -102
  178. package/dist/menu.test.interactions.d.ts +0 -3
  179. package/dist/menu.test.interactions.js +0 -1069
  180. package/dist/modal.icon-button.test.basics.d.ts +0 -1
  181. package/dist/modal.icon-button.test.basics.js +0 -46
  182. package/dist/modal.stories.d.ts +0 -13
  183. package/dist/modal.tertiary-icon.test.basics.d.ts +0 -1
  184. package/dist/modal.tertiary-icon.test.basics.js +0 -60
  185. package/dist/modal.test.accessibility.d.ts +0 -1
  186. package/dist/modal.test.accessibility.js +0 -38
  187. package/dist/modal.test.basics.d.ts +0 -3
  188. package/dist/modal.test.basics.js +0 -204
  189. package/dist/modal.test.close.d.ts +0 -1
  190. package/dist/modal.test.close.js +0 -35
  191. package/dist/modal.test.events.d.ts +0 -1
  192. package/dist/modal.test.events.js +0 -99
  193. package/dist/modal.test.lock-scroll.d.ts +0 -1
  194. package/dist/modal.test.lock-scroll.js +0 -67
  195. package/dist/modal.test.methods.d.ts +0 -1
  196. package/dist/modal.test.methods.js +0 -20
  197. package/dist/modal.test.scrollbars.d.ts +0 -1
  198. package/dist/modal.test.scrollbars.js +0 -18
  199. package/dist/radio-group.stories.d.ts +0 -6
  200. package/dist/radio-group.test.basics.d.ts +0 -2
  201. package/dist/radio-group.test.basics.js +0 -324
  202. package/dist/radio-group.test.events.d.ts +0 -2
  203. package/dist/radio-group.test.events.js +0 -278
  204. package/dist/radio-group.test.focus.d.ts +0 -2
  205. package/dist/radio-group.test.focus.js +0 -95
  206. package/dist/radio-group.test.form.d.ts +0 -1
  207. package/dist/radio-group.test.form.js +0 -124
  208. package/dist/radio-group.test.validity.d.ts +0 -1
  209. package/dist/radio-group.test.validity.js +0 -311
  210. package/dist/split-button.primary-button.test.basics.d.ts +0 -1
  211. package/dist/split-button.primary-button.test.basics.js +0 -31
  212. package/dist/split-button.primary-button.test.focus.d.ts +0 -1
  213. package/dist/split-button.primary-button.test.focus.js +0 -14
  214. package/dist/split-button.primary-link.test.basics.d.ts +0 -1
  215. package/dist/split-button.primary-link.test.basics.js +0 -30
  216. package/dist/split-button.primary-link.test.focus.d.ts +0 -1
  217. package/dist/split-button.primary-link.test.focus.js +0 -15
  218. package/dist/split-button.secondary-button.test.basics.d.ts +0 -1
  219. package/dist/split-button.secondary-button.test.basics.js +0 -58
  220. package/dist/split-button.secondary-button.test.focus.d.ts +0 -1
  221. package/dist/split-button.secondary-button.test.focus.js +0 -14
  222. package/dist/split-button.secondary-button.test.interactions.d.ts +0 -2
  223. package/dist/split-button.secondary-button.test.interactions.js +0 -30
  224. package/dist/split-button.stories.d.ts +0 -13
  225. package/dist/split-button.test.basics.d.ts +0 -2
  226. package/dist/split-button.test.basics.js +0 -87
  227. package/dist/split-button.test.interactions.d.ts +0 -4
  228. package/dist/split-button.test.interactions.js +0 -51
  229. package/dist/tab.group.test.basics.d.ts +0 -3
  230. package/dist/tab.group.test.basics.js +0 -234
  231. package/dist/tab.group.test.interactions.d.ts +0 -3
  232. package/dist/tab.group.test.interactions.js +0 -434
  233. package/dist/tab.test.basics.d.ts +0 -1
  234. package/dist/tab.test.basics.js +0 -50
  235. package/dist/tabs.stories.d.ts +0 -8
  236. package/dist/tag.stories.d.ts +0 -7
  237. package/dist/tag.test.basics.d.ts +0 -1
  238. package/dist/tag.test.basics.js +0 -28
  239. package/dist/tag.test.events.d.ts +0 -1
  240. package/dist/tag.test.events.js +0 -93
  241. package/dist/tag.test.focus.d.ts +0 -1
  242. package/dist/tag.test.focus.js +0 -10
  243. package/dist/tag.test.interactions.d.ts +0 -1
  244. package/dist/tag.test.interactions.js +0 -36
  245. package/dist/textarea.stories.d.ts +0 -5
  246. package/dist/textarea.test.basics.d.ts +0 -1
  247. package/dist/textarea.test.basics.js +0 -177
  248. package/dist/textarea.test.events.d.ts +0 -1
  249. package/dist/textarea.test.events.js +0 -106
  250. package/dist/textarea.test.form.d.ts +0 -1
  251. package/dist/textarea.test.form.js +0 -71
  252. package/dist/textarea.test.validity.d.ts +0 -1
  253. package/dist/textarea.test.validity.js +0 -204
  254. package/dist/toasts.stories.d.ts +0 -7
  255. package/dist/toasts.test.basics.d.ts +0 -1
  256. package/dist/toasts.test.basics.js +0 -115
  257. package/dist/toasts.toast.test.basics.d.ts +0 -1
  258. package/dist/toasts.toast.test.basics.js +0 -139
  259. package/dist/toggle.stories.d.ts +0 -4
  260. package/dist/toggle.test.basics.d.ts +0 -1
  261. package/dist/toggle.test.basics.js +0 -69
  262. package/dist/toggle.test.events.d.ts +0 -1
  263. package/dist/toggle.test.events.js +0 -30
  264. package/dist/toggle.test.focus.d.ts +0 -1
  265. package/dist/toggle.test.focus.js +0 -9
  266. package/dist/toggle.test.interactions.d.ts +0 -1
  267. package/dist/toggle.test.interactions.js +0 -81
  268. package/dist/tooltip.stories.d.ts +0 -7
  269. package/dist/tooltip.test.basics.d.ts +0 -1
  270. package/dist/tooltip.test.basics.js +0 -100
  271. package/dist/tooltip.test.interactions.d.ts +0 -1
  272. package/dist/tooltip.test.interactions.js +0 -203
  273. package/dist/tree.item.icon-button.test.basics.d.ts +0 -1
  274. package/dist/tree.item.icon-button.test.basics.js +0 -22
  275. package/dist/tree.item.menu.test.basics.d.ts +0 -1
  276. package/dist/tree.item.menu.test.basics.js +0 -86
  277. package/dist/tree.item.test.basics.d.ts +0 -2
  278. package/dist/tree.item.test.basics.js +0 -138
  279. package/dist/tree.stories.d.ts +0 -9
  280. package/dist/tree.test.aria.d.ts +0 -1
  281. package/dist/tree.test.aria.js +0 -86
  282. package/dist/tree.test.basics.d.ts +0 -3
  283. package/dist/tree.test.basics.js +0 -130
  284. package/dist/tree.test.events.d.ts +0 -2
  285. package/dist/tree.test.events.js +0 -19
  286. package/dist/tree.test.focus.d.ts +0 -1
  287. package/dist/tree.test.focus.js +0 -383
@@ -1,1069 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- import './menu.button.js';
9
- import './menu.link.js';
10
- import './menu.options.js';
11
- import { LitElement } from 'lit';
12
- import { aTimeout, assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
13
- import { customElement } from 'lit/decorators.js';
14
- import { sendKeys } from '@web/test-runner-commands';
15
- import { sendMouse } from '@web/test-runner-commands';
16
- import GlideCoreMenu from './menu.js';
17
- let GlideCoreNestedSlot = class GlideCoreNestedSlot extends LitElement {
18
- static { this.shadowRootOptions = {
19
- ...LitElement.shadowRootOptions,
20
- mode: 'closed',
21
- }; }
22
- render() {
23
- return html `<glide-core-menu open>
24
- <button slot="target">Target</button>
25
-
26
- <glide-core-menu-options>
27
- <slot></slot>
28
- </glide-core-menu-options>
29
- </glide-core-menu>`;
30
- }
31
- };
32
- GlideCoreNestedSlot = __decorate([
33
- customElement('glide-core-nested-slot')
34
- ], GlideCoreNestedSlot);
35
- let GlideCoreMenuInAnotherComponent = class GlideCoreMenuInAnotherComponent extends LitElement {
36
- static { this.shadowRootOptions = {
37
- ...LitElement.shadowRootOptions,
38
- mode: 'closed',
39
- }; }
40
- render() {
41
- return html `<glide-core-menu open>
42
- <button slot="target">Target</button>
43
-
44
- <glide-core-menu-options>
45
- <glide-core-menu-link label="Link"></glide-core-menu-link>
46
- </glide-core-menu-options>
47
- </glide-core-menu>`;
48
- }
49
- };
50
- GlideCoreMenuInAnotherComponent = __decorate([
51
- customElement('glide-core-menu-in-another-component')
52
- ], GlideCoreMenuInAnotherComponent);
53
- GlideCoreMenu.shadowRootOptions.mode = 'open';
54
- GlideCoreNestedSlot.shadowRootOptions.mode = 'open';
55
- GlideCoreMenuInAnotherComponent.shadowRootOptions.mode = 'open';
56
- it('opens on click', async () => {
57
- const component = await fixture(html `<glide-core-menu>
58
- <button slot="target">Target</button>
59
-
60
- <glide-core-menu-options>
61
- <glide-core-menu-link label="Link"></glide-core-menu-link>
62
- </glide-core-menu-options>
63
- </glide-core-menu>`);
64
- component.querySelector('button')?.click();
65
- // Wait for Floating UI.
66
- await aTimeout(0);
67
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
68
- const target = component.querySelector('button');
69
- const options = component.querySelector('glide-core-menu-options');
70
- const link = component.querySelector('glide-core-menu-link');
71
- expect(component.open).to.be.true;
72
- expect(defaultSlot?.checkVisibility()).to.be.true;
73
- expect(target?.ariaExpanded).to.equal('true');
74
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
75
- });
76
- it('opens when `open` is set programmatically', async () => {
77
- const component = await fixture(html `<glide-core-menu>
78
- <button slot="target">Target</button>
79
-
80
- <glide-core-menu-options>
81
- <glide-core-menu-link label="Link"></glide-core-menu-link>
82
- </glide-core-menu-options>
83
- </glide-core-menu>`);
84
- component.open = true;
85
- // Wait for Floating UI.
86
- await aTimeout(0);
87
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
88
- const target = component.querySelector('button');
89
- const options = component.querySelector('glide-core-menu-options');
90
- const link = component.querySelector('glide-core-menu-link');
91
- expect(component.open).to.be.true;
92
- expect(defaultSlot?.checkVisibility()).to.be.true;
93
- expect(target?.ariaExpanded).to.equal('true');
94
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
95
- });
96
- it('opens when `disabled` is set programmatically on its target', async () => {
97
- const component = await fixture(html `<glide-core-menu>
98
- <button slot="target" disabled>Target</button>
99
-
100
- <glide-core-menu-options>
101
- <glide-core-menu-link label="Link"></glide-core-menu-link>
102
- </glide-core-menu-options>
103
- </glide-core-menu>`);
104
- const target = component.querySelector('button');
105
- assert(target);
106
- target.disabled = false;
107
- target.click();
108
- // Wait for Floating UI.
109
- await aTimeout(0);
110
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
111
- const options = component.querySelector('glide-core-menu-options');
112
- const link = component.querySelector('glide-core-menu-link');
113
- expect(component.open).to.be.true;
114
- expect(defaultSlot?.checkVisibility()).to.be.true;
115
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
116
- expect(target?.ariaExpanded).to.equal('true');
117
- });
118
- it('opens when `aria-disabled` is set programmatically on its target', async () => {
119
- const component = await fixture(html `<glide-core-menu>
120
- <button slot="target" aria-disabled="true">Target</button>
121
-
122
- <glide-core-menu-options>
123
- <glide-core-menu-link label="Link"></glide-core-menu-link>
124
- </glide-core-menu-options>
125
- </glide-core-menu>`);
126
- const target = component.querySelector('button');
127
- assert(target);
128
- target.ariaDisabled = 'false';
129
- target.click();
130
- // Wait for Floating UI.
131
- await aTimeout(0);
132
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
133
- const options = component.querySelector('glide-core-menu-options');
134
- const link = component.querySelector('glide-core-menu-link');
135
- expect(component.open).to.be.true;
136
- expect(defaultSlot?.checkVisibility()).to.be.true;
137
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
138
- expect(target?.ariaExpanded).to.equal('true');
139
- });
140
- it('closes when `open` is set programmatically', async () => {
141
- const component = await fixture(html `<glide-core-menu open>
142
- <button slot="target">Target</button>
143
-
144
- <glide-core-menu-options>
145
- <glide-core-menu-link label="Link"></glide-core-menu-link>
146
- </glide-core-menu-options>
147
- </glide-core-menu>`);
148
- // Wait for Floating UI.
149
- await aTimeout(0);
150
- component.open = false;
151
- await elementUpdated(component);
152
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
153
- const target = component.querySelector('button');
154
- const options = component.querySelector('glide-core-menu-options');
155
- expect(component.open).to.be.false;
156
- expect(defaultSlot?.checkVisibility()).to.be.false;
157
- expect(target?.ariaExpanded).to.equal('false');
158
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
159
- });
160
- it('does not open on click when there are no options', async () => {
161
- const component = await fixture(html `<glide-core-menu>
162
- <button slot="target">Target</button>
163
- <glide-core-menu-options> </glide-core-menu-options>
164
- </glide-core-menu>`);
165
- component.querySelector('button')?.click();
166
- // Wait for Floating UI.
167
- await aTimeout(0);
168
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
169
- const options = component.querySelector('glide-core-menu-options');
170
- const target = component.querySelector('button');
171
- expect(component.open).to.be.false;
172
- expect(defaultSlot?.checkVisibility()).to.be.false;
173
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
174
- expect(target?.ariaExpanded).to.equal('false');
175
- });
176
- it('does not open when `disabled` is set on its target', async () => {
177
- const component = await fixture(html `<glide-core-menu>
178
- <button slot="target" disabled>Target</button>
179
-
180
- <glide-core-menu-options>
181
- <glide-core-menu-link label="Link"></glide-core-menu-link>
182
- </glide-core-menu-options>
183
- </glide-core-menu>`);
184
- component.querySelector('button')?.click();
185
- // Wait for Floating UI.
186
- await aTimeout(0);
187
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
188
- const options = component.querySelector('glide-core-menu-options');
189
- const target = component.querySelector('button');
190
- expect(component.open).to.be.false;
191
- expect(defaultSlot?.checkVisibility()).to.be.false;
192
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
193
- expect(target?.ariaExpanded).to.equal('false');
194
- });
195
- it('does not open when `disabled` is set programmatically on its target', async () => {
196
- const component = await fixture(html `<glide-core-menu>
197
- <button slot="target">Target</button>
198
-
199
- <glide-core-menu-options>
200
- <glide-core-menu-link label="Link"></glide-core-menu-link>
201
- </glide-core-menu-options>
202
- </glide-core-menu>`);
203
- const target = component.querySelector('button');
204
- assert(target);
205
- target.disabled = true;
206
- target.click();
207
- // Wait for Floating UI.
208
- await aTimeout(0);
209
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
210
- const options = component.querySelector('glide-core-menu-options');
211
- expect(component.open).to.be.false;
212
- expect(defaultSlot?.checkVisibility()).to.be.false;
213
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
214
- expect(target?.ariaExpanded).to.equal('false');
215
- });
216
- it('does not open when `aria-disabled` is set on its target', async () => {
217
- const component = await fixture(html `<glide-core-menu>
218
- <button aria-disabled="true" slot="target">Target</button>
219
-
220
- <glide-core-menu-options>
221
- <glide-core-menu-link label="Link"></glide-core-menu-link>
222
- </glide-core-menu-options>
223
- </glide-core-menu>`);
224
- const target = component.querySelector('button');
225
- target?.click();
226
- // Wait for Floating UI.
227
- await aTimeout(0);
228
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
229
- const options = component.querySelector('glide-core-menu-options');
230
- expect(component.open).to.be.false;
231
- expect(defaultSlot?.checkVisibility()).to.be.false;
232
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
233
- expect(target?.ariaExpanded).to.equal('false');
234
- });
235
- it('does not open when `aria-disabled` is set programmatically on its target', async () => {
236
- const component = await fixture(html `<glide-core-menu>
237
- <button slot="target">Target</button>
238
-
239
- <glide-core-menu-options>
240
- <glide-core-menu-link label="Link"></glide-core-menu-link>
241
- </glide-core-menu-options>
242
- </glide-core-menu>`);
243
- const button = component.querySelector('button');
244
- assert(button);
245
- button.ariaDisabled = 'true';
246
- button?.click();
247
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
248
- const options = component.querySelector('glide-core-menu-options');
249
- const target = component.querySelector('button');
250
- expect(defaultSlot?.checkVisibility()).to.be.false;
251
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
252
- expect(target?.ariaExpanded).to.equal('false');
253
- });
254
- it('opens on Enter', async () => {
255
- const component = await fixture(html `<glide-core-menu>
256
- <button slot="target">Target</button>
257
-
258
- <glide-core-menu-options>
259
- <glide-core-menu-link label="Link"></glide-core-menu-link>
260
- </glide-core-menu-options>
261
- </glide-core-menu>`);
262
- component.querySelector('button')?.focus();
263
- await sendKeys({ press: 'Enter' });
264
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
265
- const options = component.querySelector('glide-core-menu-options');
266
- const target = component.querySelector('button');
267
- const link = component.querySelector('glide-core-menu-link');
268
- expect(component.open).to.be.true;
269
- expect(defaultSlot?.checkVisibility()).to.be.true;
270
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
271
- expect(target?.ariaExpanded).to.equal('true');
272
- });
273
- it('opens on Enter when its target is a `<span>`', async () => {
274
- const component = await fixture(html `<glide-core-menu>
275
- <span slot="target">Target</span>
276
-
277
- <glide-core-menu-options>
278
- <glide-core-menu-link label="Link"></glide-core-menu-link>
279
- </glide-core-menu-options>
280
- </glide-core-menu>`);
281
- component.querySelector('span')?.focus();
282
- await sendKeys({ press: 'Enter' });
283
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
284
- const options = component.querySelector('glide-core-menu-options');
285
- const target = component.querySelector('span');
286
- const link = component.querySelector('glide-core-menu-link');
287
- expect(component.open).to.be.true;
288
- expect(defaultSlot?.checkVisibility()).to.be.true;
289
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
290
- expect(target?.ariaExpanded).to.equal('true');
291
- });
292
- it('opens on ArrowUp', async () => {
293
- const component = await fixture(html `<glide-core-menu>
294
- <button slot="target">Target</button>
295
-
296
- <glide-core-menu-options>
297
- <glide-core-menu-link label="Link"></glide-core-menu-link>
298
- </glide-core-menu-options>
299
- </glide-core-menu>`);
300
- component.querySelector('button')?.focus();
301
- await sendKeys({ press: 'ArrowUp' });
302
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
303
- const options = component.querySelector('glide-core-menu-options');
304
- const target = component.querySelector('button');
305
- const link = component.querySelector('glide-core-menu-link');
306
- expect(component.open).to.be.true;
307
- expect(defaultSlot?.checkVisibility()).to.be.true;
308
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
309
- expect(target?.ariaExpanded).to.equal('true');
310
- });
311
- it('opens on ArrowDown', async () => {
312
- const component = await fixture(html `<glide-core-menu>
313
- <button slot="target">Target</button>
314
-
315
- <glide-core-menu-options>
316
- <glide-core-menu-link label="Link"></glide-core-menu-link>
317
- </glide-core-menu-options>
318
- </glide-core-menu>`);
319
- component.querySelector('button')?.focus();
320
- await sendKeys({ press: 'ArrowDown' });
321
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
322
- const options = component.querySelector('glide-core-menu-options');
323
- const target = component.querySelector('button');
324
- const link = component.querySelector('glide-core-menu-link');
325
- expect(component.open).to.be.true;
326
- expect(defaultSlot?.checkVisibility()).to.be.true;
327
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
328
- expect(target?.ariaExpanded).to.equal('true');
329
- });
330
- it('opens on Space', async () => {
331
- const component = await fixture(html `<glide-core-menu>
332
- <button slot="target">Target</button>
333
-
334
- <glide-core-menu-options>
335
- <glide-core-menu-link label="Link"></glide-core-menu-link>
336
- </glide-core-menu-options>
337
- </glide-core-menu>`);
338
- component.querySelector('button')?.focus();
339
- await sendKeys({ press: ' ' });
340
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
341
- const options = component.querySelector('glide-core-menu-options');
342
- const target = component.querySelector('button');
343
- const link = component.querySelector('glide-core-menu-link');
344
- expect(component.open).to.be.true;
345
- expect(defaultSlot?.checkVisibility()).to.be.true;
346
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
347
- expect(target?.ariaExpanded).to.equal('true');
348
- });
349
- it('opens on Space when its target is a `<span>`', async () => {
350
- const component = await fixture(html `<glide-core-menu>
351
- <span slot="target">Target</span>
352
-
353
- <glide-core-menu-options>
354
- <glide-core-menu-link label="Link"></glide-core-menu-link>
355
- </glide-core-menu-options>
356
- </glide-core-menu>`);
357
- component.querySelector('span')?.focus();
358
- await sendKeys({ press: ' ' });
359
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
360
- const options = component.querySelector('glide-core-menu-options');
361
- const target = component.querySelector('span');
362
- const link = component.querySelector('glide-core-menu-link');
363
- expect(component.open).to.be.true;
364
- expect(defaultSlot?.checkVisibility()).to.be.true;
365
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
366
- expect(target?.ariaExpanded).to.equal('true');
367
- });
368
- it('does not open on Space when there are no options', async () => {
369
- const component = await fixture(html `<glide-core-menu>
370
- <button slot="target">Target</button>
371
- <glide-core-menu-options> </glide-core-menu-options>
372
- </glide-core-menu>`);
373
- component.querySelector('button')?.focus();
374
- await sendKeys({ press: ' ' });
375
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
376
- const options = component.querySelector('glide-core-menu-options');
377
- const target = component.querySelector('button');
378
- expect(component.open).to.be.false;
379
- expect(defaultSlot?.checkVisibility()).to.be.false;
380
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
381
- expect(target?.ariaExpanded).to.equal('false');
382
- });
383
- it('opens when opened programmatically', async () => {
384
- const component = await fixture(html `<glide-core-menu>
385
- <button slot="target">Target</button>
386
-
387
- <glide-core-menu-options>
388
- <glide-core-menu-link label="Link"></glide-core-menu-link>
389
- </glide-core-menu-options>
390
- </glide-core-menu>`);
391
- component.open = true;
392
- // Wait for Floating UI.
393
- await aTimeout(0);
394
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
395
- const options = component.querySelector('glide-core-menu-options');
396
- const target = component.querySelector('button');
397
- const link = component.querySelector('glide-core-menu-link');
398
- expect(defaultSlot?.checkVisibility()).to.be.true;
399
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
400
- expect(target?.ariaExpanded).to.equal('true');
401
- });
402
- // See the `document` click handler comment in `menu.ts` for an explanation.
403
- it('opens when opened programmatically via the click handler of another element', async () => {
404
- const div = document.createElement('div');
405
- const component = await fixture(html `<glide-core-menu>
406
- <button slot="target">Target</button>
407
-
408
- <glide-core-menu-options>
409
- <glide-core-menu-link label="Link"></glide-core-menu-link>
410
- </glide-core-menu-options>
411
- </glide-core-menu>`, { parentNode: div });
412
- const anotherElement = document.createElement('button');
413
- anotherElement.addEventListener('click', () => (component.open = true));
414
- div.append(anotherElement);
415
- anotherElement.click();
416
- // Wait for Floating UI.
417
- await aTimeout(0);
418
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
419
- const options = component.querySelector('glide-core-menu-options');
420
- const target = component.querySelector('button');
421
- const link = component.querySelector('glide-core-menu-link');
422
- expect(component.open).to.be.true;
423
- expect(defaultSlot?.checkVisibility()).to.be.true;
424
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
425
- expect(target?.ariaExpanded).to.equal('true');
426
- });
427
- it('sets `privateSize` on the options component when `size` is changed programmatically', async () => {
428
- const component = await fixture(html `<glide-core-menu>
429
- <button slot="target">Target</button>
430
-
431
- <glide-core-menu-options>
432
- <glide-core-menu-link label="Link"></glide-core-menu-link>
433
- </glide-core-menu-options>
434
- </glide-core-menu>`);
435
- component.size = 'small';
436
- const options = component.querySelector('glide-core-menu-options');
437
- expect(options?.privateSize).to.equal('small');
438
- });
439
- it('closes when its target clicked', async () => {
440
- const component = await fixture(html `<glide-core-menu-in-another-component></glide-core-menu-in-another-component>`);
441
- // Wait for it to open.
442
- await aTimeout(0);
443
- const target = component.shadowRoot?.querySelector('button');
444
- assert(target);
445
- const { x, y } = target.getBoundingClientRect();
446
- // Calling `click()` won't do because Menu relies on a "mouseup" event to
447
- // decide if it should close.
448
- await sendMouse({
449
- type: 'click',
450
- position: [Math.ceil(x), Math.ceil(y)],
451
- });
452
- const menu = component.shadowRoot?.querySelector('glide-core-menu');
453
- const defaultSlot = menu?.shadowRoot?.querySelector('slot:not([name])');
454
- const options = menu?.querySelector('glide-core-menu-options');
455
- expect(menu?.open).to.be.false;
456
- expect(defaultSlot?.checkVisibility()).to.be.false;
457
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
458
- expect(target?.ariaExpanded).to.equal('false');
459
- });
460
- it('closes when something outside of it is clicked', async () => {
461
- const component = await fixture(html `<glide-core-menu>
462
- <button slot="target">Target</button>
463
-
464
- <glide-core-menu-options>
465
- <glide-core-menu-link label="Link"></glide-core-menu-link>
466
- </glide-core-menu-options>
467
- </glide-core-menu>`);
468
- component.querySelector('button')?.click();
469
- document.body.click();
470
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
471
- const options = component.querySelector('glide-core-menu-options');
472
- const target = component.querySelector('button');
473
- expect(component.open).to.be.false;
474
- expect(defaultSlot?.checkVisibility()).to.be.false;
475
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
476
- expect(target?.ariaExpanded).to.equal('false');
477
- });
478
- it('closes on Escape', async () => {
479
- const component = await fixture(html `<glide-core-menu open>
480
- <button slot="target">Target</button>
481
-
482
- <glide-core-menu-options>
483
- <glide-core-menu-link label="Link"></glide-core-menu-link>
484
- </glide-core-menu-options>
485
- </glide-core-menu>`);
486
- // Wait for it to open
487
- await aTimeout(0);
488
- component.querySelector('button')?.focus();
489
- await sendKeys({ press: 'Escape' });
490
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
491
- const options = component.querySelector('glide-core-menu-options');
492
- const target = component.querySelector('button');
493
- expect(component.open).to.be.false;
494
- expect(defaultSlot?.checkVisibility()).to.be.false;
495
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
496
- expect(target?.ariaExpanded).to.equal('false');
497
- });
498
- it('closes when an option is selected via click', async () => {
499
- const component = await fixture(html `<glide-core-menu open>
500
- <button slot="target">Target</button>
501
-
502
- <glide-core-menu-options>
503
- <glide-core-menu-link label="Link"></glide-core-menu-link>
504
- </glide-core-menu-options>
505
- </glide-core-menu>`);
506
- component.querySelector('glide-core-menu-link')?.click();
507
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
508
- const options = component.querySelector('glide-core-menu-options');
509
- const target = component.querySelector('button');
510
- expect(component.open).to.be.false;
511
- expect(defaultSlot?.checkVisibility()).to.be.false;
512
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
513
- expect(target?.ariaExpanded).to.equal('false');
514
- });
515
- it('closes when an option is selected via Enter', async () => {
516
- const component = await fixture(html `<glide-core-menu open>
517
- <button slot="target">Target</button>
518
-
519
- <glide-core-menu-options>
520
- <glide-core-menu-link label="Link"></glide-core-menu-link>
521
- </glide-core-menu-options>
522
- </glide-core-menu>`);
523
- component.querySelector('button')?.focus();
524
- component
525
- .querySelector('glide-core-menu-link')
526
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
527
- await sendKeys({ press: 'Enter' });
528
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
529
- const options = component.querySelector('glide-core-menu-options');
530
- const target = component.querySelector('button');
531
- expect(component.open).to.be.false;
532
- expect(defaultSlot?.checkVisibility()).to.be.false;
533
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
534
- expect(target?.ariaExpanded).to.equal('false');
535
- });
536
- it('closes when an option is selected via Enter and its target is a `<span>', async () => {
537
- const component = await fixture(html `<glide-core-menu open>
538
- <span slot="target">Target</span>
539
-
540
- <glide-core-menu-options>
541
- <glide-core-menu-link label="Link"></glide-core-menu-link>
542
- </glide-core-menu-options>
543
- </glide-core-menu>`);
544
- component.querySelector('span')?.focus();
545
- component
546
- .querySelector('glide-core-menu-link')
547
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
548
- await sendKeys({ press: 'Enter' });
549
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
550
- const options = component.querySelector('glide-core-menu-options');
551
- const target = component.querySelector('span');
552
- expect(component.open).to.be.false;
553
- expect(defaultSlot?.checkVisibility()).to.be.false;
554
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
555
- expect(target?.ariaExpanded).to.equal('false');
556
- });
557
- it('closes when an option is selected via Space', async () => {
558
- const component = await fixture(html `<glide-core-menu open>
559
- <button slot="target">Target</button>
560
-
561
- <glide-core-menu-options>
562
- <glide-core-menu-link label="Link"></glide-core-menu-link>
563
- </glide-core-menu-options>
564
- </glide-core-menu>`);
565
- component.querySelector('button')?.focus();
566
- await sendKeys({ press: ' ' });
567
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
568
- const options = component.querySelector('glide-core-menu-options');
569
- const target = component.querySelector('button');
570
- expect(component.open).to.be.false;
571
- expect(defaultSlot?.checkVisibility()).to.be.false;
572
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
573
- expect(target?.ariaExpanded).to.equal('false');
574
- });
575
- it('closes when an option is selected via Space and its target is a `<span>`', async () => {
576
- const component = await fixture(html `<glide-core-menu open>
577
- <span slot="target">Target</span>
578
-
579
- <glide-core-menu-options>
580
- <glide-core-menu-link label="Link"></glide-core-menu-link>
581
- </glide-core-menu-options>
582
- </glide-core-menu>`);
583
- component.querySelector('span')?.focus();
584
- await sendKeys({ press: ' ' });
585
- const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
586
- const options = component.querySelector('glide-core-menu-options');
587
- const target = component.querySelector('span');
588
- expect(component.open).to.be.false;
589
- expect(defaultSlot?.checkVisibility()).to.be.false;
590
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
591
- expect(target?.ariaExpanded).to.equal('false');
592
- });
593
- it('activates the first menu link by default', async () => {
594
- const component = await fixture(html `
595
- <glide-core-menu open>
596
- <button slot="target">Target</button>
597
-
598
- <glide-core-menu-options>
599
- <glide-core-menu-link label="One"></glide-core-menu-link>
600
- <glide-core-menu-link label="Two"></glide-core-menu-link>
601
- </glide-core-menu-options>
602
- </glide-core-menu>
603
- `);
604
- // Wait for Floating UI.
605
- await aTimeout(0);
606
- const links = component.querySelectorAll('glide-core-menu-link');
607
- const options = component.querySelector('glide-core-menu-options');
608
- expect(links[0].privateActive).to.be.true;
609
- expect(links[1].privateActive).to.be.false;
610
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0]?.id);
611
- });
612
- it('activates the first menu button by default when opened via click', async () => {
613
- const component = await fixture(html `
614
- <glide-core-menu>
615
- <button slot="target">Target</button>
616
-
617
- <glide-core-menu-options>
618
- <glide-core-menu-button label="One"></glide-core-menu-button>
619
- <glide-core-menu-button label="Two"></glide-core-menu-button>
620
- </glide-core-menu-options>
621
- </glide-core-menu>
622
- `);
623
- component.querySelector('button')?.click();
624
- // Wait for Floating UI.
625
- await aTimeout(0);
626
- const buttons = component.querySelectorAll('glide-core-menu-button');
627
- const options = component.querySelector('glide-core-menu-options');
628
- expect(buttons[0].privateActive).to.be.true;
629
- expect(buttons[1].privateActive).to.be.false;
630
- expect(options?.getAttribute('aria-activedescendant')).equal(buttons[0]?.id);
631
- });
632
- it('activates a menu link on "mouseover"', async () => {
633
- const component = await fixture(html `
634
- <glide-core-menu open>
635
- <button slot="target">Target</button>
636
-
637
- <glide-core-menu-options>
638
- <glide-core-menu-link label="One"></glide-core-menu-link>
639
- <glide-core-menu-link label="Two"></glide-core-menu-link>
640
- </glide-core-menu-options>
641
- </glide-core-menu>
642
- `);
643
- // Wait for Floating UI.
644
- await aTimeout(0);
645
- const links = component.querySelectorAll('glide-core-menu-link');
646
- const options = component.querySelector('glide-core-menu-options');
647
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
648
- await elementUpdated(component);
649
- expect(links[0].privateActive).to.be.false;
650
- expect(links[1].privateActive).to.be.true;
651
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
652
- });
653
- it('activates a menu link on "mouseover" when the link is in a nested slot', async () => {
654
- const component = await fixture(html `
655
- <glide-core-nested-slot>
656
- <glide-core-menu-link label="One"></glide-core-menu-link>
657
- <glide-core-menu-link label="Two"></glide-core-menu-link>
658
- </glide-core-nested-slot>
659
- `);
660
- // Wait for Floating UI.
661
- await aTimeout(0);
662
- const links = component.querySelectorAll('glide-core-menu-link');
663
- const options = component.shadowRoot?.querySelector('glide-core-menu-options');
664
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
665
- await elementUpdated(component);
666
- expect(links[0].privateActive).to.be.false;
667
- expect(links[1].privateActive).to.be.true;
668
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
669
- });
670
- it('activates a menu button on "mouseover"', async () => {
671
- const component = await fixture(html `
672
- <glide-core-menu open>
673
- <button slot="target">Target</button>
674
-
675
- <glide-core-menu-options>
676
- <glide-core-menu-button label="One"></glide-core-menu-button>
677
- <glide-core-menu-button label="Two"></glide-core-menu-button>
678
- </glide-core-menu-options>
679
- </glide-core-menu>
680
- `);
681
- // Wait for Floating UI.
682
- await aTimeout(0);
683
- const buttons = component.querySelectorAll('glide-core-menu-button');
684
- const options = component.querySelector('glide-core-menu-options');
685
- buttons[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
686
- await elementUpdated(component);
687
- expect(buttons[0].privateActive).to.be.false;
688
- expect(buttons[1].privateActive).to.be.true;
689
- expect(options?.getAttribute('aria-activedescendant')).equal(buttons[1].id);
690
- });
691
- it('activates a menu button on "mouseover" when the button is in a nested slot', async () => {
692
- const component = await fixture(html `
693
- <glide-core-nested-slot>
694
- <glide-core-menu-button label="One"></glide-core-menu-button>
695
- <glide-core-menu-button label="Two"></glide-core-menu-button>
696
- </glide-core-nested-slot>
697
- `);
698
- // Wait for Floating UI.
699
- await aTimeout(0);
700
- const links = component.querySelectorAll('glide-core-menu-button');
701
- const options = component.shadowRoot?.querySelector('glide-core-menu-options');
702
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
703
- await elementUpdated(component);
704
- expect(links[0].privateActive).to.be.false;
705
- expect(links[1].privateActive).to.be.true;
706
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
707
- });
708
- it('activates the next option on ArrowDown', async () => {
709
- const component = await fixture(html `
710
- <glide-core-menu open>
711
- <button slot="target">Target</button>
712
-
713
- <glide-core-menu-options>
714
- <glide-core-menu-link label="One"></glide-core-menu-link>
715
- <glide-core-menu-link label="Two"></glide-core-menu-link>
716
- <glide-core-menu-link label="Three"></glide-core-menu-link>
717
- </glide-core-menu-options>
718
- </glide-core-menu>
719
- `);
720
- // Wait for Floating UI.
721
- await aTimeout(0);
722
- component.querySelector('button')?.focus();
723
- const links = component.querySelectorAll('glide-core-menu-link');
724
- const options = component.querySelector('glide-core-menu-options');
725
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
726
- await sendKeys({ press: 'ArrowDown' });
727
- expect(links[0].privateActive).to.be.false;
728
- expect(links[1].privateActive).to.be.false;
729
- expect(links[2].privateActive).to.be.true;
730
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[2].id);
731
- });
732
- it('activates the previous option on ArrowUp', async () => {
733
- const component = await fixture(html `
734
- <glide-core-menu open>
735
- <button slot="target">Target</button>
736
-
737
- <glide-core-menu-options>
738
- <glide-core-menu-link label="One"></glide-core-menu-link>
739
- <glide-core-menu-link label="Two"></glide-core-menu-link>
740
- </glide-core-menu-options>
741
- </glide-core-menu>
742
- `);
743
- // Wait for Floating UI.
744
- await aTimeout(0);
745
- component.querySelector('button')?.focus();
746
- const links = component.querySelectorAll('glide-core-menu-link');
747
- const options = component.querySelector('glide-core-menu-options');
748
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
749
- await sendKeys({ press: 'ArrowUp' });
750
- expect(links[0].privateActive).to.be.true;
751
- expect(links[1].privateActive).to.be.false;
752
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
753
- });
754
- it('activates the first option on Home', async () => {
755
- const component = await fixture(html `
756
- <glide-core-menu open>
757
- <button slot="target">Target</button>
758
-
759
- <glide-core-menu-options>
760
- <glide-core-menu-link label="One"></glide-core-menu-link>
761
- <glide-core-menu-link label="Two"></glide-core-menu-link>
762
- </glide-core-menu-options>
763
- </glide-core-menu>
764
- `);
765
- // Wait for Floating UI.
766
- await aTimeout(0);
767
- component.querySelector('button')?.focus();
768
- const links = component.querySelectorAll('glide-core-menu-link');
769
- const options = component.querySelector('glide-core-menu-options');
770
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
771
- await sendKeys({ press: 'Home' });
772
- expect(links[0].privateActive).to.be.true;
773
- expect(links[1].privateActive).to.be.false;
774
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
775
- });
776
- it('activates the first option on PageUp', async () => {
777
- const component = await fixture(html `
778
- <glide-core-menu open>
779
- <button slot="target">Target</button>
780
-
781
- <glide-core-menu-options>
782
- <glide-core-menu-link label="One"></glide-core-menu-link>
783
- <glide-core-menu-link label="Two"></glide-core-menu-link>
784
- </glide-core-menu-options>
785
- </glide-core-menu>
786
- `);
787
- // Wait for Floating UI.
788
- await aTimeout(0);
789
- component.querySelector('button')?.focus();
790
- const links = component.querySelectorAll('glide-core-menu-link');
791
- const options = component.querySelector('glide-core-menu-options');
792
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
793
- await sendKeys({ press: 'PageUp' });
794
- expect(links[0].privateActive).to.be.true;
795
- expect(links[1].privateActive).to.be.false;
796
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
797
- });
798
- it('activates the first option on Meta + ArrowUp', async () => {
799
- const component = await fixture(html `
800
- <glide-core-menu open>
801
- <button slot="target">Target</button>
802
-
803
- <glide-core-menu-options>
804
- <glide-core-menu-link label="One"></glide-core-menu-link>
805
- <glide-core-menu-link label="Two"></glide-core-menu-link>
806
- </glide-core-menu-options>
807
- </glide-core-menu>
808
- `);
809
- // Wait for Floating UI.
810
- await aTimeout(0);
811
- component.querySelector('button')?.focus();
812
- const links = component.querySelectorAll('glide-core-menu-link');
813
- const options = component.querySelector('glide-core-menu-options');
814
- links[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
815
- await sendKeys({ down: 'Meta' });
816
- await sendKeys({ press: 'ArrowUp' });
817
- await sendKeys({ up: 'Meta' });
818
- expect(links[0].privateActive).to.be.true;
819
- expect(links[1].privateActive).to.be.false;
820
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[0].id);
821
- });
822
- it('activates the last option on End', async () => {
823
- const component = await fixture(html `
824
- <glide-core-menu open>
825
- <button slot="target">Target</button>
826
-
827
- <glide-core-menu-options>
828
- <glide-core-menu-link label="One"></glide-core-menu-link>
829
- <glide-core-menu-link label="Two"></glide-core-menu-link>
830
- </glide-core-menu-options>
831
- </glide-core-menu>
832
- `);
833
- // Wait for Floating UI.
834
- await aTimeout(0);
835
- component.querySelector('button')?.focus();
836
- await sendKeys({ press: 'End' });
837
- const links = component.querySelectorAll('glide-core-menu-link');
838
- const options = component.querySelector('glide-core-menu-options');
839
- expect(links[0].privateActive).to.be.false;
840
- expect(links[1].privateActive).to.be.true;
841
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
842
- });
843
- it('activates the last option on PageDown', async () => {
844
- const component = await fixture(html `
845
- <glide-core-menu>
846
- <button slot="target">Target</button>
847
-
848
- <glide-core-menu-options>
849
- <glide-core-menu-link label="One"></glide-core-menu-link>
850
- <glide-core-menu-link label="Two"></glide-core-menu-link>
851
- </glide-core-menu-options>
852
- </glide-core-menu>
853
- `);
854
- component.querySelector('button')?.click();
855
- // Wait for Floating UI.
856
- await aTimeout(0);
857
- component.querySelector('button')?.focus();
858
- const links = component.querySelectorAll('glide-core-menu-link');
859
- const options = component.querySelector('glide-core-menu-options');
860
- links[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
861
- await sendKeys({ press: 'PageDown' });
862
- expect(links[0].privateActive).to.be.false;
863
- expect(links[1].privateActive).to.be.true;
864
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
865
- });
866
- it('activates the last option on Meta + ArrowDown', async () => {
867
- const component = await fixture(html `
868
- <glide-core-menu open>
869
- <button slot="target">Target</button>
870
-
871
- <glide-core-menu-options>
872
- <glide-core-menu-link label="One"></glide-core-menu-link>
873
- <glide-core-menu-link label="Two"></glide-core-menu-link>
874
- </glide-core-menu-options>
875
- </glide-core-menu>
876
- `);
877
- // Wait for Floating UI.
878
- await aTimeout(0);
879
- component.querySelector('button')?.focus();
880
- const links = component.querySelectorAll('glide-core-menu-link');
881
- const options = component.querySelector('glide-core-menu-options');
882
- links[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
883
- await sendKeys({ down: 'Meta' });
884
- await sendKeys({ press: 'ArrowDown' });
885
- await sendKeys({ up: 'Meta' });
886
- expect(links[0].privateActive).to.be.false;
887
- expect(links[1].privateActive).to.be.true;
888
- expect(options?.getAttribute('aria-activedescendant')).to.equal(links[1].id);
889
- });
890
- it('sets `aria-activedescendant` on open', async () => {
891
- const component = await fixture(html `<glide-core-menu>
892
- <button slot="target">Target</button>
893
-
894
- <glide-core-menu-options>
895
- <glide-core-menu-link label="Link"></glide-core-menu-link>
896
- </glide-core-menu-options>
897
- </glide-core-menu>`);
898
- component.querySelector('button')?.click();
899
- // Wait for Floating UI.
900
- await aTimeout(0);
901
- const link = component.querySelector('glide-core-menu-link');
902
- const options = component.querySelector('glide-core-menu-options');
903
- expect(options?.getAttribute('aria-activedescendant')).to.equal(link?.id);
904
- });
905
- it('sets `aria-activedescendant` on close', async () => {
906
- const component = await fixture(html `<glide-core-menu open>
907
- <button slot="target">Target</button>
908
-
909
- <glide-core-menu-options>
910
- <glide-core-menu-link label="Link"></glide-core-menu-link>
911
- </glide-core-menu-options>
912
- </glide-core-menu>`);
913
- // Wait for Floating UI.
914
- await aTimeout(0);
915
- component.querySelector('button')?.click();
916
- await elementUpdated(component);
917
- const options = component.querySelector('glide-core-menu-options');
918
- expect(options?.getAttribute('aria-activedescendant')).to.equal('');
919
- });
920
- it('sets `aria-expanded` on open', async () => {
921
- const component = await fixture(html `<glide-core-menu>
922
- <button slot="target">Target</button>
923
-
924
- <glide-core-menu-options>
925
- <glide-core-menu-link label="Link"></glide-core-menu-link>
926
- </glide-core-menu-options>
927
- </glide-core-menu>`);
928
- component.querySelector('button')?.click();
929
- // Wait for Floating UI.
930
- await aTimeout(0);
931
- const button = component.querySelector('button');
932
- expect(button?.getAttribute('aria-expanded')).to.equal('true');
933
- });
934
- it('sets `aria-expanded` on close', async () => {
935
- const component = await fixture(html `<glide-core-menu open>
936
- <button slot="target">Target</button>
937
-
938
- <glide-core-menu-options>
939
- <glide-core-menu-link label="Link"></glide-core-menu-link>
940
- </glide-core-menu-options>
941
- </glide-core-menu>`);
942
- component.querySelector('button')?.click();
943
- const button = component.querySelector('button');
944
- expect(button?.getAttribute('aria-expanded')).to.equal('false');
945
- });
946
- it('does not wrap on ArrowUp', async () => {
947
- const component = await fixture(html `
948
- <glide-core-menu open>
949
- <button slot="target">Target</button>
950
-
951
- <glide-core-menu-options>
952
- <glide-core-menu-link label="One"></glide-core-menu-link>
953
- <glide-core-menu-link label="Two"></glide-core-menu-link>
954
- </glide-core-menu-options>
955
- </glide-core-menu>
956
- `);
957
- // Wait for Floating UI.
958
- await aTimeout(0);
959
- await sendKeys({ press: 'ArrowUp' });
960
- const link = component.querySelector('glide-core-menu-link');
961
- expect(link?.privateActive).to.be.true;
962
- });
963
- it('does not wrap on Meta + ArrowUp', async () => {
964
- const component = await fixture(html `
965
- <glide-core-menu open>
966
- <button slot="target">Target</button>
967
-
968
- <glide-core-menu-options>
969
- <glide-core-menu-link label="One"></glide-core-menu-link>
970
- <glide-core-menu-link label="Two"></glide-core-menu-link>
971
- </glide-core-menu-options>
972
- </glide-core-menu>
973
- `);
974
- // Wait for Floating UI.
975
- await aTimeout(0);
976
- await sendKeys({ down: 'Meta' });
977
- await sendKeys({ press: 'ArrowUp' });
978
- await sendKeys({ up: 'Meta' });
979
- const link = component.querySelector('glide-core-menu-link');
980
- expect(link?.privateActive).to.be.true;
981
- });
982
- it('does not wrap on ArrowDown', async () => {
983
- const component = await fixture(html `
984
- <glide-core-menu open>
985
- <button slot="target">Target</button>
986
-
987
- <glide-core-menu-options>
988
- <glide-core-menu-link label="One"></glide-core-menu-link>
989
- <glide-core-menu-link label="Two"></glide-core-menu-link>
990
- </glide-core-menu-options>
991
- </glide-core-menu>
992
- `);
993
- // Wait for Floating UI.
994
- await aTimeout(0);
995
- const options = component.querySelectorAll('glide-core-menu-link');
996
- options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
997
- await sendKeys({ press: 'ArrowDown' });
998
- expect(options[1].privateActive).to.be.true;
999
- });
1000
- it('does not wrap on ArrowDown', async () => {
1001
- const component = await fixture(html `
1002
- <glide-core-menu open>
1003
- <button slot="target">Target</button>
1004
-
1005
- <glide-core-menu-options>
1006
- <glide-core-menu-link label="One"></glide-core-menu-link>
1007
- <glide-core-menu-link label="Two"></glide-core-menu-link>
1008
- </glide-core-menu-options>
1009
- </glide-core-menu>
1010
- `);
1011
- // Wait for Floating UI.
1012
- await aTimeout(0);
1013
- const options = component.querySelectorAll('glide-core-menu-link');
1014
- options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
1015
- await sendKeys({ down: 'Meta' });
1016
- await sendKeys({ press: 'ArrowDown' });
1017
- await sendKeys({ up: 'Meta' });
1018
- expect(options[1].privateActive).to.be.true;
1019
- });
1020
- it('sets the first option as active when optionless and an option is dynamically added', async () => {
1021
- const component = await fixture(html `
1022
- <glide-core-menu>
1023
- <button slot="target">Target</button>
1024
- <glide-core-menu-options> </glide-core-menu-options>
1025
- </glide-core-menu>
1026
- `);
1027
- const option = document.createElement('glide-core-menu-button');
1028
- option.label = 'Label';
1029
- component.querySelector('glide-core-menu-options')?.append(option);
1030
- await elementUpdated(component);
1031
- expect(option?.privateActive).to.be.true;
1032
- });
1033
- it('retains its active option when an option is dynamically added', async () => {
1034
- const component = await fixture(html `
1035
- <glide-core-menu>
1036
- <button slot="target">Target</button>
1037
-
1038
- <glide-core-menu-options>
1039
- <glide-core-menu-button label="One"></glide-core-menu-button>
1040
- <glide-core-menu-button label="Two"></glide-core-menu-button>
1041
- </glide-core-menu-options>
1042
- </glide-core-menu>
1043
- `);
1044
- component
1045
- .querySelectorAll('glide-core-menu-button')[1]
1046
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
1047
- await elementUpdated(component);
1048
- const button = document.createElement('glide-core-menu-button');
1049
- button.label = 'Three';
1050
- component.querySelector('glide-core-menu-options')?.append(button);
1051
- await elementUpdated(component);
1052
- const options = component.querySelectorAll('glide-core-menu-button');
1053
- expect(options[0]?.privateActive).to.be.false;
1054
- expect(options[1]?.privateActive).to.be.true;
1055
- expect(options[2]?.privateActive).to.be.false;
1056
- });
1057
- it('has `set offset()` coverage', async () => {
1058
- const component = await fixture(html `
1059
- <glide-core-menu>
1060
- <button slot="target">Target</button>
1061
-
1062
- <glide-core-menu-options>
1063
- <glide-core-menu-link label="One"></glide-core-menu-link>
1064
- <glide-core-menu-link label="Two"></glide-core-menu-link>
1065
- </glide-core-menu-options>
1066
- </glide-core-menu>
1067
- `);
1068
- component.offset = 10;
1069
- });