@crowdstrike/glide-core 0.5.1 → 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 -4
  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 +0 -2
  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 +25 -6
  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 +6 -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 +18 -16
  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,228 @@
1
+ import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2
+ import GlideCoreRadio from './radio.js';
3
+ import GlideCoreRadioGroup from './radio-group.js';
4
+ GlideCoreRadio.shadowRootOptions.mode = 'open';
5
+ GlideCoreRadioGroup.shadowRootOptions.mode = 'open';
6
+ it('is valid if not required and radios are unchecked', async () => {
7
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name">
8
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
9
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
10
+ </glide-core-radio-group>`);
11
+ expect(component.validity.valid).to.be.true;
12
+ expect(component.validity?.valueMissing).to.be.false;
13
+ expect(component.checkValidity()).to.be.true;
14
+ expect(component.reportValidity()).to.be.true;
15
+ const radios = component.querySelectorAll('glide-core-radio');
16
+ expect(radios[0]?.invalid).to.be.false;
17
+ expect(radios[0]?.ariaInvalid).to.equal('false');
18
+ expect(radios[1]?.invalid).to.be.false;
19
+ expect(radios[1]?.ariaInvalid).to.equal('false');
20
+ });
21
+ it('is valid if required and a radio is checked', async () => {
22
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
23
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
24
+ <glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
25
+ </glide-core-radio-group>`);
26
+ expect(component.validity.valid).to.be.true;
27
+ expect(component.validity?.valueMissing).to.be.false;
28
+ expect(component.checkValidity()).to.be.true;
29
+ expect(component.reportValidity()).to.be.true;
30
+ const radios = component.querySelectorAll('glide-core-radio');
31
+ expect(radios[0]?.invalid).to.be.false;
32
+ expect(radios[0]?.ariaInvalid).to.equal('false');
33
+ expect(radios[1]?.invalid).to.be.false;
34
+ expect(radios[1]?.ariaInvalid).to.equal('false');
35
+ });
36
+ it('is invalid if required and no radio is checked', async () => {
37
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
38
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
39
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
40
+ </glide-core-radio-group>`);
41
+ expect(component.validity.valid).to.be.false;
42
+ expect(component.validity?.valueMissing).to.be.true;
43
+ expect(component.checkValidity()).to.be.false;
44
+ expect(component.reportValidity()).to.be.false;
45
+ });
46
+ it('is both invalid and valid if required but disabled and no radio is checked', async () => {
47
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required disabled>
48
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
49
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
50
+ </glide-core-radio-group>`);
51
+ expect(component.validity.valid).to.be.false;
52
+ expect(component.validity?.valueMissing).to.be.true;
53
+ expect(component.checkValidity()).to.be.true;
54
+ expect(component.reportValidity()).to.be.true;
55
+ });
56
+ it('adds an error class after submit when invalid and required', async () => {
57
+ const form = document.createElement('form');
58
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
59
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
60
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
61
+ </glide-core-radio-group>`, { parentNode: form });
62
+ form.requestSubmit();
63
+ await elementUpdated(component);
64
+ const isComponentErrorClass = component.shadowRoot
65
+ ?.querySelector('.radio-container')
66
+ ?.classList.contains('invalid');
67
+ expect(isComponentErrorClass).to.be.true;
68
+ });
69
+ it('adds an error class after `reportValidity` is called when invalid and required', async () => {
70
+ const form = document.createElement('form');
71
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
72
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
73
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
74
+ </glide-core-radio-group>`, { parentNode: form });
75
+ component.reportValidity();
76
+ await elementUpdated(component);
77
+ const isComponentErrorClass = component.shadowRoot
78
+ ?.querySelector('.radio-container')
79
+ ?.classList.contains('invalid');
80
+ expect(isComponentErrorClass).to.be.true;
81
+ const radios = document.querySelectorAll('glide-core-radio');
82
+ expect(radios[0]?.invalid).to.be.true;
83
+ expect(radios[0]).to.have.attribute('aria-invalid', 'true');
84
+ expect(radios[1]?.invalid).to.be.true;
85
+ expect(radios[1]).to.have.attribute('aria-invalid', 'true');
86
+ });
87
+ it('does not add an error class by default', async () => {
88
+ const form = document.createElement('form');
89
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
90
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
91
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
92
+ </glide-core-radio-group>`, { parentNode: form });
93
+ const isComponentErrorClass = component.shadowRoot
94
+ ?.querySelector('.radio-container')
95
+ ?.classList.contains('invalid');
96
+ expect(isComponentErrorClass).to.be.false;
97
+ const radios = document.querySelectorAll('glide-core-radio');
98
+ let isRadioError = radios[0].shadowRoot
99
+ ?.querySelector('[data-test="radio"]')
100
+ ?.classList.contains('invalid');
101
+ expect(isRadioError).to.be.false;
102
+ isRadioError = radios[1].shadowRoot
103
+ ?.querySelector('[data-test="radio"]')
104
+ ?.classList.contains('invalid');
105
+ expect(isRadioError).to.be.false;
106
+ expect(radios[0]?.invalid).to.be.false;
107
+ expect(radios[0]).to.have.attribute('aria-invalid', 'false');
108
+ expect(radios[1]?.invalid).to.be.false;
109
+ expect(radios[1]).to.have.attribute('aria-invalid', 'false');
110
+ });
111
+ it('does not add an error class after `reportValidity` is called when not required', async () => {
112
+ const form = document.createElement('form');
113
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name">
114
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
115
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
116
+ </glide-core-radio-group>`, { parentNode: form });
117
+ component.reportValidity();
118
+ await elementUpdated(component);
119
+ const isComponentErrorClass = component.shadowRoot
120
+ ?.querySelector('.radio-container')
121
+ ?.classList.contains('invalid');
122
+ expect(isComponentErrorClass).to.be.false;
123
+ const radios = document.querySelectorAll('glide-core-radio');
124
+ let isRadioError = radios[0].shadowRoot
125
+ ?.querySelector('[data-test="radio"]')
126
+ ?.classList.contains('invalid');
127
+ expect(isRadioError).to.be.false;
128
+ isRadioError = radios[1].shadowRoot
129
+ ?.querySelector('[data-test="radio"]')
130
+ ?.classList.contains('invalid');
131
+ expect(isRadioError).to.be.false;
132
+ expect(radios[0]?.invalid).to.be.false;
133
+ expect(radios[0]).to.have.attribute('aria-invalid', 'false');
134
+ expect(radios[1]?.invalid).to.be.false;
135
+ expect(radios[1]).to.have.attribute('aria-invalid', 'false');
136
+ });
137
+ it('does not add an error class after `reportValidity` is called when required and a radio is checked', async () => {
138
+ const form = document.createElement('form');
139
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
140
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
141
+ <glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
142
+ </glide-core-radio-group>`, { parentNode: form });
143
+ component.reportValidity();
144
+ await elementUpdated(component);
145
+ const isComponentErrorClass = component.shadowRoot
146
+ ?.querySelector('.radio-container')
147
+ ?.classList.contains('invalid');
148
+ expect(isComponentErrorClass).to.be.false;
149
+ const radios = document.querySelectorAll('glide-core-radio');
150
+ let isRadioError = radios[0].shadowRoot
151
+ ?.querySelector('[data-test="radio"]')
152
+ ?.classList.contains('invalid');
153
+ expect(isRadioError).to.be.false;
154
+ isRadioError = radios[1].shadowRoot
155
+ ?.querySelector('[data-test="radio"]')
156
+ ?.classList.contains('invalid');
157
+ expect(isRadioError).to.be.false;
158
+ expect(radios[0]?.invalid).to.be.false;
159
+ expect(radios[0]).to.have.attribute('aria-invalid', 'false');
160
+ expect(radios[1]?.invalid).to.be.false;
161
+ expect(radios[1]).to.have.attribute('aria-invalid', 'false');
162
+ });
163
+ it('does not add an error class after `reportValidity` is called when required but disabled', async () => {
164
+ const form = document.createElement('form');
165
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required disabled>
166
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
167
+ <glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
168
+ </glide-core-radio-group>`, { parentNode: form });
169
+ component.reportValidity();
170
+ await elementUpdated(component);
171
+ const isComponentErrorClass = component.shadowRoot
172
+ ?.querySelector('.radio-container')
173
+ ?.classList.contains('invalid');
174
+ expect(isComponentErrorClass).to.be.false;
175
+ const radios = document.querySelectorAll('glide-core-radio');
176
+ let isRadioError = radios[0].shadowRoot
177
+ ?.querySelector('[data-test="radio"]')
178
+ ?.classList.contains('invalid');
179
+ expect(isRadioError).to.be.false;
180
+ isRadioError = radios[1].shadowRoot
181
+ ?.querySelector('[data-test="radio"]')
182
+ ?.classList.contains('invalid');
183
+ expect(isRadioError).to.be.false;
184
+ expect(radios[0]?.invalid).to.be.false;
185
+ expect(radios[0]).to.have.attribute('aria-invalid', 'false');
186
+ expect(radios[1]?.invalid).to.be.false;
187
+ expect(radios[1]).to.have.attribute('aria-invalid', 'false');
188
+ });
189
+ it('does not add an error class after `checkValidity` is called when required', async () => {
190
+ const form = document.createElement('form');
191
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
192
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
193
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
194
+ </glide-core-radio-group>`, { parentNode: form });
195
+ component.checkValidity();
196
+ await elementUpdated(component);
197
+ const isComponentErrorClass = component.shadowRoot
198
+ ?.querySelector('.radio-container')
199
+ ?.classList.contains('invalid');
200
+ expect(isComponentErrorClass).to.be.false;
201
+ const radios = document.querySelectorAll('glide-core-radio');
202
+ let isRadioError = radios[0].shadowRoot
203
+ ?.querySelector('[data-test="radio"]')
204
+ ?.classList.contains('invalid');
205
+ expect(isRadioError).to.be.false;
206
+ isRadioError = radios[1].shadowRoot
207
+ ?.querySelector('[data-test="radio"]')
208
+ ?.classList.contains('invalid');
209
+ expect(isRadioError).to.be.false;
210
+ expect(radios[0]?.invalid).to.be.false;
211
+ expect(radios[0]).to.have.attribute('aria-invalid', 'false');
212
+ expect(radios[1]?.invalid).to.be.false;
213
+ expect(radios[1]).to.have.attribute('aria-invalid', 'false');
214
+ });
215
+ it('sets radios as valid initially when required', async () => {
216
+ const form = document.createElement('form');
217
+ const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
218
+ <glide-core-radio value="value-1" label="One"></glide-core-radio>
219
+ <glide-core-radio value="value-2" label="Two"></glide-core-radio>
220
+ </glide-core-radio-group>`, { parentNode: form });
221
+ component.required = false;
222
+ await elementUpdated(component);
223
+ const radios = component.querySelectorAll('glide-core-radio');
224
+ expect(radios[0]?.invalid).to.be.false;
225
+ expect(radios[0]?.ariaInvalid).to.equal('false');
226
+ expect(radios[1]?.invalid).to.be.false;
227
+ expect(radios[1]?.ariaInvalid).to.equal('false');
228
+ });
package/dist/radio.js CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var i=(d,r,e,l)=>{for(var a=l>1?void 0:l?f(r,e):r,h=d.length-1,o;h>=0;h--)(o=d[h])&&(a=(l?o(r,e,a):o(a))||a);return l&&a&&p(r,e,a),a};import{LitElement as n,html as u}from"lit";import{classMap as c}from"lit/directives/class-map.js";import{customElement as b,property as s}from"lit/decorators.js";import m from"./radio.styles.js";let t=class extends n{constructor(){super(...arguments);this.checked=!1;this.disabled=!1;this.invalid=!1;this.required=!1;this.value="";this.label=""}firstUpdated(){this.role="radio",this.ariaChecked=this.checked.toString(),this.ariaDisabled=this.disabled.toString(),this.ariaInvalid=this.invalid.toString(),this.ariaRequired=this.required.toString(),this.ariaLabel=this.label}render(){return u`<span class="${c({component:!0,disabled:this.disabled})}"><span id="radio" class="${c({"radio-circle":!0,checked:this.checked})}" data-test="radio" data-test-error="${this.invalid}"></span> ${this.label}</span>`}willUpdate(e){this.hasUpdated&&(e.has("checked")&&(this.ariaChecked=this.checked.toString()),e.has("disabled")&&(this.ariaDisabled=this.disabled.toString()),e.has("required")&&(this.ariaRequired=this.required.toString()),e.has("invalid")&&(this.ariaInvalid=this.invalid.toString()),e.has("label")&&(this.ariaLabel=this.label))}};t.shadowRootOptions={...n.shadowRootOptions,mode:"closed"},t.styles=m,i([s({type:Boolean,reflect:!0})],t.prototype,"checked",2),i([s({type:Boolean,reflect:!0})],t.prototype,"disabled",2),i([s({type:Boolean})],t.prototype,"invalid",2),i([s({type:Boolean,reflect:!0})],t.prototype,"required",2),i([s()],t.prototype,"value",2),i([s({reflect:!0})],t.prototype,"label",2),t=i([b("glide-core-radio")],t);export{t as default};
1
+ var __decorate=this&&this.__decorate||function(e,t,i,r){var o,a=arguments.length,d=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,i,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(d=(a<3?o(d):a>3?o(t,i,d):o(t,i))||d);return a>3&&d&&Object.defineProperty(t,i,d),d};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import styles from"./radio.styles.js";let GlideCoreRadio=class GlideCoreRadio extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.invalid=!1,this.required=!1,this.value="",this.label=""}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.role="radio",this.ariaChecked=this.checked.toString(),this.ariaDisabled=this.disabled.toString(),this.ariaInvalid=this.invalid.toString(),this.ariaRequired=this.required.toString(),this.ariaLabel=this.label}render(){return html`<span class="${classMap({component:!0,disabled:this.disabled})}"><span id="radio" class="${classMap({"radio-circle":!0,checked:this.checked})}" data-test="radio" data-test-error="${this.invalid}"></span> ${this.label}</span>`}willUpdate(e){this.hasUpdated&&(e.has("checked")&&(this.ariaChecked=this.checked.toString()),e.has("disabled")&&(this.ariaDisabled=this.disabled.toString()),e.has("required")&&(this.ariaRequired=this.required.toString()),e.has("invalid")&&(this.ariaInvalid=this.invalid.toString()),e.has("label")&&(this.ariaLabel=this.label))}};__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"checked",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"disabled",void 0),__decorate([property({type:Boolean})],GlideCoreRadio.prototype,"invalid",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"required",void 0),__decorate([property()],GlideCoreRadio.prototype,"value",void 0),__decorate([property({reflect:!0})],GlideCoreRadio.prototype,"label",void 0),GlideCoreRadio=__decorate([customElement("glide-core-radio")],GlideCoreRadio);export default GlideCoreRadio;
@@ -1,4 +1,4 @@
1
- "use strict";import{css as e}from"lit";import r from"./styles/focus-outline.js";export default[e`
1
+ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
2
2
  :host {
3
3
  display: flex;
4
4
  }
@@ -10,7 +10,7 @@
10
10
  & .component .radio-circle {
11
11
  box-shadow: var(--glide-core-glow-sm);
12
12
 
13
- ${r};
13
+ ${focusOutline};
14
14
  outline-offset: 4px;
15
15
  }
16
16
  }
@@ -25,7 +25,6 @@
25
25
  & .radio-circle {
26
26
  align-items: center;
27
27
  appearance: none;
28
- background-color: var(--glide-core-color-white);
29
28
  block-size: 0.875rem;
30
29
  border: 1px solid var(--glide-core-border-base-dark);
31
30
  border-radius: 50%;
@@ -40,6 +39,7 @@
40
39
  position: relative;
41
40
 
42
41
  &.checked {
42
+ background-color: var(--glide-core-color-white);
43
43
  border-color: var(--glide-core-surface-primary);
44
44
 
45
45
  &::after {
@@ -89,4 +89,4 @@
89
89
  }
90
90
  }
91
91
  }
92
- `];
92
+ `];
@@ -0,0 +1,24 @@
1
+ import './menu.js';
2
+ import { LitElement } from 'lit';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'glide-core-split-button': GlideCoreSplitButton;
6
+ }
7
+ }
8
+ /**
9
+ * @description A button to be used in the `primary-action` slot of `glide-core-split-container`.
10
+ *
11
+ * @slot prefix - An optional icon slot to display before the label.
12
+ * @slot - A label for the contents of the button.
13
+ */
14
+ export default class GlideCoreSplitButton extends LitElement {
15
+ #private;
16
+ static shadowRootOptions: ShadowRootInit;
17
+ static styles: import("lit").CSSResult[];
18
+ disabled: boolean;
19
+ variant: 'primary' | 'secondary';
20
+ size: 'large' | 'small';
21
+ firstUpdated(): void;
22
+ render(): import("lit").TemplateResult<1>;
23
+ private hasPrefixSlot;
24
+ }
@@ -0,0 +1 @@
1
+ var __decorate=this&&this.__decorate||function(t,e,o,l){var i,s=arguments.length,r=s<3?e:null===l?l=Object.getOwnPropertyDescriptor(e,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,o,l);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(r=(s<3?i(r):s>3?i(e,o,r):i(e,o))||r);return s>3&&r&&Object.defineProperty(e,o,r),r};import"./menu.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,state}from"lit/decorators.js";import{owSlot,owSlotType}from"./library/ow.js";import styles from"./split-button.styles.js";let GlideCoreSplitButton=class GlideCoreSplitButton extends LitElement{constructor(){super(...arguments),this.disabled=!1,this.variant="primary",this.size="large",this.hasPrefixSlot=!1,this.#t=createRef(),this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#t.value),owSlotType(this.#t.value,[Text])}render(){return html`<button type="button" class="${classMap({component:!0,disabled:this.disabled,[this.variant]:!0,[this.size]:!0,"has-prefix":this.hasPrefixSlot})}" ?disabled="${this.disabled}" data-test="split-button"><slot name="prefix" @slotchange="${this.#o}" ${ref(this.#e)} data-test="prefix-slot"></slot><slot @slotchange="${this.#l}" ${ref(this.#t)} data-test="default-slot"></slot></button>`}#t;#e;#l(){owSlot(this.#t.value),owSlotType(this.#t.value,[Text])}#o(){const t=this.#e.value?.assignedNodes();this.hasPrefixSlot=!!(t&&t.length>0)}};__decorate([property({type:Boolean,reflect:!0})],GlideCoreSplitButton.prototype,"disabled",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButton.prototype,"variant",void 0),__decorate([property({reflect:!0})],GlideCoreSplitButton.prototype,"size",void 0),__decorate([state()],GlideCoreSplitButton.prototype,"hasPrefixSlot",void 0),GlideCoreSplitButton=__decorate([customElement("glide-core-split-button")],GlideCoreSplitButton);export default GlideCoreSplitButton;
@@ -0,0 +1,17 @@
1
+ import './icons/storybook.js';
2
+ import './menu.button.js';
3
+ import './menu.link.js';
4
+ import './split-button.js';
5
+ import './split-container.js';
6
+ import './split-link.js';
7
+ import type { Meta, StoryObj } from '@storybook/web-components';
8
+ declare const meta: Meta;
9
+ export default meta;
10
+ export declare const Primary: StoryObj;
11
+ export declare const PrimaryWithPrefixIcon: StoryObj;
12
+ export declare const PrimaryWithSizeSmall: StoryObj;
13
+ export declare const PrimaryWithLink: StoryObj;
14
+ export declare const Secondary: StoryObj;
15
+ export declare const SecondaryWithPrefixIcon: StoryObj;
16
+ export declare const SecondaryWithSizeSmall: StoryObj;
17
+ export declare const SecondaryWithLink: StoryObj;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;
@@ -0,0 +1,103 @@
1
+ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
2
+ .component {
3
+ align-items: center;
4
+ border-color: transparent;
5
+ border-radius: 0.75rem 0 0 0.75rem;
6
+ border-style: solid;
7
+ border-width: 1px 0 1px 1px;
8
+ cursor: pointer;
9
+ display: inline-flex;
10
+ font-family: var(--glide-core-heading-xxs-font-family);
11
+ font-style: var(--glide-core-heading-xxs-font-style);
12
+ font-weight: var(--glide-core-heading-xxs-font-weight);
13
+ gap: 0.625rem;
14
+ justify-content: center;
15
+ padding-block: var(--glide-core-spacing-xs);
16
+ padding-inline: var(--glide-core-spacing-md);
17
+ padding-inline-end: var(--glide-core-spacing-xs);
18
+ text-decoration: none;
19
+ transition-duration: 150ms;
20
+ transition-property: color, background-color, border-color, fill, stroke;
21
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
22
+ user-select: none;
23
+
24
+ &:focus {
25
+ outline: none;
26
+ }
27
+
28
+ &:focus-visible {
29
+ ${focusOutline};
30
+ }
31
+
32
+ &.disabled {
33
+ cursor: default;
34
+ opacity: 1;
35
+ pointer-events: none;
36
+ }
37
+
38
+ &.primary {
39
+ background-color: var(--glide-core-surface-primary);
40
+ border-color: transparent;
41
+ color: var(--glide-core-text-selected);
42
+
43
+ /* Since the "disabled" styles are shared between a link and a button, we use a disabled class and not a pseudo-class */
44
+ &.disabled {
45
+ background-color: var(--glide-core-surface-disabled);
46
+ border-color: transparent;
47
+ color: var(--glide-core-text-tertiary-disabled);
48
+ }
49
+
50
+ &:not(.disabled):active {
51
+ background-color: var(--glide-core-surface-selected-hover);
52
+ border-color: transparent;
53
+ color: var(--glide-core-text-selected);
54
+ }
55
+
56
+ &:not(:active):hover:not(.disabled) {
57
+ background-color: var(--glide-core-surface-hover);
58
+ border-color: transparent;
59
+ box-shadow: var(--glide-core-glow-sm);
60
+ color: var(--glide-core-text-primary);
61
+ }
62
+ }
63
+
64
+ &.secondary {
65
+ background-color: transparent;
66
+ border-color: var(--glide-core-border-primary);
67
+ color: var(--glide-core-text-primary);
68
+
69
+ &.disabled {
70
+ background-color: var(--glide-core-surface-disabled);
71
+ border-color: transparent;
72
+ color: var(--glide-core-text-tertiary-disabled);
73
+ }
74
+
75
+ &:not(.disabled):active {
76
+ background-color: var(--glide-core-surface-selected-hover);
77
+ border-color: transparent;
78
+ color: var(--glide-core-text-selected);
79
+ }
80
+
81
+ &:not(:active):hover:not(.disabled) {
82
+ background-color: var(--glide-core-surface-hover);
83
+ border-color: transparent;
84
+ box-shadow: var(--glide-core-glow-sm);
85
+ color: var(--glide-core-text-primary);
86
+ }
87
+ }
88
+
89
+ &.small {
90
+ block-size: 1.75rem;
91
+ box-sizing: border-box;
92
+ font-size: var(--glide-core-body-xs-font-size);
93
+ line-height: 1rem;
94
+ }
95
+
96
+ &.large {
97
+ block-size: 2.125rem;
98
+ box-sizing: border-box;
99
+ font-size: var(--glide-core-body-xxs-font-size);
100
+ line-height: 1.5rem;
101
+ }
102
+ }
103
+ `];
@@ -0,0 +1 @@
1
+ import './split-button.js';
@@ -0,0 +1,84 @@
1
+ import './split-button.js';
2
+ import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
3
+ import GlideCoreSplitButton from './split-button.js';
4
+ import expectArgumentError from './library/expect-argument-error.js';
5
+ GlideCoreSplitButton.shadowRootOptions.mode = 'open';
6
+ it('registers', async () => {
7
+ expect(window.customElements.get('glide-core-split-button')).to.equal(GlideCoreSplitButton);
8
+ });
9
+ it('is accessible', async () => {
10
+ const component = await fixture(html `
11
+ <glide-core-split-button>Button</glide-core-split-button>
12
+ `);
13
+ await expect(component).to.be.accessible();
14
+ });
15
+ it('renders a button with a label by default', async () => {
16
+ const component = await fixture(html `
17
+ <glide-core-split-button>Button</glide-core-split-button>
18
+ `);
19
+ expect(component.textContent).to.equal('Button');
20
+ });
21
+ it('renders with size "large" and variant "primary" by default', async () => {
22
+ const component = await fixture(html `
23
+ <glide-core-split-button>Button</glide-core-split-button>
24
+ `);
25
+ const button = component?.shadowRoot?.querySelector('[data-test="split-button"]');
26
+ expect(button?.classList.contains('large')).to.be.true;
27
+ expect(button?.classList.contains('primary')).to.be.true;
28
+ });
29
+ it('adds "small" styling when "size" attribute is "small"', async () => {
30
+ const component = await fixture(html `
31
+ <glide-core-split-button size="small">Button</glide-core-split-button>
32
+ `);
33
+ const button = component?.shadowRoot?.querySelector('[data-test="split-button"]');
34
+ expect(button?.classList.contains('small')).to.be.true;
35
+ });
36
+ it('adds "secondary" styling when "variant" attribute is "secondary"', async () => {
37
+ const component = await fixture(html `
38
+ <glide-core-split-button variant="secondary"
39
+ >Button</glide-core-split-button
40
+ >
41
+ `);
42
+ const button = component?.shadowRoot?.querySelector('[data-test="split-button"]');
43
+ expect(button?.classList.contains('secondary')).to.be.true;
44
+ });
45
+ it('sets the button as "disabled" when the attribute exists', async () => {
46
+ const component = await fixture(html `
47
+ <glide-core-split-button disabled>Button</glide-core-split-button>
48
+ `);
49
+ const button = component?.shadowRoot?.querySelector('[data-test="split-button"]');
50
+ expect(button).to.have.attribute('disabled');
51
+ });
52
+ it('renders a prefix slot when given', async () => {
53
+ const component = await fixture(html `
54
+ <glide-core-split-button
55
+ ><div data-prefix slot="prefix">Prefix</div>
56
+ Button</glide-core-split-button
57
+ >
58
+ `);
59
+ expect(component.querySelector('[data-prefix]')).to.be.not.null;
60
+ });
61
+ it('renders with prefix class when dynamically added and removed', async () => {
62
+ const component = await fixture(html `
63
+ <glide-core-split-button>
64
+ <span slot="prefix">prefix</span>Button</glide-core-split-button
65
+ >
66
+ `);
67
+ expect(document.querySelector('[slot="prefix"]')).to.be.not.null;
68
+ expect([
69
+ ...component.shadowRoot.querySelector('[data-test="split-button"]')
70
+ .classList,
71
+ ]).to.include('has-prefix');
72
+ component.querySelector('[slot="prefix"]')?.remove();
73
+ await elementUpdated(component);
74
+ expect([
75
+ ...component.shadowRoot.querySelector('[data-test="split-button"]')
76
+ .classList,
77
+ ]).to.not.include('has-prefix');
78
+ });
79
+ it('throws an error when there is no button label', async () => {
80
+ await expectArgumentError(() => fixture(html `<glide-core-split-button></glide-core-split-button>`));
81
+ });
82
+ it('throws an error when there is something other than text in the default slot', async () => {
83
+ await expectArgumentError(() => fixture(html `<glide-core-split-button><div>test</div></glide-core-split-button>`));
84
+ });
@@ -0,0 +1,30 @@
1
+ import './menu.js';
2
+ import { LitElement, type PropertyValueMap } from 'lit';
3
+ import { type Placement } from '@floating-ui/dom';
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ 'glide-core-split-container': GlideCoreSplitContainer;
7
+ }
8
+ }
9
+ /**
10
+ * @description A split button that provides a button action and a menu of alternate actions.
11
+ *
12
+ * @slot - One or more of `<glide-core-menu-link>` or `<glide-core-menu-button>`.
13
+ * @slot primary-action - One of either `<glide-core-split-button>` or `<glide-core-split-link>`.
14
+ *
15
+ */
16
+ export default class GlideCoreSplitContainer extends LitElement {
17
+ #private;
18
+ static shadowRootOptions: ShadowRootInit;
19
+ static styles: import("lit").CSSResult[];
20
+ menulabel: string;
21
+ open: boolean;
22
+ disabled: boolean;
23
+ placement: Placement;
24
+ variant: 'primary' | 'secondary';
25
+ size: 'large' | 'small';
26
+ firstUpdated(): void;
27
+ focus(options?: FocusOptions): void;
28
+ render(): import("lit").TemplateResult<1>;
29
+ willUpdate(changedProperties: PropertyValueMap<GlideCoreSplitContainer>): void;
30
+ }
@@ -0,0 +1 @@
1
+ var __decorate=this&&this.__decorate||function(e,t,i,o){var l,r=arguments.length,n=r<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,o);else for(var s=e.length-1;s>=0;s--)(l=e[s])&&(n=(r<3?l(n):r>3?l(t,i,n):l(t,i))||n);return r>3&&n&&Object.defineProperty(t,i,n),n};import"./menu.js";import{LitElement,html}from"lit";import{}from"@floating-ui/dom";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 GlideCoreMenuButton from"./menu.button.js";import GlideCoreMenuLink from"./menu.link.js";import GlideCoreSplitButton from"./split-button.js";import GlideCoreSplitLink from"./split-link.js";import styles from"./split-container.styles.js";let GlideCoreSplitContainer=class GlideCoreSplitContainer extends LitElement{constructor(){super(...arguments),this.menulabel="",this.open=!1,this.disabled=!1,this.placement="bottom-end",this.variant="primary",this.size="large",this.#e=createRef(),this.#t=createRef(),this.#i=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.#o(),this.#l();const e=this.#i.value?.assignedNodes().at(0);(e instanceof GlideCoreSplitButton||e instanceof GlideCoreSplitLink)&&(e.disabled=this.disabled,e.variant=this.variant,e.size=this.size)}focus(e){const t=this.#i.value?.assignedNodes()?.at(0);t instanceof HTMLElement&&t.focus(e)}render(){return html`<div class="${classMap({component:!0,disabled:this.disabled})}"><slot name="primary-action" @slotchange="${this.#r}" ${ref(this.#i)} data-test="primary-action"></slot><span class="${classMap({divider:!0,[this.variant]:!0})}" data-test="split-divider"></span><glide-core-menu ?open="${this.open}" size="${this.size}" placement="${this.placement}" data-test="menu"><button slot="target" type="button" class="${classMap({"menu-button":!0,[this.variant]:!0,[this.size]:!0})}" ?disabled="${this.disabled}" aria-label="${this.menulabel}" data-test="split-menu-button" ${ref(this.#t)}><svg width="16" height="16" viewBox="0 0 24 24" fill="none" role="presentation"><path d="M6 9L12 15L18 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button><slot @slotchange="${this.#n}" ${ref(this.#e)}></slot></glide-core-menu></div>`}willUpdate(e){const t=this.#i.value?.assignedNodes().at(0);this.hasUpdated&&(t instanceof GlideCoreSplitButton||t instanceof GlideCoreSplitLink)&&(e.has("disabled")&&(t.disabled=this.disabled),e.has("variant")&&(t.variant=this.variant),e.has("size")&&(t.size=this.size))}#e;#t;#i;#n(){this.#o()}#r(){this.#l()}#o(){owSlot(this.#e.value),owSlotType(this.#e.value,[GlideCoreMenuButton,GlideCoreMenuLink])}#l(){owSlot(this.#i.value),owSlotType(this.#i.value,[GlideCoreSplitButton,GlideCoreSplitLink])}};__decorate([property({attribute:"menu-label",reflect:!0})],GlideCoreSplitContainer.prototype,"menulabel",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreSplitContainer.prototype,"open",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreSplitContainer.prototype,"disabled",void 0),__decorate([property({attribute:"menu-placement",reflect:!0})],GlideCoreSplitContainer.prototype,"placement",void 0),__decorate([property({reflect:!0})],GlideCoreSplitContainer.prototype,"variant",void 0),__decorate([property({reflect:!0})],GlideCoreSplitContainer.prototype,"size",void 0),GlideCoreSplitContainer=__decorate([customElement("glide-core-split-container")],GlideCoreSplitContainer);export default GlideCoreSplitContainer;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult[];
2
+ export default _default;