@crowdstrike/glide-core 0.9.6 → 0.10.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.
- package/README.md +17 -53
- package/dist/accordion.d.ts +10 -10
- package/dist/accordion.js +1 -1
- package/dist/accordion.stories.d.ts +0 -1
- package/dist/accordion.styles.js +36 -38
- package/dist/accordion.test.basics.js +13 -95
- package/dist/accordion.test.events.js +21 -33
- package/dist/accordion.test.focus.d.ts +1 -0
- package/dist/accordion.test.focus.js +11 -0
- package/dist/accordion.test.interactions.d.ts +1 -0
- package/dist/accordion.test.interactions.js +75 -0
- package/dist/button-group.button.d.ts +2 -4
- package/dist/button-group.button.js +1 -1
- package/dist/button-group.button.styles.js +6 -14
- package/dist/button-group.button.test.basics.js +8 -17
- package/dist/button-group.button.test.interactions.js +4 -4
- package/dist/button-group.d.ts +0 -2
- package/dist/button-group.test.basics.js +10 -10
- package/dist/button-group.test.events.js +2 -2
- package/dist/button-group.test.interactions.js +1 -1
- package/dist/button.d.ts +7 -10
- package/dist/button.js +1 -1
- package/dist/button.styles.js +4 -7
- package/dist/button.test.basics.js +10 -26
- package/dist/button.test.events.js +9 -9
- package/dist/checkbox-group.d.ts +3 -4
- package/dist/checkbox-group.js +1 -1
- package/dist/checkbox-group.styles.js +13 -1
- package/dist/checkbox-group.test.basics.js +8 -12
- package/dist/checkbox-group.test.focus.js +7 -7
- package/dist/checkbox-group.test.interactions.d.ts +1 -0
- package/dist/checkbox-group.test.interactions.js +82 -0
- package/dist/checkbox.d.ts +5 -4
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.styles.js +35 -15
- package/dist/checkbox.test.basics.js +6 -15
- package/dist/checkbox.test.focus.js +4 -2
- package/dist/checkbox.test.interactions.js +11 -11
- package/dist/drawer.d.ts +2 -5
- package/dist/drawer.js +1 -1
- package/dist/drawer.test.accessibility.js +8 -8
- package/dist/drawer.test.basics.js +16 -16
- package/dist/drawer.test.closing.js +18 -16
- package/dist/drawer.test.events.js +13 -24
- package/dist/drawer.test.methods.js +22 -22
- package/dist/dropdown.d.ts +7 -5
- package/dist/dropdown.js +1 -1
- package/dist/dropdown.option.d.ts +1 -3
- package/dist/dropdown.option.js +1 -1
- package/dist/dropdown.option.styles.js +31 -19
- package/dist/dropdown.option.test.basics.js +4 -4
- package/dist/dropdown.styles.js +39 -3
- package/dist/dropdown.test.basics.js +8 -13
- package/dist/dropdown.test.basics.multiple.js +63 -31
- package/dist/dropdown.test.basics.single.js +49 -0
- package/dist/dropdown.test.focus.filterable.js +12 -3
- package/dist/dropdown.test.focus.js +18 -2
- package/dist/dropdown.test.interactions.filterable.js +121 -45
- package/dist/dropdown.test.interactions.multiple.js +71 -30
- package/dist/dropdown.test.interactions.single.js +26 -4
- package/dist/form-controls-layout.d.ts +0 -2
- package/dist/icon-button.d.ts +2 -4
- package/dist/icon-button.js +1 -1
- package/dist/icon-button.test.basics.js +14 -82
- package/dist/icon-button.test.focus.d.ts +1 -0
- package/dist/icon-button.test.focus.js +13 -0
- package/dist/input.d.ts +4 -5
- package/dist/input.js +1 -1
- package/dist/input.styles.js +4 -4
- package/dist/input.test.basics.js +0 -52
- package/dist/input.test.events.js +27 -27
- package/dist/input.test.focus.js +27 -26
- package/dist/input.test.form.js +6 -6
- package/dist/input.test.validity.js +130 -130
- package/dist/label.d.ts +1 -3
- package/dist/label.js +1 -1
- package/dist/label.styles.js +5 -6
- package/dist/label.test.basics.js +4 -4
- package/dist/library/ow.js +1 -1
- package/dist/menu.button.d.ts +0 -2
- package/dist/menu.button.test.basics.js +3 -3
- package/dist/menu.d.ts +1 -4
- package/dist/menu.js +1 -1
- package/dist/menu.link.d.ts +1 -2
- package/dist/menu.link.js +1 -1
- package/dist/menu.options.d.ts +0 -2
- package/dist/menu.test.events.js +6 -6
- package/dist/menu.test.focus.js +5 -18
- package/dist/menu.test.interactions.js +48 -24
- package/dist/modal.d.ts +6 -17
- package/dist/modal.icon-button.d.ts +0 -2
- package/dist/modal.icon-button.test.basics.js +3 -3
- package/dist/modal.js +1 -1
- package/dist/modal.styles.js +13 -19
- package/dist/modal.tertiary-icon.d.ts +0 -3
- package/dist/modal.tertiary-icon.test.basics.js +3 -3
- package/dist/modal.test.basics.js +9 -5
- package/dist/modal.test.close.js +2 -2
- package/dist/modal.test.events.js +2 -2
- package/dist/radio-group.d.ts +0 -3
- package/dist/radio-group.js +1 -1
- package/dist/radio-group.test.basics.js +61 -61
- package/dist/radio-group.test.events.js +13 -13
- package/dist/radio-group.test.focus.js +1 -1
- package/dist/radio-group.test.form.js +2 -2
- package/dist/radio-group.test.validity.js +12 -12
- package/dist/radio.d.ts +0 -3
- package/dist/radio.styles.js +4 -12
- package/dist/split-button.d.ts +8 -11
- package/dist/split-button.js +1 -1
- package/dist/split-button.primary-button.d.ts +21 -0
- package/dist/split-button.primary-button.js +1 -0
- package/dist/split-button.primary-button.styles.js +96 -0
- package/dist/split-button.primary-button.test.basics.d.ts +1 -0
- package/dist/split-button.primary-button.test.basics.js +31 -0
- package/dist/split-button.primary-button.test.focus.d.ts +1 -0
- package/dist/split-button.primary-button.test.focus.js +14 -0
- package/dist/split-button.primary-link.d.ts +19 -0
- package/dist/split-button.primary-link.js +1 -0
- package/dist/split-button.primary-link.test.basics.d.ts +1 -0
- package/dist/split-button.primary-link.test.basics.js +30 -0
- package/dist/split-button.primary-link.test.focus.d.ts +1 -0
- package/dist/split-button.primary-link.test.focus.js +15 -0
- package/dist/split-button.secondary-button.d.ts +25 -0
- package/dist/split-button.secondary-button.js +1 -0
- package/dist/split-button.secondary-button.styles.js +103 -0
- package/dist/split-button.secondary-button.test.basics.d.ts +1 -0
- package/dist/split-button.secondary-button.test.basics.js +58 -0
- package/dist/split-button.secondary-button.test.focus.d.ts +1 -0
- package/dist/split-button.secondary-button.test.focus.js +14 -0
- package/dist/split-button.secondary-button.test.interactions.d.ts +2 -0
- package/dist/split-button.secondary-button.test.interactions.js +30 -0
- package/dist/split-button.stories.d.ts +4 -3
- package/dist/split-button.styles.js +1 -94
- package/dist/split-button.test.basics.d.ts +2 -1
- package/dist/split-button.test.basics.js +67 -80
- package/dist/split-button.test.interactions.d.ts +4 -0
- package/dist/split-button.test.interactions.js +51 -0
- package/dist/styles/opacity-and-scale-animation.js +2 -6
- package/dist/styles/variables.css +1 -1
- package/dist/tab.d.ts +2 -11
- package/dist/tab.group.d.ts +2 -5
- package/dist/tab.group.styles.js +12 -15
- package/dist/tab.group.test.basics.js +49 -34
- package/dist/tab.group.test.interactions.js +17 -14
- package/dist/tab.panel.d.ts +0 -3
- package/dist/tab.test.basics.js +6 -5
- package/dist/tag.d.ts +6 -4
- package/dist/tag.js +1 -1
- package/dist/tag.styles.js +36 -36
- package/dist/tag.test.basics.js +16 -109
- package/dist/tag.test.events.js +12 -8
- package/dist/tag.test.focus.js +2 -3
- package/dist/tag.test.interactions.d.ts +1 -0
- package/dist/tag.test.interactions.js +34 -0
- package/dist/textarea.d.ts +2 -3
- package/dist/textarea.js +2 -2
- package/dist/textarea.test.basics.js +8 -8
- package/dist/textarea.test.events.js +55 -55
- package/dist/textarea.test.form.js +9 -9
- package/dist/textarea.test.validity.js +167 -135
- package/dist/toasts.d.ts +1 -5
- package/dist/toasts.test.basics.js +2 -1
- package/dist/toasts.toast.d.ts +1 -4
- package/dist/toasts.toast.js +1 -1
- package/dist/toasts.toast.styles.js +12 -0
- package/dist/toggle.d.ts +0 -2
- package/dist/toggle.styles.js +1 -5
- package/dist/toggle.test.basics.js +2 -2
- package/dist/toggle.test.interactions.js +7 -7
- package/dist/tooltip.d.ts +2 -1
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.styles.js +36 -13
- package/dist/tooltip.test.basics.d.ts +1 -1
- package/dist/tooltip.test.basics.js +19 -19
- package/dist/tree.d.ts +0 -2
- package/dist/tree.item.d.ts +5 -7
- package/dist/tree.item.icon-button.d.ts +1 -4
- package/dist/tree.item.js +1 -1
- package/dist/tree.item.menu.d.ts +0 -2
- package/dist/tree.item.menu.test.basics.js +9 -9
- package/dist/tree.item.styles.js +4 -3
- package/dist/tree.item.test.basics.js +43 -31
- package/dist/tree.test.basics.js +29 -29
- package/dist/tree.test.focus.js +77 -74
- package/package.json +12 -14
- package/dist/split-container.d.ts +0 -31
- package/dist/split-container.js +0 -1
- package/dist/split-container.styles.js +0 -132
- package/dist/split-container.test.basics.d.ts +0 -3
- package/dist/split-container.test.basics.js +0 -445
- package/dist/split-container.test.interactions.d.ts +0 -1
- package/dist/split-container.test.interactions.js +0 -20
- package/dist/split-link.d.ts +0 -25
- package/dist/split-link.js +0 -1
- package/dist/split-link.test.basics.d.ts +0 -1
- package/dist/split-link.test.basics.js +0 -93
- package/dist/split-link.test.interactions.d.ts +0 -1
- package/dist/split-link.test.interactions.js +0 -20
- package/dist/status-indicator.d.ts +0 -30
- package/dist/status-indicator.js +0 -1
- package/dist/status-indicator.stories.d.ts +0 -5
- package/dist/status-indicator.styles.js +0 -58
- package/dist/status-indicator.test.basics.d.ts +0 -1
- package/dist/status-indicator.test.basics.js +0 -102
- /package/dist/{split-container.styles.d.ts → split-button.primary-button.styles.d.ts} +0 -0
- /package/dist/{status-indicator.styles.d.ts → split-button.secondary-button.styles.d.ts} +0 -0
package/dist/tooltip.styles.js
CHANGED
@@ -46,14 +46,6 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
46
46
|
padding: 0;
|
47
47
|
position: absolute;
|
48
48
|
|
49
|
-
::slotted(kbd) {
|
50
|
-
color: var(--glide-core-text-header-2);
|
51
|
-
display: inline-block;
|
52
|
-
font-family: inherit;
|
53
|
-
font-size: inherit;
|
54
|
-
white-space: nowrap;
|
55
|
-
}
|
56
|
-
|
57
49
|
&:popover-open {
|
58
50
|
display: flex;
|
59
51
|
|
@@ -105,22 +97,53 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";import
|
|
105
97
|
}
|
106
98
|
}
|
107
99
|
|
108
|
-
.
|
100
|
+
.content {
|
109
101
|
align-items: center;
|
110
102
|
background-color: var(--glide-core-surface-base-dark);
|
111
103
|
border-radius: var(--glide-core-spacing-xs);
|
112
|
-
color: var(--glide-core-text-selected);
|
113
|
-
column-gap: var(--glide-core-spacing-xs);
|
114
104
|
display: flex;
|
115
105
|
font-family: var(--glide-core-body-md-font-family);
|
116
106
|
font-size: var(--glide-core-body-sm-font-size);
|
117
107
|
font-style: var(--glide-core-body-sm-font-style);
|
118
108
|
font-weight: var(--glide-core-body-sm-font-weight);
|
119
|
-
hyphens: auto;
|
120
109
|
inline-size: max-content;
|
121
110
|
inset-block-start: 50%;
|
111
|
+
line-height: var(--glide-core-body-sm-line-height);
|
112
|
+
padding: var(--glide-core-spacing-xs) var(--glide-core-spacing-sm);
|
113
|
+
|
114
|
+
&.reversed {
|
115
|
+
flex-direction: row-reverse;
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
.default-slot {
|
120
|
+
color: var(--glide-core-text-selected);
|
121
|
+
display: block;
|
122
|
+
hyphens: auto;
|
122
123
|
max-inline-size: 11.25rem;
|
124
|
+
min-inline-size: 1.875rem;
|
123
125
|
overflow-wrap: anywhere;
|
124
|
-
|
126
|
+
}
|
127
|
+
|
128
|
+
.shortcut {
|
129
|
+
color: var(--glide-core-text-body-lighter);
|
130
|
+
display: none;
|
131
|
+
white-space: nowrap;
|
132
|
+
|
133
|
+
&.visible {
|
134
|
+
display: inline-block;
|
135
|
+
}
|
136
|
+
|
137
|
+
&.reversed {
|
138
|
+
margin-inline-end: var(--glide-core-spacing-xs);
|
139
|
+
}
|
140
|
+
|
141
|
+
&:not(.reversed) {
|
142
|
+
margin-inline-start: var(--glide-core-spacing-xs);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
kbd {
|
147
|
+
font-family: var(--glide-core-body-md-font-family);
|
125
148
|
}
|
126
149
|
`];
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
export {};
|
@@ -1,5 +1,4 @@
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
-
import './tooltip.js';
|
3
2
|
import { ArgumentError } from 'ow';
|
4
3
|
import { aTimeout, expect, fixture, html } from '@open-wc/testing';
|
5
4
|
import GlideCoreTooltip from './tooltip.js';
|
@@ -30,11 +29,11 @@ it('has defaults', async () => {
|
|
30
29
|
expect(component.open).to.be.false;
|
31
30
|
expect(component.placement).to.be.be.undefined;
|
32
31
|
expect(component.disabled).to.be.false;
|
33
|
-
expect(component.
|
32
|
+
expect(component.shortcut).to.be.deep.equal([]);
|
34
33
|
expect(tooltip?.checkVisibility()).to.be.false;
|
35
34
|
});
|
36
35
|
it('can be open', async () => {
|
37
|
-
const component = await fixture(html `<glide-core-tooltip
|
36
|
+
const component = await fixture(html `<glide-core-tooltip open>
|
38
37
|
Tooltip
|
39
38
|
<span slot="target" tabindex="0">Target</span>
|
40
39
|
</glide-core-tooltip>`);
|
@@ -43,29 +42,24 @@ it('can be open', async () => {
|
|
43
42
|
await aTimeout(0);
|
44
43
|
expect(tooltip?.checkVisibility()).to.be.true;
|
45
44
|
});
|
46
|
-
it('can have a
|
47
|
-
const component = await fixture(html `<glide-core-tooltip
|
45
|
+
it('can have a single-key shortcut', async () => {
|
46
|
+
const component = await fixture(html `<glide-core-tooltip .shortcut=${['Enter']}>
|
48
47
|
Tooltip
|
49
48
|
<span slot="target" tabindex="0">Target</span>
|
50
49
|
</glide-core-tooltip>`);
|
51
|
-
const
|
52
|
-
|
53
|
-
?.assignedNodes()
|
54
|
-
.at(0);
|
55
|
-
expect(tooltip?.textContent?.trim()).to.equal('Tooltip');
|
50
|
+
const shortcut = component.shadowRoot?.querySelector('[data-test="shortcut"]');
|
51
|
+
expect(shortcut?.textContent?.trim()).to.equal('Enter');
|
56
52
|
});
|
57
|
-
it('can have a
|
58
|
-
const component = await fixture(html `<glide-core-tooltip>
|
53
|
+
it('can have a multi-key shortcut', async () => {
|
54
|
+
const component = await fixture(html `<glide-core-tooltip .shortcut=${['CMD', 'K']}>
|
59
55
|
Tooltip
|
60
56
|
<span slot="target" tabindex="0">Target</span>
|
61
57
|
</glide-core-tooltip>`);
|
62
|
-
const
|
63
|
-
|
64
|
-
?.assignedElements();
|
65
|
-
expect(assignedElements?.at(0)?.textContent).to.equal('Target');
|
58
|
+
const shortcut = component.shadowRoot?.querySelector('[data-test="shortcut"]');
|
59
|
+
expect(shortcut?.textContent?.replaceAll(/\s/g, '')).to.equal('CMD+K');
|
66
60
|
});
|
67
|
-
it('
|
68
|
-
const component = await fixture(html `<glide-core-tooltip
|
61
|
+
it('is not open when disabled', async () => {
|
62
|
+
const component = await fixture(html `<glide-core-tooltip open disabled>
|
69
63
|
Tooltip
|
70
64
|
<span slot="target" tabindex="0">Target</span>
|
71
65
|
</glide-core-tooltip>`);
|
@@ -89,7 +83,7 @@ it('throws if it does not have a default slot', async () => {
|
|
89
83
|
it('throws if it does not have a "target" slot', async () => {
|
90
84
|
const spy = sinon.spy();
|
91
85
|
try {
|
92
|
-
await fixture(html `<glide-core-tooltip>
|
86
|
+
await fixture(html `<glide-core-tooltip>Tooltip</glide-core-tooltip>`);
|
93
87
|
}
|
94
88
|
catch (error) {
|
95
89
|
if (error instanceof ArgumentError) {
|
@@ -98,3 +92,9 @@ it('throws if it does not have a "target" slot', async () => {
|
|
98
92
|
}
|
99
93
|
expect(spy.callCount).to.equal(1);
|
100
94
|
});
|
95
|
+
it('has `placement` coverage', async () => {
|
96
|
+
await fixture(html `<glide-core-tooltip open placement="top">
|
97
|
+
Tooltip
|
98
|
+
<span slot="target" tabindex="0">Target</span>
|
99
|
+
</glide-core-tooltip>`);
|
100
|
+
});
|
package/dist/tree.d.ts
CHANGED
package/dist/tree.item.d.ts
CHANGED
@@ -6,12 +6,10 @@ declare global {
|
|
6
6
|
}
|
7
7
|
}
|
8
8
|
/**
|
9
|
-
* @
|
10
|
-
*
|
11
|
-
* @slot
|
12
|
-
* @slot
|
13
|
-
* @slot suffix - An optional icon to add after the label.
|
14
|
-
* @slot menu - Place a <glide-core-menu> here, which will be visible on hover or focus
|
9
|
+
* @slot - Zero or more of `<glide-core-tree-item>`.
|
10
|
+
* @slot prefix - An optional icon before the label.
|
11
|
+
* @slot suffix - An optional icon after the label.
|
12
|
+
* @slot menu - A `<glide-core-menu>` made visible on hover or focus.
|
15
13
|
*/
|
16
14
|
export default class GlideCoreTreeItem extends LitElement {
|
17
15
|
#private;
|
@@ -25,7 +23,6 @@ export default class GlideCoreTreeItem extends LitElement {
|
|
25
23
|
nonCollapsible: boolean;
|
26
24
|
slotElements: GlideCoreTreeItem[];
|
27
25
|
suffixSlotAssignedElements: HTMLElement[];
|
28
|
-
firstUpdated(): void;
|
29
26
|
focus(options?: FocusOptions): void;
|
30
27
|
get hasChildTreeItems(): boolean;
|
31
28
|
get hasExpandIcon(): boolean;
|
@@ -38,4 +35,5 @@ export default class GlideCoreTreeItem extends LitElement {
|
|
38
35
|
selectItem(item: GlideCoreTreeItem): GlideCoreTreeItem | undefined;
|
39
36
|
toggleExpand(): void;
|
40
37
|
private childTreeItems;
|
38
|
+
private hasPrefixIcon;
|
41
39
|
}
|
@@ -6,10 +6,7 @@ declare global {
|
|
6
6
|
}
|
7
7
|
}
|
8
8
|
/**
|
9
|
-
* @
|
10
|
-
* Provides correct color styling based on tree item state
|
11
|
-
*
|
12
|
-
* @slot - Reserved for the icon to display inside of the button.
|
9
|
+
* @slot - An icon.
|
13
10
|
*/
|
14
11
|
export default class GlideCoreTreeItemIconButton extends LitElement {
|
15
12
|
#private;
|
package/dist/tree.item.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var _a,GlideCoreTreeItem_1,__decorate=this&&this.__decorate||function(e,t,o,i){var r
|
1
|
+
var _a,GlideCoreTreeItem_1,__decorate=this&&this.__decorate||function(e,t,o,i){var l,r=arguments.length,s=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,i);else for(var n=e.length-1;n>=0;n--)(l=e[n])&&(s=(r<3?l(s):r>3?l(t,o,s):l(t,o))||s);return r>3&&s&&Object.defineProperty(t,o,s),s};import"./tree.item.menu.js";import{LitElement,html}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,queryAssignedElements,state}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import GlideCoreIconButton from"./icon-button.js";import GlideCoreTreeItemMenu from"./tree.item.menu.js";import ow,{owSlotType}from"./library/ow.js";import styles from"./tree.item.styles.js";let GlideCoreTreeItem=class GlideCoreTreeItem extends LitElement{constructor(){super(...arguments),this.expanded=!1,this.label="",this.level=1,this.selected=!1,this.removeIndentation=!1,this.nonCollapsible=!1,this.childTreeItems=[],this.hasPrefixIcon=!1,this.#e=createRef(),this.#t=createRef(),this.#o=new LocalizeController(this),this.#i=createRef(),this.#l=createRef()}static{GlideCoreTreeItem_1=this}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}focus(e){this.#t.value?.focus(e),this.#r(0)}get hasChildTreeItems(){return this.childTreeItems.length>0}get hasExpandIcon(){return this.hasChildTreeItems&&!this.nonCollapsible}render(){return html`<div class="${classMap({component:!0,expanded:this.expanded,selected:this.selected})}" role="treeitem" aria-label="${this.label}" aria-selected="${ifDefined(this.#s)}" aria-expanded="${ifDefined(this.#n)}"><div class="${classMap({"label-container":!0,"prefix-icon":this.hasPrefixIcon})}" tabindex="-1" @focusout="${this.#a}" @focusin="${this.#d}" ${ref(this.#t)}><div style="flex-shrink: 0; width:${this.#c};"></div>${when(!this.removeIndentation||this.hasExpandIcon,(()=>html`<div class="expand-icon-container">${when(this.hasExpandIcon,(()=>html`<div><svg aria-hidden="true" class="${classMap({"expand-icon":!0,"expand-icon-expanded":this.expanded})}" width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>`))}</div>`))}<slot name="prefix" ${ref(this.#l)} @slotchange="${this.#h}"></slot><div class="label">${this.label}</div><div class="icon-container"><slot name="menu" ${ref(this.#i)} @slotchange="${this.#m}"></slot><slot name="suffix"></slot></div></div><div class="child-items" role="group"><slot @slotchange="${this.#f}" ${ref(this.#e)}></slot></div></div>`}selectItem(e){let t;for(const o of this.slotElements)if(e===o)o.setAttribute("selected","true"),t=o;else{o.removeAttribute("selected");const i=o.selectItem(e);i&&(t=i)}return t}toggleExpand(){this.expanded=!this.expanded}#e;#t;#o;#i;#l;get#n(){return this.hasChildTreeItems?this.expanded?"true":"false":void 0}get#s(){return this.hasChildTreeItems?void 0:this.selected?"true":"false"}#d(e){this.#p(e.target)&&e.stopPropagation()}#a(e){this.#p(e.relatedTarget)?e.stopPropagation():this.#r(-1)}get#c(){return 20*(this.level-1)+"px"}#p(e){return e&&e instanceof HTMLElement&&!(e instanceof GlideCoreTreeItem_1)&&this.contains(e)}#f(){this.#u()}#m(){owSlotType(this.#i.value,[GlideCoreTreeItemMenu]);for(const e of this.#i.value.assignedElements())e instanceof GlideCoreTreeItemMenu&&(e.label=this.#o.term("actionsFor",this.label))}#h(){const e=this.#l.value?.assignedNodes();this.hasPrefixIcon=Boolean(e&&e.length>0)}#r(e){ow(this.#t.value,ow.object.instanceOf(HTMLElement)),this.#t.value.tabIndex=e;for(const t of this.querySelectorAll("& > glide-core-tree-item-icon-button"))t.tabIndex=e}#u(){const e=[];for(const t of this.slotElements)t.level=this.level+1,e.push(t);this.childTreeItems=e}};__decorate([property({reflect:!0,type:Boolean})],GlideCoreTreeItem.prototype,"expanded",void 0),__decorate([property({reflect:!0})],GlideCoreTreeItem.prototype,"label",void 0),__decorate([property({reflect:!0,type:Number})],GlideCoreTreeItem.prototype,"level",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreTreeItem.prototype,"selected",void 0),__decorate([property({reflect:!0,type:Boolean,attribute:"remove-indentation"})],GlideCoreTreeItem.prototype,"removeIndentation",void 0),__decorate([property({reflect:!0,type:Boolean,attribute:"non-collapsible"})],GlideCoreTreeItem.prototype,"nonCollapsible",void 0),__decorate([queryAssignedElements()],GlideCoreTreeItem.prototype,"slotElements",void 0),__decorate([queryAssignedElements({slot:"suffix"})],GlideCoreTreeItem.prototype,"suffixSlotAssignedElements",void 0),__decorate([state()],GlideCoreTreeItem.prototype,"childTreeItems",void 0),__decorate([state()],GlideCoreTreeItem.prototype,"hasPrefixIcon",void 0),GlideCoreTreeItem=GlideCoreTreeItem_1=__decorate([customElement("glide-core-tree-item")],GlideCoreTreeItem);export default GlideCoreTreeItem;
|
package/dist/tree.item.menu.d.ts
CHANGED
@@ -9,8 +9,6 @@ declare global {
|
|
9
9
|
}
|
10
10
|
}
|
11
11
|
/**
|
12
|
-
* @description A menu built into a tree item. Uses <glide-core-menu>
|
13
|
-
*
|
14
12
|
* @slot - One or more of <glide-core-menu-link> or <glide-core-menu-button>.
|
15
13
|
* @slot target - A focusable element against which Menu will be positioned. Opens and closes Menu when interacted with.
|
16
14
|
*/
|
@@ -33,33 +33,33 @@ it('throws if the default slot is the incorrect type', async () => {
|
|
33
33
|
stub.restore();
|
34
34
|
});
|
35
35
|
it('defaults the placement of the menu to bottom start', async () => {
|
36
|
-
const
|
36
|
+
const component = await fixture(html `
|
37
37
|
<glide-core-tree-item-menu>
|
38
38
|
<glide-core-menu-link label="One" url="/one"> </glide-core-menu-link>
|
39
39
|
</glide-core-tree-item-menu>
|
40
40
|
`);
|
41
|
-
expect(
|
41
|
+
expect(component.shadowRoot?.querySelector('glide-core-menu')?.placement).to.equal('bottom-start');
|
42
42
|
});
|
43
43
|
it('can set placement of the menu', async () => {
|
44
|
-
const
|
44
|
+
const component = await fixture(html `
|
45
45
|
<glide-core-tree-item-menu placement="bottom-end">
|
46
46
|
<glide-core-menu-link label="One" url="/one"> </glide-core-menu-link>
|
47
47
|
</glide-core-tree-item-menu>
|
48
48
|
`);
|
49
|
-
expect(
|
49
|
+
expect(component.shadowRoot?.querySelector('glide-core-menu')?.placement).to.equal('bottom-end');
|
50
50
|
});
|
51
51
|
it('can be opened programmatically', async () => {
|
52
|
-
const
|
52
|
+
const component = await fixture(html `
|
53
53
|
<glide-core-tree-item-menu>
|
54
54
|
<glide-core-menu-link label="One" url="/one"> </glide-core-menu-link>
|
55
55
|
</glide-core-tree-item-menu>
|
56
56
|
`);
|
57
|
-
expect(
|
57
|
+
expect(component.shadowRoot
|
58
58
|
?.querySelector('glide-core-menu')
|
59
59
|
?.getAttribute('open')).to.equal(null);
|
60
|
-
|
61
|
-
await
|
62
|
-
expect(
|
60
|
+
component.click();
|
61
|
+
await component.updateComplete;
|
62
|
+
expect(component.shadowRoot
|
63
63
|
?.querySelector('glide-core-menu')
|
64
64
|
?.getAttribute('open')).to.equal('');
|
65
65
|
});
|
package/dist/tree.item.styles.js
CHANGED
@@ -13,6 +13,7 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
13
13
|
font-style: var(--glide-core-body-sm-font-style);
|
14
14
|
font-weight: var(--glide-core-body-sm-font-weight);
|
15
15
|
grid-template-columns: repeat(auto-fill, 2.5rem);
|
16
|
+
line-height: 1.25rem;
|
16
17
|
|
17
18
|
--color: var(--glide-core-text-body-1);
|
18
19
|
|
@@ -90,10 +91,10 @@ import{css}from"lit";import focusOutline from"./styles/focus-outline.js";export
|
|
90
91
|
background-color: var(--glide-core-color-dark-blue);
|
91
92
|
}
|
92
93
|
}
|
93
|
-
}
|
94
94
|
|
95
|
-
|
96
|
-
|
95
|
+
&.prefix-icon .label {
|
96
|
+
padding-inline-start: var(--glide-core-spacing-xs);
|
97
|
+
}
|
97
98
|
}
|
98
99
|
|
99
100
|
::slotted([slot='menu']) {
|
@@ -12,22 +12,23 @@ it('registers', () => {
|
|
12
12
|
expect(window.customElements.get('glide-core-tree-item')).to.equal(TreeItem);
|
13
13
|
});
|
14
14
|
it('renders and sets default attributes', async () => {
|
15
|
-
const
|
15
|
+
const component = await fixture(html `
|
16
16
|
<glide-core-tree-item label="Item"></glide-core-tree-item>
|
17
17
|
`);
|
18
|
-
expect(
|
19
|
-
expect(
|
20
|
-
expect(
|
21
|
-
expect(
|
18
|
+
expect(component.expanded).to.be.false;
|
19
|
+
expect(component.label).to.equal('Item');
|
20
|
+
expect(component.level).to.equal(1);
|
21
|
+
expect(component.shadowRoot?.querySelector('.expand-icon-container')).to.be
|
22
|
+
.ok;
|
22
23
|
});
|
23
24
|
it('does not render expand-icon-container if remove-indentation is set', async () => {
|
24
|
-
const
|
25
|
+
const component = await fixture(html `
|
25
26
|
<glide-core-tree-item
|
26
27
|
label="Item"
|
27
28
|
remove-indentation
|
28
29
|
></glide-core-tree-item>
|
29
30
|
`);
|
30
|
-
expect(
|
31
|
+
expect(component.shadowRoot?.querySelector('.expand-icon-container')).to.be
|
31
32
|
.null;
|
32
33
|
});
|
33
34
|
it('renders with a prefix slot', async () => {
|
@@ -39,14 +40,14 @@ it('renders with a prefix slot', async () => {
|
|
39
40
|
expect(document.querySelector('[data-prefix]')).to.be.ok;
|
40
41
|
});
|
41
42
|
it('adds label to menu target', async () => {
|
42
|
-
const
|
43
|
+
const component = await fixture(html `
|
43
44
|
<glide-core-tree-item label="Item">
|
44
45
|
<glide-core-tree-item-menu slot="menu" data-menu>
|
45
46
|
<glide-core-menu-link label="Move" url="/move"> </glide-core-menu-link>
|
46
47
|
</glide-core-tree-item-menu>
|
47
48
|
</glide-core-tree-item>
|
48
49
|
`);
|
49
|
-
const menuTarget =
|
50
|
+
const menuTarget = component
|
50
51
|
.querySelector('glide-core-tree-item-menu')
|
51
52
|
?.shadowRoot?.querySelector('glide-core-menu')
|
52
53
|
?.querySelector('glide-core-icon-button');
|
@@ -61,34 +62,34 @@ it('renders with a suffix slot', async () => {
|
|
61
62
|
expect(document.querySelector('[data-suffix]')).to.be.ok;
|
62
63
|
});
|
63
64
|
it('does not have an expand icon if there are no child tree items', async () => {
|
64
|
-
const
|
65
|
+
const component = await fixture(html `
|
65
66
|
<glide-core-tree-item label="Item"></glide-core-tree-item>
|
66
67
|
`);
|
67
|
-
expect(
|
68
|
+
expect(component.shadowRoot?.querySelector('.expand-icon')).to.equal(null);
|
68
69
|
});
|
69
70
|
it('can expand', async () => {
|
70
|
-
const
|
71
|
+
const component = await fixture(html `
|
71
72
|
<glide-core-tree-item label="Item">
|
72
73
|
<glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
|
73
74
|
</glide-core-tree-item>
|
74
75
|
`);
|
75
76
|
expect([
|
76
|
-
...
|
77
|
+
...component.shadowRoot.querySelector('.component').classList,
|
77
78
|
]).to.deep.equal(['component']);
|
78
79
|
expect([
|
79
|
-
...
|
80
|
+
...component.shadowRoot.querySelector('.expand-icon').classList,
|
80
81
|
]).to.deep.equal(['expand-icon']);
|
81
|
-
|
82
|
-
await
|
82
|
+
component.toggleExpand();
|
83
|
+
await component.updateComplete;
|
83
84
|
expect([
|
84
|
-
...
|
85
|
+
...component.shadowRoot.querySelector('.component').classList,
|
85
86
|
]).to.deep.equal(['component', 'expanded']);
|
86
87
|
expect([
|
87
|
-
...
|
88
|
+
...component.shadowRoot.querySelector('.expand-icon').classList,
|
88
89
|
]).to.deep.equal(['expand-icon', 'expand-icon-expanded']);
|
89
90
|
});
|
90
91
|
it('renders child and grandchild tree items', async () => {
|
91
|
-
const
|
92
|
+
const component = await fixture(html `
|
92
93
|
<glide-core-tree-item expanded label="Item">
|
93
94
|
<glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
|
94
95
|
<glide-core-tree-item label="Child Item 2">
|
@@ -96,16 +97,27 @@ it('renders child and grandchild tree items', async () => {
|
|
96
97
|
</glide-core-tree-item>
|
97
98
|
</glide-core-tree-item>
|
98
99
|
`);
|
99
|
-
expect(
|
100
|
-
const childItems =
|
100
|
+
expect(component.shadowRoot?.querySelector('.expand-icon')).to.be.ok;
|
101
|
+
const childItems = component.slotElements;
|
101
102
|
expect(childItems?.length).to.equal(2);
|
102
103
|
expect(childItems?.[0].level).to.equal(2, 'Children are level 2');
|
103
104
|
const grandchildItems = childItems?.[1].slotElements;
|
104
105
|
expect(grandchildItems?.length).to.equal(1);
|
105
106
|
expect(grandchildItems?.[0].level).to.equal(3, 'Grandchildren are level 3');
|
106
107
|
});
|
108
|
+
it('sets the level for tree items programmatically added later', async () => {
|
109
|
+
const component = await fixture(html `
|
110
|
+
<glide-core-tree-item expanded label="Item"></glide-core-tree-item>
|
111
|
+
`);
|
112
|
+
const newItem = Object.assign(document.createElement('glide-core-tree-item'), {
|
113
|
+
label: 'Child',
|
114
|
+
});
|
115
|
+
component.append(newItem);
|
116
|
+
await component.updateComplete;
|
117
|
+
expect(newItem.level).to.equal(2);
|
118
|
+
});
|
107
119
|
it('can select child and grandchild items', async () => {
|
108
|
-
const
|
120
|
+
const component = await fixture(html `
|
109
121
|
<glide-core-tree-item expanded label="Item">
|
110
122
|
<glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
|
111
123
|
<glide-core-tree-item label="Child Item 2">
|
@@ -113,14 +125,14 @@ it('can select child and grandchild items', async () => {
|
|
113
125
|
</glide-core-tree-item>
|
114
126
|
</glide-core-tree-item>
|
115
127
|
`);
|
116
|
-
const childItems =
|
128
|
+
const childItems = component.slotElements;
|
117
129
|
const grandchildItems = childItems?.[1].slotElements;
|
118
|
-
|
119
|
-
expect(childItems[0].selected).to.
|
120
|
-
expect(childItems[1].selected).to.
|
121
|
-
expect(grandchildItems[0].selected).to.
|
122
|
-
|
123
|
-
expect(childItems[0].selected).to.
|
124
|
-
expect(childItems[1].selected).to.
|
125
|
-
expect(grandchildItems[0].selected).to.
|
130
|
+
component.selectItem(childItems[0]);
|
131
|
+
expect(childItems[0].selected).to.be.true;
|
132
|
+
expect(childItems[1].selected).to.be.false;
|
133
|
+
expect(grandchildItems[0].selected).to.be.false;
|
134
|
+
component.selectItem(grandchildItems[0]);
|
135
|
+
expect(childItems[0].selected).to.be.false;
|
136
|
+
expect(childItems[1].selected).to.be.false;
|
137
|
+
expect(grandchildItems[0].selected).to.be.true;
|
126
138
|
});
|
package/dist/tree.test.basics.js
CHANGED
@@ -12,15 +12,15 @@ it('registers', async () => {
|
|
12
12
|
expect(window.customElements.get('glide-core-tree')).to.equal(GlideCoreTree);
|
13
13
|
});
|
14
14
|
it('renders and sets default attributes', async () => {
|
15
|
-
const
|
15
|
+
const component = await fixture(html `
|
16
16
|
<glide-core-tree>
|
17
17
|
<glide-core-tree-item label="Child Item"></glide-core-tree-item>
|
18
18
|
</glide-core-tree>
|
19
19
|
`);
|
20
|
-
expect(
|
20
|
+
expect(component.selectedItem).to.equal(undefined);
|
21
21
|
});
|
22
22
|
it('can select child and grandchild items', async () => {
|
23
|
-
const
|
23
|
+
const component = await fixture(html `
|
24
24
|
<glide-core-tree>
|
25
25
|
<glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
|
26
26
|
<glide-core-tree-item label="Child Item 2">
|
@@ -28,21 +28,21 @@ it('can select child and grandchild items', async () => {
|
|
28
28
|
</glide-core-tree-item>
|
29
29
|
</glide-core-tree>
|
30
30
|
`);
|
31
|
-
const childItems =
|
31
|
+
const childItems = component.slotElements;
|
32
32
|
const grandchildItems = childItems?.[1].slotElements;
|
33
|
-
|
34
|
-
expect(childItems[0].selected).to.
|
35
|
-
expect(
|
36
|
-
expect(childItems[1].selected).to.
|
37
|
-
expect(grandchildItems[0].selected).to.
|
38
|
-
|
39
|
-
expect(childItems[0].selected).to.
|
40
|
-
expect(childItems[1].selected).to.
|
41
|
-
expect(grandchildItems[0].selected).to.
|
42
|
-
expect(
|
33
|
+
component.selectItem(childItems[0]);
|
34
|
+
expect(childItems[0].selected).to.be.true;
|
35
|
+
expect(component.selectedItem).to.equal(childItems[0]);
|
36
|
+
expect(childItems[1].selected).to.be.false;
|
37
|
+
expect(grandchildItems[0].selected).to.be.false;
|
38
|
+
component.selectItem(grandchildItems[0]);
|
39
|
+
expect(childItems[0].selected).to.be.false;
|
40
|
+
expect(childItems[1].selected).to.be.false;
|
41
|
+
expect(grandchildItems[0].selected).to.be.true;
|
42
|
+
expect(component.selectedItem).to.equal(grandchildItems[0]);
|
43
43
|
});
|
44
44
|
it('can click child and grandchild items to expand or select them', async () => {
|
45
|
-
const
|
45
|
+
const component = await fixture(html `
|
46
46
|
<glide-core-tree>
|
47
47
|
<glide-core-tree-item label="Child Item 1"></glide-core-tree-item>
|
48
48
|
<glide-core-tree-item label="Child Item 2">
|
@@ -53,26 +53,26 @@ it('can click child and grandchild items to expand or select them', async () =>
|
|
53
53
|
</glide-core-tree-item>
|
54
54
|
</glide-core-tree>
|
55
55
|
`);
|
56
|
-
const childItems =
|
56
|
+
const childItems = component.slotElements;
|
57
57
|
const grandchildItems = childItems?.[1].slotElements;
|
58
58
|
// Clicking an item that doesn't have children selects it
|
59
59
|
childItems[0].click();
|
60
|
-
expect(childItems[0].selected).to.
|
61
|
-
expect(childItems[1].selected).to.
|
62
|
-
expect(grandchildItems[0].selected).to.
|
63
|
-
expect(childItems[1].expanded).to.
|
60
|
+
expect(childItems[0].selected).to.be.true;
|
61
|
+
expect(childItems[1].selected).to.be.false;
|
62
|
+
expect(grandchildItems[0].selected).to.be.false;
|
63
|
+
expect(childItems[1].expanded).to.be.false;
|
64
64
|
// Clicking an item that has children expands it
|
65
65
|
childItems[1].click();
|
66
|
-
expect(childItems[1].expanded).to.
|
66
|
+
expect(childItems[1].expanded).to.be.true;
|
67
67
|
// Can click and select a grandchild item
|
68
68
|
grandchildItems[0].click();
|
69
|
-
expect(grandchildItems[0].selected).to.
|
69
|
+
expect(grandchildItems[0].selected).to.be.true;
|
70
70
|
// Can click and select a non-collapsible parent item
|
71
71
|
childItems[2].click();
|
72
|
-
expect(childItems[2].selected).to.
|
72
|
+
expect(childItems[2].selected).to.be.true;
|
73
73
|
});
|
74
74
|
it('does not select an item if a tree-item-icon-button is clicked', async () => {
|
75
|
-
const
|
75
|
+
const component = await fixture(html `
|
76
76
|
<glide-core-tree>
|
77
77
|
<glide-core-tree-item label="Child Item 1">
|
78
78
|
<glide-core-tree-item-icon-button slot="suffix" data-test-icon-button>
|
@@ -83,15 +83,15 @@ it('does not select an item if a tree-item-icon-button is clicked', async () =>
|
|
83
83
|
</glide-core-tree-item>
|
84
84
|
</glide-core-tree>
|
85
85
|
`);
|
86
|
-
const childItems =
|
86
|
+
const childItems = component.slotElements;
|
87
87
|
const iconButton = childItems[0].querySelector('[data-test-icon-button]');
|
88
88
|
assert(iconButton);
|
89
89
|
iconButton.click();
|
90
90
|
await iconButton.updateComplete;
|
91
|
-
expect(childItems[0].selected).to.
|
91
|
+
expect(childItems[0].selected).to.be.false;
|
92
92
|
});
|
93
93
|
it('does not select an item if its menu slot is clicked', async () => {
|
94
|
-
const
|
94
|
+
const component = await fixture(html `
|
95
95
|
<glide-core-tree>
|
96
96
|
<glide-core-tree-item label="Child Item 1">
|
97
97
|
<glide-core-tree-item-menu slot="menu" data-test-menu>
|
@@ -100,12 +100,12 @@ it('does not select an item if its menu slot is clicked', async () => {
|
|
100
100
|
</glide-core-tree-item>
|
101
101
|
</glide-core-tree>
|
102
102
|
`);
|
103
|
-
const childItems =
|
103
|
+
const childItems = component.slotElements;
|
104
104
|
const menu = childItems[0].querySelector('[data-test-menu]');
|
105
105
|
assert(menu);
|
106
106
|
menu.click();
|
107
107
|
await menu.updateComplete;
|
108
|
-
expect(childItems[0].selected).to.
|
108
|
+
expect(childItems[0].selected).to.be.false;
|
109
109
|
});
|
110
110
|
it('throws if it does not have a default slot', async () => {
|
111
111
|
const spy = sinon.spy();
|