@crowdstrike/glide-core 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion.d.ts +7 -3
- package/dist/button-group.button.d.ts +1 -4
- package/dist/button-group.button.styles.js +1 -0
- package/dist/button-group.d.ts +3 -0
- package/dist/button.d.ts +3 -0
- package/dist/checkbox-group.d.ts +6 -2
- package/dist/checkbox-group.stories.d.ts +1 -1
- package/dist/checkbox.d.ts +5 -4
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.stories.d.ts +1 -1
- package/dist/checkbox.test.basics.js +15 -6
- package/dist/checkbox.test.events.js +12 -4
- package/dist/checkbox.test.focus.js +1 -1
- package/dist/checkbox.test.form.js +1 -0
- package/dist/checkbox.test.interactions.js +44 -7
- package/dist/drawer.d.ts +5 -5
- package/dist/drawer.stories.d.ts +0 -1
- package/dist/dropdown.d.ts +3 -2
- package/dist/icon-button.d.ts +2 -0
- package/dist/input.d.ts +4 -3
- package/dist/input.js +1 -1
- package/dist/label.styles.js +7 -4
- package/dist/library/localize.d.ts +1 -0
- package/dist/menu.js +1 -1
- package/dist/menu.test.events.js +197 -7
- package/dist/menu.test.interactions.js +2 -2
- package/dist/modal.stories.d.ts +1 -0
- package/dist/modal.tertiary-icon.test.basics.js +2 -2
- package/dist/radio-group.d.ts +4 -3
- package/dist/radio-group.stories.d.ts +1 -1
- package/dist/radio.d.ts +1 -2
- package/dist/radio.js +1 -1
- package/dist/split-container.d.ts +1 -1
- package/dist/status-indicator.d.ts +1 -1
- package/dist/tabs.stories.d.ts +1 -0
- package/dist/tag.d.ts +3 -6
- package/dist/textarea.d.ts +4 -3
- package/dist/toggle.d.ts +3 -3
- package/dist/toggle.js +1 -1
- package/dist/toggle.stories.d.ts +1 -1
- package/dist/toggle.test.interactions.js +26 -0
- package/dist/tooltip.d.ts +2 -2
- package/dist/translations/en.js +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/tree.d.ts +1 -1
- package/dist/tree.item.d.ts +0 -3
- package/dist/tree.item.icon-button.d.ts +1 -0
- package/dist/tree.item.icon-button.js +1 -1
- package/dist/tree.item.icon-button.test.basics.js +9 -0
- package/dist/tree.item.js +1 -1
- package/dist/tree.item.menu.d.ts +2 -0
- package/dist/tree.item.menu.js +1 -1
- package/dist/tree.item.menu.test.basics.js +15 -0
- package/dist/tree.item.styles.js +2 -0
- package/dist/tree.item.test.basics.d.ts +2 -1
- package/dist/tree.item.test.basics.js +46 -4
- package/dist/tree.js +1 -1
- package/dist/tree.test.focus.js +91 -4
- package/package.json +2 -1
package/dist/menu.test.events.js
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
import './menu.js';
|
3
3
|
import './menu.link.js';
|
4
4
|
import './menu.options.js';
|
5
|
-
import { expect, fixture, html, oneEvent } from '@open-wc/testing';
|
6
|
-
|
5
|
+
import { aTimeout, assert, expect, fixture, html, oneEvent, } from '@open-wc/testing';
|
6
|
+
import { sendKeys } from '@web/test-runner-commands';
|
7
|
+
import sinon from 'sinon';
|
8
|
+
it('dispatches one link "click" event when a link is selected via click', async () => {
|
7
9
|
const component = await fixture(html `<glide-core-menu open>
|
8
10
|
<button slot="target">Target</button>
|
9
11
|
|
@@ -11,21 +13,209 @@ it('dispatches a "click" event when a link is clicked', async () => {
|
|
11
13
|
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
12
14
|
</glide-core-menu-options>
|
13
15
|
</glide-core-menu>`);
|
14
|
-
|
16
|
+
const spy = sinon.spy();
|
17
|
+
const link = component.querySelector('glide-core-menu-link');
|
18
|
+
assert(link);
|
19
|
+
link.addEventListener('click', spy);
|
20
|
+
setTimeout(() => link.click());
|
15
21
|
const event = await oneEvent(component, 'click');
|
16
22
|
expect(event instanceof PointerEvent).to.be.true;
|
17
23
|
expect(event.bubbles).to.be.true;
|
24
|
+
expect(event.target).to.equal(link);
|
25
|
+
expect(spy.callCount).to.equal(1);
|
18
26
|
});
|
19
|
-
it('dispatches
|
27
|
+
it('dispatches one button "click" event when a button is selected via click', async () => {
|
20
28
|
const component = await fixture(html `<glide-core-menu open>
|
21
29
|
<button slot="target">Target</button>
|
22
30
|
|
23
31
|
<glide-core-menu-options>
|
24
|
-
<glide-core-menu-button label="
|
32
|
+
<glide-core-menu-button label="Button"></glide-core-menu-button>
|
25
33
|
</glide-core-menu-options>
|
26
34
|
</glide-core-menu>`);
|
27
|
-
|
28
|
-
const
|
35
|
+
const spy = sinon.spy();
|
36
|
+
const button = component.querySelector('glide-core-menu-button');
|
37
|
+
assert(button);
|
38
|
+
button.addEventListener('click', spy);
|
39
|
+
setTimeout(() => button.click());
|
40
|
+
const event = await oneEvent(button, 'click');
|
41
|
+
expect(event instanceof PointerEvent).to.be.true;
|
42
|
+
expect(event.bubbles).to.be.true;
|
43
|
+
expect(event.target).to.equal(button);
|
44
|
+
expect(spy.callCount).to.equal(1);
|
45
|
+
});
|
46
|
+
it('dispatches one link "click" event when a link is selected via Space', async () => {
|
47
|
+
const component = await fixture(html `<glide-core-menu open>
|
48
|
+
<button slot="target">Target</button>
|
49
|
+
|
50
|
+
<glide-core-menu-options>
|
51
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
52
|
+
</glide-core-menu-options>
|
53
|
+
</glide-core-menu>`);
|
54
|
+
const spy = sinon.spy();
|
55
|
+
const link = component.querySelector('glide-core-menu-link');
|
56
|
+
assert(link);
|
57
|
+
link.addEventListener('click', spy);
|
58
|
+
component.focus();
|
59
|
+
sendKeys({ press: 'Space' });
|
60
|
+
const event = await oneEvent(link, 'click');
|
61
|
+
expect(event instanceof PointerEvent).to.be.true;
|
62
|
+
expect(event.bubbles).to.be.true;
|
63
|
+
expect(event.target).to.equal(link);
|
64
|
+
expect(spy.callCount).to.equal(1);
|
65
|
+
});
|
66
|
+
it('dispatches one button "click" event when a button is selected via Space', async () => {
|
67
|
+
const component = await fixture(html `<glide-core-menu open>
|
68
|
+
<button slot="target">Target</button>
|
69
|
+
|
70
|
+
<glide-core-menu-options>
|
71
|
+
<glide-core-menu-button label="Button"></glide-core-menu-button>
|
72
|
+
</glide-core-menu-options>
|
73
|
+
</glide-core-menu>`);
|
74
|
+
const spy = sinon.spy();
|
75
|
+
const button = component.querySelector('glide-core-menu-button');
|
76
|
+
assert(button);
|
77
|
+
button.addEventListener('click', spy);
|
78
|
+
component.focus();
|
79
|
+
sendKeys({ press: 'Space' });
|
80
|
+
const event = await oneEvent(button, 'click');
|
29
81
|
expect(event instanceof PointerEvent).to.be.true;
|
30
82
|
expect(event.bubbles).to.be.true;
|
83
|
+
expect(event.target).to.equal(button);
|
84
|
+
expect(spy.callCount).to.equal(1);
|
85
|
+
});
|
86
|
+
it('dispatches one link "click" event when a link is selected via Enter', async () => {
|
87
|
+
const component = await fixture(html `<glide-core-menu open>
|
88
|
+
<button slot="target">Target</button>
|
89
|
+
|
90
|
+
<glide-core-menu-options>
|
91
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
92
|
+
</glide-core-menu-options>
|
93
|
+
</glide-core-menu>`);
|
94
|
+
const spy = sinon.spy();
|
95
|
+
const link = component.querySelector('glide-core-menu-link');
|
96
|
+
assert(link);
|
97
|
+
link.addEventListener('click', spy);
|
98
|
+
component.focus();
|
99
|
+
sendKeys({ press: 'Enter' });
|
100
|
+
const event = await oneEvent(link, 'click');
|
101
|
+
expect(event instanceof PointerEvent).to.be.true;
|
102
|
+
expect(event.bubbles).to.be.true;
|
103
|
+
expect(event.target).to.equal(link);
|
104
|
+
expect(spy.callCount).to.equal(1);
|
105
|
+
});
|
106
|
+
it('dispatches one button "click" event when a button is selected via Enter', async () => {
|
107
|
+
const component = await fixture(html `<glide-core-menu open>
|
108
|
+
<button slot="target">Target</button>
|
109
|
+
|
110
|
+
<glide-core-menu-options>
|
111
|
+
<glide-core-menu-button label="Button"></glide-core-menu-button>
|
112
|
+
</glide-core-menu-options>
|
113
|
+
</glide-core-menu>`);
|
114
|
+
const spy = sinon.spy();
|
115
|
+
const button = component.querySelector('glide-core-menu-button');
|
116
|
+
assert(button);
|
117
|
+
button.addEventListener('click', spy);
|
118
|
+
component.focus();
|
119
|
+
sendKeys({ press: 'Enter' });
|
120
|
+
const event = await oneEvent(button, 'click');
|
121
|
+
expect(event instanceof PointerEvent).to.be.true;
|
122
|
+
expect(event.bubbles).to.be.true;
|
123
|
+
expect(event.target).to.equal(button);
|
124
|
+
expect(spy.callCount).to.equal(1);
|
125
|
+
});
|
126
|
+
it('does not dispatch a link "click" event when opened via click', async () => {
|
127
|
+
const component = await fixture(html `<glide-core-menu>
|
128
|
+
<button slot="target">Target</button>
|
129
|
+
|
130
|
+
<glide-core-menu-options>
|
131
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
132
|
+
</glide-core-menu-options>
|
133
|
+
</glide-core-menu>`);
|
134
|
+
const spy = sinon.spy();
|
135
|
+
const link = component.querySelector('glide-core-menu-link');
|
136
|
+
const target = component.querySelector('button');
|
137
|
+
link?.addEventListener('click', spy);
|
138
|
+
target?.click();
|
139
|
+
await aTimeout(0);
|
140
|
+
expect(spy.callCount).to.equal(0);
|
141
|
+
});
|
142
|
+
it('does not dispatch a button "click" event when opened via click', async () => {
|
143
|
+
const component = await fixture(html `<glide-core-menu>
|
144
|
+
<button slot="target">Target</button>
|
145
|
+
|
146
|
+
<glide-core-menu-options>
|
147
|
+
<glide-core-menu-button label="Button"></glide-core-menu-button>
|
148
|
+
</glide-core-menu-options>
|
149
|
+
</glide-core-menu>`);
|
150
|
+
const spy = sinon.spy();
|
151
|
+
const button = component.querySelector('glide-core-menu-button');
|
152
|
+
const target = component.querySelector('button');
|
153
|
+
button?.addEventListener('click', spy);
|
154
|
+
target?.click();
|
155
|
+
await aTimeout(0);
|
156
|
+
expect(spy.callCount).to.equal(0);
|
157
|
+
});
|
158
|
+
it('does not dispatch a link "click" event when opened via Space', async () => {
|
159
|
+
const component = await fixture(html `<glide-core-menu>
|
160
|
+
<button slot="target">Target</button>
|
161
|
+
|
162
|
+
<glide-core-menu-options>
|
163
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
164
|
+
</glide-core-menu-options>
|
165
|
+
</glide-core-menu>`);
|
166
|
+
const spy = sinon.spy();
|
167
|
+
const link = component.querySelector('glide-core-menu-link');
|
168
|
+
link?.addEventListener('click', spy);
|
169
|
+
component.focus();
|
170
|
+
sendKeys({ press: 'Space' });
|
171
|
+
await aTimeout(0);
|
172
|
+
expect(spy.callCount).to.equal(0);
|
173
|
+
});
|
174
|
+
it('does not dispatch a button "click" event when opened via Space', async () => {
|
175
|
+
const component = await fixture(html `<glide-core-menu>
|
176
|
+
<button slot="target">Target</button>
|
177
|
+
|
178
|
+
<glide-core-menu-options>
|
179
|
+
<glide-core-menu-button label="Link"></glide-core-menu-button>
|
180
|
+
</glide-core-menu-options>
|
181
|
+
</glide-core-menu>`);
|
182
|
+
const spy = sinon.spy();
|
183
|
+
const button = component.querySelector('glide-core-menu-button');
|
184
|
+
button?.addEventListener('click', spy);
|
185
|
+
component.focus();
|
186
|
+
sendKeys({ press: 'Space' });
|
187
|
+
await aTimeout(0);
|
188
|
+
expect(spy.callCount).to.equal(0);
|
189
|
+
});
|
190
|
+
it('does not dispatch a link "click" event when opened via Enter', async () => {
|
191
|
+
const component = await fixture(html `<glide-core-menu>
|
192
|
+
<button slot="target">Target</button>
|
193
|
+
|
194
|
+
<glide-core-menu-options>
|
195
|
+
<glide-core-menu-link label="Link"></glide-core-menu-link>
|
196
|
+
</glide-core-menu-options>
|
197
|
+
</glide-core-menu>`);
|
198
|
+
const spy = sinon.spy();
|
199
|
+
const link = component.querySelector('glide-core-menu-link');
|
200
|
+
link?.addEventListener('click', spy);
|
201
|
+
component.focus();
|
202
|
+
sendKeys({ press: 'Enter' });
|
203
|
+
await aTimeout(0);
|
204
|
+
expect(spy.callCount).to.equal(0);
|
205
|
+
});
|
206
|
+
it('does not dispatch a button "click" event when opened via Enter', async () => {
|
207
|
+
const component = await fixture(html `<glide-core-menu>
|
208
|
+
<button slot="target">Target</button>
|
209
|
+
|
210
|
+
<glide-core-menu-options>
|
211
|
+
<glide-core-menu-button label="Link"></glide-core-menu-button>
|
212
|
+
</glide-core-menu-options>
|
213
|
+
</glide-core-menu>`);
|
214
|
+
const spy = sinon.spy();
|
215
|
+
const button = component.querySelector('glide-core-menu-button');
|
216
|
+
button?.addEventListener('click', spy);
|
217
|
+
component.focus();
|
218
|
+
sendKeys({ press: 'Enter' });
|
219
|
+
await aTimeout(0);
|
220
|
+
expect(spy.callCount).to.equal(0);
|
31
221
|
});
|
@@ -412,7 +412,7 @@ it('closes when something outside of it is clicked', async () => {
|
|
412
412
|
expect(options?.getAttribute('aria-activedescendant')).to.equal('');
|
413
413
|
expect(target?.ariaExpanded).to.equal('false');
|
414
414
|
});
|
415
|
-
it('closes on Escape
|
415
|
+
it('closes on Escape', async () => {
|
416
416
|
const component = await fixture(html `<glide-core-menu open>
|
417
417
|
<button slot="target">Target</button>
|
418
418
|
|
@@ -422,7 +422,7 @@ it('closes on Escape when the button has focus', async () => {
|
|
422
422
|
</glide-core-menu>`);
|
423
423
|
// Wait for it to open
|
424
424
|
await aTimeout(0);
|
425
|
-
component.
|
425
|
+
component.focus();
|
426
426
|
await sendKeys({ press: 'Escape' });
|
427
427
|
const defaultSlot = component?.shadowRoot?.querySelector('slot:not([name])');
|
428
428
|
const options = component.querySelector('glide-core-menu-options');
|
package/dist/modal.stories.d.ts
CHANGED
@@ -19,8 +19,8 @@ it('renders and sets default attributes', async () => {
|
|
19
19
|
expect(element).to.be.ok;
|
20
20
|
const spanTag = element.shadowRoot?.querySelector('span');
|
21
21
|
expect(spanTag?.getAttribute('tabindex')).to.equal('0');
|
22
|
-
const
|
23
|
-
expect(
|
22
|
+
const tooltip = element.shadowRoot?.querySelector('glide-core-tooltip');
|
23
|
+
expect(tooltip).to.not.be.null;
|
24
24
|
});
|
25
25
|
it('adds an accessible label when given', async () => {
|
26
26
|
const element = await fixture(html `<glide-core-modal-tertiary-icon label="test-label"
|
package/dist/radio-group.d.ts
CHANGED
@@ -8,10 +8,11 @@ declare global {
|
|
8
8
|
}
|
9
9
|
/**
|
10
10
|
/**
|
11
|
-
* @description A radio group with a label, and optional
|
11
|
+
* @description A radio group with a label, and optional description and tooltip. Participates in forms and validation via `FormData` and various methods.
|
12
12
|
*
|
13
|
-
* @event change -
|
14
|
-
* @event input -
|
13
|
+
* @event change - `(event: Event) => void`
|
14
|
+
* @event input - `(event: Event) => void`
|
15
|
+
* @event invalid - `(event: Event) => void`
|
15
16
|
*
|
16
17
|
* @slot - One or more of `<glide-core-radio>`.
|
17
18
|
* @slot description - Additional information or context.
|
@@ -4,5 +4,5 @@ import type { Meta, StoryObj } from '@storybook/web-components';
|
|
4
4
|
declare const meta: Meta;
|
5
5
|
export default meta;
|
6
6
|
export declare const Vertical: StoryObj;
|
7
|
-
export declare const
|
7
|
+
export declare const VerticalWithTooltip: StoryObj;
|
8
8
|
export declare const VerticalWithError: StoryObj;
|
package/dist/radio.d.ts
CHANGED
@@ -6,7 +6,6 @@ declare global {
|
|
6
6
|
}
|
7
7
|
/**
|
8
8
|
* @description A radio element for use with `<glide-core-radio-group>`.
|
9
|
-
*
|
10
9
|
*/
|
11
10
|
export default class GlideCoreRadio extends LitElement {
|
12
11
|
#private;
|
@@ -17,7 +16,7 @@ export default class GlideCoreRadio extends LitElement {
|
|
17
16
|
invalid: boolean;
|
18
17
|
required: boolean;
|
19
18
|
value: string;
|
20
|
-
label
|
19
|
+
label?: string;
|
21
20
|
firstUpdated(): void;
|
22
21
|
render(): import("lit").TemplateResult<1>;
|
23
22
|
willUpdate(changedProperties: PropertyValueMap<GlideCoreRadio>): void;
|
package/dist/radio.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,i,r){var a,o=arguments.length,d=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,i,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(d=(o<3?a(d):o>3?a(t,i,d):a(t,i))||d);return o>3&&d&&Object.defineProperty(t,i,d),d};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import styles from"./radio.styles.js";let GlideCoreRadio=class GlideCoreRadio extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.invalid=!1,this.required=!1,this.value="",this
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,i,r){var a,o=arguments.length,d=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,i,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(d=(o<3?a(d):o>3?a(t,i,d):a(t,i))||d);return o>3&&d&&Object.defineProperty(t,i,d),d};import{LitElement,html}from"lit";import{classMap}from"lit/directives/class-map.js";import{customElement,property}from"lit/decorators.js";import styles from"./radio.styles.js";let GlideCoreRadio=class GlideCoreRadio extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.invalid=!1,this.required=!1,this.value="",this.#e=!1}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.role="radio",this.ariaChecked=this.checked.toString(),this.ariaDisabled=this.disabled.toString(),this.ariaInvalid=this.invalid.toString(),this.ariaRequired=this.required.toString(),this.label&&(this.ariaLabel=this.label),this.#e=!0}render(){return html`<span class="${classMap({component:!0,disabled:this.disabled})}"><span id="radio" class="${classMap({"radio-circle":!0,checked:this.checked,animate:this.#e})}" data-test="radio" data-test-error="${this.invalid}"></span> ${this.label}</span>`}willUpdate(e){this.hasUpdated&&(e.has("checked")&&(this.ariaChecked=this.checked.toString()),e.has("disabled")&&(this.ariaDisabled=this.disabled.toString()),e.has("required")&&(this.ariaRequired=this.required.toString()),e.has("invalid")&&(this.ariaInvalid=this.invalid.toString()),e.has("label")&&this.label&&(this.ariaLabel=this.label))}#e};__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"checked",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"disabled",void 0),__decorate([property({type:Boolean})],GlideCoreRadio.prototype,"invalid",void 0),__decorate([property({type:Boolean,reflect:!0})],GlideCoreRadio.prototype,"required",void 0),__decorate([property()],GlideCoreRadio.prototype,"value",void 0),__decorate([property({reflect:!0})],GlideCoreRadio.prototype,"label",void 0),GlideCoreRadio=__decorate([customElement("glide-core-radio")],GlideCoreRadio);export default GlideCoreRadio;
|
@@ -8,7 +8,7 @@ declare global {
|
|
8
8
|
}
|
9
9
|
}
|
10
10
|
/**
|
11
|
-
* @description A
|
11
|
+
* @description A pair of buttons. One is the primary action. The other controls a menu of alternate actions.
|
12
12
|
*
|
13
13
|
* @slot - One or more of `<glide-core-menu-link>` or `<glide-core-menu-button>`.
|
14
14
|
* @slot primary-action - One of either `<glide-core-split-button>` or `<glide-core-split-link>`.
|
package/dist/tabs.stories.d.ts
CHANGED
package/dist/tag.d.ts
CHANGED
@@ -5,13 +5,10 @@ declare global {
|
|
5
5
|
}
|
6
6
|
}
|
7
7
|
/**
|
8
|
-
* @
|
8
|
+
* @event remove - Emitted when the tag is removed.
|
9
9
|
*
|
10
|
-
* @
|
11
|
-
*
|
12
|
-
* @slot - The content of the tag
|
13
|
-
*
|
14
|
-
* @slot prefix - A slot for an optional icon
|
10
|
+
* @slot - The content of the tag.
|
11
|
+
* @slot prefix - A slot for an optional icon.
|
15
12
|
*/
|
16
13
|
export default class GlideCoreTag extends LitElement {
|
17
14
|
#private;
|
package/dist/textarea.d.ts
CHANGED
@@ -6,10 +6,11 @@ declare global {
|
|
6
6
|
}
|
7
7
|
}
|
8
8
|
/**
|
9
|
-
* @description A
|
9
|
+
* @description A text area with a label and optional description and tooltip. Participates in forms and validation via `FormData` and various methods.
|
10
10
|
*
|
11
|
-
* @event change - (
|
12
|
-
* @event input - (
|
11
|
+
* @event change - `(event: Event) => void`
|
12
|
+
* @event input - `(event: Event) => void`
|
13
|
+
* @event invalid - `(event: Event) => void`
|
13
14
|
*
|
14
15
|
* @slot tooltip - Content for the tooltip.
|
15
16
|
* @slot description - Additional information or context.
|
package/dist/toggle.d.ts
CHANGED
@@ -8,9 +8,9 @@ declare global {
|
|
8
8
|
/**
|
9
9
|
* @description A toggle with a label and optional tooltip, summary, and description.
|
10
10
|
*
|
11
|
-
* @event change -
|
12
|
-
* @event input -
|
13
|
-
|
11
|
+
* @event change - `(event: Event) => void`
|
12
|
+
* @event input - `(event: Event) => void`
|
13
|
+
*
|
14
14
|
* @slot description - Additional information or context.
|
15
15
|
* @slot tooltip - Content for the tooltip.
|
16
16
|
*/
|
package/dist/toggle.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,i){var r,l=arguments.length,s=l<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 d=e.length-1;d>=0;d--)(r=e[d])&&(s=(l<3?r(s):l>3?r(t,o,s):r(t,o))||s);return l>3&&s&&Object.defineProperty(t,o,s),s};import"./label.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import styles from"./toggle.styles.js";let GlideCoreToggle=class GlideCoreToggle extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.hideLabel=!1,this.orientation="horizontal",this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}click(){this.#e.value?.click()}focus(e){this.#e.value?.focus(e)}render(){return html`<div data-test="component"><glide-core-private-label orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" ?disabled="${this.disabled}" ?hide="${this.hideLabel}"><slot name="tooltip" slot="tooltip"></slot><label for="input">${this.label}</label><div class="toggle-and-input" slot="control"><input aria-checked="${this.checked}" aria-describedby="summary description" data-test="input" id="input" role="switch" type="checkbox"
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,i){var r,l=arguments.length,s=l<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 d=e.length-1;d>=0;d--)(r=e[d])&&(s=(l<3?r(s):l>3?r(t,o,s):r(t,o))||s);return l>3&&s&&Object.defineProperty(t,o,s),s};import"./label.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import styles from"./toggle.styles.js";let GlideCoreToggle=class GlideCoreToggle extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.hideLabel=!1,this.orientation="horizontal",this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}click(){this.#e.value?.click()}focus(e){this.#e.value?.focus(e)}render(){return html`<div data-test="component"><glide-core-private-label orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" ?disabled="${this.disabled}" ?hide="${this.hideLabel}"><slot name="tooltip" slot="tooltip"></slot><label for="input">${this.label}</label><div class="toggle-and-input" slot="control"><input aria-checked="${this.checked}" aria-describedby="summary description" data-test="input" id="input" role="switch" type="checkbox" .checked="${this.checked}" ?disabled="${this.disabled}" @change="${this.#t}" @input="${this.#t}" ${ref(this.#e)}></div><div slot="summary" id="summary">${this.summary}</div><slot class="description" id="description" name="description" slot="description"></slot></glide-core-private-label></div>`}#e;#t(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),"change"===e.type&&this.dispatchEvent(new Event(e.type,e))}};__decorate([property({type:Boolean})],GlideCoreToggle.prototype,"checked",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreToggle.prototype,"disabled",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreToggle.prototype,"hideLabel",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"label",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"orientation",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"name",void 0),__decorate([property()],GlideCoreToggle.prototype,"privateSplit",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"summary",void 0),GlideCoreToggle=__decorate([customElement("glide-core-toggle")],GlideCoreToggle);export default GlideCoreToggle;
|
package/dist/toggle.stories.d.ts
CHANGED
@@ -42,3 +42,29 @@ it('is still unchecked after being clicked when unchecked and disabled', async (
|
|
42
42
|
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
43
43
|
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
44
44
|
});
|
45
|
+
it('is unchecked after being clicked then forcibly unchecked via a "change" listener', async () => {
|
46
|
+
const component = await fixture(html `<glide-core-toggle label="Label"></glide-core-toggle>`);
|
47
|
+
component.addEventListener('change', async () => {
|
48
|
+
await component.updateComplete;
|
49
|
+
component.checked = false;
|
50
|
+
});
|
51
|
+
component.click();
|
52
|
+
await elementUpdated(component);
|
53
|
+
expect(component.hasAttribute('checked')).to.be.false;
|
54
|
+
expect(component.checked).to.equal(false);
|
55
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
56
|
+
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
57
|
+
});
|
58
|
+
it('is unchecked after being clicked then forcibly unchecked via an "input" listener', async () => {
|
59
|
+
const component = await fixture(html `<glide-core-toggle label="Label"></glide-core-toggle>`);
|
60
|
+
component.addEventListener('input', async () => {
|
61
|
+
await component.updateComplete;
|
62
|
+
component.checked = false;
|
63
|
+
});
|
64
|
+
component.click();
|
65
|
+
await elementUpdated(component);
|
66
|
+
expect(component.hasAttribute('checked')).to.be.false;
|
67
|
+
expect(component.checked).to.equal(false);
|
68
|
+
const input = component.shadowRoot?.querySelector('[data-test="input"]');
|
69
|
+
expect(input?.getAttribute('aria-checked')).to.equal('false');
|
70
|
+
});
|
package/dist/tooltip.d.ts
CHANGED
@@ -5,8 +5,8 @@ declare global {
|
|
5
5
|
}
|
6
6
|
}
|
7
7
|
/**
|
8
|
-
* @slot - The
|
9
|
-
* @slot target - The element to which the tooltip should
|
8
|
+
* @slot - The content of the tooltip.
|
9
|
+
* @slot target - The element to which the tooltip should anchor.
|
10
10
|
*/
|
11
11
|
export default class GlideCoreTooltip extends LitElement {
|
12
12
|
#private;
|
package/dist/translations/en.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
const translation={$code:"en",$name:"English",$dir:"ltr",close:"Close",dismiss:"Dismiss",open:"Open",selectAll:"Select all",moreInformation:"More information",nextTab:"Next tab",notifications:"Notifications",previousTab:"Previous tab",announcedCharacterCount:(e,
|
1
|
+
const translation={$code:"en",$name:"English",$dir:"ltr",close:"Close",dismiss:"Dismiss",open:"Open",selectAll:"Select all",moreInformation:"More information",nextTab:"Next tab",notifications:"Notifications",previousTab:"Previous tab",announcedCharacterCount:(e,o)=>`Character count ${e} of ${o}`,displayedCharacterCount:(e,o)=>`${e}/${o}`,clearEntry:e=>`Clear ${e} entry`,removeTag:e=>`Remove tag: ${e}`,actionsFor:e=>`Actions for ${e}`};export default translation;
|
package/dist/translations/fr.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
const translation={$code:"fr",$name:"French",$dir:"ltr",close:"Fermer",dismiss:"Congédier",open:"Ouvrir",selectAll:"Tout sélectionner",moreInformation:"Plus d’informations",notifications:"Notifications",nextTab:"Next tab",previousTab:"Previous tab",announcedCharacterCount:(e
|
1
|
+
const translation={$code:"fr",$name:"French",$dir:"ltr",close:"Fermer",dismiss:"Congédier",open:"Ouvrir",selectAll:"Tout sélectionner",moreInformation:"Plus d’informations",notifications:"Notifications",nextTab:"Next tab",previousTab:"Previous tab",announcedCharacterCount:(r,e)=>`Character count ${r} of ${e}`,displayedCharacterCount:(r,e)=>`${r}/${e}`,clearEntry:r=>`Clear ${r} entry`,removeTag:r=>`Supprimer la balise : ${r}`,actionsFor:r=>`Actions for ${r}`};export default translation;
|
package/dist/translations/ja.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
const translation={$code:"ja",$name:"Japanese",$dir:"ltr",close:"閉じる",dismiss:"無視",open:"オープン",selectAll:"すべて選択",moreInformation:"詳細情報",notifications:"通知",nextTab:"Next tab",previousTab:"Previous tab",announcedCharacterCount:(a,
|
1
|
+
const translation={$code:"ja",$name:"Japanese",$dir:"ltr",close:"閉じる",dismiss:"無視",open:"オープン",selectAll:"すべて選択",moreInformation:"詳細情報",notifications:"通知",nextTab:"Next tab",previousTab:"Previous tab",announcedCharacterCount:(a,t)=>`Character count ${a} of ${t}`,displayedCharacterCount:(a,t)=>`${a}/${t}`,clearEntry:a=>`Clear ${a} entry`,removeTag:a=>`タグを削除: ${a}`,actionsFor:a=>`Actions for ${a}`};export default translation;
|
package/dist/tree.d.ts
CHANGED
package/dist/tree.item.d.ts
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
import './tree.item.menu.js';
|
2
2
|
import { LitElement } from 'lit';
|
3
|
-
import type GlideCoreMenu from './menu.js';
|
4
3
|
declare global {
|
5
4
|
interface HTMLElementTagNameMap {
|
6
5
|
'glide-core-tree-item': GlideCoreTreeItem;
|
@@ -24,8 +23,6 @@ export default class GlideCoreTreeItem extends LitElement {
|
|
24
23
|
selected: boolean;
|
25
24
|
removeIndentation: boolean;
|
26
25
|
nonCollapsible: boolean;
|
27
|
-
menuSlotAssignedElements: GlideCoreMenu[];
|
28
|
-
prefixSlotAssignedElements: HTMLElement[];
|
29
26
|
slotElements: GlideCoreTreeItem[];
|
30
27
|
suffixSlotAssignedElements: HTMLElement[];
|
31
28
|
firstUpdated(): void;
|
@@ -15,6 +15,7 @@ export default class GlideCoreTreeItemIconButton extends LitElement {
|
|
15
15
|
#private;
|
16
16
|
static shadowRootOptions: ShadowRootInit;
|
17
17
|
static styles: import("lit").CSSResult[];
|
18
|
+
label: string;
|
18
19
|
firstUpdated(): void;
|
19
20
|
render(): import("lit").TemplateResult<1>;
|
20
21
|
}
|
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,r){var l,n=arguments.length,i=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,r);else for(var s=e.length-1;s>=0;s--)(l=e[s])&&(i=(n<3?l(i):n>3?l(t,o,i):l(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i};import"./icon-button.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement}from"lit/decorators.js";import{owSlot}from"./library/ow.js";import styles from"./tree.item.icon-button.styles.js";let GlideCoreTreeItemIconButton=class GlideCoreTreeItemIconButton extends LitElement{static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#e.value)}render(){return html`<glide-core-icon-button class="component" variant="tertiary"><slot @slotchange="${this.#t}" ${ref(this.#e)}></slot></glide-core-icon-button>`}#e
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,r){var l,n=arguments.length,i=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,r);else for(var s=e.length-1;s>=0;s--)(l=e[s])&&(i=(n<3?l(i):n>3?l(t,o,i):l(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i};import"./icon-button.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{owSlot}from"./library/ow.js";import styles from"./tree.item.icon-button.styles.js";let GlideCoreTreeItemIconButton=class GlideCoreTreeItemIconButton extends LitElement{constructor(){super(...arguments),this.label="",this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}firstUpdated(){owSlot(this.#e.value)}render(){return html`<glide-core-icon-button class="component" variant="tertiary" tabindex="-1" label="${this.label}"><slot @slotchange="${this.#t}" ${ref(this.#e)}></slot></glide-core-icon-button>`}#e;#t(){owSlot(this.#e.value)}};__decorate([property()],GlideCoreTreeItemIconButton.prototype,"label",void 0),GlideCoreTreeItemIconButton=__decorate([customElement("glide-core-tree-item-icon-button")],GlideCoreTreeItemIconButton);export default GlideCoreTreeItemIconButton;
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { expect, fixture, html } from '@open-wc/testing';
|
2
2
|
import GlideCoreTreeItemIconButton from './tree.item.icon-button.js';
|
3
3
|
import expectArgumentError from './library/expect-argument-error.js';
|
4
|
+
GlideCoreTreeItemIconButton.shadowRootOptions.mode = 'open';
|
4
5
|
it('registers', async () => {
|
5
6
|
expect(window.customElements.get('glide-core-tree-item-icon-button')).to.equal(GlideCoreTreeItemIconButton);
|
6
7
|
});
|
@@ -11,3 +12,11 @@ it('throws if it does not have a default slot', async () => {
|
|
11
12
|
`);
|
12
13
|
});
|
13
14
|
});
|
15
|
+
it('passes its label to the icon button', async () => {
|
16
|
+
const component = await fixture(html `
|
17
|
+
<glide-core-tree-item-icon-button label="My label"
|
18
|
+
>Hello</glide-core-tree-item-icon-button
|
19
|
+
>
|
20
|
+
`);
|
21
|
+
expect(component.shadowRoot?.querySelector('glide-core-icon-button')?.label).to.equal('My label');
|
22
|
+
});
|
package/dist/tree.item.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,i
|
1
|
+
var _a,GlideCoreTreeItem_1,__decorate=this&&this.__decorate||function(e,t,o,i){var r,s=arguments.length,l=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(l=(s<3?r(l):s>3?r(t,o,l):r(t,o))||l);return s>3&&l&&Object.defineProperty(t,o,l),l};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.#e=createRef(),this.#t=new LocalizeController(this),this.#o=createRef()}static{GlideCoreTreeItem_1=this}static{this.shadowRootOptions={...LitElement.shadowRootOptions,delegatesFocus:!0,mode:"closed"}}static{this.styles=styles}firstUpdated(){this.#i()}focus(e){this.#e.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.#l)}"><div class="${classMap({"label-container":!0})}" tabindex="-1" @focusout="${this.#n}" @focusin="${this.#a}" ${ref(this.#e)}><div style="flex-shrink: 0; width:${this.#d};"></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"></slot><div class="label">${this.label}</div><div class="icon-container"><slot name="menu" ${ref(this.#o)} @slotchange="${this.#c}"></slot><slot name="suffix"></slot></div></div><div class="child-items" role="group"><slot></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;get#l(){return this.hasChildTreeItems?this.expanded?"true":"false":void 0}get#s(){return this.hasChildTreeItems?void 0:this.selected?"true":"false"}#a(e){this.#m(e.target)&&e.stopPropagation()}#n(e){this.#m(e.relatedTarget)?e.stopPropagation():this.#r(-1)}get#d(){return 20*(this.level-1)+"px"}#m(e){return e&&e instanceof HTMLElement&&!(e instanceof GlideCoreTreeItem_1)&&this.contains(e)}#c(){owSlotType(this.#o.value,[GlideCoreTreeItemMenu]);for(const e of this.#o.value.assignedElements())e instanceof GlideCoreTreeItemMenu&&(e.label=this.#t.term("actionsFor",this.label))}#r(e){ow(this.#e.value,ow.object.instanceOf(HTMLElement)),this.#e.value.tabIndex=e;for(const t of this.querySelectorAll("& > glide-core-tree-item-icon-button"))t.tabIndex=e}#i(){const e=[];for(const t of this.slotElements)t.level=this.level+1,e.push(t);this.childTreeItems=e}};__decorate([property({type:Boolean})],GlideCoreTreeItem.prototype,"expanded",void 0),__decorate([property({reflect:!0})],GlideCoreTreeItem.prototype,"label",void 0),__decorate([property({type:Number})],GlideCoreTreeItem.prototype,"level",void 0),__decorate([property({type:Boolean})],GlideCoreTreeItem.prototype,"selected",void 0),__decorate([property({type:Boolean,attribute:"remove-indentation"})],GlideCoreTreeItem.prototype,"removeIndentation",void 0),__decorate([property({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),GlideCoreTreeItem=GlideCoreTreeItem_1=__decorate([customElement("glide-core-tree-item")],GlideCoreTreeItem);export default GlideCoreTreeItem;
|
package/dist/tree.item.menu.d.ts
CHANGED
@@ -19,6 +19,8 @@ export default class GlideCoreTreeItemMenu extends LitElement {
|
|
19
19
|
static shadowRootOptions: ShadowRootInit;
|
20
20
|
static styles: import("lit").CSSResult[];
|
21
21
|
placement: Placement;
|
22
|
+
label: string;
|
23
|
+
click(): void;
|
22
24
|
firstUpdated(): void;
|
23
25
|
render(): import("lit").TemplateResult<1>;
|
24
26
|
}
|
package/dist/tree.item.menu.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var __decorate=this&&this.__decorate||function(e,t,o,
|
1
|
+
var __decorate=this&&this.__decorate||function(e,t,o,l){var n,r=arguments.length,i=r<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,o):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,l);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(i=(r<3?n(i):r>3?n(t,o,i):n(t,o))||i);return r>3&&i&&Object.defineProperty(t,o,i),i};import"./icon-button.js";import"./menu.js";import"./menu.options.js";import{LitElement,html}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import GlideCoreIconButton from"./icon-button.js";import GlideCoreMenuButton from"./menu.button.js";import GlideCoreMenuLink from"./menu.link.js";import ow,{owSlot,owSlotType}from"./library/ow.js";import styles from"./tree.item.menu.styles.js";let GlideCoreTreeItemMenu=class GlideCoreTreeItemMenu extends LitElement{constructor(){super(...arguments),this.placement="bottom-start",this.label="",this.#e=createRef(),this.#t=createRef(),this.#o=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:"closed"}}static{this.styles=styles}click(){ow(this.#t.value,ow.object.instanceOf(GlideCoreIconButton)),this.#t.value.click()}firstUpdated(){owSlot(this.#e.value),owSlotType(this.#e.value,[GlideCoreMenuButton,GlideCoreMenuLink])}render(){return html`<glide-core-menu class="component" placement="${this.placement}" ${ref(this.#o)}><glide-core-menu-options><slot @slotchange="${this.#l}" ${ref(this.#e)}></slot></glide-core-menu-options><glide-core-icon-button slot="target" variant="tertiary" label="${this.label}" ${ref(this.#t)}><svg aria-hidden="true" width="4" height="14" viewBox="0 0 4 18" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 15C2.55228 15 3 15.4477 3 16C3 16.5523 2.55228 17 2 17C1.44772 17 1 16.5523 1 16C1 15.4477 1.44772 15 2 15Z"/><path d="M2 8C2.55228 8 3 8.44772 3 9C3 9.55228 2.55228 10 2 10C1.44772 10 1 9.55228 1 9C1 8.44772 1.44772 8 2 8Z"/><path d="M2 1C2.55228 1 3 1.44772 3 2C3 2.55228 2.55228 3 2 3C1.44772 3 1 2.55228 1 2C1 1.44772 1.44772 1 2 1Z"/></svg></glide-core-icon-button></glide-core-menu>`}#e;#t;#o;#l(){owSlot(this.#e.value),owSlotType(this.#e.value,[GlideCoreMenuButton,GlideCoreMenuLink])}};__decorate([property({reflect:!0})],GlideCoreTreeItemMenu.prototype,"placement",void 0),__decorate([property()],GlideCoreTreeItemMenu.prototype,"label",void 0),GlideCoreTreeItemMenu=__decorate([customElement("glide-core-tree-item-menu")],GlideCoreTreeItemMenu);export default GlideCoreTreeItemMenu;
|
@@ -48,3 +48,18 @@ it('can set placement of the menu', async () => {
|
|
48
48
|
`);
|
49
49
|
expect(treeItemMenu.shadowRoot?.querySelector('glide-core-menu')?.placement).to.equal('bottom-end');
|
50
50
|
});
|
51
|
+
it('can be opened programmatically', async () => {
|
52
|
+
const treeItemMenu = await fixture(html `
|
53
|
+
<glide-core-tree-item-menu>
|
54
|
+
<glide-core-menu-link label="One" url="/one"> </glide-core-menu-link>
|
55
|
+
</glide-core-tree-item-menu>
|
56
|
+
`);
|
57
|
+
expect(treeItemMenu.shadowRoot
|
58
|
+
?.querySelector('glide-core-menu')
|
59
|
+
?.getAttribute('open')).to.equal(null);
|
60
|
+
treeItemMenu.click();
|
61
|
+
await treeItemMenu.updateComplete;
|
62
|
+
expect(treeItemMenu.shadowRoot
|
63
|
+
?.querySelector('glide-core-menu')
|
64
|
+
?.getAttribute('open')).to.equal('');
|
65
|
+
});
|