@crowdstrike/glide-core 0.9.6 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/README.md +17 -53
  2. package/dist/accordion.d.ts +10 -10
  3. package/dist/accordion.js +1 -1
  4. package/dist/accordion.stories.d.ts +0 -1
  5. package/dist/accordion.styles.js +36 -38
  6. package/dist/accordion.test.basics.js +13 -95
  7. package/dist/accordion.test.events.js +21 -33
  8. package/dist/accordion.test.focus.d.ts +1 -0
  9. package/dist/accordion.test.focus.js +11 -0
  10. package/dist/accordion.test.interactions.d.ts +1 -0
  11. package/dist/accordion.test.interactions.js +75 -0
  12. package/dist/button-group.button.d.ts +2 -4
  13. package/dist/button-group.button.js +1 -1
  14. package/dist/button-group.button.styles.js +6 -14
  15. package/dist/button-group.button.test.basics.js +8 -17
  16. package/dist/button-group.button.test.interactions.js +4 -4
  17. package/dist/button-group.d.ts +0 -2
  18. package/dist/button-group.test.basics.js +10 -10
  19. package/dist/button-group.test.events.js +2 -2
  20. package/dist/button-group.test.interactions.js +1 -1
  21. package/dist/button.d.ts +7 -10
  22. package/dist/button.js +1 -1
  23. package/dist/button.styles.js +4 -7
  24. package/dist/button.test.basics.js +10 -26
  25. package/dist/button.test.events.js +9 -9
  26. package/dist/checkbox-group.d.ts +3 -4
  27. package/dist/checkbox-group.js +1 -1
  28. package/dist/checkbox-group.styles.js +13 -1
  29. package/dist/checkbox-group.test.basics.js +8 -12
  30. package/dist/checkbox-group.test.focus.js +7 -7
  31. package/dist/checkbox-group.test.interactions.d.ts +1 -0
  32. package/dist/checkbox-group.test.interactions.js +82 -0
  33. package/dist/checkbox.d.ts +5 -4
  34. package/dist/checkbox.js +1 -1
  35. package/dist/checkbox.styles.js +35 -15
  36. package/dist/checkbox.test.basics.js +6 -15
  37. package/dist/checkbox.test.events.js +9 -0
  38. package/dist/checkbox.test.focus.js +4 -2
  39. package/dist/checkbox.test.interactions.js +11 -11
  40. package/dist/drawer.d.ts +2 -5
  41. package/dist/drawer.js +1 -1
  42. package/dist/drawer.test.accessibility.js +8 -8
  43. package/dist/drawer.test.basics.js +16 -16
  44. package/dist/drawer.test.closing.js +18 -16
  45. package/dist/drawer.test.events.js +13 -24
  46. package/dist/drawer.test.methods.js +22 -22
  47. package/dist/dropdown.d.ts +7 -5
  48. package/dist/dropdown.js +1 -1
  49. package/dist/dropdown.option.d.ts +2 -3
  50. package/dist/dropdown.option.js +1 -1
  51. package/dist/dropdown.option.styles.js +31 -19
  52. package/dist/dropdown.option.test.basics.js +4 -4
  53. package/dist/dropdown.option.test.events.js +9 -1
  54. package/dist/dropdown.option.test.interactions.single.js +2 -2
  55. package/dist/dropdown.styles.js +39 -3
  56. package/dist/dropdown.test.basics.d.ts +1 -1
  57. package/dist/dropdown.test.basics.js +27 -14
  58. package/dist/dropdown.test.basics.multiple.js +65 -32
  59. package/dist/dropdown.test.basics.single.js +49 -0
  60. package/dist/dropdown.test.events.filterable.js +13 -2
  61. package/dist/dropdown.test.focus.filterable.js +12 -3
  62. package/dist/dropdown.test.focus.js +18 -2
  63. package/dist/dropdown.test.form.multiple.js +3 -2
  64. package/dist/dropdown.test.interactions.filterable.js +141 -45
  65. package/dist/dropdown.test.interactions.js +24 -0
  66. package/dist/dropdown.test.interactions.multiple.js +87 -30
  67. package/dist/dropdown.test.interactions.single.js +40 -4
  68. package/dist/form-controls-layout.d.ts +0 -2
  69. package/dist/icon-button.d.ts +2 -4
  70. package/dist/icon-button.js +1 -1
  71. package/dist/icon-button.test.basics.js +14 -82
  72. package/dist/icon-button.test.focus.d.ts +1 -0
  73. package/dist/icon-button.test.focus.js +13 -0
  74. package/dist/input.d.ts +4 -5
  75. package/dist/input.js +1 -1
  76. package/dist/input.styles.js +4 -4
  77. package/dist/input.test.basics.js +0 -52
  78. package/dist/input.test.events.js +27 -27
  79. package/dist/input.test.focus.js +27 -26
  80. package/dist/input.test.form.js +6 -6
  81. package/dist/input.test.validity.js +130 -130
  82. package/dist/label.d.ts +1 -3
  83. package/dist/label.js +1 -1
  84. package/dist/label.styles.js +5 -6
  85. package/dist/label.test.basics.js +4 -4
  86. package/dist/library/ow.js +1 -1
  87. package/dist/menu.button.d.ts +0 -2
  88. package/dist/menu.button.test.basics.js +3 -3
  89. package/dist/menu.d.ts +1 -4
  90. package/dist/menu.js +1 -1
  91. package/dist/menu.link.d.ts +1 -2
  92. package/dist/menu.link.js +1 -1
  93. package/dist/menu.options.d.ts +0 -2
  94. package/dist/menu.test.events.js +6 -6
  95. package/dist/menu.test.focus.js +5 -18
  96. package/dist/menu.test.interactions.js +48 -24
  97. package/dist/modal.d.ts +6 -17
  98. package/dist/modal.icon-button.d.ts +0 -2
  99. package/dist/modal.icon-button.test.basics.js +3 -3
  100. package/dist/modal.js +1 -1
  101. package/dist/modal.styles.js +13 -19
  102. package/dist/modal.tertiary-icon.d.ts +0 -3
  103. package/dist/modal.tertiary-icon.test.basics.js +3 -3
  104. package/dist/modal.test.basics.js +9 -5
  105. package/dist/modal.test.close.js +2 -2
  106. package/dist/modal.test.events.js +2 -2
  107. package/dist/radio-group.d.ts +0 -3
  108. package/dist/radio-group.js +1 -1
  109. package/dist/radio-group.test.basics.js +61 -61
  110. package/dist/radio-group.test.events.js +13 -13
  111. package/dist/radio-group.test.focus.js +1 -1
  112. package/dist/radio-group.test.form.js +2 -2
  113. package/dist/radio-group.test.validity.js +12 -12
  114. package/dist/radio.d.ts +0 -3
  115. package/dist/radio.styles.js +4 -12
  116. package/dist/split-button.d.ts +8 -11
  117. package/dist/split-button.js +1 -1
  118. package/dist/split-button.primary-button.d.ts +21 -0
  119. package/dist/split-button.primary-button.js +1 -0
  120. package/dist/split-button.primary-button.styles.js +96 -0
  121. package/dist/split-button.primary-button.test.basics.d.ts +1 -0
  122. package/dist/split-button.primary-button.test.basics.js +31 -0
  123. package/dist/split-button.primary-button.test.focus.d.ts +1 -0
  124. package/dist/split-button.primary-button.test.focus.js +14 -0
  125. package/dist/split-button.primary-link.d.ts +19 -0
  126. package/dist/split-button.primary-link.js +1 -0
  127. package/dist/split-button.primary-link.test.basics.d.ts +1 -0
  128. package/dist/split-button.primary-link.test.basics.js +30 -0
  129. package/dist/split-button.primary-link.test.focus.d.ts +1 -0
  130. package/dist/split-button.primary-link.test.focus.js +15 -0
  131. package/dist/split-button.secondary-button.d.ts +25 -0
  132. package/dist/split-button.secondary-button.js +1 -0
  133. package/dist/split-button.secondary-button.styles.js +103 -0
  134. package/dist/split-button.secondary-button.test.basics.d.ts +1 -0
  135. package/dist/split-button.secondary-button.test.basics.js +58 -0
  136. package/dist/split-button.secondary-button.test.focus.d.ts +1 -0
  137. package/dist/split-button.secondary-button.test.focus.js +14 -0
  138. package/dist/split-button.secondary-button.test.interactions.d.ts +2 -0
  139. package/dist/split-button.secondary-button.test.interactions.js +30 -0
  140. package/dist/split-button.stories.d.ts +4 -3
  141. package/dist/split-button.styles.js +1 -94
  142. package/dist/split-button.test.basics.d.ts +2 -1
  143. package/dist/split-button.test.basics.js +67 -80
  144. package/dist/split-button.test.interactions.d.ts +4 -0
  145. package/dist/split-button.test.interactions.js +51 -0
  146. package/dist/styles/opacity-and-scale-animation.js +2 -6
  147. package/dist/styles/variables.css +1 -1
  148. package/dist/tab.d.ts +2 -11
  149. package/dist/tab.group.d.ts +3 -5
  150. package/dist/tab.group.js +1 -1
  151. package/dist/tab.group.styles.js +18 -15
  152. package/dist/tab.group.test.basics.js +49 -34
  153. package/dist/tab.group.test.interactions.js +17 -14
  154. package/dist/tab.panel.d.ts +0 -3
  155. package/dist/tab.test.basics.js +6 -5
  156. package/dist/tag.d.ts +5 -4
  157. package/dist/tag.js +1 -1
  158. package/dist/tag.styles.js +47 -38
  159. package/dist/tag.test.basics.js +18 -110
  160. package/dist/tag.test.events.js +12 -8
  161. package/dist/tag.test.focus.js +2 -3
  162. package/dist/tag.test.interactions.d.ts +1 -0
  163. package/dist/tag.test.interactions.js +36 -0
  164. package/dist/textarea.d.ts +2 -3
  165. package/dist/textarea.js +2 -2
  166. package/dist/textarea.test.basics.js +8 -8
  167. package/dist/textarea.test.events.js +55 -55
  168. package/dist/textarea.test.form.js +9 -9
  169. package/dist/textarea.test.validity.js +167 -135
  170. package/dist/toasts.d.ts +1 -5
  171. package/dist/toasts.test.basics.js +2 -1
  172. package/dist/toasts.toast.d.ts +1 -4
  173. package/dist/toasts.toast.js +1 -1
  174. package/dist/toasts.toast.styles.js +12 -0
  175. package/dist/toggle.d.ts +0 -2
  176. package/dist/toggle.styles.js +1 -5
  177. package/dist/toggle.test.basics.js +2 -2
  178. package/dist/toggle.test.interactions.js +7 -7
  179. package/dist/tooltip.d.ts +2 -1
  180. package/dist/tooltip.js +1 -1
  181. package/dist/tooltip.styles.js +37 -13
  182. package/dist/tooltip.test.basics.d.ts +1 -1
  183. package/dist/tooltip.test.basics.js +19 -19
  184. package/dist/tree.d.ts +0 -2
  185. package/dist/tree.item.d.ts +5 -7
  186. package/dist/tree.item.icon-button.d.ts +1 -4
  187. package/dist/tree.item.js +1 -1
  188. package/dist/tree.item.menu.d.ts +1 -2
  189. package/dist/tree.item.menu.js +1 -1
  190. package/dist/tree.item.menu.test.basics.js +31 -10
  191. package/dist/tree.item.styles.js +7 -9
  192. package/dist/tree.item.test.basics.js +43 -31
  193. package/dist/tree.test.basics.js +29 -29
  194. package/dist/tree.test.focus.js +77 -74
  195. package/package.json +12 -14
  196. package/dist/split-container.d.ts +0 -31
  197. package/dist/split-container.js +0 -1
  198. package/dist/split-container.styles.js +0 -132
  199. package/dist/split-container.test.basics.d.ts +0 -3
  200. package/dist/split-container.test.basics.js +0 -445
  201. package/dist/split-container.test.interactions.d.ts +0 -1
  202. package/dist/split-container.test.interactions.js +0 -20
  203. package/dist/split-link.d.ts +0 -25
  204. package/dist/split-link.js +0 -1
  205. package/dist/split-link.test.basics.d.ts +0 -1
  206. package/dist/split-link.test.basics.js +0 -93
  207. package/dist/split-link.test.interactions.d.ts +0 -1
  208. package/dist/split-link.test.interactions.js +0 -20
  209. package/dist/status-indicator.d.ts +0 -30
  210. package/dist/status-indicator.js +0 -1
  211. package/dist/status-indicator.stories.d.ts +0 -5
  212. package/dist/status-indicator.styles.js +0 -58
  213. package/dist/status-indicator.test.basics.d.ts +0 -1
  214. package/dist/status-indicator.test.basics.js +0 -102
  215. /package/dist/{split-container.styles.d.ts → split-button.primary-button.styles.d.ts} +0 -0
  216. /package/dist/{status-indicator.styles.d.ts → split-button.secondary-button.styles.d.ts} +0 -0
@@ -1,132 +0,0 @@
1
- import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export default[css`
2
- ${focusOutline(".menu-button:focus-visible")}
3
- `,css`
4
- .component {
5
- display: inline-flex;
6
- position: relative;
7
-
8
- & .divider {
9
- inline-size: 1px;
10
-
11
- &.primary {
12
- background-color: var(--glide-core-border-base-light);
13
- }
14
-
15
- &.secondary {
16
- background-color: var(--glide-core-border-primary);
17
- }
18
- }
19
-
20
- &:not(.disabled):hover {
21
- & .divider {
22
- background-color: transparent;
23
- }
24
- }
25
-
26
- &.disabled,
27
- &.disabled:hover {
28
- cursor: not-allowed;
29
-
30
- & .divider {
31
- background-color: var(--glide-core-border-base-light);
32
- }
33
- }
34
-
35
- & .menu-button {
36
- align-items: center;
37
- border-color: transparent;
38
- border-radius: 0 0.75rem 0.75rem 0;
39
- border-style: solid;
40
- border-width: 1px 1px 1px 0;
41
- cursor: pointer;
42
- display: inline-flex;
43
- font-family: var(--glide-core-heading-xxs-font-family);
44
- font-style: var(--glide-core-heading-xxs-font-style);
45
- font-weight: var(--glide-core-heading-xxs-font-weight);
46
- gap: 0.625rem;
47
- justify-content: center;
48
- padding-block: var(--glide-core-spacing-xs);
49
- padding-inline: var(--glide-core-spacing-xs);
50
- text-decoration: none;
51
- transition-duration: 150ms;
52
- transition-property: color, background-color, border-color, fill, stroke;
53
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
54
- user-select: none;
55
-
56
- &:focus {
57
- outline: none;
58
- }
59
-
60
- &:disabled {
61
- cursor: default;
62
- opacity: 1;
63
- pointer-events: none;
64
- }
65
-
66
- &.primary {
67
- background-color: var(--glide-core-surface-primary);
68
- border-color: transparent;
69
- color: var(--glide-core-text-selected);
70
-
71
- &:disabled {
72
- background-color: var(--glide-core-surface-disabled);
73
- border-color: transparent;
74
- color: var(--glide-core-text-tertiary-disabled);
75
- }
76
-
77
- &:not(:disabled):active {
78
- background-color: var(--glide-core-surface-selected-hover);
79
- border-color: transparent;
80
- color: var(--glide-core-text-selected);
81
- }
82
-
83
- &:not(:active):hover:not(:disabled) {
84
- background-color: var(--glide-core-surface-hover);
85
- border-color: transparent;
86
- box-shadow: var(--glide-core-glow-sm);
87
- color: var(--glide-core-text-primary);
88
- }
89
- }
90
-
91
- &.secondary {
92
- background-color: transparent;
93
- border-color: var(--glide-core-border-primary);
94
- color: var(--glide-core-text-primary);
95
-
96
- &:disabled {
97
- background-color: var(--glide-core-surface-disabled);
98
- border-color: transparent;
99
- color: var(--glide-core-text-tertiary-disabled);
100
- }
101
-
102
- &:not(:disabled):active {
103
- background-color: var(--glide-core-surface-selected-hover);
104
- border-color: transparent;
105
- color: var(--glide-core-text-selected);
106
- }
107
-
108
- &:not(:active):hover:not(:disabled) {
109
- background-color: var(--glide-core-surface-hover);
110
- border-color: transparent;
111
- box-shadow: var(--glide-core-glow-sm);
112
- color: var(--glide-core-text-primary);
113
- }
114
- }
115
-
116
- &.small {
117
- block-size: 1.75rem;
118
- box-sizing: border-box;
119
- font-size: var(--glide-core-body-xs-font-size);
120
- line-height: 1rem;
121
- min-inline-size: fit-content;
122
- }
123
-
124
- &.large {
125
- block-size: 2.125rem;
126
- box-sizing: border-box;
127
- font-size: var(--glide-core-body-xxs-font-size);
128
- line-height: 1.5rem;
129
- }
130
- }
131
- }
132
- `];
@@ -1,3 +0,0 @@
1
- import './split-button.js';
2
- import './split-container.js';
3
- import './split-link.js';
@@ -1,445 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- import './split-button.js';
3
- import './split-container.js';
4
- import './split-link.js';
5
- import { elementUpdated, expect, fixture, html, waitUntil, } from '@open-wc/testing';
6
- import GlideCoreMenuButton from './menu.button.js';
7
- import GlideCoreMenuLink from './menu.link.js';
8
- import GlideCoreSplitButton from './split-button.js';
9
- import GlideCoreSplitContainer from './split-container.js';
10
- import GlideCoreSplitLink from './split-link.js';
11
- import expectArgumentError from './library/expect-argument-error.js';
12
- import sinon from 'sinon';
13
- GlideCoreSplitContainer.shadowRootOptions.mode = 'open';
14
- GlideCoreMenuButton.shadowRootOptions.mode = 'open';
15
- GlideCoreMenuLink.shadowRootOptions.mode = 'open';
16
- it('registers', async () => {
17
- expect(window.customElements.get('glide-core-split-container')).to.equal(GlideCoreSplitContainer);
18
- });
19
- it('is accessible', async () => {
20
- const component = await fixture(html `
21
- <glide-core-split-container menu-label="label">
22
- <glide-core-split-button slot="primary-action"
23
- >Button</glide-core-split-button
24
- >
25
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
26
- <glide-core-menu-link label="Two" url="/two"></glide-core-menu-link>
27
- <glide-core-menu-button label="Three"></glide-core-menu-button>
28
- </glide-core-split-container>
29
- `);
30
- await expect(component).to.be.accessible();
31
- });
32
- it('should render a split button, a divider, and a menu button', async () => {
33
- const component = await fixture(html `
34
- <glide-core-split-container menu-label="label">
35
- <glide-core-split-button slot="primary-action"
36
- >Button</glide-core-split-button
37
- >
38
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
39
- </glide-core-split-container>
40
- `);
41
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]'))
42
- .to.be.not.null;
43
- expect(component.shadowRoot?.querySelector('[data-test="split-divider"]')).to
44
- .be.not.null;
45
- const slot = component?.shadowRoot?.querySelector('slot[data-test="primary-action"]');
46
- expect(slot).to.be.not.null;
47
- const defaultSlotValue = slot.assignedNodes()?.at(0);
48
- expect(defaultSlotValue instanceof GlideCoreSplitButton).to.be.true;
49
- expect(defaultSlotValue?.textContent).to.equal('Button');
50
- });
51
- it('should render a split link, a divider, and a menu button', async () => {
52
- const component = await fixture(html `
53
- <glide-core-split-container menu-label="label">
54
- <glide-core-split-link slot="primary-action">Link</glide-core-split-link>
55
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
56
- </glide-core-split-container>
57
- `);
58
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]'))
59
- .to.be.not.null;
60
- expect(component.shadowRoot?.querySelector('[data-test="split-divider"]')).to
61
- .be.not.null;
62
- const slot = component?.shadowRoot?.querySelector('slot[data-test="primary-action"]');
63
- expect(slot).to.be.not.null;
64
- const defaultSlotValue = slot.assignedNodes()?.at(0);
65
- expect(defaultSlotValue instanceof GlideCoreSplitLink).to.be.true;
66
- expect(defaultSlotValue?.textContent).to.equal('Link');
67
- });
68
- it('does not set the menu to "open" by default', async () => {
69
- const component = await fixture(html `
70
- <glide-core-split-container menu-label="label">
71
- <glide-core-split-button slot="primary-action"
72
- >Button</glide-core-split-button
73
- >
74
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
75
- </glide-core-split-container>
76
- `);
77
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.not.have.attribute('open');
78
- });
79
- it('sets the menu component to "open" when the "open" attribute is set', async () => {
80
- const component = await fixture(html `
81
- <glide-core-split-container menu-label="label" open>
82
- <glide-core-split-button slot="primary-action"
83
- >Button</glide-core-split-button
84
- >
85
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
86
- </glide-core-split-container>
87
- `);
88
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('open');
89
- });
90
- it('applies appropriate classes and attributes when "size" is set to "small"', async () => {
91
- const component = await fixture(html `
92
- <glide-core-split-container menu-label="label" size="small">
93
- <glide-core-split-button slot="primary-action"
94
- >Button</glide-core-split-button
95
- >
96
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
97
- </glide-core-split-container>
98
- `);
99
- expect(component.shadowRoot
100
- ?.querySelector('[data-test="primary-action"]')
101
- ?.assignedNodes()
102
- ?.at(0)).to.have.attribute('size', 'small');
103
- expect(component.shadowRoot
104
- ?.querySelector('[data-test="split-menu-button"]')
105
- ?.classList.contains('small')).to.be.true;
106
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'small');
107
- });
108
- it('applies appropriate classes and attributes when "size" is set to "large"', async () => {
109
- const component = await fixture(html `
110
- <glide-core-split-container menu-label="label" size="large">
111
- <glide-core-split-button slot="primary-action"
112
- >Button</glide-core-split-button
113
- >
114
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
115
- </glide-core-split-container>
116
- `);
117
- expect(component.shadowRoot
118
- ?.querySelector('[data-test="primary-action"]')
119
- ?.assignedNodes()
120
- ?.at(0)).to.have.attribute('size', 'large');
121
- expect(component.shadowRoot
122
- ?.querySelector('[data-test="split-menu-button"]')
123
- ?.classList.contains('large')).to.be.true;
124
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'large');
125
- });
126
- it('applies appropriate classes and attributes by default as "large" when "size" is not set', async () => {
127
- const component = await fixture(html `
128
- <glide-core-split-container menu-label="label">
129
- <glide-core-split-button slot="primary-action"
130
- >Button</glide-core-split-button
131
- >
132
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
133
- </glide-core-split-container>
134
- `);
135
- expect(component.shadowRoot
136
- ?.querySelector('[data-test="primary-action"]')
137
- ?.assignedNodes()
138
- ?.at(0)).to.have.attribute('size', 'large');
139
- expect(component.shadowRoot
140
- ?.querySelector('[data-test="split-menu-button"]')
141
- ?.classList.contains('large')).to.be.true;
142
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'large');
143
- });
144
- it('applies appropriate classes and attributes when "size" is dynamically changed using the split button', async () => {
145
- const component = await fixture(html `
146
- <glide-core-split-container menu-label="label" size="large">
147
- <glide-core-split-button slot="primary-action"
148
- >Button</glide-core-split-button
149
- >
150
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
151
- </glide-core-split-container>
152
- `);
153
- expect(component.shadowRoot
154
- ?.querySelector('[data-test="primary-action"]')
155
- ?.assignedNodes()
156
- ?.at(0)).to.have.attribute('size', 'large');
157
- expect(component.shadowRoot
158
- ?.querySelector('[data-test="split-menu-button"]')
159
- ?.classList.contains('large')).to.be.true;
160
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'large');
161
- component.size = 'small';
162
- await elementUpdated(component);
163
- expect(component.shadowRoot
164
- ?.querySelector('[data-test="primary-action"]')
165
- ?.assignedNodes()
166
- ?.at(0)).to.have.attribute('size', 'small');
167
- expect(component.shadowRoot
168
- ?.querySelector('[data-test="split-menu-button"]')
169
- ?.classList.contains('small')).to.be.true;
170
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'small');
171
- });
172
- it('applies appropriate classes and attributes when "size" is dynamically changed using the link button', async () => {
173
- const component = await fixture(html `
174
- <glide-core-split-container menu-label="label" size="large">
175
- <glide-core-split-link slot="primary-action" url="/"
176
- >Button</glide-core-split-link
177
- >
178
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
179
- </glide-core-split-container>
180
- `);
181
- expect(component.shadowRoot
182
- ?.querySelector('[data-test="primary-action"]')
183
- ?.assignedNodes()
184
- ?.at(0)).to.have.attribute('size', 'large');
185
- expect(component.shadowRoot
186
- ?.querySelector('[data-test="split-menu-button"]')
187
- ?.classList.contains('large')).to.be.true;
188
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'large');
189
- component.size = 'small';
190
- await elementUpdated(component);
191
- expect(component.shadowRoot
192
- ?.querySelector('[data-test="primary-action"]')
193
- ?.assignedNodes()
194
- ?.at(0)).to.have.attribute('size', 'small');
195
- expect(component.shadowRoot
196
- ?.querySelector('[data-test="split-menu-button"]')
197
- ?.classList.contains('small')).to.be.true;
198
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('size', 'small');
199
- });
200
- it('applies appropriate classes and sets the "variant" to "primary" by default', async () => {
201
- const component = await fixture(html `
202
- <glide-core-split-container menu-label="label">
203
- <glide-core-split-button slot="primary-action"
204
- >Button</glide-core-split-button
205
- >
206
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
207
- </glide-core-split-container>
208
- `);
209
- expect(component.shadowRoot
210
- ?.querySelector('[data-test="primary-action"]')
211
- ?.assignedNodes()
212
- ?.at(0)).to.have.attribute('variant', 'primary');
213
- expect(component.shadowRoot
214
- ?.querySelector('[data-test="split-menu-button"]')
215
- ?.classList.contains('primary')).to.be.true;
216
- expect(component.shadowRoot
217
- ?.querySelector('[data-test="split-divider"]')
218
- ?.classList.contains('primary')).to.be.true;
219
- });
220
- it('applies appropriate classes when "variant" is set to "primary"', async () => {
221
- const component = await fixture(html `
222
- <glide-core-split-container menu-label="label" variant="primary">
223
- <glide-core-split-button slot="primary-action"
224
- >Button</glide-core-split-button
225
- >
226
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
227
- </glide-core-split-container>
228
- `);
229
- expect(component.shadowRoot
230
- ?.querySelector('[data-test="primary-action"]')
231
- ?.assignedNodes()
232
- ?.at(0)).to.have.attribute('variant', 'primary');
233
- expect(component.shadowRoot
234
- ?.querySelector('[data-test="split-menu-button"]')
235
- ?.classList.contains('primary')).to.be.true;
236
- expect(component.shadowRoot
237
- ?.querySelector('[data-test="split-divider"]')
238
- ?.classList.contains('primary')).to.be.true;
239
- });
240
- it('applies appropriate classes when "variant" is set to "secondary"', async () => {
241
- const component = await fixture(html `
242
- <glide-core-split-container menu-label="label" variant="secondary">
243
- <glide-core-split-button slot="primary-action"
244
- >Button</glide-core-split-button
245
- >
246
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
247
- </glide-core-split-container>
248
- `);
249
- expect(component.shadowRoot
250
- ?.querySelector('[data-test="primary-action"]')
251
- ?.assignedNodes()
252
- ?.at(0)).to.have.attribute('variant', 'secondary');
253
- expect(component.shadowRoot
254
- ?.querySelector('[data-test="split-menu-button"]')
255
- ?.classList.contains('secondary')).to.be.true;
256
- expect(component.shadowRoot
257
- ?.querySelector('[data-test="split-divider"]')
258
- ?.classList.contains('secondary')).to.be.true;
259
- });
260
- it('applies appropriate classes and attributes when "variant" is dynamically changed using the split button', async () => {
261
- const component = await fixture(html `
262
- <glide-core-split-container menu-label="label" variant="primary">
263
- <glide-core-split-button slot="primary-action"
264
- >Button</glide-core-split-button
265
- >
266
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
267
- </glide-core-split-container>
268
- `);
269
- expect(component.shadowRoot
270
- ?.querySelector('[data-test="primary-action"]')
271
- ?.assignedNodes()
272
- ?.at(0)).to.have.attribute('variant', 'primary');
273
- expect(component.shadowRoot
274
- ?.querySelector('[data-test="split-menu-button"]')
275
- ?.classList.contains('primary')).to.be.true;
276
- expect(component.shadowRoot
277
- ?.querySelector('[data-test="split-divider"]')
278
- ?.classList.contains('primary')).to.be.true;
279
- component.variant = 'secondary';
280
- await elementUpdated(component);
281
- expect(component.shadowRoot
282
- ?.querySelector('[data-test="primary-action"]')
283
- ?.assignedNodes()
284
- ?.at(0)).to.have.attribute('variant', 'secondary');
285
- expect(component.shadowRoot
286
- ?.querySelector('[data-test="split-menu-button"]')
287
- ?.classList.contains('secondary')).to.be.true;
288
- expect(component.shadowRoot
289
- ?.querySelector('[data-test="split-divider"]')
290
- ?.classList.contains('secondary')).to.be.true;
291
- });
292
- it('applies appropriate classes and attributes when "variant" is dynamically changed using the link button', async () => {
293
- const component = await fixture(html `
294
- <glide-core-split-container menu-label="label" variant="primary">
295
- <glide-core-split-link slot="primary-action" url="/"
296
- >Button</glide-core-split-link
297
- >
298
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
299
- </glide-core-split-container>
300
- `);
301
- expect(component.shadowRoot
302
- ?.querySelector('[data-test="primary-action"]')
303
- ?.assignedNodes()
304
- ?.at(0)).to.have.attribute('variant', 'primary');
305
- expect(component.shadowRoot
306
- ?.querySelector('[data-test="split-menu-button"]')
307
- ?.classList.contains('primary')).to.be.true;
308
- expect(component.shadowRoot
309
- ?.querySelector('[data-test="split-divider"]')
310
- ?.classList.contains('primary')).to.be.true;
311
- component.variant = 'secondary';
312
- await elementUpdated(component);
313
- expect(component.shadowRoot
314
- ?.querySelector('[data-test="primary-action"]')
315
- ?.assignedNodes()
316
- ?.at(0)).to.have.attribute('variant', 'secondary');
317
- expect(component.shadowRoot
318
- ?.querySelector('[data-test="split-menu-button"]')
319
- ?.classList.contains('secondary')).to.be.true;
320
- expect(component.shadowRoot
321
- ?.querySelector('[data-test="split-divider"]')
322
- ?.classList.contains('secondary')).to.be.true;
323
- });
324
- it('sets the appropriate classes and attributes when the "disabled" attribute is set', async () => {
325
- const component = await fixture(html `
326
- <glide-core-split-container menu-label="label" disabled>
327
- <glide-core-split-button slot="primary-action"
328
- >Button</glide-core-split-button
329
- >
330
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
331
- </glide-core-split-container>
332
- `);
333
- expect(component.shadowRoot
334
- ?.querySelector('[data-test="primary-action"]')
335
- ?.assignedNodes()
336
- ?.at(0)).to.have.attribute('disabled');
337
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.have.attribute('disabled');
338
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.have.attribute('disabled');
339
- });
340
- it('applies appropriate classes and attributes when "disabled" is dynamically changed using the split button', async () => {
341
- const component = await fixture(html `
342
- <glide-core-split-container menu-label="label">
343
- <glide-core-split-button slot="primary-action"
344
- >Button</glide-core-split-button
345
- >
346
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
347
- </glide-core-split-container>
348
- `);
349
- expect(component.shadowRoot
350
- ?.querySelector('[data-test="primary-action"]')
351
- ?.assignedNodes()
352
- ?.at(0)).to.not.have.attribute('disabled');
353
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.not.have.attribute('disabled');
354
- component.disabled = true;
355
- await elementUpdated(component);
356
- expect(component.shadowRoot
357
- ?.querySelector('[data-test="primary-action"]')
358
- ?.assignedNodes()
359
- ?.at(0)).to.have.attribute('disabled');
360
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.have.attribute('disabled');
361
- });
362
- it('applies appropriate classes and attributes when "disabled" is dynamically changed using the link button', async () => {
363
- const component = await fixture(html `
364
- <glide-core-split-container menu-label="label">
365
- <glide-core-split-link slot="primary-action" url="/"
366
- >Button</glide-core-split-link
367
- >
368
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
369
- </glide-core-split-container>
370
- `);
371
- expect(component.shadowRoot
372
- ?.querySelector('[data-test="primary-action"]')
373
- ?.assignedNodes()
374
- ?.at(0)).to.not.have.attribute('disabled');
375
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.not.have.attribute('disabled');
376
- component.disabled = true;
377
- await elementUpdated(component);
378
- expect(component.shadowRoot
379
- ?.querySelector('[data-test="primary-action"]')
380
- ?.assignedNodes()
381
- ?.at(0)).to.have.attribute('disabled');
382
- expect(component.shadowRoot?.querySelector('[data-test="split-menu-button"]')).to.have.attribute('disabled');
383
- });
384
- it('sets the default "menu-placement" as "bottom-end"', async () => {
385
- const component = await fixture(html `
386
- <glide-core-split-container menu-label="label">
387
- <glide-core-split-button slot="primary-action"
388
- >Button</glide-core-split-button
389
- >
390
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
391
- </glide-core-split-container>
392
- `);
393
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('placement', 'bottom-end');
394
- });
395
- it('sets the "menu-placement" attribute as specified', async () => {
396
- const component = await fixture(html `
397
- <glide-core-split-container menu-label="label" menu-placement="bottom">
398
- <glide-core-split-button slot="primary-action"
399
- >Button</glide-core-split-button
400
- >
401
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
402
- </glide-core-split-container>
403
- `);
404
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('placement', 'bottom');
405
- });
406
- it('focuses the "primary-action" slotted element when the container component is focused', async () => {
407
- const component = await fixture(html `
408
- <glide-core-split-container menu-label="label" menu-placement="bottom">
409
- <glide-core-split-button slot="primary-action"
410
- >Button</glide-core-split-button
411
- >
412
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
413
- </glide-core-split-container>
414
- `);
415
- component.focus();
416
- expect(component.shadowRoot
417
- ?.querySelector('[data-test="primary-action"]')
418
- ?.assignedNodes()
419
- ?.at(0)).to.have.focus;
420
- });
421
- it('throws an error when the default slot is empty', async () => {
422
- await expectArgumentError(() => fixture(html `<glide-core-split-container menu-label="label">
423
- <glide-core-split-button slot="primary-action"
424
- >Button</glide-core-split-button
425
- >
426
- </glide-core-split-container>`));
427
- });
428
- it('throws an error when the default slot is an unsupported type', async () => {
429
- await expectArgumentError(() => fixture(html `<glide-core-split-container menu-label="label">
430
- <glide-core-split-button slot="primary-action">
431
- Button
432
- </glide-core-split-button>
433
- <div>Option</div>
434
- </glide-core-split-container>`));
435
- // Menu is rendered asynchronously outside of Split Container's lifecycle
436
- // and asserts against its default slot. That assertion, which is expected
437
- // to fail in this case, results in an unhandled rejection that gets logged.
438
- // `console.error` is stubbed so the logs aren't muddied.
439
- const stub = sinon.stub(console, 'error');
440
- // Menu asserts against its default slot once on `firstUpdated` and
441
- // again on "slotchange". So we wait until the stub has been called
442
- // twice before restoring it.
443
- await waitUntil(() => stub.calledTwice);
444
- stub.restore();
445
- });
@@ -1 +0,0 @@
1
- import './split-container.js';
@@ -1,20 +0,0 @@
1
- import './split-container.js';
2
- import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
3
- import GlideCoreSplitContainer from './split-container.js';
4
- GlideCoreSplitContainer.shadowRootOptions.mode = 'open';
5
- it('the menu opens when the menu button is clicked', async () => {
6
- const component = await fixture(html `
7
- <glide-core-split-container menu-label="label">
8
- <glide-core-split-button slot="primary-action"
9
- >Button</glide-core-split-button
10
- >
11
- <glide-core-menu-link label="One" url="/one"></glide-core-menu-link>
12
- </glide-core-split-container>
13
- `);
14
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.not.have.attribute('open');
15
- component.shadowRoot
16
- ?.querySelector('[data-test="split-menu-button"]')
17
- ?.click();
18
- await elementUpdated(component);
19
- expect(component.shadowRoot?.querySelector('glide-core-menu')).to.have.attribute('open');
20
- });
@@ -1,25 +0,0 @@
1
- import './menu.js';
2
- import { LitElement } from 'lit';
3
- declare global {
4
- interface HTMLElementTagNameMap {
5
- 'glide-core-split-link': GlideCoreSplitLink;
6
- }
7
- }
8
- /**
9
- * @description - A link to be used in the `primary-action` slot of `glide-core-split-container`.
10
- *
11
- * @slot prefix - An optional icon slot to display before the label.
12
- * @slot - A label for the contents of the link.
13
- */
14
- export default class GlideCoreSplitLink extends LitElement {
15
- #private;
16
- static shadowRootOptions: ShadowRootInit;
17
- static styles: import("lit").CSSResult[];
18
- url?: string;
19
- disabled: boolean;
20
- variant: 'primary' | 'secondary';
21
- size: 'large' | 'small';
22
- firstUpdated(): void;
23
- render(): import("lit").TemplateResult<1>;
24
- private hasPrefixSlot;
25
- }
@@ -1 +0,0 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,l){var i,s=arguments.length,r=s<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,o,l);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(r=(s<3?i(r):s>3?i(t,o,r):i(t,o))||r);return s>3&&r&&Object.defineProperty(t,o,r),r};import"./menu.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{owSlot,owSlotType}from"./library/ow.js";import styles from"./split-button.styles.js";let GlideCoreSplitLink=class GlideCoreSplitLink extends LitElement{constructor(){super(...arguments),this.disabled=!1,this.variant="primary",this.size="large",this.hasPrefixSlot=!1,this.#e=createRef(),this.#t=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#e.value),owSlotType(this.#e.value,[Text])}render(){return this.disabled?html`<span class="${classMap({component:!0,disabled:!0,[this.variant]:!0,[this.size]:!0,"has-prefix":this.hasPrefixSlot})}" aria-disabled="true" role="link" @keydown="${this.#o}" data-test="split-link"><slot name="prefix" @slotchange="${this.#l}" ${ref(this.#t)} data-test="prefix-slot"></slot><slot @slotchange="${this.#i}" ${ref(this.#e)} data-test="default-slot"></slot></span>`:html`<a href="${ifDefined(this.url)}" class="${classMap({component:!0,[this.variant]:!0,[this.size]:!0,"has-prefix":this.hasPrefixSlot})}" @keydown="${this.#o}" data-test="split-link"><slot name="prefix" @slotchange="${this.#l}" ${ref(this.#t)} data-test="prefix-slot"></slot><slot @slotchange="${this.#i}" ${ref(this.#e)} data-test="default-slot"></slot></a>`}#e;#t;#i(){owSlot(this.#e.value),owSlotType(this.#e.value,[Text])}#o(e){" "===e.key&&this.url?.length&&window.open(this.url)}#l(){const e=this.#t.value?.assignedNodes();this.hasPrefixSlot=!!(e&&e.length>0)}};__decorate([property({reflect:!0})],GlideCoreSplitLink.prototype,"url",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreSplitLink.prototype,"disabled",void 0),__decorate([property({reflect:!0})],GlideCoreSplitLink.prototype,"variant",void 0),__decorate([property({reflect:!0})],GlideCoreSplitLink.prototype,"size",void 0),__decorate([state()],GlideCoreSplitLink.prototype,"hasPrefixSlot",void 0),GlideCoreSplitLink=__decorate([customElement("glide-core-split-link")],GlideCoreSplitLink);export default GlideCoreSplitLink;
@@ -1 +0,0 @@
1
- import './split-link.js';