@crowdstrike/glide-core 0.7.0 → 0.9.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 (203) hide show
  1. package/README.md +44 -5
  2. package/dist/accordion.test.basics.js +1 -0
  3. package/dist/accordion.test.events.js +1 -0
  4. package/dist/button-group.button.d.ts +14 -15
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +75 -52
  7. package/dist/button-group.button.test.basics.d.ts +1 -1
  8. package/dist/button-group.button.test.basics.js +84 -147
  9. package/dist/button-group.button.test.events.js +9 -67
  10. package/dist/button-group.button.test.focus.js +13 -0
  11. package/dist/button-group.button.test.interactions.d.ts +1 -0
  12. package/dist/button-group.button.test.interactions.js +42 -0
  13. package/dist/button-group.d.ts +7 -10
  14. package/dist/button-group.js +1 -1
  15. package/dist/button-group.stories.d.ts +1 -5
  16. package/dist/button-group.styles.js +18 -6
  17. package/dist/button-group.test.basics.js +114 -234
  18. package/dist/button-group.test.events.js +211 -263
  19. package/dist/button-group.test.focus.d.ts +1 -0
  20. package/dist/button-group.test.focus.js +39 -0
  21. package/dist/button-group.test.interactions.d.ts +1 -0
  22. package/dist/button-group.test.interactions.js +91 -0
  23. package/dist/button.test.basics.js +2 -1
  24. package/dist/button.test.events.js +1 -0
  25. package/dist/button.test.form.js +1 -0
  26. package/dist/checkbox-group.js +1 -1
  27. package/dist/checkbox-group.styles.js +1 -1
  28. package/dist/checkbox-group.test.basics.js +2 -1
  29. package/dist/checkbox-group.test.events.js +5 -4
  30. package/dist/checkbox-group.test.focus.js +5 -3
  31. package/dist/checkbox-group.test.form.js +1 -0
  32. package/dist/checkbox-group.test.validity.js +1 -0
  33. package/dist/checkbox.d.ts +7 -1
  34. package/dist/checkbox.js +1 -1
  35. package/dist/checkbox.styles.js +11 -3
  36. package/dist/checkbox.test.basics.js +1 -0
  37. package/dist/checkbox.test.events.js +5 -4
  38. package/dist/checkbox.test.focus.js +2 -2
  39. package/dist/checkbox.test.form.js +1 -0
  40. package/dist/{checkbox.test.states.js → checkbox.test.interactions.js} +25 -1
  41. package/dist/checkbox.test.validity.js +1 -0
  42. package/dist/drawer.js +1 -1
  43. package/dist/drawer.test.basics.js +1 -0
  44. package/dist/drawer.test.closing.js +1 -0
  45. package/dist/drawer.test.events.js +1 -0
  46. package/dist/drawer.test.methods.js +1 -0
  47. package/dist/dropdown.d.ts +6 -4
  48. package/dist/dropdown.js +1 -1
  49. package/dist/dropdown.option.d.ts +7 -2
  50. package/dist/dropdown.option.js +1 -1
  51. package/dist/dropdown.option.styles.js +13 -0
  52. package/dist/dropdown.option.test.basics.js +7 -3
  53. package/dist/dropdown.option.test.basics.multiple.js +1 -0
  54. package/dist/dropdown.option.test.basics.single.js +1 -0
  55. package/dist/dropdown.option.test.events.js +2 -1
  56. package/dist/dropdown.option.test.focus.js +1 -1
  57. package/dist/dropdown.option.test.interactions.multiple.js +2 -54
  58. package/dist/dropdown.option.test.interactions.single.js +52 -9
  59. package/dist/dropdown.styles.js +20 -19
  60. package/dist/dropdown.test.basics.filterable.js +1 -0
  61. package/dist/dropdown.test.basics.js +144 -2
  62. package/dist/dropdown.test.basics.multiple.js +6 -3
  63. package/dist/dropdown.test.basics.single.js +1 -1
  64. package/dist/dropdown.test.events.filterable.js +74 -0
  65. package/dist/dropdown.test.events.js +50 -160
  66. package/dist/dropdown.test.events.multiple.js +268 -10
  67. package/dist/dropdown.test.events.single.js +202 -4
  68. package/dist/dropdown.test.focus.filterable.js +9 -5
  69. package/dist/dropdown.test.focus.js +2 -1
  70. package/dist/dropdown.test.focus.multiple.js +1 -2
  71. package/dist/dropdown.test.focus.single.js +1 -1
  72. package/dist/dropdown.test.form.js +1 -0
  73. package/dist/dropdown.test.form.multiple.js +1 -0
  74. package/dist/dropdown.test.form.single.js +1 -0
  75. package/dist/dropdown.test.interactions.filterable.js +69 -11
  76. package/dist/dropdown.test.interactions.js +95 -5
  77. package/dist/dropdown.test.interactions.multiple.js +203 -6
  78. package/dist/dropdown.test.interactions.single.js +69 -6
  79. package/dist/dropdown.test.validity.js +1 -0
  80. package/dist/form-controls-layout.test.basics.js +2 -1
  81. package/dist/icon-button.test.basics.js +2 -1
  82. package/dist/icons/checked.d.ts +1 -1
  83. package/dist/icons/checked.js +1 -1
  84. package/dist/icons/magnifying-glass.js +1 -1
  85. package/dist/input.d.ts +0 -6
  86. package/dist/input.js +1 -1
  87. package/dist/input.styles.js +7 -2
  88. package/dist/input.test.basics.js +20 -5
  89. package/dist/input.test.events.js +5 -4
  90. package/dist/input.test.focus.js +5 -4
  91. package/dist/input.test.form.js +1 -0
  92. package/dist/input.test.translations.d.ts +1 -0
  93. package/dist/input.test.translations.js +38 -0
  94. package/dist/input.test.validity.js +134 -4
  95. package/dist/label.d.ts +1 -1
  96. package/dist/label.js +1 -1
  97. package/dist/label.styles.js +29 -20
  98. package/dist/label.test.basics.js +27 -24
  99. package/dist/library/expect-argument-error.js +1 -1
  100. package/dist/library/localize.d.ts +5 -1
  101. package/dist/library/ow.test.d.ts +2 -1
  102. package/dist/library/ow.test.js +8 -3
  103. package/dist/menu.button.test.basics.js +1 -0
  104. package/dist/menu.d.ts +3 -5
  105. package/dist/menu.js +1 -1
  106. package/dist/menu.link.test.basics.js +1 -0
  107. package/dist/menu.options.test.basics.js +3 -2
  108. package/dist/menu.styles.js +1 -15
  109. package/dist/menu.test.basics.d.ts +1 -2
  110. package/dist/menu.test.basics.js +23 -6
  111. package/dist/menu.test.events.d.ts +1 -0
  112. package/dist/menu.test.events.js +2 -1
  113. package/dist/menu.test.focus.d.ts +1 -0
  114. package/dist/menu.test.focus.js +14 -6
  115. package/dist/menu.test.interactions.js +213 -56
  116. package/dist/modal.icon-button.test.basics.js +2 -1
  117. package/dist/modal.js +1 -1
  118. package/dist/modal.styles.js +18 -13
  119. package/dist/modal.tertiary-icon.d.ts +0 -1
  120. package/dist/modal.tertiary-icon.js +1 -1
  121. package/dist/modal.tertiary-icon.test.basics.js +2 -1
  122. package/dist/modal.test.accessibility.js +1 -0
  123. package/dist/modal.test.basics.js +2 -1
  124. package/dist/modal.test.close.js +1 -0
  125. package/dist/modal.test.events.js +11 -10
  126. package/dist/modal.test.lock-scroll.js +1 -0
  127. package/dist/modal.test.methods.js +1 -0
  128. package/dist/modal.test.scrollbars.js +1 -0
  129. package/dist/radio-group.js +1 -1
  130. package/dist/radio-group.styles.js +1 -1
  131. package/dist/radio-group.test.basics.js +1 -0
  132. package/dist/radio-group.test.events.js +1 -0
  133. package/dist/radio-group.test.focus.js +4 -3
  134. package/dist/radio-group.test.form.js +1 -0
  135. package/dist/radio-group.test.validity.js +1 -0
  136. package/dist/radio.d.ts +1 -0
  137. package/dist/radio.js +1 -1
  138. package/dist/radio.styles.js +33 -0
  139. package/dist/split-button.test.basics.js +1 -0
  140. package/dist/split-container.test.basics.js +5 -0
  141. package/dist/split-link.test.basics.js +1 -0
  142. package/dist/split-link.test.interactions.js +2 -1
  143. package/dist/styles/variables.css +1 -1
  144. package/dist/tab.d.ts +1 -3
  145. package/dist/tab.group.d.ts +3 -5
  146. package/dist/tab.group.js +1 -1
  147. package/dist/tab.group.styles.js +27 -13
  148. package/dist/tab.group.test.basics.js +8 -57
  149. package/dist/tab.group.test.interactions.d.ts +3 -0
  150. package/dist/tab.group.test.interactions.js +454 -0
  151. package/dist/tab.js +1 -1
  152. package/dist/tab.panel.d.ts +1 -0
  153. package/dist/tab.panel.js +1 -1
  154. package/dist/tab.panel.styles.js +11 -1
  155. package/dist/tab.styles.js +7 -68
  156. package/dist/tab.test.basics.js +0 -20
  157. package/dist/tabs.stories.d.ts +1 -2
  158. package/dist/tag.test.basics.js +3 -2
  159. package/dist/textarea.d.ts +0 -1
  160. package/dist/textarea.js +2 -2
  161. package/dist/textarea.stories.d.ts +3 -4
  162. package/dist/textarea.styles.js +14 -3
  163. package/dist/textarea.test.basics.js +81 -44
  164. package/dist/textarea.test.events.js +57 -41
  165. package/dist/textarea.test.form.js +1 -0
  166. package/dist/textarea.test.translations.d.ts +1 -0
  167. package/dist/textarea.test.translations.js +34 -0
  168. package/dist/textarea.test.validity.js +105 -20
  169. package/dist/toasts.js +1 -1
  170. package/dist/toasts.styles.js +8 -1
  171. package/dist/toasts.test.basics.js +20 -0
  172. package/dist/toggle.js +1 -1
  173. package/dist/toggle.test.basics.js +1 -0
  174. package/dist/toggle.test.events.js +1 -0
  175. package/dist/toggle.test.focus.js +1 -1
  176. package/dist/toggle.test.interactions.d.ts +1 -0
  177. package/dist/{toggle.test.states.js → toggle.test.interactions.js} +1 -0
  178. package/dist/tooltip.d.ts +7 -5
  179. package/dist/tooltip.js +1 -1
  180. package/dist/tooltip.styles.js +90 -25
  181. package/dist/tooltip.test.basics.js +39 -3
  182. package/dist/tooltip.test.interactions.js +137 -34
  183. package/dist/translations/en.js +1 -1
  184. package/dist/translations/fr.js +1 -1
  185. package/dist/translations/ja.js +1 -1
  186. package/dist/tree.d.ts +0 -1
  187. package/dist/tree.item.d.ts +2 -3
  188. package/dist/tree.item.js +1 -1
  189. package/dist/tree.item.menu.d.ts +0 -1
  190. package/dist/tree.item.menu.js +1 -1
  191. package/dist/tree.item.test.basics.js +1 -0
  192. package/dist/tree.js +1 -1
  193. package/dist/tree.test.basics.js +2 -1
  194. package/dist/tree.test.events.js +1 -1
  195. package/package.json +40 -29
  196. package/dist/drawer.test.floating-components.d.ts +0 -1
  197. package/dist/drawer.test.floating-components.js +0 -51
  198. package/dist/library/set-containing-block.d.ts +0 -15
  199. package/dist/library/set-containing-block.js +0 -1
  200. package/dist/modal.test.floating-components.js +0 -62
  201. /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
  202. /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
  203. /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
@@ -1,291 +1,239 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
1
2
  import './button-group.button.js';
2
- import { elementUpdated, expect, fixture, html, oneEvent, } from '@open-wc/testing';
3
+ import { aTimeout, expect, fixture, html, oneEvent } from '@open-wc/testing';
3
4
  import { sendKeys } from '@web/test-runner-commands';
4
5
  import GlideCoreButtonGroup from './button-group.js';
5
6
  import GlideCoreButtonGroupButton from './button-group.button.js';
7
+ import sinon from 'sinon';
6
8
  GlideCoreButtonGroup.shadowRootOptions.mode = 'open';
7
9
  GlideCoreButtonGroupButton.shadowRootOptions.mode = 'open';
8
- it('emits a change event when arrow keys are pressed', async () => {
9
- await fixture(html `<glide-core-button-group>
10
- <glide-core-button-group-button value="value-1"
11
- >Button 1</glide-core-button-group-button
12
- >
13
- <glide-core-button-group-button value="value-2" selected
14
- >Button 2</glide-core-button-group-button
15
- >
16
- <glide-core-button-group-button value="value-3"
17
- >Button 3</glide-core-button-group-button
18
- >
10
+ it('emits a "change" event when a button is clicked and not already selected', async () => {
11
+ const component = await fixture(html `<glide-core-button-group>
12
+ <glide-core-button-group-button
13
+ label="One"
14
+ ></glide-core-button-group-button>
15
+
16
+ <glide-core-button-group-button
17
+ label="Two"
18
+ ></glide-core-button-group-button>
19
19
  </glide-core-button-group>`);
20
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
21
- await sendKeys({ press: 'Tab' });
22
- // This pattern is adopted from https://open-wc.org/docs/testing/helpers/#testing-events
23
- // Without the setTimeout the test fails. An `await` is used since `sendKeys` returns a
24
- // promise, however the test seems to work without it. Keeping `await` here until this can
25
- // be investigated further.
26
- setTimeout(async () => await sendKeys({ press: 'ArrowLeft' }));
27
- const changeEventLeft = await oneEvent(buttonElements[0], 'change');
28
- expect(changeEventLeft instanceof Event).to.be.true;
29
- expect(changeEventLeft.bubbles).to.be.true;
30
- setTimeout(async () => await sendKeys({ press: 'ArrowRight' }));
31
- const changeEventRight = await oneEvent(buttonElements[1], 'change');
32
- expect(changeEventRight instanceof Event).to.be.true;
33
- expect(changeEventRight.bubbles).to.be.true;
34
- setTimeout(async () => await sendKeys({ press: 'ArrowUp' }));
35
- const changeEventUp = await oneEvent(buttonElements[0], 'change');
36
- expect(changeEventUp instanceof Event).to.be.true;
37
- expect(changeEventUp.bubbles).to.be.true;
38
- setTimeout(async () => await sendKeys({ press: 'ArrowDown' }));
39
- const changeEventDown = await oneEvent(buttonElements[1], 'change');
40
- expect(changeEventDown instanceof Event).to.be.true;
41
- expect(changeEventDown.bubbles).to.be.true;
20
+ const button = component.querySelector('glide-core-button-group-button:last-of-type');
21
+ setTimeout(() => {
22
+ button?.click();
23
+ });
24
+ const event = await oneEvent(component, 'change');
25
+ expect(event instanceof Event).to.be.true;
26
+ expect(event.bubbles).to.be.true;
42
27
  });
43
- it('emits an input event when arrow keys are pressed', async () => {
44
- await fixture(html `<glide-core-button-group>
45
- <glide-core-button-group-button value="value-1"
46
- >Button 1</glide-core-button-group-button
47
- >
48
- <glide-core-button-group-button value="value-2" selected
49
- >Button 2</glide-core-button-group-button
50
- >
51
- <glide-core-button-group-button value="value-3"
52
- >Button 3</glide-core-button-group-button
53
- >
28
+ it('emits an "input" event when a button is clicked and not already selected', async () => {
29
+ const component = await fixture(html `<glide-core-button-group>
30
+ <glide-core-button-group-button
31
+ label="One"
32
+ ></glide-core-button-group-button>
33
+
34
+ <glide-core-button-group-button
35
+ label="Two"
36
+ ></glide-core-button-group-button>
54
37
  </glide-core-button-group>`);
55
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
56
- await sendKeys({ press: 'Tab' });
57
- setTimeout(async () => await sendKeys({ press: 'ArrowLeft' }));
58
- const inputEventLeft = await oneEvent(buttonElements[0], 'input');
59
- expect(inputEventLeft instanceof Event).to.be.true;
60
- expect(inputEventLeft.bubbles).to.be.true;
61
- setTimeout(async () => await sendKeys({ press: 'ArrowRight' }));
62
- const inputEventRight = await oneEvent(buttonElements[1], 'input');
63
- expect(inputEventRight instanceof Event).to.be.true;
64
- expect(inputEventRight.bubbles).to.be.true;
65
- setTimeout(async () => await sendKeys({ press: 'ArrowUp' }));
66
- const inputEventUp = await oneEvent(buttonElements[0], 'input');
67
- expect(inputEventUp instanceof Event).to.be.true;
68
- expect(inputEventUp.bubbles).to.be.true;
69
- setTimeout(async () => await sendKeys({ press: 'ArrowDown' }));
70
- const inputEventDown = await oneEvent(buttonElements[1], 'input');
71
- expect(inputEventDown instanceof Event).to.be.true;
72
- expect(inputEventDown.bubbles).to.be.true;
38
+ const button = component.querySelector('glide-core-button-group-button:last-of-type');
39
+ setTimeout(() => {
40
+ button?.click();
41
+ });
42
+ const event = await oneEvent(component, 'input');
43
+ expect(event instanceof Event).to.be.true;
44
+ expect(event.bubbles).to.be.true;
73
45
  });
74
- it('moves focus to previous button when left or up arrow keys are pressed', async () => {
75
- await fixture(html `<glide-core-button-group>
76
- <glide-core-button-group-button value="value-1"
77
- >Button 1</glide-core-button-group-button
78
- >
79
- <glide-core-button-group-button value="value-2"
80
- >Button 2</glide-core-button-group-button
81
- >
82
- <glide-core-button-group-button value="value-3" selected
83
- >Button 3</glide-core-button-group-button
84
- >
46
+ it('does not emit an "change" event when clicked button is clicked and already selected', async () => {
47
+ const component = await fixture(html `<glide-core-button-group>
48
+ <glide-core-button-group-button
49
+ label="One"
50
+ selected
51
+ ></glide-core-button-group-button>
52
+
53
+ <glide-core-button-group-button
54
+ label="One"
55
+ ></glide-core-button-group-button>
85
56
  </glide-core-button-group>`);
86
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
87
- await sendKeys({ press: 'Tab' });
88
- await sendKeys({ press: 'ArrowLeft' });
89
- expect(buttonElements[1]).to.have.focus;
90
- await sendKeys({ press: 'ArrowUp' });
91
- expect(buttonElements[0]).to.have.focus;
57
+ const spy = sinon.spy();
58
+ const button = component.querySelector('glide-core-button-group-button');
59
+ component.addEventListener('change', spy);
60
+ setTimeout(() => {
61
+ button?.click();
62
+ });
63
+ await aTimeout(0);
64
+ expect(spy.callCount).to.equal(0);
92
65
  });
93
- it('moves focus to last button when left or up arrow keys are pressed on the first button', async () => {
94
- await fixture(html `<glide-core-button-group>
95
- <glide-core-button-group-button value="value-1" selected
96
- >Button 1</glide-core-button-group-button
97
- >
98
- <glide-core-button-group-button value="value-2"
99
- >Button 2</glide-core-button-group-button
100
- >
101
- <glide-core-button-group-button value="value-3"
102
- >Button 3</glide-core-button-group-button
103
- >
66
+ it('does not emit an "input" event when clicked button is clicked and already selected', async () => {
67
+ const component = await fixture(html `<glide-core-button-group>
68
+ <glide-core-button-group-button
69
+ label="One"
70
+ selected
71
+ ></glide-core-button-group-button>
72
+
73
+ <glide-core-button-group-button
74
+ label="Two"
75
+ ></glide-core-button-group-button>
104
76
  </glide-core-button-group>`);
105
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
106
- await sendKeys({ press: 'Tab' });
107
- await sendKeys({ press: 'ArrowLeft' });
108
- expect(buttonElements[2]).to.have.focus;
109
- buttonElements[0].focus();
110
- await sendKeys({ press: ' ' });
111
- await sendKeys({ press: 'ArrowUp' });
112
- expect(buttonElements[2]).to.have.focus;
77
+ const spy = sinon.spy();
78
+ const button = component.querySelector('glide-core-button-group-button');
79
+ component.addEventListener('input', spy);
80
+ setTimeout(() => {
81
+ button?.click();
82
+ });
83
+ await aTimeout(0);
84
+ expect(spy.callCount).to.equal(0);
113
85
  });
114
- it('moves focus to next button when right or down arrow keys are pressed', async () => {
115
- await fixture(html `<glide-core-button-group>
116
- <glide-core-button-group-button value="value-1" selected
117
- >Button 1</glide-core-button-group-button
118
- >
119
- <glide-core-button-group-button value="value-2"
120
- >Button 2</glide-core-button-group-button
121
- >
122
- <glide-core-button-group-button value="value-3"
123
- >Button 3</glide-core-button-group-button
124
- >
86
+ it('emits a "change" event when arrowing', async () => {
87
+ const component = await fixture(html `<glide-core-button-group>
88
+ <glide-core-button-group-button
89
+ label="One"
90
+ ></glide-core-button-group-button>
91
+
92
+ <glide-core-button-group-button
93
+ label="Two"
94
+ selected
95
+ ></glide-core-button-group-button>
125
96
  </glide-core-button-group>`);
126
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
127
- await sendKeys({ press: 'Tab' });
128
- await sendKeys({ press: 'ArrowRight' });
129
- expect(buttonElements[1]).to.have.focus;
130
- await sendKeys({ press: 'ArrowDown' });
131
- expect(buttonElements[2]).to.have.focus;
97
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
98
+ buttons[0].focus();
99
+ let event;
100
+ sendKeys({ press: 'ArrowRight' });
101
+ event = await oneEvent(component, 'change');
102
+ expect(event instanceof Event).to.be.true;
103
+ expect(event.bubbles).to.be.true;
104
+ sendKeys({ press: 'ArrowLeft' });
105
+ event = await oneEvent(component, 'change');
106
+ expect(event instanceof Event).to.be.true;
107
+ expect(event.bubbles).to.be.true;
108
+ sendKeys({ press: 'ArrowDown' });
109
+ event = await oneEvent(component, 'change');
110
+ expect(event instanceof Event).to.be.true;
111
+ expect(event.bubbles).to.be.true;
112
+ sendKeys({ press: 'ArrowUp' });
113
+ event = await oneEvent(component, 'change');
114
+ expect(event instanceof Event).to.be.true;
115
+ expect(event.bubbles).to.be.true;
132
116
  });
133
- it('moves focus to first button when right or down arrow keys are pressed on the last button', async () => {
134
- await fixture(html `<glide-core-button-group>
135
- <glide-core-button-group-button value="value-1"
136
- >Button 1</glide-core-button-group-button
137
- >
138
- <glide-core-button-group-button value="value-2"
139
- >Button 2</glide-core-button-group-button
140
- >
141
- <glide-core-button-group-button value="value-3" selected
142
- >Button 3</glide-core-button-group-button
143
- >
117
+ it('emits an "input" event when arrowing', async () => {
118
+ const component = await fixture(html `<glide-core-button-group>
119
+ <glide-core-button-group-button
120
+ label="One"
121
+ ></glide-core-button-group-button>
122
+
123
+ <glide-core-button-group-button
124
+ label="Two"
125
+ ></glide-core-button-group-button>
144
126
  </glide-core-button-group>`);
145
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
146
- await sendKeys({ press: 'Tab' });
147
- await sendKeys({ press: 'ArrowRight' });
148
- expect(buttonElements[0]).to.have.focus;
149
- buttonElements[2].focus();
150
- await sendKeys({ press: ' ' });
151
- expect(buttonElements[2]).to.have.focus;
152
- await sendKeys({ press: 'ArrowDown' });
153
- expect(buttonElements[0]).to.have.focus;
127
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
128
+ buttons[0].focus();
129
+ let event;
130
+ sendKeys({ press: 'ArrowRight' });
131
+ event = await oneEvent(component, 'input');
132
+ expect(event instanceof Event).to.be.true;
133
+ expect(event.bubbles).to.be.true;
134
+ sendKeys({ press: 'ArrowLeft' });
135
+ event = await oneEvent(component, 'input');
136
+ expect(event instanceof Event).to.be.true;
137
+ expect(event.bubbles).to.be.true;
138
+ sendKeys({ press: 'ArrowDown' });
139
+ event = await oneEvent(component, 'input');
140
+ expect(event instanceof Event).to.be.true;
141
+ expect(event.bubbles).to.be.true;
142
+ sendKeys({ press: 'ArrowUp' });
143
+ event = await oneEvent(component, 'input');
144
+ expect(event instanceof Event).to.be.true;
145
+ expect(event.bubbles).to.be.true;
154
146
  });
155
- it('moves focus to previous enabled button when pressing left or up arrow keys', async () => {
156
- await fixture(html `<glide-core-button-group>
157
- <glide-core-button-group-button value="value-1"
158
- >Button 1</glide-core-button-group-button
159
- >
160
- <glide-core-button-group-button value="value-2" disabled
161
- >Button 2</glide-core-button-group-button
162
- >
163
- <glide-core-button-group-button value="value-3" selected
164
- >Button 3</glide-core-button-group-button
165
- >
147
+ it('emits a "change" event when a button is selected via Space', async () => {
148
+ const component = await fixture(html `<glide-core-button-group>
149
+ <glide-core-button-group-button
150
+ label="One"
151
+ selected
152
+ ></glide-core-button-group-button>
153
+
154
+ <glide-core-button-group-button
155
+ label="Two"
156
+ ></glide-core-button-group-button>
166
157
  </glide-core-button-group>`);
167
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
168
- await sendKeys({ press: 'Tab' });
169
- await sendKeys({ press: 'ArrowLeft' });
170
- expect(buttonElements[0]).to.have.focus;
171
- buttonElements[2].focus();
172
- await sendKeys({ press: ' ' });
173
- expect(buttonElements[2]).to.have.focus;
174
- await sendKeys({ press: 'ArrowUp' });
175
- expect(buttonElements[0]).to.have.focus;
158
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
159
+ buttons[1]?.focus();
160
+ sendKeys({ press: 'Space' });
161
+ const event = await oneEvent(component, 'input');
162
+ expect(event instanceof Event).to.be.true;
163
+ expect(event.bubbles).to.be.true;
176
164
  });
177
- it('moves focus to next enabled button when pressing right or down arrow keys', async () => {
178
- await fixture(html `<glide-core-button-group>
179
- <glide-core-button-group-button value="value-1" selected
180
- >Button 1</glide-core-button-group-button
181
- >
182
- <glide-core-button-group-button value="value-2" disabled
183
- >Button 2</glide-core-button-group-button
184
- >
185
- <glide-core-button-group-button value="value-3"
186
- >Button 3</glide-core-button-group-button
187
- >
165
+ it('emits a "change" event when a button is selected programmatically', async () => {
166
+ const component = await fixture(html `<glide-core-button-group>
167
+ <glide-core-button-group-button
168
+ label="One"
169
+ selected
170
+ ></glide-core-button-group-button>
171
+
172
+ <glide-core-button-group-button
173
+ label="Two"
174
+ ></glide-core-button-group-button>
188
175
  </glide-core-button-group>`);
189
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
190
- await sendKeys({ press: 'Tab' });
191
- await sendKeys({ press: 'ArrowRight' });
192
- expect(buttonElements[2]).to.have.focus;
193
- buttonElements[0].focus();
194
- await sendKeys({ press: ' ' });
195
- expect(buttonElements[0]).to.have.focus;
196
- await sendKeys({ press: 'ArrowDown' });
197
- expect(buttonElements[2]).to.have.focus;
176
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
177
+ setTimeout(() => {
178
+ buttons[1].selected = true;
179
+ });
180
+ const event = await oneEvent(component, 'input');
181
+ expect(event instanceof Event).to.be.true;
182
+ expect(event.bubbles).to.be.true;
198
183
  });
199
- it('does not move focus if there is only one button when pressing arrow keys', async () => {
200
- await fixture(html `<glide-core-button-group>
201
- <glide-core-button-group-button value="value-1"
202
- >Button 1</glide-core-button-group-button
203
- >
184
+ it('does not emit a "change" event when an already selected button is selected via Space', async () => {
185
+ const component = await fixture(html `<glide-core-button-group>
186
+ <glide-core-button-group-button
187
+ label="One"
188
+ selected
189
+ ></glide-core-button-group-button>
190
+
191
+ <glide-core-button-group-button
192
+ label="Two"
193
+ ></glide-core-button-group-button>
204
194
  </glide-core-button-group>`);
205
- const buttonElement = document.querySelector('glide-core-button-group-button');
206
- await sendKeys({ press: 'Tab' });
207
- await sendKeys({ press: 'ArrowLeft' });
208
- expect(buttonElement).to.have.focus;
209
- await sendKeys({ press: 'ArrowRight' });
210
- expect(buttonElement).to.have.focus;
211
- await sendKeys({ press: 'ArrowUp' });
212
- expect(buttonElement).to.have.focus;
213
- await sendKeys({ press: 'ArrowDown' });
214
- expect(buttonElement).to.have.focus;
195
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
196
+ buttons[0]?.focus();
197
+ const spy = sinon.spy();
198
+ component.addEventListener('change', spy);
199
+ sendKeys({ press: 'Space' });
200
+ expect(spy.callCount).to.equal(0);
215
201
  });
216
- it('changes the "selected" attribute when clicking', async () => {
217
- const element = await fixture(html `<glide-core-button-group>
218
- <glide-core-button-group-button value="value-1" selected
219
- >Button 1</glide-core-button-group-button
220
- >
221
- <glide-core-button-group-button value="value-2"
222
- >Button 2</glide-core-button-group-button
223
- >
224
- <glide-core-button-group-button value="value-3"
225
- >Button 3</glide-core-button-group-button
226
- >
202
+ it('does not emit a "change" event a button is selected programmatically', async () => {
203
+ const component = await fixture(html `<glide-core-button-group>
204
+ <glide-core-button-group-button
205
+ label="One"
206
+ selected
207
+ ></glide-core-button-group-button>
208
+
209
+ <glide-core-button-group-button
210
+ label="Two"
211
+ ></glide-core-button-group-button>
227
212
  </glide-core-button-group>`);
228
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
229
- const liElement = buttonElements[2].shadowRoot.querySelector('li');
230
- expect(liElement).to.exist;
231
- liElement?.click();
232
- await elementUpdated(element);
233
- expect(buttonElements[2]).to.have.focus;
234
- expect(buttonElements[2]).to.have.attribute('selected');
235
- expect(buttonElements[0]).to.not.have.attribute('selected');
213
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
214
+ const spy = sinon.spy();
215
+ component.addEventListener('change', spy);
216
+ setTimeout(() => {
217
+ buttons[1].selected = true;
218
+ });
219
+ expect(spy.callCount).to.equal(0);
236
220
  });
237
- it('does not change focus nor the "selected" attribute when clicking a disabled button', async () => {
238
- const element = await fixture(html `<glide-core-button-group>
239
- <glide-core-button-group-button value="value-1" selected
240
- >Button 1</glide-core-button-group-button
241
- >
242
- <glide-core-button-group-button value="value-2" disabled
243
- >Button 2</glide-core-button-group-button
244
- >
221
+ it('does not emit a "input" event a button is selected programmatically', async () => {
222
+ const component = await fixture(html `<glide-core-button-group>
223
+ <glide-core-button-group-button
224
+ label="One"
225
+ selected
226
+ ></glide-core-button-group-button>
227
+
228
+ <glide-core-button-group-button
229
+ label="Two"
230
+ ></glide-core-button-group-button>
245
231
  </glide-core-button-group>`);
246
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
247
- await sendKeys({ press: 'Tab' });
248
- const liElement = buttonElements[0].shadowRoot.querySelector('li');
249
- expect(liElement).to.exist;
250
- liElement?.click();
251
- await elementUpdated(element);
252
- expect(buttonElements[0]).to.have.focus;
253
- expect(buttonElements[0]).to.have.attribute('selected');
254
- expect(buttonElements[1]).to.not.have.attribute('selected');
255
- });
256
- it('changes the "selected" attribute when pressing arrow and space keys', async () => {
257
- await fixture(html `<glide-core-button-group>
258
- <glide-core-button-group-button value="value-1" selected
259
- >Button 1</glide-core-button-group-button
260
- >
261
- <glide-core-button-group-button value="value-2"
262
- >Button 2</glide-core-button-group-button
263
- >
264
- <glide-core-button-group-button value="value-3"
265
- >Button 3</glide-core-button-group-button
266
- >
267
- </glide-core-button-group>`);
268
- const buttonElements = document.querySelectorAll('glide-core-button-group-button');
269
- await sendKeys({ press: 'Tab' });
270
- await sendKeys({ press: 'ArrowRight' });
271
- expect(buttonElements[1]).to.have.focus;
272
- expect(buttonElements[1]).to.have.attribute('selected');
273
- expect(buttonElements[0]).to.not.have.attribute('selected');
274
- await sendKeys({ press: 'ArrowDown' });
275
- expect(buttonElements[2]).to.have.focus;
276
- expect(buttonElements[2]).to.have.attribute('selected');
277
- expect(buttonElements[1]).to.not.have.attribute('selected');
278
- await sendKeys({ press: 'ArrowUp' });
279
- expect(buttonElements[1]).to.have.focus;
280
- expect(buttonElements[1]).to.have.attribute('selected');
281
- expect(buttonElements[2]).to.not.have.attribute('selected');
282
- await sendKeys({ press: 'ArrowLeft' });
283
- expect(buttonElements[0]).to.have.focus;
284
- expect(buttonElements[0]).to.have.attribute('selected');
285
- expect(buttonElements[1]).to.not.have.attribute('selected');
286
- buttonElements[2].focus();
287
- await sendKeys({ press: ' ' });
288
- expect(buttonElements[2]).to.have.focus;
289
- expect(buttonElements[2]).to.have.attribute('selected');
290
- expect(buttonElements[0]).to.not.have.attribute('selected');
232
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
233
+ const spy = sinon.spy();
234
+ component.addEventListener('input', spy);
235
+ setTimeout(() => {
236
+ buttons[1].selected = true;
237
+ });
238
+ expect(spy.callCount).to.equal(0);
291
239
  });
@@ -0,0 +1 @@
1
+ import './button-group.button.js';
@@ -0,0 +1,39 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import './button-group.button.js';
3
+ import { expect, fixture, html } from '@open-wc/testing';
4
+ import { sendKeys } from '@web/test-runner-commands';
5
+ import GlideCoreButtonGroup from './button-group.js';
6
+ import GlideCoreButtonGroupButton from './button-group.button.js';
7
+ GlideCoreButtonGroup.shadowRootOptions.mode = 'open';
8
+ GlideCoreButtonGroupButton.shadowRootOptions.mode = 'open';
9
+ it('moves focus', async () => {
10
+ await fixture(html `<glide-core-button-group>
11
+ <glide-core-button-group-button
12
+ label="One"
13
+ ></glide-core-button-group-button>
14
+
15
+ <glide-core-button-group-button
16
+ label="Two"
17
+ disabled
18
+ ></glide-core-button-group-button>
19
+
20
+ <glide-core-button-group-button
21
+ label="Three"
22
+ ></glide-core-button-group-button>
23
+
24
+ <glide-core-button-group-button
25
+ label="Four"
26
+ selected
27
+ ></glide-core-button-group-button>
28
+ </glide-core-button-group>`);
29
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
30
+ buttons[3]?.focus();
31
+ await sendKeys({ press: 'ArrowRight' });
32
+ expect(buttons[0]).to.have.focus;
33
+ await sendKeys({ press: 'ArrowUp' });
34
+ expect(buttons[3]).to.have.focus;
35
+ await sendKeys({ press: 'ArrowLeft' });
36
+ expect(buttons[2]).to.have.focus;
37
+ await sendKeys({ press: 'ArrowDown' });
38
+ expect(buttons[3]).to.have.focus;
39
+ });
@@ -0,0 +1 @@
1
+ import './button-group.button.js';
@@ -0,0 +1,91 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import './button-group.button.js';
3
+ import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
4
+ import { sendKeys } from '@web/test-runner-commands';
5
+ import GlideCoreButtonGroup from './button-group.js';
6
+ import GlideCoreButtonGroupButton from './button-group.button.js';
7
+ GlideCoreButtonGroup.shadowRootOptions.mode = 'open';
8
+ GlideCoreButtonGroupButton.shadowRootOptions.mode = 'open';
9
+ it('selects a button when clicked', async () => {
10
+ const component = await fixture(html `<glide-core-button-group>
11
+ <glide-core-button-group-button
12
+ label="One"
13
+ selected
14
+ ></glide-core-button-group-button>
15
+
16
+ <glide-core-button-group-button
17
+ label="Two"
18
+ ></glide-core-button-group-button>
19
+ </glide-core-button-group>`);
20
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
21
+ buttons[1]?.click();
22
+ await elementUpdated(component);
23
+ expect(buttons[0].selected).to.be.false;
24
+ expect(buttons[1].selected).to.be.true;
25
+ });
26
+ it('selects buttons when arrowing', async () => {
27
+ await fixture(html `<glide-core-button-group>
28
+ <glide-core-button-group-button
29
+ label="One"
30
+ disabled
31
+ ></glide-core-button-group-button>
32
+
33
+ <glide-core-button-group-button
34
+ label="Two"
35
+ selected
36
+ ></glide-core-button-group-button>
37
+
38
+ <glide-core-button-group-button
39
+ label="Three"
40
+ ></glide-core-button-group-button>
41
+
42
+ <glide-core-button-group-button
43
+ label="Four"
44
+ disabled
45
+ ></glide-core-button-group-button>
46
+ </glide-core-button-group>`);
47
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
48
+ buttons[1]?.focus();
49
+ await sendKeys({ press: 'ArrowRight' });
50
+ expect(buttons[2].selected).to.be.true;
51
+ await sendKeys({ press: 'ArrowDown' });
52
+ expect(buttons[1].selected).to.be.true;
53
+ await sendKeys({ press: 'ArrowLeft' });
54
+ expect(buttons[2].selected).to.be.true;
55
+ await sendKeys({ press: 'ArrowUp' });
56
+ expect(buttons[1].selected).to.be.true;
57
+ });
58
+ it('selects a button on Space', async () => {
59
+ await fixture(html `<glide-core-button-group>
60
+ <glide-core-button-group-button
61
+ label="One"
62
+ selected
63
+ ></glide-core-button-group-button>
64
+
65
+ <glide-core-button-group-button
66
+ label="Two"
67
+ ></glide-core-button-group-button>
68
+ </glide-core-button-group>`);
69
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
70
+ buttons[1]?.focus();
71
+ await sendKeys({ press: 'Space' });
72
+ expect(buttons[0].selected).to.be.false;
73
+ expect(buttons[1].selected).to.be.true;
74
+ });
75
+ it('does not select a disabled button', async () => {
76
+ await fixture(html `<glide-core-button-group>
77
+ <glide-core-button-group-button
78
+ label="One"
79
+ selected
80
+ ></glide-core-button-group-button>
81
+
82
+ <glide-core-button-group-button
83
+ label="Two"
84
+ disabled
85
+ ></glide-core-button-group-button>
86
+ </glide-core-button-group>`);
87
+ const buttons = document.querySelectorAll('glide-core-button-group-button');
88
+ buttons[1]?.click();
89
+ expect(buttons[0].selected).to.be.true;
90
+ expect(buttons[1].selected).to.be.false;
91
+ });