@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
@@ -247,12 +247,208 @@ it('scrolls using keyboard when there is overflow and only a few pixels of overf
247
247
  await sendKeys({ press: 'ArrowRight' });
248
248
  await waitUntil(() => tabGroup?.shadowRoot?.querySelector('[data-test="overflow-end-button"]') === null);
249
249
  expect(tabGroup?.tabElements[3]).to.have.focus;
250
- expect(spy.called).to.be.true;
250
+ expect(spy.callCount).to.equal(1);
251
251
  spy.resetHistory();
252
252
  await sendKeys({ press: 'ArrowLeft' });
253
253
  await sendKeys({ press: 'ArrowLeft' });
254
254
  await sendKeys({ press: 'ArrowLeft' });
255
255
  await waitUntil(() => tabGroup?.shadowRoot?.querySelector('[data-test="overflow-start-button"]') === null);
256
256
  expect(tabGroup?.tabElements[0]).to.have.focus;
257
- expect(spy.called).to.be.true;
257
+ expect(spy.callCount).to.equal(1);
258
+ });
259
+ it('has only one active tab that is tabbable after pressing the Enter key', async () => {
260
+ const tabGroup = await fixture(html `
261
+ <glide-core-tab-group>
262
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
263
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
264
+ <glide-core-tab slot="nav" panel="3">Tab 3</glide-core-tab>
265
+ <glide-core-tab slot="nav" panel="4">Tab 4</glide-core-tab>
266
+
267
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
268
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
269
+ <glide-core-tab-panel name="3">Content for Tab 3</glide-core-tab-panel>
270
+ <glide-core-tab-panel name="4">Content for Tab 4</glide-core-tab-panel>
271
+ </glide-core-tab-group>
272
+ `);
273
+ const [firstTab, secondTab, thirdTab, fourthTab] = tabGroup.tabElements;
274
+ expect(firstTab.active).to.be.true;
275
+ expect(secondTab.active).to.be.false;
276
+ expect(thirdTab.active).to.be.false;
277
+ expect(fourthTab.active).to.be.false;
278
+ expect(firstTab.tabIndex).to.equal(0);
279
+ expect(secondTab.tabIndex).to.equal(-1);
280
+ expect(thirdTab.tabIndex).to.equal(-1);
281
+ expect(fourthTab.tabIndex).to.equal(-1);
282
+ firstTab.focus();
283
+ await sendKeys({ press: 'ArrowRight' });
284
+ await sendKeys({ press: 'Enter' });
285
+ expect(firstTab.active).to.be.false;
286
+ expect(secondTab.active).to.be.true;
287
+ expect(thirdTab.active).to.be.false;
288
+ expect(fourthTab.active).to.be.false;
289
+ expect(firstTab.tabIndex).to.equal(-1);
290
+ expect(secondTab.tabIndex).to.equal(0);
291
+ expect(thirdTab.tabIndex).to.equal(-1);
292
+ expect(fourthTab.tabIndex).to.equal(-1);
293
+ await sendKeys({ press: 'End' });
294
+ await sendKeys({ press: 'Enter' });
295
+ expect(firstTab.active).to.be.false;
296
+ expect(secondTab.active).to.be.false;
297
+ expect(thirdTab.active).to.be.false;
298
+ expect(fourthTab.active).to.be.true;
299
+ expect(firstTab.tabIndex).to.equal(-1);
300
+ expect(secondTab.tabIndex).to.equal(-1);
301
+ expect(thirdTab.tabIndex).to.equal(-1);
302
+ expect(fourthTab.tabIndex).to.equal(0);
303
+ await sendKeys({ press: 'ArrowLeft' });
304
+ await sendKeys({ press: 'Enter' });
305
+ expect(firstTab.active).to.be.false;
306
+ expect(secondTab.active).to.be.false;
307
+ expect(thirdTab.active).to.be.true;
308
+ expect(fourthTab.active).to.be.false;
309
+ expect(firstTab.tabIndex).to.equal(-1);
310
+ expect(secondTab.tabIndex).to.equal(-1);
311
+ expect(thirdTab.tabIndex).to.equal(0);
312
+ expect(fourthTab.tabIndex).to.equal(-1);
313
+ await sendKeys({ press: 'Home' });
314
+ await sendKeys({ press: 'Enter' });
315
+ expect(firstTab.active).to.be.true;
316
+ expect(secondTab.active).to.be.false;
317
+ expect(thirdTab.active).to.be.false;
318
+ expect(fourthTab.active).to.be.false;
319
+ expect(firstTab.tabIndex).to.equal(0);
320
+ expect(secondTab.tabIndex).to.equal(-1);
321
+ expect(thirdTab.tabIndex).to.equal(-1);
322
+ expect(fourthTab.tabIndex).to.equal(-1);
323
+ });
324
+ it('has only one active tab that is tabbable when clicked', async () => {
325
+ const tabGroup = await fixture(html `
326
+ <glide-core-tab-group>
327
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
328
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
329
+ <glide-core-tab slot="nav" panel="3">Tab 3</glide-core-tab>
330
+
331
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
332
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
333
+ <glide-core-tab-panel name="3">Content for Tab 3</glide-core-tab-panel>
334
+ </glide-core-tab-group>
335
+ `);
336
+ const [firstTab, secondTab, thirdTab] = tabGroup.tabElements;
337
+ expect(firstTab.active).to.be.true;
338
+ expect(secondTab.active).to.be.false;
339
+ expect(thirdTab.active).to.be.false;
340
+ expect(firstTab.tabIndex).to.equal(0);
341
+ expect(secondTab.tabIndex).to.equal(-1);
342
+ expect(thirdTab.tabIndex).to.equal(-1);
343
+ secondTab.click();
344
+ expect(firstTab.active).to.be.false;
345
+ expect(secondTab.active).to.be.true;
346
+ expect(thirdTab.active).to.be.false;
347
+ expect(firstTab.tabIndex).to.equal(-1);
348
+ expect(secondTab.tabIndex).to.equal(0);
349
+ expect(thirdTab.tabIndex).to.equal(-1);
350
+ thirdTab.click();
351
+ expect(firstTab.active).to.be.false;
352
+ expect(secondTab.active).to.be.false;
353
+ expect(thirdTab.active).to.be.true;
354
+ expect(firstTab.tabIndex).to.equal(-1);
355
+ expect(secondTab.tabIndex).to.equal(-1);
356
+ expect(thirdTab.tabIndex).to.equal(0);
357
+ });
358
+ it('has only one tab panel that is active and tabbable when a tab is clicked', async () => {
359
+ const tabGroup = await fixture(html `
360
+ <glide-core-tab-group>
361
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
362
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
363
+
364
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
365
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
366
+ </glide-core-tab-group>
367
+ `);
368
+ const [, secondTab] = tabGroup.tabElements;
369
+ const [firstPanel, secondPanel] = tabGroup.panelElements;
370
+ expect(firstPanel.isActive).to.be.true;
371
+ expect(secondPanel.isActive).to.be.false;
372
+ expect(firstPanel.tabIndex).to.equal(0);
373
+ expect(secondPanel.tabIndex).to.equal(-1);
374
+ secondTab.click();
375
+ expect(firstPanel.isActive).to.be.false;
376
+ expect(secondPanel.isActive).to.be.true;
377
+ expect(firstPanel.tabIndex).to.equal(-1);
378
+ expect(secondPanel.tabIndex).to.equal(0);
379
+ });
380
+ it('has only one tab panel that is active and tabbable when using the keyboard to make selections', async () => {
381
+ const tabGroup = await fixture(html `
382
+ <glide-core-tab-group>
383
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
384
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
385
+
386
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
387
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
388
+ </glide-core-tab-group>
389
+ `);
390
+ const [firstTab] = tabGroup.tabElements;
391
+ const [firstPanel, secondPanel] = tabGroup.panelElements;
392
+ expect(firstPanel.isActive).to.be.true;
393
+ expect(secondPanel.isActive).to.be.false;
394
+ expect(firstPanel.tabIndex).to.equal(0);
395
+ expect(secondPanel.tabIndex).to.equal(-1);
396
+ firstTab.focus();
397
+ await sendKeys({ press: 'ArrowRight' });
398
+ await sendKeys({ press: 'Enter' });
399
+ expect(firstPanel.isActive).to.be.false;
400
+ expect(secondPanel.isActive).to.be.true;
401
+ expect(firstPanel.tabIndex).to.equal(-1);
402
+ expect(secondPanel.tabIndex).to.equal(0);
403
+ });
404
+ it('sets the last keyboard focused tab as tabbable ', async () => {
405
+ const tabGroup = await fixture(html `
406
+ <glide-core-tab-group>
407
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
408
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
409
+
410
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
411
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
412
+ </glide-core-tab-group>
413
+ `);
414
+ const [firstTab, secondTab] = tabGroup.tabElements;
415
+ expect(firstTab.active).to.be.true;
416
+ expect(secondTab.active).to.be.false;
417
+ expect(firstTab.tabIndex).to.equal(0);
418
+ expect(secondTab.tabIndex).to.equal(-1);
419
+ firstTab.focus();
420
+ await sendKeys({ press: 'ArrowRight' });
421
+ expect(firstTab.active).to.be.true;
422
+ expect(secondTab.active).to.be.false;
423
+ expect(firstTab.tabIndex).to.equal(-1);
424
+ expect(secondTab.tabIndex).to.equal(0);
425
+ });
426
+ it('sets the active tab as tabbable on tab blur', async () => {
427
+ // This behavior is to ensure that the last active tab is the first tabbable
428
+ // element in the component.
429
+ const tabGroup = await fixture(html `
430
+ <glide-core-tab-group>
431
+ <glide-core-tab slot="nav" panel="1">Tab 1</glide-core-tab>
432
+ <glide-core-tab slot="nav" panel="2">Tab 2</glide-core-tab>
433
+
434
+ <glide-core-tab-panel name="1">Content for Tab 1</glide-core-tab-panel>
435
+ <glide-core-tab-panel name="2">Content for Tab 2</glide-core-tab-panel>
436
+ </glide-core-tab-group>
437
+ `);
438
+ const [firstTab, secondTab] = tabGroup.tabElements;
439
+ expect(firstTab.active).to.be.true;
440
+ expect(secondTab.active).to.be.false;
441
+ expect(firstTab.tabIndex).to.equal(0);
442
+ expect(secondTab.tabIndex).to.equal(-1);
443
+ firstTab.focus();
444
+ await sendKeys({ press: 'ArrowRight' });
445
+ expect(firstTab.active).to.be.true;
446
+ expect(secondTab.active).to.be.false;
447
+ expect(firstTab.tabIndex).to.equal(-1);
448
+ expect(secondTab.tabIndex).to.equal(0);
449
+ secondTab.blur();
450
+ expect(firstTab.active).to.be.true;
451
+ expect(secondTab.active).to.be.false;
452
+ expect(firstTab.tabIndex).to.equal(0);
453
+ expect(secondTab.tabIndex).to.equal(-1);
258
454
  });
package/dist/tab.js CHANGED
@@ -1 +1 @@
1
- var GlideCoreTab_1,__decorate=this&&this.__decorate||function(t,e,i,s){var o,a=arguments.length,r=a<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,i,s);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(a<3?o(r):a>3?o(e,i,r):o(e,i))||r);return a>3&&r&&Object.defineProperty(e,i,r),r};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import styles from"./tab.styles.js";let GlideCoreTab=class GlideCoreTab extends LitElement{constructor(){super(...arguments),this.panel="",this.active=!1,this.disabled=!1}static{GlideCoreTab_1=this}static{this.instanceCount=0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.setAttribute("role","tab"),this.hasAttribute("id")||(this.id="glide-core-tab-"+GlideCoreTab_1.instanceCount++)}render(){return html`<div class="${classMap({component:!0,active:this.active,disabled:this.disabled})}"><span class="container"><slot name="icon"></slot><div class="default-slot"><slot></slot></div></span></div>`}updated(t){t.has("active")&&this.setAttribute("aria-selected",this.active?"true":"false"),t.has("disabled")&&(this.disabled?(this.setAttribute("aria-disabled","true"),this.setAttribute("tabindex","-1")):(this.removeAttribute("aria-disabled"),this.setAttribute("tabindex","0")))}};__decorate([property({reflect:!0})],GlideCoreTab.prototype,"panel",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreTab.prototype,"active",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreTab.prototype,"disabled",void 0),GlideCoreTab=GlideCoreTab_1=__decorate([customElement("glide-core-tab")],GlideCoreTab);export default GlideCoreTab;
1
+ var __decorate=this&&this.__decorate||function(t,e,i,o){var s,r=arguments.length,a=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,i,o);else for(var l=t.length-1;l>=0;l--)(s=t[l])&&(a=(r<3?s(a):r>3?s(e,i,a):s(e,i))||a);return r>3&&a&&Object.defineProperty(e,i,a),a};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import{nanoid}from"nanoid";import styles from"./tab.styles.js";let GlideCoreTab=class GlideCoreTab extends LitElement{constructor(){super(...arguments),this.panel="",this.active=!1,this.disabled=!1,this.#t=nanoid()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.setAttribute("role","tab"),this.id=this.#t}render(){return html`<div class="${classMap({component:!0,active:this.active,disabled:this.disabled})}"><span class="container"><slot name="icon"></slot><div class="default-slot"><slot></slot></div></span></div>`}updated(t){t.has("active")&&this.setAttribute("aria-selected",this.active?"true":"false"),t.has("disabled")&&(this.disabled?(this.setAttribute("aria-disabled","true"),this.setAttribute("tabindex","-1")):this.removeAttribute("aria-disabled"))}#t};__decorate([property({reflect:!0})],GlideCoreTab.prototype,"panel",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreTab.prototype,"active",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreTab.prototype,"disabled",void 0),GlideCoreTab=__decorate([customElement("glide-core-tab")],GlideCoreTab);export default GlideCoreTab;
@@ -11,6 +11,7 @@ declare global {
11
11
  *
12
12
  */
13
13
  export default class GlideCoreTabPanel extends LitElement {
14
+ #private;
14
15
  static instanceCount: number;
15
16
  static shadowRootOptions: ShadowRootInit;
16
17
  static styles: import("lit").CSSResult[];
package/dist/tab.panel.js CHANGED
@@ -1 +1 @@
1
- var GlideCoreTabPanel_1,__decorate=this&&this.__decorate||function(e,t,i,o){var a,s=arguments.length,r=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,o);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import styles from"./tab.panel.styles.js";let GlideCoreTabPanel=class GlideCoreTabPanel extends LitElement{constructor(){super(...arguments),this.name="",this.isActive=!0}static{GlideCoreTabPanel_1=this}static{this.instanceCount=0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.setAttribute("role","tabpanel"),this.hasAttribute("id")||(this.id="glide-core-tab-panel-"+GlideCoreTabPanel_1.instanceCount++)}render(){return html`<div class="${classMap({component:!0,hidden:!this.isActive})}"><slot></slot></div>`}updated(e){super.updated(e),e.has("isActive")&&this.setAttribute("aria-hidden",this.isActive?"false":"true")}};__decorate([property({reflect:!0})],GlideCoreTabPanel.prototype,"name",void 0),__decorate([property({type:Boolean})],GlideCoreTabPanel.prototype,"isActive",void 0),GlideCoreTabPanel=GlideCoreTabPanel_1=__decorate([customElement("glide-core-tab-panel")],GlideCoreTabPanel);export default GlideCoreTabPanel;
1
+ var __decorate=this&&this.__decorate||function(e,t,i,o){var s,r=arguments.length,a=r<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,o);else for(var l=e.length-1;l>=0;l--)(s=e[l])&&(a=(r<3?s(a):r>3?s(t,i,a):s(t,i))||a);return r>3&&a&&Object.defineProperty(t,i,a),a};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import{nanoid}from"nanoid";import styles from"./tab.panel.styles.js";let GlideCoreTabPanel=class GlideCoreTabPanel extends LitElement{constructor(){super(...arguments),this.name="",this.isActive=!0,this.#e=nanoid()}static{this.instanceCount=0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.setAttribute("role","tabpanel"),this.id=this.#e}render(){return html`<div class="${classMap({component:!0,hidden:!this.isActive})}"><slot></slot></div>`}updated(e){super.updated(e),e.has("isActive")&&this.setAttribute("aria-hidden",this.isActive?"false":"true")}#e};__decorate([property({reflect:!0})],GlideCoreTabPanel.prototype,"name",void 0),__decorate([property({type:Boolean})],GlideCoreTabPanel.prototype,"isActive",void 0),GlideCoreTabPanel=__decorate([customElement("glide-core-tab-panel")],GlideCoreTabPanel);export default GlideCoreTabPanel;
@@ -1,6 +1,16 @@
1
- import{css}from"lit";import visuallyHidden from"./styles/visually-hidden.js";export default[css`
1
+ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import visuallyHidden from"./styles/visually-hidden.js";export default[css`
2
+ :host(:focus-visible) {
3
+ outline: none;
4
+ }
5
+
6
+ /* stylelint-disable-next-line csstools/use-nesting */
7
+ :host(:focus-visible) .component {
8
+ ${focusOutline};
9
+ }
10
+
2
11
  .component {
3
12
  font-family: var(--glide-core-font-sans);
13
+ outline: none;
4
14
  }
5
15
 
6
16
  .hidden {
@@ -1,3 +1,4 @@
1
+ import './icons/storybook.js';
1
2
  import './tab.group.js';
2
3
  import './tab.js';
3
4
  import './tab.panel.js';
package/dist/tag.d.ts CHANGED
@@ -5,13 +5,10 @@ declare global {
5
5
  }
6
6
  }
7
7
  /**
8
- * @description A tag component to categorize information.
8
+ * @event remove - Emitted when the tag is removed.
9
9
  *
10
- * @event remove - Emitted when `glide-core-tag` is removed
11
- *
12
- * @slot - The content of the tag
13
- *
14
- * @slot prefix - A slot for an optional icon
10
+ * @slot - The content of the tag.
11
+ * @slot prefix - A slot for an optional icon.
15
12
  */
16
13
  export default class GlideCoreTag extends LitElement {
17
14
  #private;
@@ -79,7 +79,7 @@ it('throws an error when the default slot is empty', async () => {
79
79
  spy();
80
80
  }
81
81
  }
82
- expect(spy.called).to.be.true;
82
+ expect(spy.callCount).to.equal(1);
83
83
  });
84
84
  it('does not throw an error when the default slot is non-empty', async () => {
85
85
  const spy = sinon.spy();
@@ -91,7 +91,7 @@ it('does not throw an error when the default slot is non-empty', async () => {
91
91
  spy();
92
92
  }
93
93
  }
94
- expect(spy.notCalled).to.be.true;
94
+ expect(spy.callCount).to.equal(0);
95
95
  });
96
96
  it('toggles the "activate" and "deactivate" clases when the button is clicked', async () => {
97
97
  const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
@@ -6,10 +6,11 @@ declare global {
6
6
  }
7
7
  }
8
8
  /**
9
- * @description A textarea with a label and optional description and toolip. Participates in forms and validation via `FormData` and various methods.
9
+ * @description A text area with a label and optional description and tooltip. Participates in forms and validation via `FormData` and various methods.
10
10
  *
11
- * @event change - (same as native textarea's `change` event)
12
- * @event input - (same as native textarea's `input` event)
11
+ * @event change - `(event: Event) => void`
12
+ * @event input - `(event: Event) => void`
13
+ * @event invalid - `(event: Event) => void`
13
14
  *
14
15
  * @slot tooltip - Content for the tooltip.
15
16
  * @slot description - Additional information or context.
@@ -43,7 +44,6 @@ export default class GlideCoreTextarea extends LitElement {
43
44
  formResetCallback(): void;
44
45
  render(): import("lit").TemplateResult<1>;
45
46
  reportValidity(): boolean;
46
- updated(): void;
47
47
  constructor();
48
48
  private isBlurring;
49
49
  private isCheckingValidity;
package/dist/textarea.js CHANGED
@@ -1,2 +1,2 @@
1
- var __decorate=this&&this.__decorate||function(e,t,i,a){var r,o=arguments.length,l=o<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,i,a);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(l=(o<3?r(l):o>3?r(t,i,l):r(t,i))||l);return o>3&&l&&Object.defineProperty(t,i,l),l};import"./label.js";import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import ow from"./library/ow.js";import styles from"./textarea.styles.js";let GlideCoreTextarea=class GlideCoreTextarea extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed",delegatesFocus:!0}}static{this.styles=styles}blur(){this.#e.value?.blur()}checkValidity(){this.isCheckingValidity=!0;const e=this.#t.checkValidity();return this.isCheckingValidity=!1,e}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#i),this.removeEventListener("invalid",this.#a)}get form(){return this.#t.form}get validity(){return this.#t.validity}get willValidate(){return this.#t.willValidate}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#i)}formResetCallback(){this.value=this.getAttribute("value")??""}render(){return html`<glide-core-label split="${ifDefined(this.privateSplit??void 0)}" orientation="${this.orientation}" ?disabled="${this.disabled}" ?error="${this.#r||this.#o}" ?hide="${this.hideLabel}" ?required="${this.required}"><slot name="tooltip" slot="tooltip"></slot><label class="label" for="textarea">${this.label}</label><div class="textarea-container" slot="control"><textarea class="${classMap({error:this.#r||this.#o})}" id="textarea" name="${ifDefined(this.name)}" placeholder="${ifDefined(this.placeholder)}" rows="${this.rows}" autocapitalize="${ifDefined(this.autocapitalize)}" spellcheck="${this.spellcheck}" ?required="${this.required}" ?readonly="${this.readonly}" ?disabled="${this.disabled}" aria-describedby="meta" ${ref(this.#e)} @input="${this.#l}" @change="${this.#s}" @blur="${this.#d}">
2
- </textarea></div><div class="meta" data-test-description-container id="meta" slot="description"><slot name="description"></slot>${when(this.maxlength,(()=>html`<div class="${classMap({"character-count":!0,error:this.#o})}" data-test-maxlength>${this.value.length}/${this.maxlength}</div>`))}</div></glide-core-label>`}reportValidity(){this.isReportValidityOrSubmit=!0;const e=this.#t.reportValidity();return this.requestUpdate(),e}updated(){this.#e.value&&(this.#e.value.value=this.value),this.#n()}constructor(){super(),this.value="",this.label="",this.hideLabel=!1,this.orientation="horizontal",this.placeholder="",this.rows=2,this.required=!1,this.readonly=!1,this.disabled=!1,this.spellcheck=!1,this.autocapitalize="on",this.isBlurring=!1,this.isCheckingValidity=!1,this.isReportValidityOrSubmit=!1,this.#e=createRef(),this.#i=({formData:e})=>{this.value.length>0&&this.name&&this.value&&!this.disabled&&e.append(this.name,this.value)},this.#t=this.attachInternals(),this.addEventListener("invalid",this.#a)}#t;#e;#i;get#r(){return!this.disabled&&!this.readonly&&!this.validity.valid&&this.isReportValidityOrSubmit}get#o(){return!(!this.maxlength||this.disabled)&&this.value.length>this.maxlength}#d(){this.isBlurring=!0,this.reportValidity(),this.isBlurring=!1}#s(e){ow(this.#e.value,ow.object.instanceOf(HTMLTextAreaElement));const t=this.#e.value.value;this.value=t,this.#n(),this.dispatchEvent(new Event(e.type,e))}#l(){ow(this.#e.value,ow.object.instanceOf(HTMLTextAreaElement));const e=this.#e.value.value;this.value=e,this.#t.setFormValue(this.value),this.#n()}#a(e){if(e?.preventDefault(),this.isCheckingValidity||this.isBlurring)return;this.isReportValidityOrSubmit=!0;this.form?.querySelector(":invalid")===this&&this.focus()}async#n(){const e=this.#e.value;this.#o?this.#t.setValidity({...e?.validity,tooLong:!0}," ",e):this.#t.setValidity(e?.validity,e?.validationMessage,e),await this.updateComplete}};__decorate([property()],GlideCoreTextarea.prototype,"value",void 0),__decorate([property()],GlideCoreTextarea.prototype,"label",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreTextarea.prototype,"hideLabel",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"orientation",void 0),__decorate([property()],GlideCoreTextarea.prototype,"placeholder",void 0),__decorate([property({reflect:!0,type:Number})],GlideCoreTextarea.prototype,"rows",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"required",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"readonly",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"disabled",void 0),__decorate([property({type:Number,converter:e=>e&&Number.parseInt(e,10)})],GlideCoreTextarea.prototype,"maxlength",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"name",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"spellcheck",void 0),__decorate([property()],GlideCoreTextarea.prototype,"autocapitalize",void 0),__decorate([property()],GlideCoreTextarea.prototype,"privateSplit",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isBlurring",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isCheckingValidity",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isReportValidityOrSubmit",void 0),GlideCoreTextarea=__decorate([customElement("glide-core-textarea")],GlideCoreTextarea);export default GlideCoreTextarea;
1
+ var __decorate=this&&this.__decorate||function(e,t,i,a){var r,o=arguments.length,l=o<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,i,a);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(l=(o<3?r(l):o>3?r(t,i,l):r(t,i))||l);return o>3&&l&&Object.defineProperty(t,i,l),l};import"./label.js";import{LitElement,html,nothing}from"lit";import{LocalizeController}from"./library/localize.js";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import ow from"./library/ow.js";import styles from"./textarea.styles.js";let GlideCoreTextarea=class GlideCoreTextarea extends LitElement{static{this.formAssociated=!0}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed",delegatesFocus:!0}}static{this.styles=styles}blur(){this.#e.value?.blur()}checkValidity(){this.isCheckingValidity=!0;const e=this.#t.checkValidity();return this.isCheckingValidity=!1,e}disconnectedCallback(){super.disconnectedCallback(),this.form?.removeEventListener("formdata",this.#i)}get form(){return this.#t.form}get validity(){return!this.required||this.value||this.disabled?this.#a?this.#t.setValidity({tooLong:!0}," ",this.#e.value):this.#t.setValidity({}):this.#t.setValidity({valueMissing:!0}," ",this.#e.value),this.#t.validity}get willValidate(){return this.#t.willValidate}formAssociatedCallback(){this.form?.addEventListener("formdata",this.#i)}formResetCallback(){this.value=this.getAttribute("value")??""}render(){return html`<glide-core-private-label split="${ifDefined(this.privateSplit??void 0)}" orientation="${this.orientation}" ?disabled="${this.disabled}" ?error="${this.#r||this.#a}" ?hide="${this.hideLabel}" ?required="${this.required}"><slot name="tooltip" slot="tooltip"></slot><label class="label" for="textarea">${this.label}</label><div class="textarea-container" slot="control"><textarea aria-describedby="meta" aria-invalid="${this.#r||this.#a}" class="${classMap({error:this.#r||this.#a})}" id="textarea" name="${ifDefined(this.name)}" placeholder="${ifDefined(this.placeholder)}" rows="${this.rows}" autocapitalize="${ifDefined(this.autocapitalize)}" spellcheck="${this.spellcheck}" .value="${this.value}" ?required="${this.required}" ?readonly="${this.readonly}" ?disabled="${this.disabled}" ${ref(this.#e)} @input="${this.#o}" @change="${this.#l}" @blur="${this.#s}">
2
+ </textarea></div><div class="meta" id="meta" slot="description"><slot class="description" name="description"></slot>${this.maxlength?html`<div class="${classMap({"character-count":!0,error:this.#a})}" data-test="character-count-container"><span aria-hidden="true" data-test="character-count-text">${this.#d.term("displayedCharacterCount",this.#n,this.maxlength)} </span><span class="hidden" data-test="character-count-announcement">${this.#d.term("announcedCharacterCount",this.#n,this.maxlength)}</span></div>`:nothing}</div></glide-core-private-label>`}reportValidity(){this.isReportValidityOrSubmit=!0;const e=this.#t.reportValidity();return this.requestUpdate(),e}constructor(){super(),this.value="",this.label="",this.hideLabel=!1,this.orientation="horizontal",this.placeholder="",this.rows=2,this.required=!1,this.readonly=!1,this.disabled=!1,this.spellcheck=!1,this.autocapitalize="on",this.isBlurring=!1,this.isCheckingValidity=!1,this.isReportValidityOrSubmit=!1,this.#d=new LocalizeController(this),this.#e=createRef(),this.#i=({formData:e})=>{this.name&&this.value&&!this.disabled&&e.append(this.name,this.value)},this.#t=this.attachInternals(),this.addEventListener("invalid",(e=>{if(e?.preventDefault(),this.isCheckingValidity||this.isBlurring)return;this.isReportValidityOrSubmit=!0;this.form?.querySelector(":invalid")===this&&this.focus()}))}#t;#d;#e;#i;get#r(){return!this.disabled&&!this.readonly&&!this.validity.valid&&this.isReportValidityOrSubmit}get#n(){return this.value.length}get#a(){return Boolean(!this.disabled&&!this.readonly&&this.maxlength&&this.#n>this.maxlength)}#s(){this.isBlurring=!0,this.reportValidity(),this.isBlurring=!1}#l(e){ow(this.#e.value,ow.object.instanceOf(HTMLTextAreaElement)),this.value=this.#e.value.value,this.dispatchEvent(new Event(e.type,e))}#o(){ow(this.#e.value,ow.object.instanceOf(HTMLTextAreaElement)),this.value=this.#e.value.value}};__decorate([property()],GlideCoreTextarea.prototype,"value",void 0),__decorate([property()],GlideCoreTextarea.prototype,"label",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreTextarea.prototype,"hideLabel",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"orientation",void 0),__decorate([property()],GlideCoreTextarea.prototype,"placeholder",void 0),__decorate([property({reflect:!0,type:Number})],GlideCoreTextarea.prototype,"rows",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"required",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"readonly",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"disabled",void 0),__decorate([property({type:Number,converter:e=>e&&Number.parseInt(e,10)})],GlideCoreTextarea.prototype,"maxlength",void 0),__decorate([property({reflect:!0})],GlideCoreTextarea.prototype,"name",void 0),__decorate([property({type:Boolean})],GlideCoreTextarea.prototype,"spellcheck",void 0),__decorate([property()],GlideCoreTextarea.prototype,"autocapitalize",void 0),__decorate([property()],GlideCoreTextarea.prototype,"privateSplit",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isBlurring",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isCheckingValidity",void 0),__decorate([state()],GlideCoreTextarea.prototype,"isReportValidityOrSubmit",void 0),GlideCoreTextarea=__decorate([customElement("glide-core-textarea")],GlideCoreTextarea);export default GlideCoreTextarea;
@@ -2,12 +2,11 @@ import type { Meta, StoryObj } from '@storybook/web-components';
2
2
  declare const meta: Meta;
3
3
  export default meta;
4
4
  export declare const Default: StoryObj;
5
- export declare const Required: StoryObj;
6
- export declare const Vertical: StoryObj;
5
+ export declare const WithError: StoryObj;
6
+ export declare const Description: StoryObj;
7
7
  export declare const Readonly: StoryObj;
8
8
  export declare const Disabled: StoryObj;
9
9
  export declare const Placeholder: StoryObj;
10
10
  export declare const MaxLength: StoryObj;
11
- export declare const Description: StoryObj;
12
- export declare const WithError: StoryObj;
11
+ export declare const MaxLengthAndDescription: StoryObj;
13
12
  export declare const Tooltip: StoryObj;
@@ -1,5 +1,5 @@
1
- import{css}from"lit";export default css`
2
- glide-core-label::part(tooltips-and-label) {
1
+ import{css,unsafeCSS}from"lit";import visuallyHidden from"./styles/visually-hidden.js";const fieldSizingContent=unsafeCSS("\n field-sizing: content;\n");export default css`
2
+ glide-core-private-label::part(tooltips-and-label) {
3
3
  align-items: flex-start;
4
4
  margin-block-start: var(--glide-core-spacing-sm);
5
5
  }
@@ -8,6 +8,10 @@ import{css}from"lit";export default css`
8
8
  display: flex;
9
9
  }
10
10
 
11
+ .description {
12
+ display: block;
13
+ }
14
+
11
15
  textarea {
12
16
  appearance: none;
13
17
  background-color: var(--glide-core-surface-base-lighter);
@@ -20,11 +24,14 @@ import{css}from"lit";export default css`
20
24
  font-family: var(--glide-core-body-xs-font-family);
21
25
  font-size: var(--glide-core-body-sm-font-size);
22
26
  font-weight: var(--glide-core-body-xs-font-weight);
23
- min-block-size: 1.1875rem;
27
+ max-block-size: 5lh;
28
+ min-block-size: 3lh;
24
29
  padding: var(--glide-core-spacing-xs) var(--glide-core-spacing-sm);
25
30
  resize: vertical;
26
31
  transition: border-color 200ms ease-in-out;
27
32
 
33
+ ${fieldSizingContent};
34
+
28
35
  &:hover {
29
36
  border-color: var(--glide-core-border-base);
30
37
  }
@@ -66,5 +73,9 @@ import{css}from"lit";export default css`
66
73
  &.error {
67
74
  font-weight: var(--glide-core-font-weight-bold);
68
75
  }
76
+
77
+ .hidden {
78
+ ${visuallyHidden};
79
+ }
69
80
  }
70
81
  `;