@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,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- import { expect, fixture } from '@open-wc/testing';
2
+ import { expect, fixture, html } from '@open-wc/testing';
3
3
  import { sendKeys } from '@web/test-runner-commands';
4
4
  import GlideCoreTextarea from './textarea.js';
5
5
  GlideCoreTextarea.shadowRootOptions.mode = 'open';
@@ -7,13 +7,17 @@ it('registers', async () => {
7
7
  expect(window.customElements.get('glide-core-textarea')).to.equal(GlideCoreTextarea);
8
8
  });
9
9
  it('is accessible', async () => {
10
- const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
11
- const element = await fixture(template);
10
+ const element = await fixture(html `<glide-core-textarea
11
+ value="value"
12
+ label="label"
13
+ ></glide-core-textarea>`);
12
14
  await expect(element).to.be.accessible();
13
15
  });
14
16
  it('renders a textarea with two rows and value when attribute `value` is set ', async () => {
15
- const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
16
- const element = await fixture(template);
17
+ const element = await fixture(html `<glide-core-textarea
18
+ value="value"
19
+ label="label"
20
+ ></glide-core-textarea>`);
17
21
  const textarea = element.shadowRoot.querySelector('textarea');
18
22
  expect(element);
19
23
  expect(element).to.have.attribute('rows', '2');
@@ -21,119 +25,151 @@ it('renders a textarea with two rows and value when attribute `value` is set ',
21
25
  expect(textarea).to.have.attribute('rows', '2');
22
26
  });
23
27
  it('renders the `rows` attribute on the textarea when set', async () => {
24
- const template = `<glide-core-textarea value="value" label="label" rows="5"></glide-core-textarea>`;
25
- const element = await fixture(template);
28
+ const element = await fixture(html `<glide-core-textarea
29
+ value="value"
30
+ label="label"
31
+ rows="5"
32
+ ></glide-core-textarea>`);
26
33
  const textarea = element.shadowRoot.querySelector('textarea');
27
34
  expect(textarea).to.have.attribute('rows', '5');
28
35
  });
29
36
  it('renders a label when attribute `label` is set', async () => {
30
- const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
31
- const element = await fixture(template);
37
+ const element = await fixture(html `<glide-core-textarea
38
+ value="value"
39
+ label="label"
40
+ ></glide-core-textarea>`);
32
41
  const label = element.shadowRoot.querySelector('label');
33
42
  expect(label).to.exist;
34
43
  expect(label?.textContent?.trim()).to.be.equal('label');
35
44
  });
36
45
  it('renders the textarea as readonly when attribute `readonly` is set', async () => {
37
- const template = `<glide-core-textarea value="value" label="label" readonly></glide-core-textarea>`;
38
- const element = await fixture(template);
46
+ const element = await fixture(html `<glide-core-textarea
47
+ value="value"
48
+ label="label"
49
+ readonly
50
+ ></glide-core-textarea>`);
39
51
  const textarea = element.shadowRoot.querySelector('textarea');
40
52
  expect(textarea).to.have.attribute('readonly');
41
53
  });
42
54
  it('renders the textarea as disabled when attribute `disabled` is set', async () => {
43
- const template = `<glide-core-textarea value="value" label="label" disabled></glide-core-textarea>`;
44
- const element = await fixture(template);
55
+ const element = await fixture(html `<glide-core-textarea
56
+ value="value"
57
+ label="label"
58
+ disabled
59
+ ></glide-core-textarea>`);
45
60
  const textarea = element.shadowRoot.querySelector('textarea');
46
61
  expect(textarea).to.have.attribute('disabled');
47
62
  });
48
63
  it('renders the textarea with a placeholder when attribute `placeholder` is set', async () => {
49
- const template = `<glide-core-textarea value="" label="label" placeholder="placeholder"></glide-core-textarea>`;
50
- const element = await fixture(template);
64
+ const element = await fixture(html `<glide-core-textarea
65
+ value=""
66
+ label="label"
67
+ placeholder="placeholder"
68
+ ></glide-core-textarea>`);
51
69
  const textarea = element.shadowRoot.querySelector('textarea');
52
70
  expect(textarea).to.have.attribute('placeholder', 'placeholder');
53
71
  });
54
72
  it('renders `required` on textarea when set', async () => {
55
- const template = `<glide-core-textarea value="value" label="label" required></glide-core-textarea>`;
56
- const element = await fixture(template);
73
+ const element = await fixture(html `<glide-core-textarea
74
+ value="value"
75
+ label="label"
76
+ required
77
+ ></glide-core-textarea>`);
57
78
  const textarea = element.shadowRoot.querySelector('textarea');
58
79
  expect(textarea).to.have.attribute('required');
59
80
  });
60
81
  it('renders a `name` attribute on the textarea when set', async () => {
61
- const template = `<glide-core-textarea value="value" label="label" name="test-name"></glide-core-textarea>`;
62
- const element = await fixture(template);
82
+ const element = await fixture(html `<glide-core-textarea
83
+ value="value"
84
+ label="label"
85
+ name="test-name"
86
+ ></glide-core-textarea>`);
63
87
  const textarea = element.shadowRoot.querySelector('textarea');
64
88
  expect(textarea).to.have.attribute('name', 'test-name');
65
89
  });
66
90
  it('supports a "tooltip" slot', async () => {
67
- const template = `
91
+ const element = await fixture(html `
68
92
  <glide-core-textarea value="value" label="label" required>
69
93
  <div slot="tooltip">Tooltip</div>
70
94
  </glide-core-textarea>
71
- `;
72
- const element = await fixture(template);
95
+ `);
73
96
  const assignedElements = element.shadowRoot
74
97
  ?.querySelector('slot[name="tooltip"]')
75
98
  ?.assignedElements();
76
99
  expect(assignedElements?.at(0)?.textContent).to.equal('Tooltip');
77
100
  });
78
101
  it('renders a slot with description', async () => {
79
- const template = `<glide-core-textarea value="value" label="label"><span slot="description" data-test-content>Description</slot></glide-core-textarea>`;
80
- const element = await fixture(template);
102
+ const element = await fixture(html `<glide-core-textarea value="value" label="label"
103
+ ><span slot="description" data-test-content
104
+ >Description</span
105
+ ></glide-core-textarea
106
+ >`);
81
107
  expect(element).to.exist;
82
108
  const contentRendered = element.querySelector('[data-test-content]');
83
109
  expect(contentRendered).to.exist;
84
110
  expect(contentRendered?.textContent).to.be.equal('Description');
85
111
  });
112
+ it('displays visually hidden character count text for screenreaders', async () => {
113
+ const element = await fixture(html `<glide-core-textarea
114
+ label="label"
115
+ maxlength="10"
116
+ ></glide-core-textarea>`);
117
+ const maxCharacterCountAnnouncement = element.shadowRoot?.querySelector('[data-test="character-count-announcement"]');
118
+ expect(maxCharacterCountAnnouncement?.textContent?.trim()).to.equal('Character count 0 of 10');
119
+ });
86
120
  it('renders a character count when attribute `maxlength` is set greater than zero', async () => {
87
- const template = `<glide-core-textarea value="value" label="label" maxlength="10"><span slot="description">Description</span></glide-core-textarea>`;
88
- const element = await fixture(template);
89
- const container = element.shadowRoot.querySelector('[data-test-maxlength]');
121
+ const element = await fixture(html `<glide-core-textarea value="value" label="label" maxlength="10"
122
+ ><span slot="description">Description</span></glide-core-textarea
123
+ >`);
124
+ const container = element.shadowRoot.querySelector('[data-test="character-count-text"]');
90
125
  expect(container?.textContent?.trim()).to.be.equal('5/10');
91
126
  });
92
127
  it('does not render a character count when attribute `maxlength` is set less than than zero', async () => {
93
- const template = `<glide-core-textarea value="value" label="label" maxlength="0"><span slot="description" data-test-content>Description</span></glide-core-textarea>`;
94
- const element = await fixture(template);
95
- const container = element.shadowRoot.querySelector('[data-test-description-container]');
96
- expect(container?.textContent?.trim()).to.be.equal('');
128
+ const element = await fixture(html `<glide-core-textarea value="value" label="label" maxlength="0"
129
+ ><span slot="description">Description</span></glide-core-textarea
130
+ >`);
131
+ const container = element.shadowRoot?.querySelector('[data-test="character-count-container"]');
132
+ expect(container).to.be.null;
97
133
  });
98
134
  it('focuses the textarea when the label is clicked', async () => {
99
- const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
100
- const element = await fixture(template);
135
+ const element = await fixture(html `<glide-core-textarea
136
+ value="value"
137
+ label="label"
138
+ ></glide-core-textarea>`);
101
139
  const label = element.shadowRoot.querySelector('label');
102
140
  label?.click();
103
141
  expect(element).to.have.focus;
104
142
  await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
105
143
  });
106
144
  it('has tabbable textarea', async () => {
107
- const template = `<glide-core-textarea value="value" label="label"></glide-core-textarea>`;
108
- const element = await fixture(template);
145
+ const element = await fixture(html `<glide-core-textarea
146
+ value="value"
147
+ label="label"
148
+ ></glide-core-textarea>`);
109
149
  await sendKeys({ press: 'Tab' });
110
150
  expect(element).to.have.focus;
111
151
  await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
112
152
  });
113
153
  it('renders text when typed into text area', async () => {
114
- const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
115
- const element = await fixture(template);
154
+ const element = await fixture(html `<glide-core-textarea value="" label="label"></glide-core-textarea>`);
116
155
  const textarea = element.shadowRoot.querySelector('textarea');
117
156
  element.focus();
118
157
  await sendKeys({ type: 'test text' });
119
158
  expect(textarea?.value).to.equal('test text');
120
159
  });
121
160
  it('returns the content of the textarea when getting the `value` property', async () => {
122
- const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
123
- const element = await fixture(template);
161
+ const element = await fixture(html `<glide-core-textarea value="" label="label"></glide-core-textarea>`);
124
162
  element.focus();
125
163
  await sendKeys({ type: 'test text' });
126
164
  expect(element.value).to.equal('test text');
127
165
  });
128
- it('focuses the textarea when `focus` is called', async () => {
129
- const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
130
- const element = await fixture(template);
166
+ it('focuses the textarea when `focus()` is called', async () => {
167
+ const element = await fixture(html `<glide-core-textarea value="" label="label"></glide-core-textarea>`);
131
168
  element.focus();
132
169
  await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
133
170
  });
134
171
  it('blurs the textarea when `blur` is called', async () => {
135
- const template = `<glide-core-textarea value="" label="label"></glide-core-textarea>`;
136
- const element = await fixture(template);
172
+ const element = await fixture(html `<glide-core-textarea value="" label="label"></glide-core-textarea>`);
137
173
  element.focus();
138
174
  await expect(element.shadowRoot?.activeElement?.tagName.toLocaleLowerCase()).to.be.equal('textarea');
139
175
  element.blur();
@@ -1,11 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
2
  import './textarea.js';
3
3
  import * as sinon from 'sinon';
4
- import { aTimeout, expect, fixture, oneEvent } from '@open-wc/testing';
4
+ import { aTimeout, expect, fixture, html, oneEvent } from '@open-wc/testing';
5
5
  import { sendKeys } from '@web/test-runner-commands';
6
6
  it('dispatches a `input` event when typed in', async () => {
7
- const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
8
- const textarea = await fixture(template);
7
+ const textarea = await fixture(html `<glide-core-textarea label="label"></glide-core-textarea>`);
9
8
  setTimeout(async () => {
10
9
  textarea.focus();
11
10
  await sendKeys({ type: 'testing' });
@@ -16,8 +15,7 @@ it('dispatches a `input` event when typed in', async () => {
16
15
  expect(event.bubbles).to.be.true;
17
16
  });
18
17
  it('dispatches an `change` event when typed in', async () => {
19
- const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
20
- const textarea = await fixture(template);
18
+ const textarea = await fixture(html `<glide-core-textarea label="label"></glide-core-textarea>`);
21
19
  setTimeout(async () => {
22
20
  textarea.focus();
23
21
  await sendKeys({ type: 'testing' });
@@ -29,8 +27,7 @@ it('dispatches an `change` event when typed in', async () => {
29
27
  });
30
28
  it('dispatches an `invalid` event on submit when required and no value', async () => {
31
29
  const form = document.createElement('form');
32
- const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
33
- const textarea = await fixture(template, {
30
+ const textarea = await fixture(html `<glide-core-textarea label="label" required></glide-core-textarea>`, {
34
31
  parentNode: form,
35
32
  });
36
33
  setTimeout(() => form.requestSubmit());
@@ -39,8 +36,7 @@ it('dispatches an `invalid` event on submit when required and no value', async (
39
36
  });
40
37
  it('dispatches an `invalid` event after `checkValidity` is called when required and no value', async () => {
41
38
  const form = document.createElement('form');
42
- const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
43
- const textarea = await fixture(template, {
39
+ const textarea = await fixture(html `<glide-core-textarea label="label" required></glide-core-textarea>`, {
44
40
  parentNode: form,
45
41
  });
46
42
  setTimeout(() => textarea.checkValidity());
@@ -49,8 +45,7 @@ it('dispatches an `invalid` event after `checkValidity` is called when required
49
45
  });
50
46
  it('dispatches an `invalid` event after `reportValidity` is called when required and no value', async () => {
51
47
  const form = document.createElement('form');
52
- const template = `<glide-core-textarea label="label" required></glide-core-textarea>`;
53
- const textarea = await fixture(template, {
48
+ const textarea = await fixture(html `<glide-core-textarea label="label" required></glide-core-textarea>`, {
54
49
  parentNode: form,
55
50
  });
56
51
  setTimeout(() => textarea.reportValidity());
@@ -59,56 +54,62 @@ it('dispatches an `invalid` event after `reportValidity` is called when required
59
54
  });
60
55
  it('does not dispatch an `invalid` event after `checkValidity` is called when not required', async () => {
61
56
  const form = document.createElement('form');
62
- const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
63
- const textarea = await fixture(template, {
57
+ const textarea = await fixture(html `<glide-core-textarea label="label"></glide-core-textarea>`, {
64
58
  parentNode: form,
65
59
  });
66
60
  const spy = sinon.spy();
67
61
  textarea.addEventListener('invalid', spy);
68
62
  textarea.checkValidity();
69
63
  await aTimeout(0);
70
- expect(spy.notCalled).to.be.true;
64
+ expect(spy.callCount).to.equal(0);
71
65
  });
72
66
  it('does not dispatch an `invalid` event after `checkValidity` is called when required, no value, and disabled', async () => {
73
67
  const form = document.createElement('form');
74
- const template = `<glide-core-textarea label="label" required disabled></glide-core-textarea>`;
75
- const textarea = await fixture(template, {
68
+ const textarea = await fixture(html `<glide-core-textarea
69
+ label="label"
70
+ required
71
+ disabled
72
+ ></glide-core-textarea>`, {
76
73
  parentNode: form,
77
74
  });
78
75
  const spy = sinon.spy();
79
76
  textarea.addEventListener('invalid', spy);
80
77
  textarea.checkValidity();
81
78
  await aTimeout(0);
82
- expect(spy.notCalled).to.be.true;
79
+ expect(spy.callCount).to.equal(0);
83
80
  });
84
81
  it('does not dispatch an `invalid` event when `reportValidity` is called when not required,', async () => {
85
82
  const form = document.createElement('form');
86
- const template = `<glide-core-textarea label="label"></glide-core-textarea>`;
87
- const textarea = await fixture(template, {
83
+ const textarea = await fixture(html `<glide-core-textarea label="label"></glide-core-textarea>`, {
88
84
  parentNode: form,
89
85
  });
90
86
  const spy = sinon.spy();
91
87
  textarea.addEventListener('invalid', spy);
92
88
  textarea.reportValidity();
93
89
  await aTimeout(0);
94
- expect(spy.notCalled).to.be.true;
90
+ expect(spy.callCount).to.equal(0);
95
91
  });
96
92
  it('does not dispatch an `invalid` event when `reportValidity` is called when required, no value, and disabled', async () => {
97
93
  const form = document.createElement('form');
98
- const template = `<glide-core-textarea label="label" required disabled></glide-core-textarea>`;
99
- const textarea = await fixture(template, {
94
+ const textarea = await fixture(html `<glide-core-textarea
95
+ label="label"
96
+ required
97
+ disabled
98
+ ></glide-core-textarea>`, {
100
99
  parentNode: form,
101
100
  });
102
101
  const spy = sinon.spy();
103
102
  textarea.addEventListener('invalid', spy);
104
103
  textarea.reportValidity();
105
104
  await aTimeout(0);
106
- expect(spy.notCalled).to.be.true;
105
+ expect(spy.callCount).to.equal(0);
107
106
  });
108
107
  it('dispatches an `invalid` event after `requestSubmit` is called when `maxlength` exceeded', async () => {
109
108
  const form = document.createElement('form');
110
- const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
111
- const textarea = await fixture(template, {
109
+ const textarea = await fixture(html `<glide-core-textarea
110
+ label="label"
111
+ maxlength="3"
112
+ ></glide-core-textarea>`, {
112
113
  parentNode: form,
113
114
  });
114
115
  setTimeout(async () => {
@@ -121,8 +122,10 @@ it('dispatches an `invalid` event after `requestSubmit` is called when `maxlengt
121
122
  });
122
123
  it('dispatches an `invalid` event after `checkValidity` is called when `maxlength` exceeded', async () => {
123
124
  const form = document.createElement('form');
124
- const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
125
- const textarea = await fixture(template, {
125
+ const textarea = await fixture(html `<glide-core-textarea
126
+ label="label"
127
+ maxlength="3"
128
+ ></glide-core-textarea>`, {
126
129
  parentNode: form,
127
130
  });
128
131
  setTimeout(async () => {
@@ -135,8 +138,10 @@ it('dispatches an `invalid` event after `checkValidity` is called when `maxlengt
135
138
  });
136
139
  it('dispatches an `invalid` event after `reportValidity` is called when `maxlength` exceeded', async () => {
137
140
  const form = document.createElement('form');
138
- const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
139
- const textarea = await fixture(template, {
141
+ const textarea = await fixture(html `<glide-core-textarea
142
+ label="label"
143
+ maxlength="3"
144
+ ></glide-core-textarea>`, {
140
145
  parentNode: form,
141
146
  });
142
147
  setTimeout(async () => {
@@ -149,8 +154,10 @@ it('dispatches an `invalid` event after `reportValidity` is called when `maxleng
149
154
  });
150
155
  it('does not dispatch an `invalid` event after `checkValidity` is called when `maxlength` not exceeded', async () => {
151
156
  const form = document.createElement('form');
152
- const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
153
- const textarea = await fixture(template, {
157
+ const textarea = await fixture(html `<glide-core-textarea
158
+ label="label"
159
+ maxlength="3"
160
+ ></glide-core-textarea>`, {
154
161
  parentNode: form,
155
162
  });
156
163
  const spy = sinon.spy();
@@ -159,12 +166,15 @@ it('does not dispatch an `invalid` event after `checkValidity` is called when `m
159
166
  await sendKeys({ type: 'ab' });
160
167
  textarea.checkValidity();
161
168
  await aTimeout(0);
162
- expect(spy.notCalled).to.be.true;
169
+ expect(spy.callCount).to.equal(0);
163
170
  });
164
171
  it('does not dispatch an `invalid` event after `checkValidity` is called when `maxlength` exceeded and disabled', async () => {
165
172
  const form = document.createElement('form');
166
- const template = `<glide-core-textarea label="label" maxlength="3" disabled></glide-core-textarea>`;
167
- const textarea = await fixture(template, {
173
+ const textarea = await fixture(html `<glide-core-textarea
174
+ label="label"
175
+ maxlength="3"
176
+ disabled
177
+ ></glide-core-textarea>`, {
168
178
  parentNode: form,
169
179
  });
170
180
  const spy = sinon.spy();
@@ -173,12 +183,14 @@ it('does not dispatch an `invalid` event after `checkValidity` is called when `m
173
183
  await sendKeys({ type: 'test' });
174
184
  textarea.checkValidity();
175
185
  await aTimeout(0);
176
- expect(spy.notCalled).to.be.true;
186
+ expect(spy.callCount).to.equal(0);
177
187
  });
178
188
  it('does not dispatch an `invalid` event when `reportValidity` is called and `maxlength` is not exceeded,', async () => {
179
189
  const form = document.createElement('form');
180
- const template = `<glide-core-textarea label="label" maxlength="3"></glide-core-textarea>`;
181
- const textarea = await fixture(template, {
190
+ const textarea = await fixture(html `<glide-core-textarea
191
+ label="label"
192
+ maxlength="3"
193
+ ></glide-core-textarea>`, {
182
194
  parentNode: form,
183
195
  });
184
196
  const spy = sinon.spy();
@@ -187,12 +199,15 @@ it('does not dispatch an `invalid` event when `reportValidity` is called and `ma
187
199
  await sendKeys({ type: 'ab' });
188
200
  textarea.reportValidity();
189
201
  await aTimeout(0);
190
- expect(spy.notCalled).to.be.true;
202
+ expect(spy.callCount).to.equal(0);
191
203
  });
192
204
  it('does not dispatch an `invalid` event when `reportValidity` is called `maxlength` exceeded and disabled,', async () => {
193
205
  const form = document.createElement('form');
194
- const template = `<glide-core-textarea label="label" maxlength="3" disabled></glide-core-textarea>`;
195
- const textarea = await fixture(template, {
206
+ const textarea = await fixture(html `<glide-core-textarea
207
+ label="label"
208
+ maxlength="3"
209
+ disabled
210
+ ></glide-core-textarea>`, {
196
211
  parentNode: form,
197
212
  });
198
213
  const spy = sinon.spy();
@@ -201,5 +216,5 @@ it('does not dispatch an `invalid` event when `reportValidity` is called `maxlen
201
216
  await sendKeys({ type: 'test' });
202
217
  textarea.reportValidity();
203
218
  await aTimeout(0);
204
- expect(spy.notCalled).to.be.true;
219
+ expect(spy.callCount).to.equal(0);
205
220
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
3
+ import GlideCoreTextarea from './textarea.js';
4
+ GlideCoreTextarea.shadowRootOptions.mode = 'open';
5
+ it('renders dynamic strings in Japanese', async () => {
6
+ const element = await fixture(html `
7
+ <glide-core-textarea
8
+ label="Test"
9
+ value="lorem"
10
+ maxlength="40"
11
+ ></glide-core-textarea>
12
+ `);
13
+ document.documentElement.setAttribute('lang', 'ja');
14
+ await elementUpdated(element);
15
+ const maxCharacterCountText = element.shadowRoot?.querySelector('[data-test="character-count-text"]');
16
+ expect(maxCharacterCountText?.textContent?.trim()).to.equal('5/40');
17
+ const maxCharacterCountAnnouncement = element.shadowRoot?.querySelector('[data-test="character-count-announcement"]');
18
+ expect(maxCharacterCountAnnouncement?.textContent?.trim()).to.equal('Character count 5 of 40');
19
+ });
20
+ it('renders dynamic strings in French', async () => {
21
+ const element = await fixture(html `
22
+ <glide-core-textarea
23
+ label="Test"
24
+ value="lorem"
25
+ maxlength="40"
26
+ ></glide-core-textarea>
27
+ `);
28
+ document.documentElement.setAttribute('lang', 'fr');
29
+ await elementUpdated(element);
30
+ const maxCharacterCountText = element.shadowRoot?.querySelector('[data-test="character-count-text"]');
31
+ expect(maxCharacterCountText?.textContent?.trim()).to.equal('5/40');
32
+ const maxCharacterCountAnnouncement = element.shadowRoot?.querySelector('[data-test="character-count-announcement"]');
33
+ expect(maxCharacterCountAnnouncement?.textContent?.trim()).to.equal('Character count 5 of 40');
34
+ });