@crowdstrike/glide-core 0.8.0 → 0.9.1

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