@crowdstrike/glide-core 0.9.1 → 0.9.3

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 (130) hide show
  1. package/dist/accordion.stories.d.ts +2 -4
  2. package/dist/accordion.styles.js +2 -4
  3. package/dist/button-group.button.styles.js +3 -8
  4. package/dist/button-group.stories.d.ts +2 -6
  5. package/dist/button-group.styles.js +2 -2
  6. package/dist/button.d.ts +12 -1
  7. package/dist/button.js +1 -1
  8. package/dist/button.stories.d.ts +2 -12
  9. package/dist/button.styles.js +2 -4
  10. package/dist/button.test.basics.js +47 -165
  11. package/dist/button.test.events.js +86 -10
  12. package/dist/checkbox-group.stories.d.ts +2 -3
  13. package/dist/checkbox.js +1 -1
  14. package/dist/checkbox.stories.d.ts +2 -6
  15. package/dist/checkbox.styles.js +43 -6
  16. package/dist/checkbox.test.form.js +16 -0
  17. package/dist/checkbox.test.interactions.js +8 -0
  18. package/dist/drawer.js +1 -1
  19. package/dist/drawer.stories.d.ts +1 -1
  20. package/dist/dropdown.d.ts +4 -2
  21. package/dist/dropdown.js +1 -1
  22. package/dist/dropdown.option.js +1 -1
  23. package/dist/dropdown.option.styles.js +2 -0
  24. package/dist/dropdown.stories.d.ts +4 -10
  25. package/dist/dropdown.styles.js +47 -29
  26. package/dist/dropdown.test.focus.filterable.js +20 -0
  27. package/dist/dropdown.test.focus.js +1 -0
  28. package/dist/dropdown.test.form.js +23 -112
  29. package/dist/dropdown.test.interactions.filterable.js +121 -17
  30. package/dist/dropdown.test.interactions.multiple.js +15 -22
  31. package/dist/dropdown.test.interactions.single.js +44 -22
  32. package/dist/form-controls-layout.stories.d.ts +1 -1
  33. package/dist/icon-button.d.ts +1 -1
  34. package/dist/icon-button.stories.d.ts +1 -3
  35. package/dist/icon-button.styles.js +2 -4
  36. package/dist/icons/checked.d.ts +5 -0
  37. package/dist/icons/checked.js +1 -1
  38. package/dist/input.d.ts +1 -1
  39. package/dist/input.js +1 -1
  40. package/dist/input.stories.d.ts +2 -13
  41. package/dist/input.styles.d.ts +1 -1
  42. package/dist/input.styles.js +93 -93
  43. package/dist/input.test.basics.js +45 -45
  44. package/dist/input.test.form.js +17 -0
  45. package/dist/label.styles.js +6 -11
  46. package/dist/library/localize.test.js +45 -0
  47. package/dist/menu.button.styles.js +1 -0
  48. package/dist/menu.js +1 -1
  49. package/dist/menu.link.styles.js +1 -0
  50. package/dist/menu.stories.d.ts +1 -1
  51. package/dist/menu.styles.js +3 -1
  52. package/dist/menu.test.events.js +1 -97
  53. package/dist/menu.test.focus.js +26 -3
  54. package/dist/menu.test.interactions.js +3 -0
  55. package/dist/modal.d.ts +0 -7
  56. package/dist/modal.icon-button.test.basics.js +9 -9
  57. package/dist/modal.stories.d.ts +3 -5
  58. package/dist/modal.styles.js +2 -4
  59. package/dist/modal.tertiary-icon.test.basics.js +14 -14
  60. package/dist/modal.test.accessibility.js +16 -27
  61. package/dist/modal.test.basics.js +64 -68
  62. package/dist/modal.test.close.js +12 -16
  63. package/dist/modal.test.events.js +32 -44
  64. package/dist/modal.test.lock-scroll.js +15 -25
  65. package/dist/modal.test.methods.js +8 -12
  66. package/dist/modal.test.scrollbars.js +2 -4
  67. package/dist/radio-group.js +1 -1
  68. package/dist/radio-group.stories.d.ts +2 -3
  69. package/dist/radio-group.test.basics.js +3 -3
  70. package/dist/radio-group.test.events.js +6 -6
  71. package/dist/radio-group.test.form.js +19 -0
  72. package/dist/radio.styles.js +2 -6
  73. package/dist/split-button.stories.d.ts +3 -8
  74. package/dist/split-button.styles.js +2 -4
  75. package/dist/split-container.styles.js +2 -4
  76. package/dist/status-indicator.stories.d.ts +1 -13
  77. package/dist/styles/focus-outline.d.ts +1 -1
  78. package/dist/styles/focus-outline.js +7 -1
  79. package/dist/styles/opacity-and-scale-animation.d.ts +2 -0
  80. package/dist/styles/opacity-and-scale-animation.js +24 -0
  81. package/dist/styles/variables.css +1 -1
  82. package/dist/styles/visually-hidden.d.ts +1 -1
  83. package/dist/styles/visually-hidden.js +14 -1
  84. package/dist/tab.group.d.ts +6 -6
  85. package/dist/tab.group.js +1 -1
  86. package/dist/tab.group.styles.js +46 -5
  87. package/dist/tab.group.test.basics.js +9 -2
  88. package/dist/tab.group.test.interactions.js +70 -93
  89. package/dist/tab.js +1 -1
  90. package/dist/tab.panel.styles.js +3 -9
  91. package/dist/tab.styles.js +6 -13
  92. package/dist/tab.test.basics.js +15 -17
  93. package/dist/tabs.stories.d.ts +2 -2
  94. package/dist/tag.js +1 -1
  95. package/dist/tag.stories.d.ts +2 -4
  96. package/dist/tag.styles.js +2 -4
  97. package/dist/tag.test.basics.js +28 -27
  98. package/dist/tag.test.events.js +3 -3
  99. package/dist/tag.test.focus.js +4 -4
  100. package/dist/textarea.d.ts +1 -1
  101. package/dist/textarea.stories.d.ts +1 -8
  102. package/dist/textarea.styles.d.ts +1 -1
  103. package/dist/textarea.styles.js +63 -67
  104. package/dist/textarea.test.basics.js +52 -52
  105. package/dist/toasts.d.ts +5 -0
  106. package/dist/toasts.stories.d.ts +1 -1
  107. package/dist/toasts.styles.js +1 -1
  108. package/dist/toggle.stories.d.ts +1 -4
  109. package/dist/toggle.styles.js +2 -1
  110. package/dist/toggle.test.interactions.js +11 -0
  111. package/dist/tooltip.js +1 -1
  112. package/dist/tooltip.styles.js +16 -30
  113. package/dist/tooltip.test.interactions.js +6 -6
  114. package/dist/translations/en.js +1 -1
  115. package/dist/translations/fr.d.ts +3 -1
  116. package/dist/translations/fr.js +1 -1
  117. package/dist/translations/ja.d.ts +3 -1
  118. package/dist/translations/ja.js +1 -1
  119. package/dist/tree.item.styles.js +11 -3
  120. package/dist/tree.item.test.basics.js +0 -30
  121. package/dist/tree.stories.d.ts +0 -9
  122. package/package.json +1 -3
  123. package/dist/button.test.form.d.ts +0 -1
  124. package/dist/button.test.form.js +0 -50
  125. package/dist/input.test.translations.js +0 -38
  126. package/dist/tag.test.translations.d.ts +0 -1
  127. package/dist/tag.test.translations.js +0 -25
  128. package/dist/textarea.test.translations.d.ts +0 -1
  129. package/dist/textarea.test.translations.js +0 -34
  130. /package/dist/{input.test.translations.d.ts → library/localize.test.d.ts} +0 -0
@@ -1,4 +1,6 @@
1
1
  import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
2
+ ${focusOutline(".label-container:focus-visible")}
3
+ `,css`
2
4
  :host {
3
5
  cursor: pointer;
4
6
  display: flex;
@@ -50,6 +52,7 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
50
52
  font-size: var(--glide-core-body-sm-font-size);
51
53
  padding-block: var(--glide-core-spacing-xxs);
52
54
  padding-inline: var(--glide-core-spacing-xs);
55
+ transition: background-color 150ms ease-in-out;
53
56
 
54
57
  &:hover {
55
58
  background-color: var(--glide-core-surface-hover);
@@ -64,13 +67,18 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
64
67
  }
65
68
 
66
69
  &:focus-visible {
67
- ${focusOutline};
68
-
69
70
  /* The outline is inside the component since children have overflow hidden */
70
71
  outline-offset: -2px;
71
72
 
72
73
  .component.selected & {
73
- outline: 1px solid var(--glide-core-icon-selected);
74
+ /*
75
+ We need !important here as we must override the focusVisible mixin
76
+ that also includes !important.
77
+ This component is a bit of a unique case as we want to override the
78
+ default outline styles when a tree item is also focus-visible, but
79
+ also selected.
80
+ */
81
+ outline: 1px solid var(--glide-core-icon-selected) !important;
74
82
  outline-offset: -3px;
75
83
  }
76
84
  }
@@ -52,36 +52,6 @@ it('adds label to menu target', async () => {
52
52
  ?.querySelector('glide-core-icon-button');
53
53
  expect(menuTarget?.label).to.equal('Actions for Item');
54
54
  });
55
- it('adds Japanese label to menu', async () => {
56
- document.documentElement.setAttribute('lang', 'ja');
57
- const treeItem = await fixture(html `
58
- <glide-core-tree-item label="Item">
59
- <glide-core-tree-item-menu slot="menu" data-menu>
60
- <glide-core-menu-link label="Move" url="/move"> </glide-core-menu-link>
61
- </glide-core-tree-item-menu>
62
- </glide-core-tree-item>
63
- `);
64
- const menuTarget = treeItem
65
- .querySelector('glide-core-tree-item-menu')
66
- ?.shadowRoot?.querySelector('glide-core-menu')
67
- ?.querySelector('glide-core-icon-button');
68
- expect(menuTarget?.label).to.equal('Actions for Item');
69
- });
70
- it('adds French label to menu', async () => {
71
- document.documentElement.setAttribute('lang', 'fr');
72
- const treeItem = await fixture(html `
73
- <glide-core-tree-item label="Item">
74
- <glide-core-tree-item-menu slot="menu" data-menu>
75
- <glide-core-menu-link label="Move" url="/move"> </glide-core-menu-link>
76
- </glide-core-tree-item-menu>
77
- </glide-core-tree-item>
78
- `);
79
- const menuTarget = treeItem
80
- .querySelector('glide-core-tree-item-menu')
81
- ?.shadowRoot?.querySelector('glide-core-menu')
82
- ?.querySelector('glide-core-icon-button');
83
- expect(menuTarget?.label).to.equal('Actions for Item');
84
- });
85
55
  it('renders with a suffix slot', async () => {
86
56
  await fixture(html `
87
57
  <glide-core-tree-item label="Item">
@@ -8,12 +8,3 @@ import type { Meta, StoryObj } from '@storybook/web-components';
8
8
  declare const meta: Meta;
9
9
  export default meta;
10
10
  export declare const Tree: StoryObj;
11
- export declare const TreeItemDefault: StoryObj;
12
- export declare const TreeItemSelected: StoryObj;
13
- export declare const TreeItemWithChildItemsCollapsed: StoryObj;
14
- export declare const TreeItemWithChildItemsExpanded: StoryObj;
15
- export declare const TreeItemWithChildItemsNonCollapsible: StoryObj;
16
- export declare const TreeItemWithPrefixIcon: StoryObj;
17
- export declare const TreeItemWithSuffixIconButton: StoryObj;
18
- export declare const TreeItemWithMenu: StoryObj;
19
- export declare const TreeItemWithPrefixSuffixAndMenu: StoryObj;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdstrike/glide-core",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "CrowdStrike's Glide Design System components package for providing web components",
5
5
  "author": "CrowdStrike UX Team",
6
6
  "license": "Apache-2.0",
@@ -76,8 +76,6 @@
76
76
  "eslint-config-prettier": "^9.1.0",
77
77
  "eslint-plugin-lit": "^1.11.0",
78
78
  "eslint-plugin-lit-a11y": "^4.1.2",
79
- "eslint-plugin-no-only-tests": "^3.1.0",
80
- "eslint-plugin-no-skip-tests": "^1.1.0",
81
79
  "eslint-plugin-sort-class-members": "^1.20.0",
82
80
  "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
83
81
  "eslint-plugin-unicorn": "^50.0.1",
@@ -1 +0,0 @@
1
- import './button.js';
@@ -1,50 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- import './button.js';
3
- import { expect, fixture, html, oneEvent } from '@open-wc/testing';
4
- import { sendKeys } from '@web/test-runner-commands';
5
- import GlideCoreButton from './button.js';
6
- GlideCoreButton.shadowRootOptions.mode = 'open';
7
- it('participates in a form when type="reset"', async () => {
8
- const form = document.createElement('form');
9
- const component = await fixture(html ` <glide-core-button type="reset">Button</glide-core-button> `, {
10
- parentNode: form,
11
- });
12
- const formResetEvent = oneEvent(form, 'reset');
13
- component.shadowRoot?.querySelector('button')?.click();
14
- const event = await formResetEvent;
15
- expect(event instanceof Event).to.be.true;
16
- });
17
- it('participates in a form when hitting "enter" and type="reset"', async () => {
18
- const form = document.createElement('form');
19
- const component = await fixture(html ` <glide-core-button type="reset">Button</glide-core-button> `, {
20
- parentNode: form,
21
- });
22
- const formResetEvent = oneEvent(form, 'reset');
23
- component.focus();
24
- await sendKeys({ press: 'Enter' });
25
- const event = await formResetEvent;
26
- expect(event instanceof Event).to.be.true;
27
- });
28
- it('participates in a form when type="submit"', async () => {
29
- const form = document.createElement('form');
30
- const component = await fixture(html ` <glide-core-button type="submit">Button</glide-core-button> `, {
31
- parentNode: form,
32
- });
33
- form.addEventListener('submit', (event) => event.preventDefault());
34
- const formSubmitEvent = oneEvent(form, 'submit');
35
- component.shadowRoot?.querySelector('button')?.click();
36
- const event = await formSubmitEvent;
37
- expect(event instanceof Event).to.be.true;
38
- });
39
- it('participates in a form when hitting "enter" and type="submit"', async () => {
40
- const form = document.createElement('form');
41
- const component = await fixture(html ` <glide-core-button type="submit">Button</glide-core-button> `, {
42
- parentNode: form,
43
- });
44
- form.addEventListener('submit', (event) => event.preventDefault());
45
- const formSubmitEvent = oneEvent(form, 'submit');
46
- component.focus();
47
- await sendKeys({ press: 'Enter' });
48
- const event = await formSubmitEvent;
49
- expect(event instanceof Event).to.be.true;
50
- });
@@ -1,38 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
3
- import GlideCoreInput from './input.js';
4
- GlideCoreInput.shadowRootOptions.mode = 'open';
5
- it('renders dynamic strings in Japanese', async () => {
6
- const element = await fixture(html `
7
- <glide-core-input
8
- label="Test"
9
- value="lorem"
10
- maxlength="40"
11
- clearable
12
- ></glide-core-input>
13
- `);
14
- document.documentElement.setAttribute('lang', 'ja');
15
- await elementUpdated(element);
16
- const maxCharacterCountText = element.shadowRoot?.querySelector('[data-test="character-count-text"]');
17
- expect(maxCharacterCountText?.textContent?.trim()).to.equal('5/40');
18
- const maxCharacterCountAnnouncement = element.shadowRoot?.querySelector('[data-test="character-count-announcement"]');
19
- expect(maxCharacterCountAnnouncement?.textContent?.trim()).to.equal('Character count 5 of 40');
20
- expect(element.shadowRoot?.querySelector('[data-test="clear-button"]')?.label).to.equal('Clear Test entry');
21
- });
22
- it('renders dynamic strings in French', async () => {
23
- const element = await fixture(html `
24
- <glide-core-input
25
- label="Test"
26
- value="lorem"
27
- maxlength="40"
28
- clearable
29
- ></glide-core-input>
30
- `);
31
- document.documentElement.setAttribute('lang', 'fr');
32
- await elementUpdated(element);
33
- const maxCharacterCountText = element.shadowRoot?.querySelector('[data-test="character-count-text"]');
34
- expect(maxCharacterCountText?.textContent?.trim()).to.equal('5/40');
35
- const maxCharacterCountAnnouncement = element.shadowRoot?.querySelector('[data-test="character-count-announcement"]');
36
- expect(maxCharacterCountAnnouncement?.textContent?.trim()).to.equal('Character count 5 of 40');
37
- expect(element.shadowRoot?.querySelector('[data-test="clear-button"]')?.label).to.equal('Clear Test entry');
38
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2
- import GlideCoreTag from './tag.js';
3
- GlideCoreTag.shadowRootOptions.mode = 'open';
4
- it('renders dynamic string in Japanese', async () => {
5
- const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
6
- ><span slot="prefix">Prefix</span
7
- ><span data-content>Tag</span></glide-core-tag
8
- >`);
9
- document.documentElement.setAttribute('lang', 'ja');
10
- await elementUpdated(element);
11
- const iconButton = element.shadowRoot?.querySelector('button');
12
- expect(iconButton).to.have.attribute('aria-label', `タグを削除: test-aria-label`);
13
- expect(iconButton).to.have.attribute('type', 'button');
14
- });
15
- it('renders dynamic string in French', async () => {
16
- const element = await fixture(html `<glide-core-tag removable-label="test-aria-label"
17
- ><span slot="prefix">Prefix</span
18
- ><span data-content>Tag</span></glide-core-tag
19
- >`);
20
- document.documentElement.setAttribute('lang', 'fr');
21
- await elementUpdated(element);
22
- const iconButton = element.shadowRoot?.querySelector('button');
23
- expect(iconButton).to.have.attribute('aria-label', `Supprimer la balise : test-aria-label`);
24
- expect(iconButton).to.have.attribute('type', 'button');
25
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,34 +0,0 @@
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
- });