@crowdstrike/glide-core 0.9.6 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +17 -53
  2. package/dist/accordion.d.ts +10 -10
  3. package/dist/accordion.js +1 -1
  4. package/dist/accordion.stories.d.ts +0 -1
  5. package/dist/accordion.styles.js +36 -38
  6. package/dist/accordion.test.basics.js +13 -95
  7. package/dist/accordion.test.events.js +21 -33
  8. package/dist/accordion.test.focus.d.ts +1 -0
  9. package/dist/accordion.test.focus.js +11 -0
  10. package/dist/accordion.test.interactions.d.ts +1 -0
  11. package/dist/accordion.test.interactions.js +75 -0
  12. package/dist/button-group.button.d.ts +2 -4
  13. package/dist/button-group.button.js +1 -1
  14. package/dist/button-group.button.styles.js +6 -14
  15. package/dist/button-group.button.test.basics.js +8 -17
  16. package/dist/button-group.button.test.interactions.js +4 -4
  17. package/dist/button-group.d.ts +0 -2
  18. package/dist/button-group.test.basics.js +10 -10
  19. package/dist/button-group.test.events.js +2 -2
  20. package/dist/button-group.test.interactions.js +1 -1
  21. package/dist/button.d.ts +7 -10
  22. package/dist/button.js +1 -1
  23. package/dist/button.styles.js +4 -7
  24. package/dist/button.test.basics.js +10 -26
  25. package/dist/button.test.events.js +9 -9
  26. package/dist/checkbox-group.d.ts +3 -4
  27. package/dist/checkbox-group.js +1 -1
  28. package/dist/checkbox-group.styles.js +13 -1
  29. package/dist/checkbox-group.test.basics.js +8 -12
  30. package/dist/checkbox-group.test.focus.js +7 -7
  31. package/dist/checkbox-group.test.interactions.d.ts +1 -0
  32. package/dist/checkbox-group.test.interactions.js +82 -0
  33. package/dist/checkbox.d.ts +5 -4
  34. package/dist/checkbox.js +1 -1
  35. package/dist/checkbox.styles.js +35 -15
  36. package/dist/checkbox.test.basics.js +6 -15
  37. package/dist/checkbox.test.focus.js +4 -2
  38. package/dist/checkbox.test.interactions.js +11 -11
  39. package/dist/drawer.d.ts +2 -5
  40. package/dist/drawer.js +1 -1
  41. package/dist/drawer.test.accessibility.js +8 -8
  42. package/dist/drawer.test.basics.js +16 -16
  43. package/dist/drawer.test.closing.js +18 -16
  44. package/dist/drawer.test.events.js +13 -24
  45. package/dist/drawer.test.methods.js +22 -22
  46. package/dist/dropdown.d.ts +7 -5
  47. package/dist/dropdown.js +1 -1
  48. package/dist/dropdown.option.d.ts +1 -3
  49. package/dist/dropdown.option.js +1 -1
  50. package/dist/dropdown.option.styles.js +31 -19
  51. package/dist/dropdown.option.test.basics.js +4 -4
  52. package/dist/dropdown.styles.js +39 -3
  53. package/dist/dropdown.test.basics.js +8 -13
  54. package/dist/dropdown.test.basics.multiple.js +63 -31
  55. package/dist/dropdown.test.basics.single.js +49 -0
  56. package/dist/dropdown.test.focus.filterable.js +12 -3
  57. package/dist/dropdown.test.focus.js +18 -2
  58. package/dist/dropdown.test.interactions.filterable.js +121 -45
  59. package/dist/dropdown.test.interactions.multiple.js +71 -30
  60. package/dist/dropdown.test.interactions.single.js +26 -4
  61. package/dist/form-controls-layout.d.ts +0 -2
  62. package/dist/icon-button.d.ts +2 -4
  63. package/dist/icon-button.js +1 -1
  64. package/dist/icon-button.test.basics.js +14 -82
  65. package/dist/icon-button.test.focus.d.ts +1 -0
  66. package/dist/icon-button.test.focus.js +13 -0
  67. package/dist/input.d.ts +4 -5
  68. package/dist/input.js +1 -1
  69. package/dist/input.styles.js +4 -4
  70. package/dist/input.test.basics.js +0 -52
  71. package/dist/input.test.events.js +27 -27
  72. package/dist/input.test.focus.js +27 -26
  73. package/dist/input.test.form.js +6 -6
  74. package/dist/input.test.validity.js +130 -130
  75. package/dist/label.d.ts +1 -3
  76. package/dist/label.js +1 -1
  77. package/dist/label.styles.js +5 -6
  78. package/dist/label.test.basics.js +4 -4
  79. package/dist/library/ow.js +1 -1
  80. package/dist/menu.button.d.ts +0 -2
  81. package/dist/menu.button.test.basics.js +3 -3
  82. package/dist/menu.d.ts +1 -4
  83. package/dist/menu.js +1 -1
  84. package/dist/menu.link.d.ts +1 -2
  85. package/dist/menu.link.js +1 -1
  86. package/dist/menu.options.d.ts +0 -2
  87. package/dist/menu.test.events.js +6 -6
  88. package/dist/menu.test.focus.js +5 -18
  89. package/dist/menu.test.interactions.js +48 -24
  90. package/dist/modal.d.ts +6 -17
  91. package/dist/modal.icon-button.d.ts +0 -2
  92. package/dist/modal.icon-button.test.basics.js +3 -3
  93. package/dist/modal.js +1 -1
  94. package/dist/modal.styles.js +13 -19
  95. package/dist/modal.tertiary-icon.d.ts +0 -3
  96. package/dist/modal.tertiary-icon.test.basics.js +3 -3
  97. package/dist/modal.test.basics.js +9 -5
  98. package/dist/modal.test.close.js +2 -2
  99. package/dist/modal.test.events.js +2 -2
  100. package/dist/radio-group.d.ts +0 -3
  101. package/dist/radio-group.js +1 -1
  102. package/dist/radio-group.test.basics.js +61 -61
  103. package/dist/radio-group.test.events.js +13 -13
  104. package/dist/radio-group.test.focus.js +1 -1
  105. package/dist/radio-group.test.form.js +2 -2
  106. package/dist/radio-group.test.validity.js +12 -12
  107. package/dist/radio.d.ts +0 -3
  108. package/dist/radio.styles.js +4 -12
  109. package/dist/split-button.d.ts +8 -11
  110. package/dist/split-button.js +1 -1
  111. package/dist/split-button.primary-button.d.ts +21 -0
  112. package/dist/split-button.primary-button.js +1 -0
  113. package/dist/split-button.primary-button.styles.js +96 -0
  114. package/dist/split-button.primary-button.test.basics.d.ts +1 -0
  115. package/dist/split-button.primary-button.test.basics.js +31 -0
  116. package/dist/split-button.primary-button.test.focus.d.ts +1 -0
  117. package/dist/split-button.primary-button.test.focus.js +14 -0
  118. package/dist/split-button.primary-link.d.ts +19 -0
  119. package/dist/split-button.primary-link.js +1 -0
  120. package/dist/split-button.primary-link.test.basics.d.ts +1 -0
  121. package/dist/split-button.primary-link.test.basics.js +30 -0
  122. package/dist/split-button.primary-link.test.focus.d.ts +1 -0
  123. package/dist/split-button.primary-link.test.focus.js +15 -0
  124. package/dist/split-button.secondary-button.d.ts +25 -0
  125. package/dist/split-button.secondary-button.js +1 -0
  126. package/dist/split-button.secondary-button.styles.js +103 -0
  127. package/dist/split-button.secondary-button.test.basics.d.ts +1 -0
  128. package/dist/split-button.secondary-button.test.basics.js +58 -0
  129. package/dist/split-button.secondary-button.test.focus.d.ts +1 -0
  130. package/dist/split-button.secondary-button.test.focus.js +14 -0
  131. package/dist/split-button.secondary-button.test.interactions.d.ts +2 -0
  132. package/dist/split-button.secondary-button.test.interactions.js +30 -0
  133. package/dist/split-button.stories.d.ts +4 -3
  134. package/dist/split-button.styles.js +1 -94
  135. package/dist/split-button.test.basics.d.ts +2 -1
  136. package/dist/split-button.test.basics.js +67 -80
  137. package/dist/split-button.test.interactions.d.ts +4 -0
  138. package/dist/split-button.test.interactions.js +51 -0
  139. package/dist/styles/opacity-and-scale-animation.js +2 -6
  140. package/dist/styles/variables.css +1 -1
  141. package/dist/tab.d.ts +2 -11
  142. package/dist/tab.group.d.ts +2 -5
  143. package/dist/tab.group.styles.js +12 -15
  144. package/dist/tab.group.test.basics.js +49 -34
  145. package/dist/tab.group.test.interactions.js +17 -14
  146. package/dist/tab.panel.d.ts +0 -3
  147. package/dist/tab.test.basics.js +6 -5
  148. package/dist/tag.d.ts +6 -4
  149. package/dist/tag.js +1 -1
  150. package/dist/tag.styles.js +36 -36
  151. package/dist/tag.test.basics.js +16 -109
  152. package/dist/tag.test.events.js +12 -8
  153. package/dist/tag.test.focus.js +2 -3
  154. package/dist/tag.test.interactions.d.ts +1 -0
  155. package/dist/tag.test.interactions.js +34 -0
  156. package/dist/textarea.d.ts +2 -3
  157. package/dist/textarea.js +2 -2
  158. package/dist/textarea.test.basics.js +8 -8
  159. package/dist/textarea.test.events.js +55 -55
  160. package/dist/textarea.test.form.js +9 -9
  161. package/dist/textarea.test.validity.js +167 -135
  162. package/dist/toasts.d.ts +1 -5
  163. package/dist/toasts.test.basics.js +2 -1
  164. package/dist/toasts.toast.d.ts +1 -4
  165. package/dist/toasts.toast.js +1 -1
  166. package/dist/toasts.toast.styles.js +12 -0
  167. package/dist/toggle.d.ts +0 -2
  168. package/dist/toggle.styles.js +1 -5
  169. package/dist/toggle.test.basics.js +2 -2
  170. package/dist/toggle.test.interactions.js +7 -7
  171. package/dist/tooltip.d.ts +2 -1
  172. package/dist/tooltip.js +1 -1
  173. package/dist/tooltip.styles.js +36 -13
  174. package/dist/tooltip.test.basics.d.ts +1 -1
  175. package/dist/tooltip.test.basics.js +19 -19
  176. package/dist/tree.d.ts +0 -2
  177. package/dist/tree.item.d.ts +5 -7
  178. package/dist/tree.item.icon-button.d.ts +1 -4
  179. package/dist/tree.item.js +1 -1
  180. package/dist/tree.item.menu.d.ts +0 -2
  181. package/dist/tree.item.menu.test.basics.js +9 -9
  182. package/dist/tree.item.styles.js +4 -3
  183. package/dist/tree.item.test.basics.js +43 -31
  184. package/dist/tree.test.basics.js +29 -29
  185. package/dist/tree.test.focus.js +77 -74
  186. package/package.json +12 -14
  187. package/dist/split-container.d.ts +0 -31
  188. package/dist/split-container.js +0 -1
  189. package/dist/split-container.styles.js +0 -132
  190. package/dist/split-container.test.basics.d.ts +0 -3
  191. package/dist/split-container.test.basics.js +0 -445
  192. package/dist/split-container.test.interactions.d.ts +0 -1
  193. package/dist/split-container.test.interactions.js +0 -20
  194. package/dist/split-link.d.ts +0 -25
  195. package/dist/split-link.js +0 -1
  196. package/dist/split-link.test.basics.d.ts +0 -1
  197. package/dist/split-link.test.basics.js +0 -93
  198. package/dist/split-link.test.interactions.d.ts +0 -1
  199. package/dist/split-link.test.interactions.js +0 -20
  200. package/dist/status-indicator.d.ts +0 -30
  201. package/dist/status-indicator.js +0 -1
  202. package/dist/status-indicator.stories.d.ts +0 -5
  203. package/dist/status-indicator.styles.js +0 -58
  204. package/dist/status-indicator.test.basics.d.ts +0 -1
  205. package/dist/status-indicator.test.basics.js +0 -102
  206. /package/dist/{split-container.styles.d.ts → split-button.primary-button.styles.d.ts} +0 -0
  207. /package/dist/{status-indicator.styles.d.ts → split-button.secondary-button.styles.d.ts} +0 -0
@@ -4,177 +4,209 @@ import { sendKeys } from '@web/test-runner-commands';
4
4
  import GlideCoreTextarea from './textarea.js';
5
5
  GlideCoreTextarea.shadowRootOptions.mode = 'open';
6
6
  it('is valid by default', async () => {
7
- const textarea = await fixture(html `<glide-core-textarea></glide-core-textarea>`);
8
- expect(textarea.validity?.valid).to.be.true;
9
- expect(textarea.validity?.valueMissing).to.be.false;
10
- expect(textarea.validity?.tooLong).to.be.false;
11
- expect(textarea.checkValidity()).to.be.true;
12
- expect(textarea.reportValidity()).to.be.true;
13
- await elementUpdated(textarea);
14
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
7
+ const component = await fixture(html `<glide-core-textarea></glide-core-textarea>`);
8
+ expect(component.validity?.valid).to.be.true;
9
+ expect(component.validity?.valueMissing).to.be.false;
10
+ expect(component.validity?.tooLong).to.be.false;
11
+ expect(component.checkValidity()).to.be.true;
12
+ expect(component.reportValidity()).to.be.true;
13
+ await elementUpdated(component);
14
+ expect(component.shadowRoot
15
+ ?.querySelector('textarea')
16
+ ?.getAttribute('aria-invalid')).to.equal('false');
15
17
  });
16
18
  it('is valid after being filled in and required', async () => {
17
- const textarea = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
18
- textarea.focus();
19
+ const component = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
20
+ component.focus();
19
21
  await sendKeys({ type: 'value' });
20
- expect(textarea.validity?.valid).to.be.true;
21
- expect(textarea.validity?.valueMissing).to.be.false;
22
- expect(textarea.validity?.tooLong).to.be.false;
23
- expect(textarea.checkValidity()).to.be.true;
24
- expect(textarea.reportValidity()).to.be.true;
25
- await elementUpdated(textarea);
26
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
22
+ expect(component.validity?.valid).to.be.true;
23
+ expect(component.validity?.valueMissing).to.be.false;
24
+ expect(component.validity?.tooLong).to.be.false;
25
+ expect(component.checkValidity()).to.be.true;
26
+ expect(component.reportValidity()).to.be.true;
27
+ await elementUpdated(component);
28
+ expect(component.shadowRoot
29
+ ?.querySelector('textarea')
30
+ ?.getAttribute('aria-invalid')).to.equal('false');
27
31
  });
28
32
  it('is invalid if no value and required', async () => {
29
- const textarea = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
30
- expect(textarea.validity?.valid).to.be.false;
31
- expect(textarea.validity?.valueMissing).to.be.true;
32
- expect(textarea.validity?.tooLong).to.be.false;
33
- expect(textarea.willValidate).to.be.true;
34
- expect(textarea.checkValidity()).to.be.false;
35
- expect(textarea.reportValidity()).to.be.false;
36
- await elementUpdated(textarea);
37
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
33
+ const component = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
34
+ expect(component.validity?.valid).to.be.false;
35
+ expect(component.validity?.valueMissing).to.be.true;
36
+ expect(component.validity?.tooLong).to.be.false;
37
+ expect(component.willValidate).to.be.true;
38
+ expect(component.checkValidity()).to.be.false;
39
+ expect(component.reportValidity()).to.be.false;
40
+ await elementUpdated(component);
41
+ expect(component.shadowRoot
42
+ ?.querySelector('textarea')
43
+ ?.getAttribute('aria-invalid')).to.equal('true');
38
44
  });
39
45
  it('is valid when empty and does not exceed `maxlength`', async () => {
40
- const textarea = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
41
- expect(textarea.validity?.valid).to.be.true;
42
- expect(textarea.validity?.valueMissing).to.be.false;
43
- expect(textarea.validity?.tooLong).to.be.false;
44
- expect(textarea.checkValidity()).to.be.true;
45
- expect(textarea.reportValidity()).to.be.true;
46
- await elementUpdated(textarea);
47
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
46
+ const component = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
47
+ expect(component.validity?.valid).to.be.true;
48
+ expect(component.validity?.valueMissing).to.be.false;
49
+ expect(component.validity?.tooLong).to.be.false;
50
+ expect(component.checkValidity()).to.be.true;
51
+ expect(component.reportValidity()).to.be.true;
52
+ await elementUpdated(component);
53
+ expect(component.shadowRoot
54
+ ?.querySelector('textarea')
55
+ ?.getAttribute('aria-invalid')).to.equal('false');
48
56
  });
49
57
  it('is valid when filled in and does not exceed `maxlength`', async () => {
50
- const textarea = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
51
- textarea.focus();
58
+ const component = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
59
+ component.focus();
52
60
  await sendKeys({ type: 'abc' });
53
- expect(textarea.validity?.valid).to.be.true;
54
- expect(textarea.validity?.valueMissing).to.be.false;
55
- expect(textarea.validity?.tooLong).to.be.false;
56
- expect(textarea.checkValidity()).to.be.true;
57
- expect(textarea.reportValidity()).to.be.true;
58
- await elementUpdated(textarea);
59
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
61
+ expect(component.validity?.valid).to.be.true;
62
+ expect(component.validity?.valueMissing).to.be.false;
63
+ expect(component.validity?.tooLong).to.be.false;
64
+ expect(component.checkValidity()).to.be.true;
65
+ expect(component.reportValidity()).to.be.true;
66
+ await elementUpdated(component);
67
+ expect(component.shadowRoot
68
+ ?.querySelector('textarea')
69
+ ?.getAttribute('aria-invalid')).to.equal('false');
60
70
  });
61
71
  it('is invalid when filled in and exceeds `maxlength`', async () => {
62
- const textarea = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
63
- textarea.focus();
72
+ const component = await fixture(html `<glide-core-textarea maxlength="3"></glide-core-textarea>`);
73
+ component.focus();
64
74
  await sendKeys({ type: 'value' });
65
- expect(textarea.validity?.valid).to.be.false;
66
- expect(textarea.validity?.valueMissing).to.be.false;
67
- expect(textarea.validity?.tooLong).to.be.true;
68
- expect(textarea.checkValidity()).to.be.false;
69
- expect(textarea.reportValidity()).to.be.false;
70
- await elementUpdated(textarea);
71
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
75
+ expect(component.validity?.valid).to.be.false;
76
+ expect(component.validity?.valueMissing).to.be.false;
77
+ expect(component.validity?.tooLong).to.be.true;
78
+ expect(component.checkValidity()).to.be.false;
79
+ expect(component.reportValidity()).to.be.false;
80
+ await elementUpdated(component);
81
+ expect(component.shadowRoot
82
+ ?.querySelector('textarea')
83
+ ?.getAttribute('aria-invalid')).to.equal('true');
72
84
  });
73
85
  it('is valid if no value but required and disabled', async () => {
74
- const textarea = await fixture(html `<glide-core-textarea required disabled></glide-core-textarea>`);
75
- expect(textarea.validity?.valid).to.be.true;
76
- expect(textarea.validity?.valueMissing).to.be.false;
77
- expect(textarea.validity?.tooLong).to.be.false;
78
- expect(textarea.checkValidity()).to.be.true;
79
- expect(textarea.reportValidity()).to.be.true;
80
- await elementUpdated(textarea);
81
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
86
+ const component = await fixture(html `<glide-core-textarea required disabled></glide-core-textarea>`);
87
+ expect(component.validity?.valid).to.be.true;
88
+ expect(component.validity?.valueMissing).to.be.false;
89
+ expect(component.validity?.tooLong).to.be.false;
90
+ expect(component.checkValidity()).to.be.true;
91
+ expect(component.reportValidity()).to.be.true;
92
+ await elementUpdated(component);
93
+ expect(component.shadowRoot
94
+ ?.querySelector('textarea')
95
+ ?.getAttribute('aria-invalid')).to.equal('false');
82
96
  });
83
97
  it('updates validity when `required` and `value` is changed programmatically', async () => {
84
- const textarea = await fixture(html `<glide-core-textarea label="Label" required></glide-core-textarea>`);
85
- expect(textarea.validity?.valid).to.be.false;
86
- expect(textarea.validity?.valueMissing).to.be.true;
87
- expect(textarea.checkValidity()).to.be.false;
88
- expect(textarea.reportValidity()).to.be.false;
89
- await elementUpdated(textarea);
90
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
91
- textarea.value = 'text';
92
- await elementUpdated(textarea);
93
- expect(textarea.validity?.valid).to.be.true;
94
- expect(textarea.validity?.valueMissing).to.be.false;
95
- expect(textarea.checkValidity()).to.be.true;
96
- expect(textarea.reportValidity()).to.be.true;
97
- await elementUpdated(textarea);
98
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
98
+ const component = await fixture(html `<glide-core-textarea label="Label" required></glide-core-textarea>`);
99
+ expect(component.validity?.valid).to.be.false;
100
+ expect(component.validity?.valueMissing).to.be.true;
101
+ expect(component.checkValidity()).to.be.false;
102
+ expect(component.reportValidity()).to.be.false;
103
+ await elementUpdated(component);
104
+ expect(component.shadowRoot
105
+ ?.querySelector('textarea')
106
+ ?.getAttribute('aria-invalid')).to.equal('true');
107
+ component.value = 'text';
108
+ await elementUpdated(component);
109
+ expect(component.validity?.valid).to.be.true;
110
+ expect(component.validity?.valueMissing).to.be.false;
111
+ expect(component.checkValidity()).to.be.true;
112
+ expect(component.reportValidity()).to.be.true;
113
+ await elementUpdated(component);
114
+ expect(component.shadowRoot
115
+ ?.querySelector('textarea')
116
+ ?.getAttribute('aria-invalid')).to.equal('false');
99
117
  // Resetting the value to empty to ensure it goes
100
118
  // back to an invalid state
101
- textarea.value = '';
102
- await elementUpdated(textarea);
103
- expect(textarea.validity?.valid).to.be.false;
104
- expect(textarea.validity?.valueMissing).to.be.true;
105
- expect(textarea.checkValidity()).to.be.false;
106
- expect(textarea.reportValidity()).to.be.false;
107
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
119
+ component.value = '';
120
+ await elementUpdated(component);
121
+ expect(component.validity?.valid).to.be.false;
122
+ expect(component.validity?.valueMissing).to.be.true;
123
+ expect(component.checkValidity()).to.be.false;
124
+ expect(component.reportValidity()).to.be.false;
125
+ expect(component.shadowRoot
126
+ ?.querySelector('textarea')
127
+ ?.getAttribute('aria-invalid')).to.equal('true');
108
128
  });
109
129
  it('is invalid when `value` is empty and `required` is set to `true` programmatically', async () => {
110
- const textarea = await fixture(html `<glide-core-textarea label="Label"></glide-core-textarea>`);
111
- expect(textarea.validity?.valid).to.be.true;
112
- expect(textarea.validity?.valueMissing).to.be.false;
113
- expect(textarea.checkValidity()).to.be.true;
114
- expect(textarea.reportValidity()).to.be.true;
115
- await elementUpdated(textarea);
116
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
117
- textarea.required = true;
118
- await elementUpdated(textarea);
119
- expect(textarea.validity?.valid).to.be.false;
120
- expect(textarea.validity?.valueMissing).to.be.true;
121
- expect(textarea.checkValidity()).to.be.false;
122
- expect(textarea.reportValidity()).to.be.false;
123
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
130
+ const component = await fixture(html `<glide-core-textarea label="Label"></glide-core-textarea>`);
131
+ expect(component.validity?.valid).to.be.true;
132
+ expect(component.validity?.valueMissing).to.be.false;
133
+ expect(component.checkValidity()).to.be.true;
134
+ expect(component.reportValidity()).to.be.true;
135
+ await elementUpdated(component);
136
+ expect(component.shadowRoot
137
+ ?.querySelector('textarea')
138
+ ?.getAttribute('aria-invalid')).to.equal('false');
139
+ component.required = true;
140
+ await elementUpdated(component);
141
+ expect(component.validity?.valid).to.be.false;
142
+ expect(component.validity?.valueMissing).to.be.true;
143
+ expect(component.checkValidity()).to.be.false;
144
+ expect(component.reportValidity()).to.be.false;
145
+ expect(component.shadowRoot
146
+ ?.querySelector('textarea')
147
+ ?.getAttribute('aria-invalid')).to.equal('true');
124
148
  });
125
149
  it('is valid when `value` is empty and `required` is set to `false` programmatically', async () => {
126
- const textarea = await fixture(html `<glide-core-textarea label="Label" required></glide-core-textarea>`);
127
- expect(textarea.validity?.valid).to.be.false;
128
- expect(textarea.validity?.valueMissing).to.be.true;
129
- expect(textarea.checkValidity()).to.be.false;
130
- expect(textarea.reportValidity()).to.be.false;
131
- await elementUpdated(textarea);
132
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'true');
133
- textarea.required = false;
134
- await elementUpdated(textarea);
135
- expect(textarea.validity?.valid).to.be.true;
136
- expect(textarea.validity?.valueMissing).to.be.false;
137
- expect(textarea.checkValidity()).to.be.true;
138
- expect(textarea.reportValidity()).to.be.true;
139
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
150
+ const component = await fixture(html `<glide-core-textarea label="Label" required></glide-core-textarea>`);
151
+ expect(component.validity?.valid).to.be.false;
152
+ expect(component.validity?.valueMissing).to.be.true;
153
+ expect(component.checkValidity()).to.be.false;
154
+ expect(component.reportValidity()).to.be.false;
155
+ await elementUpdated(component);
156
+ expect(component.shadowRoot
157
+ ?.querySelector('textarea')
158
+ ?.getAttribute('aria-invalid')).to.equal('true');
159
+ component.required = false;
160
+ await elementUpdated(component);
161
+ expect(component.validity?.valid).to.be.true;
162
+ expect(component.validity?.valueMissing).to.be.false;
163
+ expect(component.checkValidity()).to.be.true;
164
+ expect(component.reportValidity()).to.be.true;
165
+ expect(component.shadowRoot
166
+ ?.querySelector('textarea')
167
+ ?.getAttribute('aria-invalid')).to.equal('false');
140
168
  });
141
169
  it('is valid when filled in, disabled, and value exceeds `maxlength`', async () => {
142
- const textarea = await fixture(html `<glide-core-textarea
170
+ const component = await fixture(html `<glide-core-textarea
143
171
  value="value"
144
172
  disabled
145
173
  maxlength="3"
146
174
  ></glide-core-textarea>`);
147
- expect(textarea.validity?.valid).to.be.true;
148
- expect(textarea.validity?.valueMissing).to.be.false;
149
- expect(textarea.validity?.tooLong).to.be.false;
150
- expect(textarea.checkValidity()).to.be.true;
151
- expect(textarea.reportValidity()).to.be.true;
152
- await elementUpdated(textarea);
153
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
175
+ expect(component.validity?.valid).to.be.true;
176
+ expect(component.validity?.valueMissing).to.be.false;
177
+ expect(component.validity?.tooLong).to.be.false;
178
+ expect(component.checkValidity()).to.be.true;
179
+ expect(component.reportValidity()).to.be.true;
180
+ await elementUpdated(component);
181
+ expect(component.shadowRoot
182
+ ?.querySelector('textarea')
183
+ ?.getAttribute('aria-invalid')).to.equal('false');
154
184
  });
155
185
  it('is valid when filled in, readonly, and value exceeds `maxlength`', async () => {
156
- const textarea = await fixture(html `<glide-core-textarea
186
+ const component = await fixture(html `<glide-core-textarea
157
187
  value="value"
158
188
  readonly
159
189
  maxlength="3"
160
190
  ></glide-core-textarea>`);
161
- expect(textarea.validity?.valid).to.be.true;
162
- expect(textarea.validity?.valueMissing).to.be.false;
163
- expect(textarea.validity?.tooLong).to.be.false;
164
- expect(textarea.checkValidity()).to.be.true;
165
- expect(textarea.reportValidity()).to.be.true;
166
- await elementUpdated(textarea);
167
- expect(textarea.shadowRoot?.querySelector('textarea')).to.have.attribute('aria-invalid', 'false');
191
+ expect(component.validity?.valid).to.be.true;
192
+ expect(component.validity?.valueMissing).to.be.false;
193
+ expect(component.validity?.tooLong).to.be.false;
194
+ expect(component.checkValidity()).to.be.true;
195
+ expect(component.reportValidity()).to.be.true;
196
+ await elementUpdated(component);
197
+ expect(component.shadowRoot
198
+ ?.querySelector('textarea')
199
+ ?.getAttribute('aria-invalid')).to.equal('false');
168
200
  });
169
201
  it('blurs the textarea and reports validity if `blur` is called', async () => {
170
- const textarea = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
171
- textarea.focus();
172
- const textareaElement = textarea.shadowRoot?.querySelector('textarea');
173
- expect(textarea.shadowRoot?.activeElement === textareaElement).to.be.true;
174
- textarea.blur();
175
- await textarea.updateComplete;
176
- expect(textarea.shadowRoot?.activeElement === null).to.be.true;
177
- expect(textarea.validity.valid).to.equal(false);
178
- expect(textarea.shadowRoot?.querySelector('glide-core-private-label')?.error)
202
+ const component = await fixture(html `<glide-core-textarea required></glide-core-textarea>`);
203
+ component.focus();
204
+ const textareaElement = component.shadowRoot?.querySelector('textarea');
205
+ expect(component.shadowRoot?.activeElement === textareaElement).to.be.true;
206
+ component.blur();
207
+ await component.updateComplete;
208
+ expect(component.shadowRoot?.activeElement === null).to.be.true;
209
+ expect(component.validity.valid).to.be.false;
210
+ expect(component.shadowRoot?.querySelector('glide-core-private-label')?.error)
179
211
  .to.be.true;
180
212
  });
package/dist/toasts.d.ts CHANGED
@@ -11,10 +11,6 @@ export interface Toast {
11
11
  variant: 'informational' | 'success';
12
12
  duration?: number;
13
13
  }
14
- /**
15
- * @description A container and controller for toast messages.
16
-
17
- */
18
14
  export default class GlideCoreToasts extends LitElement {
19
15
  #private;
20
16
  static shadowRootOptions: ShadowRootInit;
@@ -25,7 +21,7 @@ export default class GlideCoreToasts extends LitElement {
25
21
  * Minimum: `5000`. Default: `5000`. For a Toast that never auto-hides, set to `Infinity`
26
22
  * */
27
23
  add(toast: Toast): import("./toasts.toast.js").default & {
28
- variant: "success" | "informational";
24
+ variant: "informational" | "success";
29
25
  label: string;
30
26
  description: string;
31
27
  duration: number | undefined;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
1
2
  import { assert, expect, fixture, html } from '@open-wc/testing';
2
3
  import GlideCoreToasts from './toasts.js';
3
4
  GlideCoreToasts.shadowRootOptions.mode = 'open';
@@ -96,7 +97,7 @@ it('is hidden unless there are toasts displayed', async () => {
96
97
  const component = await fixture(html `<glide-core-toasts></glide-core-toasts>`);
97
98
  const shadowComponent = component.shadowRoot?.querySelector('.component');
98
99
  assert(shadowComponent);
99
- expect(shadowComponent.hasAttribute('popover')).to.equal(false);
100
+ expect(shadowComponent.hasAttribute('popover')).to.be.false;
100
101
  expect(getComputedStyle(shadowComponent).display).to.equal('none');
101
102
  component.add({
102
103
  label: 'Test toast',
@@ -1,5 +1,4 @@
1
1
  import './icon-button.js';
2
- import './status-indicator.js';
3
2
  import './tooltip.js';
4
3
  import { LitElement } from 'lit';
5
4
  import type { Toast } from './toasts.js';
@@ -10,9 +9,7 @@ declare global {
10
9
  }
11
10
  /**
12
11
  * @private
13
- *
14
- * @description A message that animates onto the screen
15
- */
12
+ * */
16
13
  export default class GlideCoreToast extends LitElement {
17
14
  #private;
18
15
  static shadowRootOptions: ShadowRootInit;
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,i){var s,r=arguments.length,l=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(l=(r<3?s(l):r>3?s(t,o,l):s(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l};import"./icon-button.js";import"./status-indicator.js";import"./tooltip.js";import{LitElement,html}from"lit";import{LocalizeController}from"./library/localize.js";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import styles from"./toasts.toast.styles.js";let GlideCoreToast=class GlideCoreToast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.#e=createRef(),this.#t=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){const e=this.#e?.value;e?.addEventListener("transitionend",(()=>{e?.classList?.remove("open"),e?.classList?.remove("closing"),e?.classList?.add("closed"),this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),e?.classList?.add("closing")}firstUpdated(){requestAnimationFrame((()=>{this.open()}))}open(){const e=Math.max(this.duration??0,5e3);e<Number.POSITIVE_INFINITY&&setTimeout((()=>{this.close()}),e),this.#e?.value?.classList?.add("open")}render(){return html`<div class="${classMap({component:!0,[this.variant]:!0})}" role="alert" aria-labelledby="label description" ${ref(this.#e)}><glide-core-status-indicator style="--size: 1.25rem;" class="icon" variant="${this.#o}"></glide-core-status-indicator><div class="label" id="label">${this.label}</div><glide-core-icon-button label="${this.#t.term("close")}" variant="tertiary" class="close-button" @click="${this.#i}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><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-icon-button><div class="description" id="description">${this.description}</div></div>`}#e;#t;#i(){this.close()}get#o(){return{informational:"warning-informational",success:"success"}[this.variant]}};__decorate([property({reflect:!0})],GlideCoreToast.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreToast.prototype,"description",void 0),__decorate([property()],GlideCoreToast.prototype,"variant",void 0),__decorate([property({type:Number})],GlideCoreToast.prototype,"duration",void 0),GlideCoreToast=__decorate([customElement("glide-core-toast")],GlideCoreToast);export default GlideCoreToast;
1
+ var __decorate=this&&this.__decorate||function(e,t,o,i){var s,r=arguments.length,l=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var n=e.length-1;n>=0;n--)(s=e[n])&&(l=(r<3?s(l):r>3?s(t,o,l):s(t,o))||l);return r>3&&l&&Object.defineProperty(t,o,l),l};import"./icon-button.js";import"./tooltip.js";import{LitElement,html}from"lit";import{LocalizeController}from"./library/localize.js";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{when}from"lit/directives/when.js";import styles from"./toasts.toast.styles.js";let GlideCoreToast=class GlideCoreToast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.#e=createRef(),this.#t=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}close(){const e=this.#e?.value;e?.addEventListener("transitionend",(()=>{e?.classList?.remove("open"),e?.classList?.remove("closing"),e?.classList?.add("closed"),this.dispatchEvent(new Event("close",{bubbles:!0}))}),{once:!0}),e?.classList?.add("closing")}firstUpdated(){requestAnimationFrame((()=>{this.open()}))}open(){const e=Math.max(this.duration??0,5e3);e<Number.POSITIVE_INFINITY&&setTimeout((()=>{this.close()}),e),this.#e?.value?.classList?.add("open")}render(){return html`<div class="${classMap({component:!0,[this.variant]:!0})}" role="alert" aria-labelledby="label description" ${ref(this.#e)}>${when("success"===this.#o,(()=>html`<svg aria-hidden="true" class="${classMap({icon:!0,success:!0})}" fill="none" height="16" width="16" viewBox="0 0 24 24"><path clip-rule="evenodd" d="M12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23ZM16.7071 9.70711C17.0976 9.31658 17.0976 8.68342 16.7071 8.29289C16.3166 7.90237 15.6834 7.90237 15.2929 8.29289L10 13.5858L7.70711 11.2929C7.31658 10.9024 6.68342 10.9024 6.29289 11.2929C5.90237 11.6834 5.90237 12.3166 6.29289 12.7071L9.29289 15.7071C9.68342 16.0976 10.3166 16.0976 10.7071 15.7071L16.7071 9.70711Z" fill="currentColor" fill-rule="evenodd"/></svg>`),(()=>html`<svg aria-hidden="true" class="${classMap({icon:!0,"warning-informational":!0})}" fill="none" height="16" width="16" viewBox="0 0 24 24"><path clip-rule="evenodd" d="M12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23ZM13 8C13 7.44772 12.5523 7 12 7C11.4477 7 11 7.44772 11 8V12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12V8ZM12 17C12.5523 17 13 16.5523 13 16C13 15.4477 12.5523 15 12 15C11.4477 15 11 15.4477 11 16C11 16.5523 11.4477 17 12 17Z" fill="currentColor" fill-rule="evenodd"/></svg>`))}<div class="label" id="label">${this.label}</div><glide-core-icon-button label="${this.#t.term("close")}" variant="tertiary" class="close-button" @click="${this.#i}"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><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-icon-button><div class="description" id="description">${this.description}</div></div>`}#e;#t;#i(){this.close()}get#o(){return{informational:"warning-informational",success:"success"}[this.variant]}};__decorate([property({reflect:!0})],GlideCoreToast.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreToast.prototype,"description",void 0),__decorate([property()],GlideCoreToast.prototype,"variant",void 0),__decorate([property({type:Number})],GlideCoreToast.prototype,"duration",void 0),GlideCoreToast=__decorate([customElement("glide-core-toast")],GlideCoreToast);export default GlideCoreToast;
@@ -42,10 +42,13 @@ import{css}from"lit";export default[css`
42
42
  }
43
43
 
44
44
  .icon {
45
+ block-size: 1.25rem;
45
46
  grid-column: 1;
47
+ inline-size: 1.25rem;
46
48
  }
47
49
 
48
50
  .label {
51
+ color: var(--glide-core-text-body-2);
49
52
  font-size: var(--glide-core-heading-xs-font-size);
50
53
  font-weight: var(--glide-core-heading-xs-font-weight);
51
54
  grid-column: 2;
@@ -58,6 +61,15 @@ import{css}from"lit";export default[css`
58
61
  }
59
62
 
60
63
  .description {
64
+ color: var(--glide-core-text-body-2);
61
65
  grid-column: 2;
62
66
  }
67
+
68
+ .success {
69
+ color: var(--glide-core-status-success);
70
+ }
71
+
72
+ .warning-informational {
73
+ color: var(--glide-core-status-warning-informational);
74
+ }
63
75
  `];
package/dist/toggle.d.ts CHANGED
@@ -6,8 +6,6 @@ declare global {
6
6
  }
7
7
  }
8
8
  /**
9
- * @description A toggle with a label and optional tooltip, summary, and description.
10
- *
11
9
  * @event change - `(event: Event) => void`
12
10
  * @event input - `(event: Event) => void`
13
11
  *
@@ -31,10 +31,6 @@ Use the ":checked" pseudo class on the host and throughout when browsers support
31
31
  justify-content: center;
32
32
  position: relative;
33
33
 
34
- &:has(input:focus-visible) {
35
- outline-offset: 4px;
36
- }
37
-
38
34
  &:has(input:checked:not(:disabled)) {
39
35
  background-color: var(--glide-core-surface-primary);
40
36
  border-color: transparent;
@@ -45,7 +41,7 @@ Use the ":checked" pseudo class on the host and throughout when browsers support
45
41
  }
46
42
 
47
43
  &:has(input:disabled) {
48
- background-color: var(--glide-core-surface-disabled);
44
+ background-color: var(--glide-core-surface-unselected-disabled);
49
45
 
50
46
  &::before {
51
47
  box-shadow: none;
@@ -58,12 +58,12 @@ it('can have a tooltip', async () => {
58
58
  it('can be checked', async () => {
59
59
  const component = await fixture(html `<glide-core-toggle checked></glide-core-toggle> `);
60
60
  expect(component.hasAttribute('checked')).to.be.true;
61
- expect(component.checked).to.equal(true);
61
+ expect(component.checked).to.be.true;
62
62
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
63
63
  expect(input?.getAttribute('aria-checked')).to.equal('true');
64
64
  });
65
65
  it('can be disabled', async () => {
66
66
  const component = await fixture(html `<glide-core-toggle disabled></glide-core-toggle> `);
67
67
  expect(component.hasAttribute('disabled')).to.be.true;
68
- expect(component.disabled).to.equal(true);
68
+ expect(component.disabled).to.be.true;
69
69
  });
@@ -6,7 +6,7 @@ it('is checked after being clicked', async () => {
6
6
  const component = await fixture(html `<glide-core-toggle label="Label"></glide-core-toggle>`);
7
7
  component.click();
8
8
  await elementUpdated(component);
9
- expect(component.checked).to.equal(true);
9
+ expect(component.checked).to.be.true;
10
10
  expect(component.hasAttribute('checked')).to.be.false;
11
11
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
12
12
  expect(input?.getAttribute('aria-checked')).to.equal('true');
@@ -15,7 +15,7 @@ it('is unchecked after being clicked', async () => {
15
15
  const component = await fixture(html `<glide-core-toggle label="Label" checked></glide-core-toggle>`);
16
16
  component.click();
17
17
  await elementUpdated(component);
18
- expect(component.checked).to.equal(false);
18
+ expect(component.checked).to.be.false;
19
19
  expect(component.hasAttribute('checked')).to.be.true;
20
20
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
21
21
  expect(input?.getAttribute('aria-checked')).to.equal('false');
@@ -28,7 +28,7 @@ it('is still checked after being clicked when checked but disabled', async () =>
28
28
  ></glide-core-toggle>`);
29
29
  component.click();
30
30
  await elementUpdated(component);
31
- expect(component.checked).to.equal(true);
31
+ expect(component.checked).to.be.true;
32
32
  expect(component.hasAttribute('checked')).to.be.true;
33
33
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
34
34
  expect(input?.getAttribute('aria-checked')).to.equal('true');
@@ -38,7 +38,7 @@ it('is still unchecked after being clicked when unchecked and disabled', async (
38
38
  component.click();
39
39
  await elementUpdated(component);
40
40
  expect(component.hasAttribute('checked')).to.be.false;
41
- expect(component.checked).to.equal(false);
41
+ expect(component.checked).to.be.false;
42
42
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
43
43
  expect(input?.getAttribute('aria-checked')).to.equal('false');
44
44
  });
@@ -51,7 +51,7 @@ it('is unchecked after being clicked then forcibly unchecked via a "change" list
51
51
  component.click();
52
52
  await elementUpdated(component);
53
53
  expect(component.hasAttribute('checked')).to.be.false;
54
- expect(component.checked).to.equal(false);
54
+ expect(component.checked).to.be.false;
55
55
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
56
56
  expect(input?.getAttribute('aria-checked')).to.equal('false');
57
57
  });
@@ -64,7 +64,7 @@ it('is unchecked after being clicked then forcibly unchecked via an "input" list
64
64
  component.click();
65
65
  await elementUpdated(component);
66
66
  expect(component.hasAttribute('checked')).to.be.false;
67
- expect(component.checked).to.equal(false);
67
+ expect(component.checked).to.be.false;
68
68
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
69
69
  expect(input?.getAttribute('aria-checked')).to.equal('false');
70
70
  });
@@ -75,7 +75,7 @@ it('remains unchecked when its "click" event is canceled', async () => {
75
75
  });
76
76
  component.click();
77
77
  expect(component.hasAttribute('checked')).to.be.false;
78
- expect(component.checked).to.equal(false);
78
+ expect(component.checked).to.be.false;
79
79
  const input = component.shadowRoot?.querySelector('[data-test="input"]');
80
80
  expect(input?.getAttribute('aria-checked')).to.equal('false');
81
81
  });
package/dist/tooltip.d.ts CHANGED
@@ -5,7 +5,7 @@ declare global {
5
5
  }
6
6
  }
7
7
  /**
8
- * @slot - The content of the tooltip.
8
+ * @slot - The primary content of the tooltip.
9
9
  * @slot target - The element to which the tooltip should anchor.
10
10
  */
11
11
  export default class GlideCoreTooltip extends LitElement {
@@ -18,6 +18,7 @@ export default class GlideCoreTooltip extends LitElement {
18
18
  get open(): boolean;
19
19
  set open(isOpen: boolean);
20
20
  placement?: 'bottom' | 'left' | 'right' | 'top';
21
+ shortcut: string[];
21
22
  disconnectedCallback(): void;
22
23
  firstUpdated(): void;
23
24
  render(): import("lit").TemplateResult<1>;
package/dist/tooltip.js CHANGED
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,l){var i,s=arguments.length,a=s<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,o,l);else for(var n=e.length-1;n>=0;n--)(i=e[n])&&(a=(s<3?i(a):s>3?i(t,o,a):i(t,o))||a);return s>3&&a&&Object.defineProperty(t,o,a),a};import{LitElement,html}from"lit";import{arrow,autoUpdate,computePosition,flip,limitShift,offset,shift}from"@floating-ui/dom";import{choose}from"lit/directives/choose.js";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{ifDefined}from"lit/directives/if-defined.js";import ow,{owSlot}from"./library/ow.js";import styles from"./tooltip.styles.js";let GlideCoreTooltip=class GlideCoreTooltip extends LitElement{constructor(){super(...arguments),this.offset=4,this.effectivePlacement=this.placement??"bottom",this.#e=createRef(),this.#t=createRef(),this.#o=!1,this.#l=!1,this.#i=createRef(),this.#s=createRef(),this.#a=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}get disabled(){return this.#o}set disabled(e){this.#o=e,this.open&&!e?this.#n():this.#r()}get open(){return this.#l}set open(e){this.#l=e,e&&!this.disabled?this.#n():this.#r()}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#f),clearTimeout(this.#p)}firstUpdated(){owSlot(this.#t.value),owSlot(this.#s.value),ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#a.value.popover="manual",this.open&&!this.disabled&&this.#n()}render(){return html`<div class="component" data-test="component" @mouseover="${this.#d}" @mouseout="${this.#h}"><div aria-labelledby="${ifDefined(this.disabled?void 0:"tooltip")}" class="target" data-test="target" slot="target" @focusin="${this.#c}" @focusout="${this.#m}" @keydown="${this.#u}" ${ref(this.#i)}><slot @slotchange="${this.#v}" ${ref(this.#s)} name="target"></slot></div><div class="${classMap({tooltip:!0,[this.effectivePlacement]:!0})}" id="tooltip" data-test="tooltip" data-open-delay="300" data-close-delay="200" role="${ifDefined(this.disabled?void 0:"tooltip")}" ${ref(this.#a)}><div class="${classMap({arrow:!0,[this.effectivePlacement]:!0})}" data-test="arrow" ${ref(this.#e)}>${choose(this.effectivePlacement,[["top",()=>html`<svg viewBox="0 0 10 6" fill="none"><path d="M4.23178 5.07814C4.63157 5.55789 5.36843 5.55789 5.76822 5.07813L10 -7.9486e-08L-2.62268e-07 3.57628e-07L4.23178 5.07814Z" fill="#212121"/></svg>`],["right",()=>html`<svg viewBox="0 0 6 10" fill="none"><path d="M0.921865 4.23178C0.442111 4.63157 0.442112 5.36843 0.921866 5.76822L6 10L6 -2.62268e-07L0.921865 4.23178Z" fill="#212121"/></svg>`],["bottom",()=>html`<svg viewBox="0 0 10 6" fill="none"><path d="M4.23178 0.921865C4.63157 0.442111 5.36843 0.442112 5.76822 0.921866L10 6L-2.62268e-07 6L4.23178 0.921865Z" fill="#212121"/></svg>`],["left",()=>html`<svg viewBox="0 0 6 10" fill="none"><path d="M5.07814 4.23178C5.55789 4.63157 5.55789 5.36843 5.07813 5.76822L-4.37114e-07 10L0 -2.62268e-07L5.07814 4.23178Z" fill="#212121"/></svg>`]])}</div><span aria-label="${ifDefined(this.disabled?void 0:"Tooltip: ")}"></span><slot class="default-slot" @slotchange="${this.#R}" ${ref(this.#t)}></slot></div></div>`}#e;#g;#f;#t;#o;#l;#p;#i;#s;#a;#E(){clearTimeout(this.#f)}#r(){this.#a.value?.hidePopover(),this.#g&&this.#g()}#R(){owSlot(this.#t.value)}#c(){this.open=!0}#m(){this.open=!1}#u(e){"Escape"===e.key&&(this.open=!1)}#h(){this.#w(),clearTimeout(this.#p)}#d(){ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#E(),this.#p=setTimeout((()=>{this.open=!0}),Number(this.#a.value.dataset.openDelay))}#v(){owSlot(this.#s.value)}#w(){ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#f=setTimeout((()=>{this.open=!1}),Number(this.#a.value.dataset.closeDelay))}#n(){this.disabled||(this.#g?.(),this.#i.value&&this.#a.value&&(this.#g=autoUpdate(this.#i.value,this.#a.value,(()=>{(async()=>{if(this.#i.value&&this.#a.value&&this.#e.value){const{x:e,y:t,placement:o,middlewareData:l}=await computePosition(this.#i.value,this.#a.value,{placement:this.placement,middleware:[offset(this.offset),flip({fallbackStrategy:"initialPlacement"}),shift({limiter:limitShift({offset:20})}),arrow({element:this.#e.value})]});Object.assign(this.#a.value.style,{left:`${e}px`,top:`${t}px`}),Object.assign(this.#e.value.style,{left:l.arrow?.x?`${l.arrow.x}px`:null,top:l.arrow?.y?`${l.arrow.y}px`:null}),this.effectivePlacement=o,this.#a.value.showPopover()}})()}))))}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"disabled",null),__decorate([property({reflect:!0,type:Number})],GlideCoreTooltip.prototype,"offset",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"open",null),__decorate([property()],GlideCoreTooltip.prototype,"placement",void 0),__decorate([state()],GlideCoreTooltip.prototype,"effectivePlacement",void 0),GlideCoreTooltip=__decorate([customElement("glide-core-tooltip")],GlideCoreTooltip);export default GlideCoreTooltip;
1
+ var __decorate=this&&this.__decorate||function(e,t,o,i){var l,s=arguments.length,a=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,o,i);else for(var r=e.length-1;r>=0;r--)(l=e[r])&&(a=(s<3?l(a):s>3?l(t,o,a):l(t,o))||a);return s>3&&a&&Object.defineProperty(t,o,a),a};import{LitElement,html}from"lit";import{arrow,autoUpdate,computePosition,flip,limitShift,offset,shift}from"@floating-ui/dom";import{choose}from"lit/directives/choose.js";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{ifDefined}from"lit/directives/if-defined.js";import{map}from"lit/directives/map.js";import ow,{owSlot}from"./library/ow.js";import styles from"./tooltip.styles.js";let GlideCoreTooltip=class GlideCoreTooltip extends LitElement{constructor(){super(...arguments),this.offset=4,this.shortcut=[],this.effectivePlacement=this.placement??"bottom",this.#e=createRef(),this.#t=createRef(),this.#o=!1,this.#i=!1,this.#l=createRef(),this.#s=createRef(),this.#a=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}get disabled(){return this.#o}set disabled(e){this.#o=e,this.open&&!e?this.#r():this.#n()}get open(){return this.#i}set open(e){this.#i=e,e&&!this.disabled?this.#r():this.#n()}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#f),clearTimeout(this.#h)}firstUpdated(){owSlot(this.#t.value),owSlot(this.#s.value),ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#a.value.popover="manual",this.open&&!this.disabled&&this.#r()}render(){return html`<div class="component" data-test="component" @mouseover="${this.#p}" @mouseout="${this.#c}"><div aria-labelledby="${ifDefined(this.disabled?void 0:"tooltip")}" class="target" data-test="target" slot="target" @focusin="${this.#d}" @focusout="${this.#m}" @keydown="${this.#u}" ${ref(this.#l)}><slot @slotchange="${this.#v}" ${ref(this.#s)} name="target"></slot></div><div class="${classMap({tooltip:!0,[this.effectivePlacement]:!0})}" id="tooltip" data-test="tooltip" data-open-delay="300" data-close-delay="200" role="${ifDefined(this.disabled?void 0:"tooltip")}" ${ref(this.#a)}><div class="${classMap({arrow:!0,[this.effectivePlacement]:!0})}" data-test="arrow" ${ref(this.#e)}>${choose(this.effectivePlacement,[["top",()=>html`<svg viewBox="0 0 10 6" fill="none"><path d="M4.23178 5.07814C4.63157 5.55789 5.36843 5.55789 5.76822 5.07813L10 -7.9486e-08L-2.62268e-07 3.57628e-07L4.23178 5.07814Z" fill="#212121"/></svg>`],["right",()=>html`<svg viewBox="0 0 6 10" fill="none"><path d="M0.921865 4.23178C0.442111 4.63157 0.442112 5.36843 0.921866 5.76822L6 10L6 -2.62268e-07L0.921865 4.23178Z" fill="#212121"/></svg>`],["bottom",()=>html`<svg viewBox="0 0 10 6" fill="none"><path d="M4.23178 0.921865C4.63157 0.442111 5.36843 0.442112 5.76822 0.921866L10 6L-2.62268e-07 6L4.23178 0.921865Z" fill="#212121"/></svg>`],["left",()=>html`<svg viewBox="0 0 6 10" fill="none"><path d="M5.07814 4.23178C5.55789 4.63157 5.55789 5.36843 5.07813 5.76822L-4.37114e-07 10L0 -2.62268e-07L5.07814 4.23178Z" fill="#212121"/></svg>`]])}</div><span aria-label="${ifDefined(this.disabled?void 0:"Tooltip: ")}"></span><div class="${classMap({content:!0,reversed:"left"===this.effectivePlacement})}"><slot class="default-slot" @slotchange="${this.#g}" ${ref(this.#t)}></slot><kbd class="${classMap({shortcut:!0,reversed:"left"===this.effectivePlacement,visible:this.shortcut.length>0})}" data-test="shortcut">${1===this.shortcut.length?this.shortcut.at(0):map(this.shortcut,((e,t)=>html`<kbd>${e}</kbd> ${t===this.shortcut.length-1?"":" + "}`))}</kbd></div></div></div>`}#e;#R;#f;#t;#o;#i;#h;#l;#s;#a;#E(){clearTimeout(this.#f)}#n(){this.#a.value?.hidePopover(),this.#R&&this.#R()}#g(){owSlot(this.#t.value)}#d(){this.open=!0}#m(){this.open=!1}#u(e){"Escape"===e.key&&(this.open=!1)}#c(){this.#w(),clearTimeout(this.#h)}#p(){ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#E(),this.#h=setTimeout((()=>{this.open=!0}),Number(this.#a.value.dataset.openDelay))}#v(){owSlot(this.#s.value)}#w(){ow(this.#a.value,ow.object.instanceOf(HTMLElement)),this.#f=setTimeout((()=>{this.open=!1}),Number(this.#a.value.dataset.closeDelay))}#r(){this.disabled||(this.#R?.(),this.#l.value&&this.#a.value&&(this.#R=autoUpdate(this.#l.value,this.#a.value,(()=>{(async()=>{if(this.#l.value&&this.#a.value&&this.#e.value){const{x:e,y:t,placement:o,middlewareData:i}=await computePosition(this.#l.value,this.#a.value,{placement:this.placement,middleware:[offset(this.offset),flip({fallbackStrategy:"initialPlacement"}),shift({limiter:limitShift({offset:20})}),arrow({element:this.#e.value})]});Object.assign(this.#a.value.style,{left:`${e}px`,top:`${t}px`}),Object.assign(this.#e.value.style,{left:i.arrow?.x?`${i.arrow.x}px`:null,top:i.arrow?.y?`${i.arrow.y}px`:null}),this.effectivePlacement=o,this.#a.value.showPopover()}})()}))))}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"disabled",null),__decorate([property({reflect:!0,type:Number})],GlideCoreTooltip.prototype,"offset",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"open",null),__decorate([property()],GlideCoreTooltip.prototype,"placement",void 0),__decorate([property({reflect:!0,type:Array})],GlideCoreTooltip.prototype,"shortcut",void 0),__decorate([state()],GlideCoreTooltip.prototype,"effectivePlacement",void 0),GlideCoreTooltip=__decorate([customElement("glide-core-tooltip")],GlideCoreTooltip);export default GlideCoreTooltip;