@crowdstrike/glide-core 0.5.0 → 0.5.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 (208) hide show
  1. package/dist/accordion.js +1 -1
  2. package/dist/accordion.styles.js +4 -4
  3. package/dist/accordion.test.basics.js +109 -0
  4. package/dist/accordion.test.events.js +39 -0
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +4 -4
  7. package/dist/button-group.button.test.basics.js +169 -0
  8. package/dist/button-group.button.test.events.js +73 -0
  9. package/dist/button-group.js +1 -1
  10. package/dist/button-group.styles.js +3 -3
  11. package/dist/button-group.test.basics.js +268 -0
  12. package/dist/button-group.test.events.js +291 -0
  13. package/dist/button.js +1 -1
  14. package/dist/button.styles.js +4 -4
  15. package/dist/button.test.basics.js +196 -0
  16. package/dist/button.test.events.js +25 -0
  17. package/dist/button.test.form.js +49 -0
  18. package/dist/checkbox-group.js +1 -1
  19. package/dist/checkbox-group.styles.js +2 -2
  20. package/dist/checkbox-group.test.basics.js +119 -0
  21. package/dist/checkbox-group.test.events.js +110 -0
  22. package/dist/checkbox-group.test.focus.js +45 -0
  23. package/dist/checkbox-group.test.form.js +130 -0
  24. package/dist/checkbox-group.test.validity.js +75 -0
  25. package/dist/checkbox.js +1 -1
  26. package/dist/checkbox.styles.js +3 -3
  27. package/dist/checkbox.test.basics.js +89 -0
  28. package/dist/checkbox.test.events.js +87 -0
  29. package/dist/checkbox.test.focus.js +38 -0
  30. package/dist/checkbox.test.form.js +115 -0
  31. package/dist/checkbox.test.states.js +62 -0
  32. package/dist/checkbox.test.validity.js +51 -0
  33. package/dist/drawer.d.ts +2 -2
  34. package/dist/drawer.js +1 -15
  35. package/dist/drawer.styles.js +18 -3
  36. package/dist/drawer.test.accessibility.js +22 -0
  37. package/dist/drawer.test.basics.js +43 -0
  38. package/dist/drawer.test.closing.js +37 -0
  39. package/dist/drawer.test.events.js +52 -0
  40. package/dist/drawer.test.methods.js +34 -0
  41. package/dist/dropdown.d.ts +4 -2
  42. package/dist/dropdown.js +1 -1
  43. package/dist/dropdown.option.d.ts +1 -3
  44. package/dist/dropdown.option.js +1 -1
  45. package/dist/dropdown.option.styles.js +2 -2
  46. package/dist/dropdown.option.test.basics.js +59 -0
  47. package/dist/dropdown.option.test.basics.multiple.js +26 -0
  48. package/dist/dropdown.option.test.basics.single.js +20 -0
  49. package/dist/dropdown.option.test.events.js +27 -0
  50. package/dist/dropdown.option.test.focus.js +11 -0
  51. package/dist/dropdown.option.test.interactions.multiple.js +87 -0
  52. package/dist/dropdown.option.test.interactions.single.js +22 -0
  53. package/dist/dropdown.styles.js +28 -9
  54. package/dist/dropdown.test.basics.filterable.js +84 -0
  55. package/dist/dropdown.test.basics.js +233 -0
  56. package/dist/dropdown.test.basics.multiple.js +270 -0
  57. package/dist/dropdown.test.basics.single.js +79 -0
  58. package/dist/dropdown.test.events.js +268 -0
  59. package/dist/dropdown.test.events.multiple.js +130 -0
  60. package/dist/dropdown.test.focus.d.ts +1 -0
  61. package/dist/dropdown.test.focus.filterable.js +154 -0
  62. package/dist/dropdown.test.focus.js +18 -0
  63. package/dist/dropdown.test.focus.multiple.js +181 -0
  64. package/dist/dropdown.test.focus.single.js +53 -0
  65. package/dist/dropdown.test.form.js +140 -0
  66. package/dist/dropdown.test.form.multiple.js +149 -0
  67. package/dist/dropdown.test.form.single.js +128 -0
  68. package/dist/dropdown.test.interactions.filterable.js +385 -0
  69. package/dist/dropdown.test.interactions.js +446 -0
  70. package/dist/dropdown.test.interactions.multiple.js +908 -0
  71. package/dist/dropdown.test.interactions.single.js +466 -0
  72. package/dist/dropdown.test.validity.js +46 -0
  73. package/dist/icon-button.js +1 -1
  74. package/dist/icon-button.styles.js +3 -3
  75. package/dist/icon-button.test.basics.js +103 -0
  76. package/dist/icons/checked.js +1 -1
  77. package/dist/icons/magnifying-glass.js +1 -1
  78. package/dist/input.js +1 -1
  79. package/dist/input.styles.js +3 -3
  80. package/dist/input.test.basics.js +169 -0
  81. package/dist/input.test.events.js +97 -0
  82. package/dist/input.test.focus.js +54 -0
  83. package/dist/input.test.form.js +56 -0
  84. package/dist/input.test.validity.js +50 -0
  85. package/dist/label.js +1 -1
  86. package/dist/label.styles.js +3 -3
  87. package/dist/label.test.basics.js +129 -0
  88. package/dist/library/expect-argument-error.js +1 -1
  89. package/dist/library/ow.js +1 -1
  90. package/dist/library/ow.test.js +55 -0
  91. package/dist/menu.button.d.ts +1 -2
  92. package/dist/menu.button.js +1 -1
  93. package/dist/menu.button.styles.js +3 -3
  94. package/dist/menu.button.test.basics.js +42 -0
  95. package/dist/menu.d.ts +4 -0
  96. package/dist/menu.js +1 -1
  97. package/dist/menu.link.d.ts +1 -2
  98. package/dist/menu.link.js +1 -1
  99. package/dist/menu.link.styles.js +3 -3
  100. package/dist/menu.link.test.basics.js +46 -0
  101. package/dist/menu.styles.js +13 -6
  102. package/dist/menu.test.basics.js +161 -0
  103. package/dist/menu.test.focus.d.ts +0 -1
  104. package/dist/menu.test.focus.js +66 -0
  105. package/dist/menu.test.interactions.d.ts +0 -1
  106. package/dist/menu.test.interactions.js +522 -0
  107. package/dist/modal.icon-button.js +1 -1
  108. package/dist/modal.icon-button.styles.js +2 -2
  109. package/dist/modal.icon-button.test.basics.js +45 -0
  110. package/dist/modal.js +1 -15
  111. package/dist/modal.styles.js +4 -4
  112. package/dist/modal.tertiary-icon.js +1 -1
  113. package/dist/modal.tertiary-icon.test.basics.js +59 -0
  114. package/dist/modal.test.accessibility.js +48 -0
  115. package/dist/modal.test.basics.js +203 -0
  116. package/dist/modal.test.close.js +38 -0
  117. package/dist/modal.test.events.js +110 -0
  118. package/dist/modal.test.lock-scroll.js +76 -0
  119. package/dist/modal.test.methods.js +23 -0
  120. package/dist/modal.test.scrollbars.js +19 -0
  121. package/dist/radio-group.js +1 -1
  122. package/dist/radio-group.styles.js +2 -2
  123. package/dist/radio-group.test.basics.js +323 -0
  124. package/dist/radio-group.test.events.js +277 -0
  125. package/dist/radio-group.test.focus.js +75 -0
  126. package/dist/radio-group.test.form.js +104 -0
  127. package/dist/radio-group.test.validity.js +228 -0
  128. package/dist/radio.js +1 -1
  129. package/dist/radio.styles.js +4 -4
  130. package/dist/split-button.d.ts +24 -0
  131. package/dist/split-button.js +1 -0
  132. package/dist/split-button.stories.d.ts +17 -0
  133. package/dist/split-button.styles.d.ts +2 -0
  134. package/dist/split-button.styles.js +103 -0
  135. package/dist/split-button.test.basics.d.ts +1 -0
  136. package/dist/split-button.test.basics.js +84 -0
  137. package/dist/split-container.d.ts +30 -0
  138. package/dist/split-container.js +1 -0
  139. package/dist/split-container.styles.d.ts +2 -0
  140. package/dist/split-container.styles.js +132 -0
  141. package/dist/split-container.test.basics.d.ts +3 -0
  142. package/dist/split-container.test.basics.js +445 -0
  143. package/dist/split-container.test.interactions.d.ts +1 -0
  144. package/dist/split-container.test.interactions.js +20 -0
  145. package/dist/split-link.d.ts +25 -0
  146. package/dist/split-link.js +1 -0
  147. package/dist/split-link.test.basics.d.ts +1 -0
  148. package/dist/split-link.test.basics.js +92 -0
  149. package/dist/split-link.test.interactions.d.ts +1 -0
  150. package/dist/split-link.test.interactions.js +19 -0
  151. package/dist/status-indicator.js +1 -1
  152. package/dist/status-indicator.styles.js +2 -2
  153. package/dist/status-indicator.test.basics.js +102 -0
  154. package/dist/styles/focus-outline.js +1 -4
  155. package/dist/styles/visually-hidden.js +1 -11
  156. package/dist/tab.group.js +1 -1
  157. package/dist/tab.group.styles.js +2 -2
  158. package/dist/tab.group.test.basics.js +185 -0
  159. package/dist/tab.js +1 -1
  160. package/dist/tab.panel.js +1 -1
  161. package/dist/tab.panel.styles.js +3 -3
  162. package/dist/tab.styles.js +2 -2
  163. package/dist/tab.test.basics.js +71 -0
  164. package/dist/tag.js +1 -1
  165. package/dist/tag.styles.js +3 -3
  166. package/dist/tag.test.basics.js +118 -0
  167. package/dist/tag.test.events.js +16 -0
  168. package/dist/tag.test.focus.js +11 -0
  169. package/dist/textarea.js +2 -2
  170. package/dist/textarea.styles.js +3 -3
  171. package/dist/textarea.test.basics.js +140 -0
  172. package/dist/textarea.test.events.js +204 -0
  173. package/dist/textarea.test.form.js +70 -0
  174. package/dist/textarea.test.validity.js +83 -0
  175. package/dist/toasts.js +1 -1
  176. package/dist/toasts.styles.js +2 -2
  177. package/dist/toasts.test.basics.js +94 -0
  178. package/dist/toasts.toast.js +1 -1
  179. package/dist/toasts.toast.styles.js +5 -2
  180. package/dist/toasts.toast.test.basics.js +139 -0
  181. package/dist/toggle.js +1 -1
  182. package/dist/toggle.styles.js +3 -3
  183. package/dist/toggle.test.basics.js +64 -0
  184. package/dist/toggle.test.events.js +29 -0
  185. package/dist/toggle.test.focus.js +9 -0
  186. package/dist/toggle.test.states.js +35 -0
  187. package/dist/tooltip.js +1 -1
  188. package/dist/tooltip.styles.js +3 -3
  189. package/dist/tooltip.test.basics.js +64 -0
  190. package/dist/tooltip.test.interactions.js +78 -0
  191. package/dist/tree.item.icon-button.js +1 -1
  192. package/dist/tree.item.icon-button.styles.js +2 -2
  193. package/dist/tree.item.icon-button.test.basics.js +13 -0
  194. package/dist/tree.item.js +1 -1
  195. package/dist/tree.item.menu.js +1 -1
  196. package/dist/tree.item.menu.styles.js +2 -2
  197. package/dist/tree.item.menu.test.basics.js +34 -0
  198. package/dist/tree.item.styles.js +2 -2
  199. package/dist/tree.item.test.basics.js +102 -0
  200. package/dist/tree.js +1 -1
  201. package/dist/tree.styles.js +2 -2
  202. package/dist/tree.test.aria.js +86 -0
  203. package/dist/tree.test.basics.js +123 -0
  204. package/dist/tree.test.events.js +19 -0
  205. package/dist/tree.test.focus.js +261 -0
  206. package/package.json +20 -18
  207. /package/dist/{dropdown.option.test.focus.multiple.d.ts → dropdown.option.test.focus.d.ts} +0 -0
  208. /package/dist/{dropdown.option.test.focus.single.d.ts → dropdown.test.events.multiple.d.ts} +0 -0
@@ -0,0 +1,522 @@
1
+ import './menu.link.js';
2
+ import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
3
+ import { sendKeys } from '@web/test-runner-commands';
4
+ import GlideCoreMenu from './menu.js';
5
+ GlideCoreMenu.shadowRootOptions.mode = 'open';
6
+ it('opens when clicked', async () => {
7
+ const component = await fixture(html `<glide-core-menu>
8
+ <button slot="target">Target</button>
9
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
10
+ </glide-core-menu>`);
11
+ component.querySelector('button')?.click();
12
+ await elementUpdated(component);
13
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
14
+ expect(component.open).to.be.true;
15
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
16
+ });
17
+ it('does not open when clicked when its target is `disabled`', async () => {
18
+ const component = await fixture(html `<glide-core-menu>
19
+ <button slot="target" disabled>Target</button>
20
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
21
+ </glide-core-menu>`);
22
+ component.querySelector('button')?.click();
23
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
24
+ const target = component.querySelector('button');
25
+ expect(component.open).to.be.false;
26
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.not.be.ok;
27
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
28
+ expect(target?.ariaExpanded).to.equal('false');
29
+ });
30
+ it('does not open when clicked when its target is `aria-disabled`', async () => {
31
+ const component = await fixture(html `<glide-core-menu>
32
+ <button aria-disabled="true" slot="target">Target</button>
33
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
34
+ </glide-core-menu>`);
35
+ component.querySelector('button')?.click();
36
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
37
+ const target = component.querySelector('button');
38
+ expect(component.open).to.be.false;
39
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.not.be.ok;
40
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
41
+ expect(target?.ariaExpanded).to.equal('false');
42
+ });
43
+ it('opens on Enter', async () => {
44
+ const component = await fixture(html `<glide-core-menu>
45
+ <button slot="target">Target</button>
46
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
47
+ </glide-core-menu>`);
48
+ component.querySelector('button')?.focus();
49
+ await sendKeys({ press: 'Enter' });
50
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
51
+ const target = component.querySelector('button');
52
+ const link = component.querySelector('glide-core-menu-link');
53
+ expect(component.open).to.be.true;
54
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
55
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
56
+ expect(target?.ariaExpanded).to.equal('true');
57
+ });
58
+ it('opens on ArrowUp', async () => {
59
+ const component = await fixture(html `<glide-core-menu>
60
+ <button slot="target">Target</button>
61
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
62
+ </glide-core-menu>`);
63
+ component.querySelector('button')?.focus();
64
+ await sendKeys({ press: 'ArrowUp' });
65
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
66
+ const target = component.querySelector('button');
67
+ const link = component.querySelector('glide-core-menu-link');
68
+ expect(component.open).to.be.true;
69
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
70
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
71
+ expect(target?.ariaExpanded).to.equal('true');
72
+ });
73
+ it('opens on ArrowDown', async () => {
74
+ const component = await fixture(html `<glide-core-menu>
75
+ <button slot="target">Target</button>
76
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
77
+ </glide-core-menu>`);
78
+ component.querySelector('button')?.focus();
79
+ await sendKeys({ press: 'ArrowDown' });
80
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
81
+ const target = component.querySelector('button');
82
+ const link = component.querySelector('glide-core-menu-link');
83
+ expect(component.open).to.be.true;
84
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
85
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
86
+ expect(target?.ariaExpanded).to.equal('true');
87
+ });
88
+ it('opens on Space', async () => {
89
+ const component = await fixture(html `<glide-core-menu>
90
+ <button slot="target">Target</button>
91
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
92
+ </glide-core-menu>`);
93
+ component.querySelector('button')?.focus();
94
+ await sendKeys({ press: ' ' });
95
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
96
+ const target = component.querySelector('button');
97
+ const link = component.querySelector('glide-core-menu-link');
98
+ expect(component.open).to.be.true;
99
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
100
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
101
+ expect(target?.ariaExpanded).to.equal('true');
102
+ });
103
+ it('opens when opened programmatically', async () => {
104
+ const component = await fixture(html `<glide-core-menu>
105
+ <button slot="target">Target</button>
106
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
107
+ </glide-core-menu>`);
108
+ component.open = true;
109
+ await elementUpdated(component);
110
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
111
+ const target = component.querySelector('button');
112
+ const link = component.querySelector('glide-core-menu-link');
113
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
114
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
115
+ expect(target?.ariaExpanded).to.equal('true');
116
+ });
117
+ it('does not open when opened programmatically and its target is `disabled`', async () => {
118
+ const component = await fixture(html `<glide-core-menu>
119
+ <button slot="target" disabled>Target</button>
120
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
121
+ </glide-core-menu>`);
122
+ component.open = true;
123
+ await elementUpdated(component);
124
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
125
+ const target = component.querySelector('button');
126
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.not.be.ok;
127
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
128
+ expect(target?.ariaExpanded).to.equal('false');
129
+ });
130
+ it('does not open when opened programmatically and its target is `aria-disabled`', async () => {
131
+ const component = await fixture(html `<glide-core-menu>
132
+ <button aria-disabled="true" slot="target">Target</button>
133
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
134
+ </glide-core-menu>`);
135
+ component.open = true;
136
+ await elementUpdated(component);
137
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
138
+ const target = component.querySelector('button');
139
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.not.be.ok;
140
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
141
+ expect(target?.ariaExpanded).to.equal('false');
142
+ });
143
+ // See the `document` click listener comment in `menu.ts` for an explanation.
144
+ it('opens when opened programmatically via the click handler of another element', async () => {
145
+ const div = document.createElement('div');
146
+ const component = await fixture(html `<glide-core-menu>
147
+ <button slot="target">Target</button>
148
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
149
+ </glide-core-menu>`, { parentNode: div });
150
+ const anotherElement = document.createElement('button');
151
+ anotherElement.addEventListener('click', () => (component.open = true));
152
+ div.append(anotherElement);
153
+ anotherElement.click();
154
+ await elementUpdated(component);
155
+ const menu = component.shadowRoot?.querySelector('[data-test="menu"]');
156
+ const target = component.querySelector('button');
157
+ const link = component.querySelector('glide-core-menu-link');
158
+ expect(component.open).to.be.true;
159
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.true;
160
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(link?.id);
161
+ expect(target?.ariaExpanded).to.equal('true');
162
+ });
163
+ it('closes when clicked', async () => {
164
+ const component = await fixture(html `<glide-core-menu open>
165
+ <button slot="target">Target</button>
166
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
167
+ </glide-core-menu>`);
168
+ component.querySelector('button')?.click();
169
+ await elementUpdated(component);
170
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
171
+ const target = component.querySelector('button');
172
+ expect(component.open).to.be.false;
173
+ expect(menu?.checkVisibility({ checkVisibilityCSS: true })).to.be.false;
174
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
175
+ expect(target?.ariaExpanded).to.equal('false');
176
+ });
177
+ it('closes when something outside of it is clicked', async () => {
178
+ const component = await fixture(html `<glide-core-menu>
179
+ <button slot="target">Target</button>
180
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
181
+ </glide-core-menu>`);
182
+ component.querySelector('button')?.click();
183
+ document.body.click();
184
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
185
+ const target = component.querySelector('button');
186
+ expect(component.open).to.be.false;
187
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
188
+ expect(target?.ariaExpanded).to.equal('false');
189
+ });
190
+ it('closes on Escape when the button has focus', async () => {
191
+ const component = await fixture(html `<glide-core-menu open>
192
+ <button slot="target">Target</button>
193
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
194
+ </glide-core-menu>`);
195
+ component.querySelector('button')?.click();
196
+ await sendKeys({ press: 'Escape' });
197
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
198
+ const target = component.querySelector('button');
199
+ expect(component.open).to.be.false;
200
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
201
+ expect(target?.ariaExpanded).to.equal('false');
202
+ });
203
+ it('closes when an option is selected via click', async () => {
204
+ const component = await fixture(html `<glide-core-menu open>
205
+ <button slot="target">Target</button>
206
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
207
+ </glide-core-menu>`);
208
+ component.querySelector('glide-core-menu-link')?.click();
209
+ await elementUpdated(component);
210
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
211
+ const target = component.querySelector('button');
212
+ expect(component.open).to.be.false;
213
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
214
+ expect(target?.ariaExpanded).to.equal('false');
215
+ expect(target?.ariaExpanded).to.equal('false');
216
+ });
217
+ it('closes when an option is selected via Enter', async () => {
218
+ const component = await fixture(html `<glide-core-menu open>
219
+ <button slot="target">Target</button>
220
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
221
+ </glide-core-menu>`);
222
+ component.focus();
223
+ component
224
+ .querySelector('glide-core-menu-link')
225
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
226
+ await sendKeys({ press: 'Enter' });
227
+ await elementUpdated(component);
228
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
229
+ const target = component.querySelector('button');
230
+ expect(component.open).to.be.false;
231
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
232
+ expect(target?.ariaExpanded).to.equal('false');
233
+ });
234
+ it('closes when an option is selected via Space', async () => {
235
+ const component = await fixture(html `<glide-core-menu open>
236
+ <button slot="target">Target</button>
237
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
238
+ </glide-core-menu>`);
239
+ component.focus();
240
+ await sendKeys({ press: ' ' });
241
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
242
+ const target = component.querySelector('button');
243
+ expect(component.open).to.be.false;
244
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
245
+ expect(target?.ariaExpanded).to.equal('false');
246
+ });
247
+ it('activates the first menu link by default', async () => {
248
+ const component = await fixture(html `
249
+ <glide-core-menu>
250
+ <button slot="target">Target</button>
251
+ <glide-core-menu-link label="One"></glide-core-menu-link>
252
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
253
+ </glide-core-menu>
254
+ `);
255
+ component.querySelector('button')?.click();
256
+ await elementUpdated(component);
257
+ const options = component.querySelectorAll('glide-core-menu-link');
258
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
259
+ expect(options[0].privateActive).to.be.true;
260
+ expect(options[1].privateActive).to.be.false;
261
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
262
+ });
263
+ it('activates the first menu button by default', async () => {
264
+ const component = await fixture(html `
265
+ <glide-core-menu>
266
+ <button slot="target">Target</button>
267
+ <glide-core-menu-button label="One"></glide-core-menu-button>
268
+ <glide-core-menu-button label="Two"></glide-core-menu-button>
269
+ </glide-core-menu>
270
+ `);
271
+ component.querySelector('button')?.click();
272
+ await elementUpdated(component);
273
+ const options = component.querySelectorAll('glide-core-menu-button');
274
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
275
+ expect(options[0].privateActive).to.be.true;
276
+ expect(options[1].privateActive).to.be.false;
277
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
278
+ });
279
+ it('activates a menu link on "mouseover"', async () => {
280
+ const component = await fixture(html `
281
+ <glide-core-menu open>
282
+ <button slot="target">Target</button>
283
+ <glide-core-menu-link label="One"></glide-core-menu-link>
284
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
285
+ </glide-core-menu>
286
+ `);
287
+ const options = component.querySelectorAll('glide-core-menu-link');
288
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
289
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
290
+ await elementUpdated(component);
291
+ expect(options[0].privateActive).to.be.false;
292
+ expect(options[1].privateActive).to.be.true;
293
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
294
+ });
295
+ it('activates a menu button on "mouseover"', async () => {
296
+ const component = await fixture(html `
297
+ <glide-core-menu open>
298
+ <button slot="target">Target</button>
299
+ <glide-core-menu-button label="One"></glide-core-menu-button>
300
+ <glide-core-menu-button label="Two"></glide-core-menu-button>
301
+ </glide-core-menu>
302
+ `);
303
+ const options = component.querySelectorAll('glide-core-menu-button');
304
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
305
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
306
+ await elementUpdated(component);
307
+ expect(options[0].privateActive).to.be.false;
308
+ expect(options[1].privateActive).to.be.true;
309
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
310
+ });
311
+ it('activates the next option on ArrowDown', async () => {
312
+ const component = await fixture(html `
313
+ <glide-core-menu>
314
+ <button slot="target">Target</button>
315
+ <glide-core-menu-link label="One"></glide-core-menu-link>
316
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
317
+ <glide-core-menu-link label="Three"></glide-core-menu-link>
318
+ </glide-core-menu>
319
+ `);
320
+ component.querySelector('button')?.click();
321
+ component.focus();
322
+ const options = component.querySelectorAll('glide-core-menu-link');
323
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
324
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
325
+ await sendKeys({ press: 'ArrowDown' });
326
+ expect(options[0].privateActive).to.be.false;
327
+ expect(options[1].privateActive).to.be.false;
328
+ expect(options[2].privateActive).to.be.true;
329
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[2].id);
330
+ });
331
+ it('activates the previous option on ArrowUp', async () => {
332
+ const component = await fixture(html `
333
+ <glide-core-menu>
334
+ <button slot="target">Target</button>
335
+ <glide-core-menu-link label="One"></glide-core-menu-link>
336
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
337
+ </glide-core-menu>
338
+ `);
339
+ component.querySelector('button')?.click();
340
+ component.focus();
341
+ const options = component.querySelectorAll('glide-core-menu-link');
342
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
343
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
344
+ await sendKeys({ press: 'ArrowUp' });
345
+ expect(options[0].privateActive).to.be.true;
346
+ expect(options[1].privateActive).to.be.false;
347
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
348
+ });
349
+ it('activates the first option on Home', async () => {
350
+ const component = await fixture(html `
351
+ <glide-core-menu>
352
+ <button slot="target">Target</button>
353
+ <glide-core-menu-link label="One"></glide-core-menu-link>
354
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
355
+ </glide-core-menu>
356
+ `);
357
+ component.querySelector('button')?.click();
358
+ component.focus();
359
+ const options = component.querySelectorAll('glide-core-menu-link');
360
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
361
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
362
+ await sendKeys({ press: 'Home' });
363
+ expect(options[0].privateActive).to.be.true;
364
+ expect(options[1].privateActive).to.be.false;
365
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
366
+ });
367
+ it('activates the first option on PageUp', async () => {
368
+ const component = await fixture(html `
369
+ <glide-core-menu>
370
+ <button slot="target">Target</button>
371
+ <glide-core-menu-link label="One"></glide-core-menu-link>
372
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
373
+ </glide-core-menu>
374
+ `);
375
+ component.querySelector('button')?.click();
376
+ component.focus();
377
+ const options = component.querySelectorAll('glide-core-menu-link');
378
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
379
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
380
+ await sendKeys({ press: 'PageUp' });
381
+ expect(options[0].privateActive).to.be.true;
382
+ expect(options[1].privateActive).to.be.false;
383
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
384
+ });
385
+ it('activates the first option on ArrowUp + Meta', async () => {
386
+ const component = await fixture(html `
387
+ <glide-core-menu>
388
+ <button slot="target">Target</button>
389
+ <glide-core-menu-link label="One"></glide-core-menu-link>
390
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
391
+ </glide-core-menu>
392
+ `);
393
+ component.querySelector('button')?.click();
394
+ component.focus();
395
+ const options = component.querySelectorAll('glide-core-menu-link');
396
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
397
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
398
+ await sendKeys({ down: 'Meta' });
399
+ await sendKeys({ press: 'ArrowUp' });
400
+ expect(options[0].privateActive).to.be.true;
401
+ expect(options[1].privateActive).to.be.false;
402
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
403
+ });
404
+ it('activates the last option on End', async () => {
405
+ const component = await fixture(html `
406
+ <glide-core-menu>
407
+ <button slot="target">Target</button>
408
+ <glide-core-menu-link label="One"></glide-core-menu-link>
409
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
410
+ </glide-core-menu>
411
+ `);
412
+ component.querySelector('button')?.click();
413
+ component.focus();
414
+ await sendKeys({ press: 'End' });
415
+ const options = component.querySelectorAll('glide-core-menu-link');
416
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
417
+ expect(options[0].privateActive).to.be.false;
418
+ expect(options[1].privateActive).to.be.true;
419
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
420
+ });
421
+ it('activates the last option on PageDown', async () => {
422
+ const component = await fixture(html `
423
+ <glide-core-menu>
424
+ <button slot="target">Target</button>
425
+ <glide-core-menu-link label="One"></glide-core-menu-link>
426
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
427
+ </glide-core-menu>
428
+ `);
429
+ component.querySelector('button')?.click();
430
+ component.focus();
431
+ const options = component.querySelectorAll('glide-core-menu-link');
432
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
433
+ options[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
434
+ await sendKeys({ press: 'PageDown' });
435
+ expect(options[0].privateActive).to.be.false;
436
+ expect(options[1].privateActive).to.be.true;
437
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
438
+ });
439
+ it('activates the last option on Meta + ArrowDown', async () => {
440
+ const component = await fixture(html `
441
+ <glide-core-menu>
442
+ <button slot="target">Target</button>
443
+ <glide-core-menu-link label="One"></glide-core-menu-link>
444
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
445
+ </glide-core-menu>
446
+ `);
447
+ component.querySelector('button')?.click();
448
+ component.focus();
449
+ const options = component.querySelectorAll('glide-core-menu-link');
450
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
451
+ options[0].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
452
+ await sendKeys({ down: 'Meta' });
453
+ await sendKeys({ press: 'ArrowDown' });
454
+ await sendKeys({ up: 'Meta' });
455
+ expect(options[0].privateActive).to.be.false;
456
+ expect(options[1].privateActive).to.be.true;
457
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
458
+ });
459
+ it('sets `aria-activedescendant` on open', async () => {
460
+ const component = await fixture(html `<glide-core-menu>
461
+ <button slot="target">Target</button>
462
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
463
+ </glide-core-menu>`);
464
+ component.querySelector('button')?.click();
465
+ await elementUpdated(component);
466
+ const option = component.querySelector('glide-core-menu-link');
467
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
468
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal(option?.id);
469
+ });
470
+ it('sets `aria-activedescendant` on close', async () => {
471
+ const component = await fixture(html `<glide-core-menu open>
472
+ <button slot="target">Target</button>
473
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
474
+ </glide-core-menu>`);
475
+ component.querySelector('button')?.click();
476
+ await elementUpdated(component);
477
+ const menu = component?.shadowRoot?.querySelector('[data-test="menu"]');
478
+ expect(menu?.getAttribute('aria-activedescendant')).to.equal('');
479
+ });
480
+ it('sets `aria-expanded` on open', async () => {
481
+ const component = await fixture(html `<glide-core-menu>
482
+ <button slot="target">Target</button>
483
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
484
+ </glide-core-menu>`);
485
+ component.querySelector('button')?.click();
486
+ expect(component.querySelector('button')?.getAttribute('aria-expanded')).to.equal('true');
487
+ });
488
+ it('sets `aria-expanded` on close', async () => {
489
+ const component = await fixture(html `<glide-core-menu open>
490
+ <button slot="target">Target</button>
491
+ <glide-core-menu-link label="Link"></glide-core-menu-link>
492
+ </glide-core-menu>`);
493
+ component.querySelector('button')?.click();
494
+ expect(component.querySelector('button')?.getAttribute('aria-expanded')).to.equal('false');
495
+ });
496
+ it('does not wrap on ArrowUp', async () => {
497
+ const component = await fixture(html `
498
+ <glide-core-menu>
499
+ <button slot="target">Target</button>
500
+ <glide-core-menu-link label="One"></glide-core-menu-link>
501
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
502
+ </glide-core-menu>
503
+ `);
504
+ component.querySelector('button')?.click();
505
+ await sendKeys({ press: 'ArrowUp' });
506
+ const link = component.querySelector('glide-core-menu-link');
507
+ expect(link?.privateActive).to.be.true;
508
+ });
509
+ it('does not wrap on ArrowDown', async () => {
510
+ const component = await fixture(html `
511
+ <glide-core-menu>
512
+ <button slot="target">Target</button>
513
+ <glide-core-menu-link label="One"></glide-core-menu-link>
514
+ <glide-core-menu-link label="Two"></glide-core-menu-link>
515
+ </glide-core-menu>
516
+ `);
517
+ component.querySelector('button')?.click();
518
+ const options = component.querySelectorAll('glide-core-menu-link');
519
+ options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
520
+ await sendKeys({ press: 'ArrowDown' });
521
+ expect(options[1].privateActive).to.be.true;
522
+ });
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var p=(t,e,o,a)=>{for(var i=a>1?void 0:a?E(e,o):e,f=t.length-1,n;f>=0;f--)(n=t[f])&&(i=(a?n(e,o,i):n(i))||i);return a&&i&&u(e,o,i),i};var c=(t,e,o)=>{if(!e.has(t))throw TypeError("Cannot "+o)};var m=(t,e,o)=>(c(t,e,"read from private field"),o?o.call(t):e.get(t)),d=(t,e,o)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,o)};var h=(t,e,o)=>(c(t,e,"access private method"),o);var l,s,v;import"./icon-button.js";import{LitElement as b,html as R}from"lit";import{createRef as S,ref as w}from"lit/directives/ref.js";import{customElement as y,property as L}from"lit/decorators.js";import{ifDefined as T}from"lit/directives/if-defined.js";import{owSlot as g}from"./library/ow.js";import $ from"./modal.icon-button.styles.js";let r=class extends b{constructor(){super(...arguments);d(this,s);this.label="";d(this,l,S())}firstUpdated(){g(m(this,l).value)}render(){return R`<glide-core-icon-button label="${T(this.label)}" variant="tertiary"><slot @slotchange="${h(this,s,v)}" ${w(m(this,l))}></slot></glide-core-icon-button>`}};l=new WeakMap,s=new WeakSet,v=function(){g(m(this,l).value)},r.shadowRootOptions={...b.shadowRootOptions,mode:"closed"},r.styles=$,p([L()],r.prototype,"label",2),r=p([y("glide-core-modal-icon-button")],r);export{r as default};
1
+ var __decorate=this&&this.__decorate||function(t,e,o,l){var r,i=arguments.length,n=i<3?e:null===l?l=Object.getOwnPropertyDescriptor(e,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,o,l);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(n=(i<3?r(n):i>3?r(e,o,n):r(e,o))||n);return i>3&&n&&Object.defineProperty(e,o,n),n};import"./icon-button.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{owSlot}from"./library/ow.js";import styles from"./modal.icon-button.styles.js";let GlideCoreModalIconButton=class GlideCoreModalIconButton extends LitElement{constructor(){super(...arguments),this.label="",this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#t.value)}render(){return html`<glide-core-icon-button label="${ifDefined(this.label)}" variant="tertiary"><slot @slotchange="${this.#e}" ${ref(this.#t)}></slot></glide-core-icon-button>`}#t;#e(){owSlot(this.#t.value)}};__decorate([property()],GlideCoreModalIconButton.prototype,"label",void 0),GlideCoreModalIconButton=__decorate([customElement("glide-core-modal-icon-button")],GlideCoreModalIconButton);export default GlideCoreModalIconButton;
@@ -1,8 +1,8 @@
1
- "use strict";import{css as e}from"lit";export default[e`
1
+ import{css}from"lit";export default[css`
2
2
  ::slotted(*) {
3
3
  --size: 1.25rem;
4
4
 
5
5
  block-size: 1.25rem;
6
6
  inline-size: 1.25rem;
7
7
  }
8
- `];
8
+ `];
@@ -0,0 +1,45 @@
1
+ import { ArgumentError } from 'ow';
2
+ import { expect, fixture, html } from '@open-wc/testing';
3
+ import GlideCoreModalIconButton from './modal.icon-button.js';
4
+ import sinon from 'sinon';
5
+ GlideCoreModalIconButton.shadowRootOptions.mode = 'open';
6
+ it('registers', async () => {
7
+ expect(window.customElements.get('glide-core-modal-icon-button')).to.equal(GlideCoreModalIconButton);
8
+ });
9
+ it('is accessible', async () => {
10
+ const element = await fixture(html `<glide-core-modal-icon-button>Test</glide-core-modal-icon-button>`);
11
+ await expect(element).to.be.accessible();
12
+ });
13
+ it('renders and sets default attributes', async () => {
14
+ const element = await fixture(html `
15
+ <glide-core-modal-icon-button>Test</glide-core-modal-icon-button>
16
+ `);
17
+ expect(element).to.be.ok;
18
+ const buttonElement = element.shadowRoot?.querySelector('glide-core-icon-button');
19
+ expect(buttonElement).to.be.not.null;
20
+ expect(buttonElement).to.have.attribute('variant', 'tertiary');
21
+ });
22
+ it('adds an accessible label when given', async () => {
23
+ const element = await fixture(html `<glide-core-modal-icon-button label="test-label"
24
+ >Test</glide-core-modal-icon-button
25
+ >`);
26
+ const buttonElement = element.shadowRoot?.querySelector('glide-core-icon-button');
27
+ expect(buttonElement).to.have.attribute('label', 'test-label');
28
+ });
29
+ it('does not add an acceessible label when not given', async () => {
30
+ const element = await fixture(html `<glide-core-modal-icon-button>Test</glide-core-modal-icon-button>`);
31
+ const buttonElement = element.shadowRoot?.querySelector('glide-core-icon-button');
32
+ expect(buttonElement).to.have.attribute('label', '');
33
+ });
34
+ it('throws if it does not have a default slot', async () => {
35
+ const spy = sinon.spy();
36
+ try {
37
+ await fixture(html `<glide-core-modal-icon-button></glide-core-modal-icon-button>`);
38
+ }
39
+ catch (error) {
40
+ if (error instanceof ArgumentError) {
41
+ spy();
42
+ }
43
+ }
44
+ expect(spy.called).to.be.true;
45
+ });
package/dist/modal.js CHANGED
@@ -1,15 +1 @@
1
- "use strict";var Y=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var b=(l,o,t,n)=>{for(var c=n>1?void 0:n?N(o,t):o,R=l.length-1,B;R>=0;R--)(B=l[R])&&(c=(n?B(o,t,c):B(c))||c);return n&&c&&Y(o,t,c),c};var z=(l,o,t)=>{if(!o.has(l))throw TypeError("Cannot "+t)};var e=(l,o,t)=>(z(l,o,"read from private field"),t?t.call(l):o.get(l)),i=(l,o,t)=>{if(o.has(l))throw TypeError("Cannot add the same private member more than once");o instanceof WeakSet?o.add(l):o.set(l,t)};var r=(l,o,t)=>(z(l,o,"access private method"),t);var s,p,g,v,f,S,w,x,E,j,y,F,C,P,M,K,$,O,L,W,H,X;import"./modal.icon-button.js";import{LitElement as V,html as D}from"lit";import{classMap as U}from"lit/directives/class-map.js";import{createRef as m,ref as u}from"lit/directives/ref.js";import{customElement as q,property as T}from"lit/decorators.js";import{owSlot as I,owSlotType as d}from"./library/ow.js";import{when as J}from"lit/directives/when.js";import h from"./button.js";import Z from"./modal.icon-button.js";import A from"./modal.tertiary-icon.js";import Q from"./modal.styles.js";const k=new CSSStyleSheet;k.insertRule(`
2
- @supports (scrollbar-gutter: stable) {
3
- .private-glide-core-modal-lock-scroll {
4
- scrollbar-gutter: stable !important;
5
- overflow: hidden !important;
6
- }
7
- }
8
- `),k.insertRule(`
9
- @supports not (scrollbar-gutter: stable) {
10
- .private-glide-core-modal-lock-scroll {
11
- padding-right: var(--glide-scroll-size, 0.9375rem) !important;
12
- overflow: hidden !important;
13
- }
14
- }
15
- `);let a=class extends V{constructor(){super(...arguments);i(this,w);i(this,E);i(this,y);i(this,C);i(this,M);i(this,$);i(this,L);i(this,H);this.label="";this.showBackButton=!1;this.size="medium";i(this,s,m());i(this,p,m());i(this,g,m());i(this,v,m());i(this,f,m());i(this,S,m())}close(){e(this,s).value?.open&&(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),e(this,s).value?.close())}connectedCallback(){super.connectedCallback(),document.adoptedStyleSheets.includes(k)||document.adoptedStyleSheets.push(k)}disconnectedCallback(){super.disconnectedCallback(),document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),document.adoptedStyleSheets=document.adoptedStyleSheets.filter(t=>t!==k)}firstUpdated(){I(e(this,p).value),d(e(this,S).value,[Z]),d(e(this,g).value,[h]),d(e(this,v).value,[h]),d(e(this,f).value,[A,h])}render(){return D`<dialog class="${U({component:!0,small:this.size==="small",medium:this.size==="medium",large:this.size==="large",xlarge:this.size==="xlarge"})}" tabindex="-1" @keydown="${r(this,L,W)}" @mousedown="${r(this,H,X)}" ${u(e(this,s))}><header class="header"><h2 class="label" data-test="heading" id="heading">${J(this.showBackButton,()=>D`<glide-core-modal-icon-button data-test="back-button" @click="${r(this,w,x)}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><title>Dismiss</title><path d="M12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20V18ZM20 14.5C20 16.433 18.433 18 16.5 18V20C19.5376 20 22 17.5376 22 14.5H20ZM16.5 11C18.433 11 20 12.567 20 14.5H22C22 11.4624 19.5376 9 16.5 9V11ZM16.5 18H12V20H16.5V18ZM16.5 9H3V11H16.5V9Z" fill="currentColor"/><path d="M7 6L3 10L7 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-modal-icon-button>`)} ${this.label}</h2><div class="header-actions" role="toolbar"><slot name="header-actions" @slotchange="${r(this,$,O)}" ${u(e(this,S))}></slot><glide-core-modal-icon-button data-test="close-button" @click="${r(this,w,x)}"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><title>Close</title><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-modal-icon-button></div></header><article aria-labelledby="heading" class="body" role="region" tabindex="0"><slot @slotchange="${r(this,E,j)}" ${u(e(this,p))}></slot></article><footer class="footer"><menu class="menu"><li class="flex align-center"><slot name="tertiary" @slotchange="${r(this,M,K)}" ${u(e(this,f))}></slot></li><li><menu class="actions"><li><slot name="secondary" @slotchange="${r(this,C,P)}" ${u(e(this,v))}></slot></li><li><slot name="primary" @slotchange="${r(this,y,F)}" ${u(e(this,g))}></slot></li></menu></li></menu></footer></dialog>`}showModal(){if(!e(this,s).value?.open){if(document.documentElement.classList.add("private-glide-core-modal-lock-scroll"),!window.CSS.supports("scrollbar-gutter","stable")){const t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.documentElement.style.setProperty("--glide-scroll-size",`${t}px`)}e(this,s).value?.showModal(),e(this,s).value?.focus()}}};s=new WeakMap,p=new WeakMap,g=new WeakMap,v=new WeakMap,f=new WeakMap,S=new WeakMap,w=new WeakSet,x=function(){document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),e(this,s).value?.close()},E=new WeakSet,j=function(){I(e(this,p).value)},y=new WeakSet,F=function(){d(e(this,g).value,[h])},C=new WeakSet,P=function(){d(e(this,v).value,[h])},M=new WeakSet,K=function(){d(e(this,f).value,[A,h])},$=new WeakSet,O=function(){d(e(this,S).value,[Z])},L=new WeakSet,W=function(t){t.key==="Escape"&&(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),e(this,s).value?.close())},H=new WeakSet,X=function(t){if(t.target!==e(this,s).value)return;const n=e(this,s).value?.getBoundingClientRect();n&&(n.top<=t.clientY&&t.clientY<=n.top+n.height&&n.left<=t.clientX&&t.clientX<=n.left+n.width||(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),e(this,s).value?.close()))},a.shadowRootOptions={...V.shadowRootOptions,mode:"closed"},a.styles=Q,b([T({reflect:!0})],a.prototype,"label",2),b([T({attribute:"show-back-button",type:Boolean,reflect:!0})],a.prototype,"showBackButton",2),b([T({reflect:!0})],a.prototype,"size",2),a=b([q("glide-core-modal")],a);export{a as default};
1
+ var __decorate=this&&this.__decorate||function(e,t,o,l){var n,r=arguments.length,i=r<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,l);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(i=(r<3?n(i):r>3?n(t,o,i):n(t,o))||i);return r>3&&i&&Object.defineProperty(t,o,i),i};import"./modal.icon-button.js";import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import{when}from"lit/directives/when.js";import GlideCoreButton from"./button.js";import GlideCoreModalIconButton from"./modal.icon-button.js";import GlideCoreModalTertiaryIcon from"./modal.tertiary-icon.js";import styles from"./modal.styles.js";const globalStylesheet=new CSSStyleSheet;globalStylesheet.insertRule("\n @supports (scrollbar-gutter: stable) {\n .private-glide-core-modal-lock-scroll {\n scrollbar-gutter: stable !important;\n overflow: hidden !important;\n }\n }\n"),globalStylesheet.insertRule("\n @supports not (scrollbar-gutter: stable) {\n .private-glide-core-modal-lock-scroll {\n padding-right: var(--glide-scroll-size, 0.9375rem) !important;\n overflow: hidden !important;\n }\n }\n");let GlideCoreModal=class GlideCoreModal extends LitElement{constructor(){super(...arguments),this.label="",this.showBackButton=!1,this.size="medium",this.#e=createRef(),this.#t=createRef(),this.#o=createRef(),this.#l=createRef(),this.#n=createRef(),this.#r=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){this.#e.value?.open&&(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),this.#e.value?.close())}connectedCallback(){super.connectedCallback();document.adoptedStyleSheets.includes(globalStylesheet)||document.adoptedStyleSheets.push(globalStylesheet)}disconnectedCallback(){super.disconnectedCallback(),document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),document.adoptedStyleSheets=document.adoptedStyleSheets.filter((e=>e!==globalStylesheet))}firstUpdated(){owSlot(this.#t.value),owSlotType(this.#r.value,[GlideCoreModalIconButton]),owSlotType(this.#o.value,[GlideCoreButton]),owSlotType(this.#l.value,[GlideCoreButton]),owSlotType(this.#n.value,[GlideCoreModalTertiaryIcon,GlideCoreButton])}render(){return html`<dialog class="${classMap({component:!0,small:"small"===this.size,medium:"medium"===this.size,large:"large"===this.size,xlarge:"xlarge"===this.size})}" tabindex="-1" @keydown="${this.#i}" @mousedown="${this.#s}" ${ref(this.#e)}><header class="header"><h2 class="label" data-test="heading" id="heading">${when(this.showBackButton,(()=>html`<glide-core-modal-icon-button data-test="back-button" @click="${this.#a}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><title>Dismiss</title><path d="M12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20V18ZM20 14.5C20 16.433 18.433 18 16.5 18V20C19.5376 20 22 17.5376 22 14.5H20ZM16.5 11C18.433 11 20 12.567 20 14.5H22C22 11.4624 19.5376 9 16.5 9V11ZM16.5 18H12V20H16.5V18ZM16.5 9H3V11H16.5V9Z" fill="currentColor"/><path d="M7 6L3 10L7 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-modal-icon-button>`))} ${this.label}</h2><div class="header-actions" role="toolbar"><slot name="header-actions" @slotchange="${this.#c}" ${ref(this.#r)}></slot><glide-core-modal-icon-button data-test="close-button" @click="${this.#a}"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><title>Close</title><path d="M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></glide-core-modal-icon-button></div></header><article aria-labelledby="heading" class="body" role="region" tabindex="0"><slot @slotchange="${this.#d}" ${ref(this.#t)}></slot></article><footer class="footer"><menu class="menu"><li class="flex align-center"><slot name="tertiary" @slotchange="${this.#m}" ${ref(this.#n)}></slot></li><li><menu class="actions"><li><slot name="secondary" @slotchange="${this.#h}" ${ref(this.#l)}></slot></li><li><slot name="primary" @slotchange="${this.#u}" ${ref(this.#o)}></slot></li></menu></li></menu></footer></dialog>`}showModal(){if(!this.#e.value?.open){if(document.documentElement.classList.add("private-glide-core-modal-lock-scroll"),!window.CSS.supports("scrollbar-gutter","stable")){const e=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.documentElement.style.setProperty("--glide-scroll-size",`${e}px`)}this.#e.value?.showModal(),this.#e.value?.focus()}}#e;#t;#o;#l;#n;#r;#a(){document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),this.#e.value?.close()}#d(){owSlot(this.#t.value)}#u(){owSlotType(this.#o.value,[GlideCoreButton])}#h(){owSlotType(this.#l.value,[GlideCoreButton])}#m(){owSlotType(this.#n.value,[GlideCoreModalTertiaryIcon,GlideCoreButton])}#c(){owSlotType(this.#r.value,[GlideCoreModalIconButton])}#i(e){"Escape"===e.key&&(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),this.#e.value?.close())}#s(e){if(e.target!==this.#e.value)return;const t=this.#e.value?.getBoundingClientRect();if(t){t.top<=e.clientY&&e.clientY<=t.top+t.height&&t.left<=e.clientX&&e.clientX<=t.left+t.width||(document.documentElement.classList.remove("private-glide-core-modal-lock-scroll"),this.dispatchEvent(new Event("close")),this.#e.value?.close())}}};__decorate([property({reflect:!0})],GlideCoreModal.prototype,"label",void 0),__decorate([property({attribute:"show-back-button",type:Boolean,reflect:!0})],GlideCoreModal.prototype,"showBackButton",void 0),__decorate([property({reflect:!0})],GlideCoreModal.prototype,"size",void 0),GlideCoreModal=__decorate([customElement("glide-core-modal")],GlideCoreModal);export default GlideCoreModal;